如何判断Linux机器是否支持io_uring?

如何判断Linux机器是否支持io_uring?

我想检查Linux机器是否支持io_uring。如何才能做到这一点?

是否有一些内核文件描述了对此的支持,或者所有 Linux 5.1+ 内核都支持吗?

答案1

io_uring不暴露任何用户可见的功能,例如作为一个sysctl;它只公开新的系统调用。它从内核 5.1 起就可用,但可以编译出对它的支持,并且它可能会向后移植到某些系统中的旧内核。

因此,检查支持的最安全方法是检查io_uring系统调用是否可用。如果你有/proc/kallsyms,你可以在那里查看:

grep io_uring_setup /proc/kallsyms

检查系统调用的另一种方法是尝试安全但格式错误的调用,并检查生成的错误是否为ENOSYS,例如:

#include <errno.h>
#include <linux/io_uring.h>
#include <stddef.h>
#include <sys/syscall.h>
#include <unistd.h>

int main(int argc, char **argv) {
  if (syscall(__NR_io_uring_register, 0, IORING_UNREGISTER_BUFFERS, NULL, 0) && errno == ENOSYS) {
    // No io_uring
  } else {
    // io_uring
  }
}

在支持 的内核上io_uring,可用的操作会随着新内核版本引入新功能而变化;确定支持的操作,使用io_uring_get_probe

答案2

它在 Linux 5.1 及更高版本中可用,并且可以在编译过程中启用。在 Debian 及其衍生版本中,您可以在 file 中找到编译期间使用的内核选项/boot/config-{kernel version}-{arch}。在 UEFI 机器中,此路径可能有所不同。

因此输入,
grep -i uring /boot/config-$(uname -r)

输出应包括CONFIG_IO_URING、y 或 n、启用或禁用。

相关内容