Message ID | 20220805154226.155008-5-joshi.k@samsung.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | iopoll support for io_uring/nvme passthrough | expand |
On 8/5/22 9:42 AM, Kanchan Joshi wrote: > @@ -685,6 +721,29 @@ int nvme_ns_head_chr_uring_cmd(struct io_uring_cmd *ioucmd, > srcu_read_unlock(&head->srcu, srcu_idx); > return ret; > } > + > +int nvme_ns_head_chr_uring_cmd_iopoll(struct io_uring_cmd *ioucmd) > +{ > + struct cdev *cdev = file_inode(ioucmd->file)->i_cdev; > + struct nvme_ns_head *head = container_of(cdev, struct nvme_ns_head, cdev); > + int srcu_idx = srcu_read_lock(&head->srcu); > + struct nvme_ns *ns = nvme_find_path(head); > + struct bio *bio; > + int ret = 0; > + struct request_queue *q; > + > + if (ns) { > + rcu_read_lock(); > + bio = READ_ONCE(ioucmd->private); > + q = ns->queue; > + if (test_bit(QUEUE_FLAG_POLL, &q->queue_flags) && bio > + && bio->bi_bdev) > + ret = bio_poll(bio, 0, 0); > + rcu_read_unlock(); > + } > + srcu_read_unlock(&head->srcu, srcu_idx); > + return ret; > +} > #endif /* CONFIG_NVME_MULTIPATH */ Looks like that READ_ONCE() should be: bio = READ_ONCE(ioucmd->cookie); ?
On Fri, Aug 05, 2022 at 11:03:55AM -0600, Jens Axboe wrote: >On 8/5/22 9:42 AM, Kanchan Joshi wrote: >> @@ -685,6 +721,29 @@ int nvme_ns_head_chr_uring_cmd(struct io_uring_cmd *ioucmd, >> srcu_read_unlock(&head->srcu, srcu_idx); >> return ret; >> } >> + >> +int nvme_ns_head_chr_uring_cmd_iopoll(struct io_uring_cmd *ioucmd) >> +{ >> + struct cdev *cdev = file_inode(ioucmd->file)->i_cdev; >> + struct nvme_ns_head *head = container_of(cdev, struct nvme_ns_head, cdev); >> + int srcu_idx = srcu_read_lock(&head->srcu); >> + struct nvme_ns *ns = nvme_find_path(head); >> + struct bio *bio; >> + int ret = 0; >> + struct request_queue *q; >> + >> + if (ns) { >> + rcu_read_lock(); >> + bio = READ_ONCE(ioucmd->private); >> + q = ns->queue; >> + if (test_bit(QUEUE_FLAG_POLL, &q->queue_flags) && bio >> + && bio->bi_bdev) >> + ret = bio_poll(bio, 0, 0); >> + rcu_read_unlock(); >> + } >> + srcu_read_unlock(&head->srcu, srcu_idx); >> + return ret; >> +} >> #endif /* CONFIG_NVME_MULTIPATH */ > >Looks like that READ_ONCE() should be: > > bio = READ_ONCE(ioucmd->cookie); > >? Damn, indeed. Would have caught if I had compiled this with NVME_MULTIPATH config enabled. Thanks for the catch.
Hi Kanchan, Thank you for the patch! Yet something to improve: [auto build test ERROR on axboe-block/for-next] [also build test ERROR on linus/master] [cannot apply to hch-configfs/for-next v5.19] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Kanchan-Joshi/fs-add-file_operations-uring_cmd_iopoll/20220806-004320 base: https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next config: i386-allyesconfig (https://download.01.org/0day-ci/archive/20220806/202208060547.zSVYtFTN-lkp@intel.com/config) compiler: gcc-11 (Debian 11.3.0-3) 11.3.0 reproduce (this is a W=1 build): # https://github.com/intel-lab-lkp/linux/commit/0964795577fbf09d8b315269504b5e87b5ac492b git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Kanchan-Joshi/fs-add-file_operations-uring_cmd_iopoll/20220806-004320 git checkout 0964795577fbf09d8b315269504b5e87b5ac492b # save the config file mkdir build_dir && cp config build_dir/.config make W=1 O=build_dir ARCH=i386 SHELL=/bin/bash If you fix the issue, kindly add following tag where applicable Reported-by: kernel test robot <lkp@intel.com> All errors (new ones prefixed by >>): In file included from <command-line>: drivers/nvme/host/ioctl.c: In function 'nvme_ns_head_chr_uring_cmd_iopoll': >> drivers/nvme/host/ioctl.c:737:39: error: 'struct io_uring_cmd' has no member named 'private' 737 | bio = READ_ONCE(ioucmd->private); | ^~ include/linux/compiler_types.h:334:23: note: in definition of macro '__compiletime_assert' 334 | if (!(condition)) \ | ^~~~~~~~~ include/linux/compiler_types.h:354:9: note: in expansion of macro '_compiletime_assert' 354 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) | ^~~~~~~~~~~~~~~~~~~ include/asm-generic/rwonce.h:36:9: note: in expansion of macro 'compiletime_assert' 36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \ | ^~~~~~~~~~~~~~~~~~ include/asm-generic/rwonce.h:36:28: note: in expansion of macro '__native_word' 36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \ | ^~~~~~~~~~~~~ include/asm-generic/rwonce.h:49:9: note: in expansion of macro 'compiletime_assert_rwonce_type' 49 | compiletime_assert_rwonce_type(x); \ | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/nvme/host/ioctl.c:737:23: note: in expansion of macro 'READ_ONCE' 737 | bio = READ_ONCE(ioucmd->private); | ^~~~~~~~~ >> drivers/nvme/host/ioctl.c:737:39: error: 'struct io_uring_cmd' has no member named 'private' 737 | bio = READ_ONCE(ioucmd->private); | ^~ include/linux/compiler_types.h:334:23: note: in definition of macro '__compiletime_assert' 334 | if (!(condition)) \ | ^~~~~~~~~ include/linux/compiler_types.h:354:9: note: in expansion of macro '_compiletime_assert' 354 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) | ^~~~~~~~~~~~~~~~~~~ include/asm-generic/rwonce.h:36:9: note: in expansion of macro 'compiletime_assert' 36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \ | ^~~~~~~~~~~~~~~~~~ include/asm-generic/rwonce.h:36:28: note: in expansion of macro '__native_word' 36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \ | ^~~~~~~~~~~~~ include/asm-generic/rwonce.h:49:9: note: in expansion of macro 'compiletime_assert_rwonce_type' 49 | compiletime_assert_rwonce_type(x); \ | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/nvme/host/ioctl.c:737:23: note: in expansion of macro 'READ_ONCE' 737 | bio = READ_ONCE(ioucmd->private); | ^~~~~~~~~ >> drivers/nvme/host/ioctl.c:737:39: error: 'struct io_uring_cmd' has no member named 'private' 737 | bio = READ_ONCE(ioucmd->private); | ^~ include/linux/compiler_types.h:334:23: note: in definition of macro '__compiletime_assert' 334 | if (!(condition)) \ | ^~~~~~~~~ include/linux/compiler_types.h:354:9: note: in expansion of macro '_compiletime_assert' 354 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) | ^~~~~~~~~~~~~~~~~~~ include/asm-generic/rwonce.h:36:9: note: in expansion of macro 'compiletime_assert' 36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \ | ^~~~~~~~~~~~~~~~~~ include/asm-generic/rwonce.h:36:28: note: in expansion of macro '__native_word' 36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \ | ^~~~~~~~~~~~~ include/asm-generic/rwonce.h:49:9: note: in expansion of macro 'compiletime_assert_rwonce_type' 49 | compiletime_assert_rwonce_type(x); \ | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/nvme/host/ioctl.c:737:23: note: in expansion of macro 'READ_ONCE' 737 | bio = READ_ONCE(ioucmd->private); | ^~~~~~~~~ >> drivers/nvme/host/ioctl.c:737:39: error: 'struct io_uring_cmd' has no member named 'private' 737 | bio = READ_ONCE(ioucmd->private); | ^~ include/linux/compiler_types.h:334:23: note: in definition of macro '__compiletime_assert' 334 | if (!(condition)) \ | ^~~~~~~~~ include/linux/compiler_types.h:354:9: note: in expansion of macro '_compiletime_assert' 354 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) | ^~~~~~~~~~~~~~~~~~~ include/asm-generic/rwonce.h:36:9: note: in expansion of macro 'compiletime_assert' 36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \ | ^~~~~~~~~~~~~~~~~~ include/asm-generic/rwonce.h:36:28: note: in expansion of macro '__native_word' 36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \ | ^~~~~~~~~~~~~ include/asm-generic/rwonce.h:49:9: note: in expansion of macro 'compiletime_assert_rwonce_type' 49 | compiletime_assert_rwonce_type(x); \ | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/nvme/host/ioctl.c:737:23: note: in expansion of macro 'READ_ONCE' 737 | bio = READ_ONCE(ioucmd->private); | ^~~~~~~~~ >> drivers/nvme/host/ioctl.c:737:39: error: 'struct io_uring_cmd' has no member named 'private' 737 | bio = READ_ONCE(ioucmd->private); | ^~ include/linux/compiler_types.h:334:23: note: in definition of macro '__compiletime_assert' 334 | if (!(condition)) \ | ^~~~~~~~~ include/linux/compiler_types.h:354:9: note: in expansion of macro '_compiletime_assert' 354 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) | ^~~~~~~~~~~~~~~~~~~ include/asm-generic/rwonce.h:36:9: note: in expansion of macro 'compiletime_assert' 36 | compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \ | ^~~~~~~~~~~~~~~~~~ include/asm-generic/rwonce.h:49:9: note: in expansion of macro 'compiletime_assert_rwonce_type' 49 | compiletime_assert_rwonce_type(x); \ | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/nvme/host/ioctl.c:737:23: note: in expansion of macro 'READ_ONCE' 737 | bio = READ_ONCE(ioucmd->private); | ^~~~~~~~~ >> drivers/nvme/host/ioctl.c:737:39: error: 'struct io_uring_cmd' has no member named 'private' 737 | bio = READ_ONCE(ioucmd->private); | ^~ include/linux/compiler_types.h:310:27: note: in definition of macro '__unqual_scalar_typeof' 310 | _Generic((x), \ | ^ include/asm-generic/rwonce.h:50:9: note: in expansion of macro '__READ_ONCE' 50 | __READ_ONCE(x); \ | ^~~~~~~~~~~ drivers/nvme/host/ioctl.c:737:23: note: in expansion of macro 'READ_ONCE' 737 | bio = READ_ONCE(ioucmd->private); | ^~~~~~~~~ In file included from ./arch/x86/include/generated/asm/rwonce.h:1, from include/linux/compiler.h:248, from include/linux/ptrace.h:5, from drivers/nvme/host/ioctl.c:6: >> drivers/nvme/host/ioctl.c:737:39: error: 'struct io_uring_cmd' has no member named 'private' 737 | bio = READ_ONCE(ioucmd->private); | ^~ include/asm-generic/rwonce.h:44:73: note: in definition of macro '__READ_ONCE' 44 | #define __READ_ONCE(x) (*(const volatile __unqual_scalar_typeof(x) *)&(x)) | ^ drivers/nvme/host/ioctl.c:737:23: note: in expansion of macro 'READ_ONCE' 737 | bio = READ_ONCE(ioucmd->private); | ^~~~~~~~~ vim +737 drivers/nvme/host/ioctl.c 724 725 int nvme_ns_head_chr_uring_cmd_iopoll(struct io_uring_cmd *ioucmd) 726 { 727 struct cdev *cdev = file_inode(ioucmd->file)->i_cdev; 728 struct nvme_ns_head *head = container_of(cdev, struct nvme_ns_head, cdev); 729 int srcu_idx = srcu_read_lock(&head->srcu); 730 struct nvme_ns *ns = nvme_find_path(head); 731 struct bio *bio; 732 int ret = 0; 733 struct request_queue *q; 734 735 if (ns) { 736 rcu_read_lock(); > 737 bio = READ_ONCE(ioucmd->private); 738 q = ns->queue; 739 if (test_bit(QUEUE_FLAG_POLL, &q->queue_flags) && bio 740 && bio->bi_bdev) 741 ret = bio_poll(bio, 0, 0); 742 rcu_read_unlock(); 743 } 744 srcu_read_unlock(&head->srcu, srcu_idx); 745 return ret; 746 } 747 #endif /* CONFIG_NVME_MULTIPATH */ 748
Hi Kanchan, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on axboe-block/for-next] [also build test WARNING on linus/master next-20220805] [cannot apply to hch-configfs/for-next v5.19] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Kanchan-Joshi/fs-add-file_operations-uring_cmd_iopoll/20220806-004320 base: https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next config: i386-randconfig-a002 (https://download.01.org/0day-ci/archive/20220806/202208060733.GCwasLXB-lkp@intel.com/config) compiler: clang version 16.0.0 (https://github.com/llvm/llvm-project 26dd42705c2af0b8f6e5d6cdb32c9bd5ed9524eb) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/intel-lab-lkp/linux/commit/0964795577fbf09d8b315269504b5e87b5ac492b git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Kanchan-Joshi/fs-add-file_operations-uring_cmd_iopoll/20220806-004320 git checkout 0964795577fbf09d8b315269504b5e87b5ac492b # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=i386 SHELL=/bin/bash drivers/nvme/host/ If you fix the issue, kindly add following tag where applicable Reported-by: kernel test robot <lkp@intel.com> All warnings (new ones prefixed by >>): >> drivers/nvme/host/ioctl.c:638:6: warning: variable 'ret' is used uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized] if (test_bit(QUEUE_FLAG_POLL, &q->queue_flags) && bio && bio->bi_bdev) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/nvme/host/ioctl.c:641:9: note: uninitialized use occurs here return ret; ^~~ drivers/nvme/host/ioctl.c:638:2: note: remove the 'if' if its condition is always true if (test_bit(QUEUE_FLAG_POLL, &q->queue_flags) && bio && bio->bi_bdev) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> drivers/nvme/host/ioctl.c:638:6: warning: variable 'ret' is used uninitialized whenever '&&' condition is false [-Wsometimes-uninitialized] if (test_bit(QUEUE_FLAG_POLL, &q->queue_flags) && bio && bio->bi_bdev) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/nvme/host/ioctl.c:641:9: note: uninitialized use occurs here return ret; ^~~ drivers/nvme/host/ioctl.c:638:6: note: remove the '&&' if its condition is always true if (test_bit(QUEUE_FLAG_POLL, &q->queue_flags) && bio && bio->bi_bdev) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> drivers/nvme/host/ioctl.c:638:6: warning: variable 'ret' is used uninitialized whenever '&&' condition is false [-Wsometimes-uninitialized] if (test_bit(QUEUE_FLAG_POLL, &q->queue_flags) && bio && bio->bi_bdev) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/nvme/host/ioctl.c:641:9: note: uninitialized use occurs here return ret; ^~~ drivers/nvme/host/ioctl.c:638:6: note: remove the '&&' if its condition is always true if (test_bit(QUEUE_FLAG_POLL, &q->queue_flags) && bio && bio->bi_bdev) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/nvme/host/ioctl.c:629:9: note: initialize the variable 'ret' to silence this warning int ret; ^ = 0 3 warnings generated. vim +638 drivers/nvme/host/ioctl.c 625 626 int nvme_ns_chr_uring_cmd_iopoll(struct io_uring_cmd *ioucmd) 627 { 628 struct bio *bio; 629 int ret; 630 struct nvme_ns *ns; 631 struct request_queue *q; 632 633 rcu_read_lock(); 634 bio = READ_ONCE(ioucmd->cookie); 635 ns = container_of(file_inode(ioucmd->file)->i_cdev, 636 struct nvme_ns, cdev); 637 q = ns->queue; > 638 if (test_bit(QUEUE_FLAG_POLL, &q->queue_flags) && bio && bio->bi_bdev) 639 ret = bio_poll(bio, 0, 0); 640 rcu_read_unlock(); 641 return ret; 642 } 643 #ifdef CONFIG_NVME_MULTIPATH 644 static int nvme_ns_head_ctrl_ioctl(struct nvme_ns *ns, unsigned int cmd, 645 void __user *argp, struct nvme_ns_head *head, int srcu_idx) 646 __releases(&head->srcu) 647 { 648 struct nvme_ctrl *ctrl = ns->ctrl; 649 int ret; 650 651 nvme_get_ctrl(ns->ctrl); 652 srcu_read_unlock(&head->srcu, srcu_idx); 653 ret = nvme_ctrl_ioctl(ns->ctrl, cmd, argp); 654 655 nvme_put_ctrl(ctrl); 656 return ret; 657 } 658
Hi Kanchan, Thank you for the patch! Yet something to improve: [auto build test ERROR on axboe-block/for-next] [also build test ERROR on linus/master] [cannot apply to hch-configfs/for-next v5.19] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Kanchan-Joshi/fs-add-file_operations-uring_cmd_iopoll/20220806-004320 base: https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next config: hexagon-randconfig-r015-20220805 (https://download.01.org/0day-ci/archive/20220806/202208060944.JJcNJmU1-lkp@intel.com/config) compiler: clang version 16.0.0 (https://github.com/llvm/llvm-project 5f1c7e2cc5a3c07cbc2412e851a7283c1841f520) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # https://github.com/intel-lab-lkp/linux/commit/0964795577fbf09d8b315269504b5e87b5ac492b git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Kanchan-Joshi/fs-add-file_operations-uring_cmd_iopoll/20220806-004320 git checkout 0964795577fbf09d8b315269504b5e87b5ac492b # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=hexagon SHELL=/bin/bash drivers/nvme/host/ If you fix the issue, kindly add following tag where applicable Reported-by: kernel test robot <lkp@intel.com> All error/warnings (new ones prefixed by >>): >> drivers/nvme/host/ioctl.c:638:6: warning: variable 'ret' is used uninitialized whenever 'if' condition is false [-Wsometimes-uninitialized] if (test_bit(QUEUE_FLAG_POLL, &q->queue_flags) && bio && bio->bi_bdev) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ arch/hexagon/include/asm/bitops.h:175:28: note: expanded from macro 'test_bit' #define test_bit(nr, addr) __test_bit(nr, addr) ^ drivers/nvme/host/ioctl.c:641:9: note: uninitialized use occurs here return ret; ^~~ drivers/nvme/host/ioctl.c:638:2: note: remove the 'if' if its condition is always true if (test_bit(QUEUE_FLAG_POLL, &q->queue_flags) && bio && bio->bi_bdev) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ >> drivers/nvme/host/ioctl.c:638:6: warning: variable 'ret' is used uninitialized whenever '&&' condition is false [-Wsometimes-uninitialized] if (test_bit(QUEUE_FLAG_POLL, &q->queue_flags) && bio && bio->bi_bdev) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ arch/hexagon/include/asm/bitops.h:175:28: note: expanded from macro 'test_bit' #define test_bit(nr, addr) __test_bit(nr, addr) ^ drivers/nvme/host/ioctl.c:641:9: note: uninitialized use occurs here return ret; ^~~ drivers/nvme/host/ioctl.c:638:6: note: remove the '&&' if its condition is always true if (test_bit(QUEUE_FLAG_POLL, &q->queue_flags) && bio && bio->bi_bdev) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ arch/hexagon/include/asm/bitops.h:175:28: note: expanded from macro 'test_bit' #define test_bit(nr, addr) __test_bit(nr, addr) ^ >> drivers/nvme/host/ioctl.c:638:6: warning: variable 'ret' is used uninitialized whenever '&&' condition is false [-Wsometimes-uninitialized] if (test_bit(QUEUE_FLAG_POLL, &q->queue_flags) && bio && bio->bi_bdev) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ arch/hexagon/include/asm/bitops.h:175:28: note: expanded from macro 'test_bit' #define test_bit(nr, addr) __test_bit(nr, addr) ^~~~~~~~~~~~~~~~~~~~ drivers/nvme/host/ioctl.c:641:9: note: uninitialized use occurs here return ret; ^~~ drivers/nvme/host/ioctl.c:638:6: note: remove the '&&' if its condition is always true if (test_bit(QUEUE_FLAG_POLL, &q->queue_flags) && bio && bio->bi_bdev) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ arch/hexagon/include/asm/bitops.h:175:28: note: expanded from macro 'test_bit' #define test_bit(nr, addr) __test_bit(nr, addr) ^ drivers/nvme/host/ioctl.c:629:9: note: initialize the variable 'ret' to silence this warning int ret; ^ = 0 >> drivers/nvme/host/ioctl.c:737:27: error: no member named 'private' in 'struct io_uring_cmd' bio = READ_ONCE(ioucmd->private); ~~~~~~ ^ include/asm-generic/rwonce.h:49:33: note: expanded from macro 'READ_ONCE' compiletime_assert_rwonce_type(x); \ ^ include/asm-generic/rwonce.h:36:35: note: expanded from macro 'compiletime_assert_rwonce_type' compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \ ^ include/linux/compiler_types.h:321:10: note: expanded from macro '__native_word' (sizeof(t) == sizeof(char) || sizeof(t) == sizeof(short) || \ ^ include/linux/compiler_types.h:354:22: note: expanded from macro 'compiletime_assert' _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) ^~~~~~~~~ include/linux/compiler_types.h:342:23: note: expanded from macro '_compiletime_assert' __compiletime_assert(condition, msg, prefix, suffix) ^~~~~~~~~ include/linux/compiler_types.h:334:9: note: expanded from macro '__compiletime_assert' if (!(condition)) \ ^~~~~~~~~ >> drivers/nvme/host/ioctl.c:737:27: error: no member named 'private' in 'struct io_uring_cmd' bio = READ_ONCE(ioucmd->private); ~~~~~~ ^ include/asm-generic/rwonce.h:49:33: note: expanded from macro 'READ_ONCE' compiletime_assert_rwonce_type(x); \ ^ include/asm-generic/rwonce.h:36:35: note: expanded from macro 'compiletime_assert_rwonce_type' compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \ ^ include/linux/compiler_types.h:321:39: note: expanded from macro '__native_word' (sizeof(t) == sizeof(char) || sizeof(t) == sizeof(short) || \ ^ include/linux/compiler_types.h:354:22: note: expanded from macro 'compiletime_assert' _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) ^~~~~~~~~ include/linux/compiler_types.h:342:23: note: expanded from macro '_compiletime_assert' __compiletime_assert(condition, msg, prefix, suffix) ^~~~~~~~~ include/linux/compiler_types.h:334:9: note: expanded from macro '__compiletime_assert' if (!(condition)) \ ^~~~~~~~~ >> drivers/nvme/host/ioctl.c:737:27: error: no member named 'private' in 'struct io_uring_cmd' bio = READ_ONCE(ioucmd->private); ~~~~~~ ^ include/asm-generic/rwonce.h:49:33: note: expanded from macro 'READ_ONCE' compiletime_assert_rwonce_type(x); \ ^ include/asm-generic/rwonce.h:36:35: note: expanded from macro 'compiletime_assert_rwonce_type' compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \ ^ include/linux/compiler_types.h:322:10: note: expanded from macro '__native_word' sizeof(t) == sizeof(int) || sizeof(t) == sizeof(long)) ^ include/linux/compiler_types.h:354:22: note: expanded from macro 'compiletime_assert' _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) ^~~~~~~~~ include/linux/compiler_types.h:342:23: note: expanded from macro '_compiletime_assert' __compiletime_assert(condition, msg, prefix, suffix) ^~~~~~~~~ include/linux/compiler_types.h:334:9: note: expanded from macro '__compiletime_assert' if (!(condition)) \ ^~~~~~~~~ >> drivers/nvme/host/ioctl.c:737:27: error: no member named 'private' in 'struct io_uring_cmd' bio = READ_ONCE(ioucmd->private); ~~~~~~ ^ include/asm-generic/rwonce.h:49:33: note: expanded from macro 'READ_ONCE' compiletime_assert_rwonce_type(x); \ ^ include/asm-generic/rwonce.h:36:35: note: expanded from macro 'compiletime_assert_rwonce_type' compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \ ^ include/linux/compiler_types.h:322:38: note: expanded from macro '__native_word' sizeof(t) == sizeof(int) || sizeof(t) == sizeof(long)) ^ include/linux/compiler_types.h:354:22: note: expanded from macro 'compiletime_assert' _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) ^~~~~~~~~ include/linux/compiler_types.h:342:23: note: expanded from macro '_compiletime_assert' __compiletime_assert(condition, msg, prefix, suffix) ^~~~~~~~~ include/linux/compiler_types.h:334:9: note: expanded from macro '__compiletime_assert' if (!(condition)) \ ^~~~~~~~~ >> drivers/nvme/host/ioctl.c:737:27: error: no member named 'private' in 'struct io_uring_cmd' bio = READ_ONCE(ioucmd->private); ~~~~~~ ^ include/asm-generic/rwonce.h:49:33: note: expanded from macro 'READ_ONCE' compiletime_assert_rwonce_type(x); \ ^ include/asm-generic/rwonce.h:36:48: note: expanded from macro 'compiletime_assert_rwonce_type' compiletime_assert(__native_word(t) || sizeof(t) == sizeof(long long), \ ^ include/linux/compiler_types.h:354:22: note: expanded from macro 'compiletime_assert' _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__) ^~~~~~~~~ include/linux/compiler_types.h:342:23: note: expanded from macro '_compiletime_assert' __compiletime_assert(condition, msg, prefix, suffix) ^~~~~~~~~ include/linux/compiler_types.h:334:9: note: expanded from macro '__compiletime_assert' if (!(condition)) \ ^~~~~~~~~ >> drivers/nvme/host/ioctl.c:737:27: error: no member named 'private' in 'struct io_uring_cmd' bio = READ_ONCE(ioucmd->private); ~~~~~~ ^ include/asm-generic/rwonce.h:50:14: note: expanded from macro 'READ_ONCE' __READ_ONCE(x); \ ^ include/asm-generic/rwonce.h:44:65: note: expanded from macro '__READ_ONCE' #define __READ_ONCE(x) (*(const volatile __unqual_scalar_typeof(x) *)&(x)) ^ include/linux/compiler_types.h:310:13: note: expanded from macro '__unqual_scalar_typeof' _Generic((x), \ ^ >> drivers/nvme/host/ioctl.c:737:27: error: no member named 'private' in 'struct io_uring_cmd' bio = READ_ONCE(ioucmd->private); ~~~~~~ ^ include/asm-generic/rwonce.h:50:14: note: expanded from macro 'READ_ONCE' __READ_ONCE(x); \ ^ include/asm-generic/rwonce.h:44:65: note: expanded from macro '__READ_ONCE' #define __READ_ONCE(x) (*(const volatile __unqual_scalar_typeof(x) *)&(x)) ^ include/linux/compiler_types.h:317:15: note: expanded from macro '__unqual_scalar_typeof' default: (x))) ^ >> drivers/nvme/host/ioctl.c:737:27: error: no member named 'private' in 'struct io_uring_cmd' bio = READ_ONCE(ioucmd->private); ~~~~~~ ^ include/asm-generic/rwonce.h:50:14: note: expanded from macro 'READ_ONCE' __READ_ONCE(x); \ ^ include/asm-generic/rwonce.h:44:72: note: expanded from macro '__READ_ONCE' #define __READ_ONCE(x) (*(const volatile __unqual_scalar_typeof(x) *)&(x)) ^ >> drivers/nvme/host/ioctl.c:737:7: error: assigning to 'struct bio *' from incompatible type 'void' bio = READ_ONCE(ioucmd->private); ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~ 3 warnings and 9 errors generated. vim +737 drivers/nvme/host/ioctl.c 625 626 int nvme_ns_chr_uring_cmd_iopoll(struct io_uring_cmd *ioucmd) 627 { 628 struct bio *bio; 629 int ret; 630 struct nvme_ns *ns; 631 struct request_queue *q; 632 633 rcu_read_lock(); 634 bio = READ_ONCE(ioucmd->cookie); 635 ns = container_of(file_inode(ioucmd->file)->i_cdev, 636 struct nvme_ns, cdev); 637 q = ns->queue; > 638 if (test_bit(QUEUE_FLAG_POLL, &q->queue_flags) && bio && bio->bi_bdev) 639 ret = bio_poll(bio, 0, 0); 640 rcu_read_unlock(); 641 return ret; 642 } 643 #ifdef CONFIG_NVME_MULTIPATH 644 static int nvme_ns_head_ctrl_ioctl(struct nvme_ns *ns, unsigned int cmd, 645 void __user *argp, struct nvme_ns_head *head, int srcu_idx) 646 __releases(&head->srcu) 647 { 648 struct nvme_ctrl *ctrl = ns->ctrl; 649 int ret; 650 651 nvme_get_ctrl(ns->ctrl); 652 srcu_read_unlock(&head->srcu, srcu_idx); 653 ret = nvme_ctrl_ioctl(ns->ctrl, cmd, argp); 654 655 nvme_put_ctrl(ctrl); 656 return ret; 657 } 658 659 int nvme_ns_head_ioctl(struct block_device *bdev, fmode_t mode, 660 unsigned int cmd, unsigned long arg) 661 { 662 struct nvme_ns_head *head = bdev->bd_disk->private_data; 663 void __user *argp = (void __user *)arg; 664 struct nvme_ns *ns; 665 int srcu_idx, ret = -EWOULDBLOCK; 666 667 srcu_idx = srcu_read_lock(&head->srcu); 668 ns = nvme_find_path(head); 669 if (!ns) 670 goto out_unlock; 671 672 /* 673 * Handle ioctls that apply to the controller instead of the namespace 674 * seperately and drop the ns SRCU reference early. This avoids a 675 * deadlock when deleting namespaces using the passthrough interface. 676 */ 677 if (is_ctrl_ioctl(cmd)) 678 return nvme_ns_head_ctrl_ioctl(ns, cmd, argp, head, srcu_idx); 679 680 ret = nvme_ns_ioctl(ns, cmd, argp); 681 out_unlock: 682 srcu_read_unlock(&head->srcu, srcu_idx); 683 return ret; 684 } 685 686 long nvme_ns_head_chr_ioctl(struct file *file, unsigned int cmd, 687 unsigned long arg) 688 { 689 struct cdev *cdev = file_inode(file)->i_cdev; 690 struct nvme_ns_head *head = 691 container_of(cdev, struct nvme_ns_head, cdev); 692 void __user *argp = (void __user *)arg; 693 struct nvme_ns *ns; 694 int srcu_idx, ret = -EWOULDBLOCK; 695 696 srcu_idx = srcu_read_lock(&head->srcu); 697 ns = nvme_find_path(head); 698 if (!ns) 699 goto out_unlock; 700 701 if (is_ctrl_ioctl(cmd)) 702 return nvme_ns_head_ctrl_ioctl(ns, cmd, argp, head, srcu_idx); 703 704 ret = nvme_ns_ioctl(ns, cmd, argp); 705 out_unlock: 706 srcu_read_unlock(&head->srcu, srcu_idx); 707 return ret; 708 } 709 710 int nvme_ns_head_chr_uring_cmd(struct io_uring_cmd *ioucmd, 711 unsigned int issue_flags) 712 { 713 struct cdev *cdev = file_inode(ioucmd->file)->i_cdev; 714 struct nvme_ns_head *head = container_of(cdev, struct nvme_ns_head, cdev); 715 int srcu_idx = srcu_read_lock(&head->srcu); 716 struct nvme_ns *ns = nvme_find_path(head); 717 int ret = -EINVAL; 718 719 if (ns) 720 ret = nvme_ns_uring_cmd(ns, ioucmd, issue_flags); 721 srcu_read_unlock(&head->srcu, srcu_idx); 722 return ret; 723 } 724 725 int nvme_ns_head_chr_uring_cmd_iopoll(struct io_uring_cmd *ioucmd) 726 { 727 struct cdev *cdev = file_inode(ioucmd->file)->i_cdev; 728 struct nvme_ns_head *head = container_of(cdev, struct nvme_ns_head, cdev); 729 int srcu_idx = srcu_read_lock(&head->srcu); 730 struct nvme_ns *ns = nvme_find_path(head); 731 struct bio *bio; 732 int ret = 0; 733 struct request_queue *q; 734 735 if (ns) { 736 rcu_read_lock(); > 737 bio = READ_ONCE(ioucmd->private); 738 q = ns->queue; 739 if (test_bit(QUEUE_FLAG_POLL, &q->queue_flags) && bio 740 && bio->bi_bdev) 741 ret = bio_poll(bio, 0, 0); 742 rcu_read_unlock(); 743 } 744 srcu_read_unlock(&head->srcu, srcu_idx); 745 return ret; 746 } 747 #endif /* CONFIG_NVME_MULTIPATH */ 748
Hi Kanchan, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on axboe-block/for-next] [also build test WARNING on linus/master next-20220805] [cannot apply to hch-configfs/for-next v5.19] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Kanchan-Joshi/fs-add-file_operations-uring_cmd_iopoll/20220806-004320 base: https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next config: ia64-randconfig-s032-20220807 (https://download.01.org/0day-ci/archive/20220807/202208072057.wTajgd76-lkp@intel.com/config) compiler: ia64-linux-gcc (GCC) 12.1.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # apt-get install sparse # sparse version: v0.6.4-39-gce1a6720-dirty # https://github.com/intel-lab-lkp/linux/commit/0964795577fbf09d8b315269504b5e87b5ac492b git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Kanchan-Joshi/fs-add-file_operations-uring_cmd_iopoll/20220806-004320 git checkout 0964795577fbf09d8b315269504b5e87b5ac492b # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=ia64 SHELL=/bin/bash drivers/nvme/host/ If you fix the issue, kindly add following tag where applicable Reported-by: kernel test robot <lkp@intel.com> sparse warnings: (new ones prefixed by >>) >> drivers/nvme/host/ioctl.c:639:37: sparse: sparse: Using plain integer as NULL pointer vim +639 drivers/nvme/host/ioctl.c 625 626 int nvme_ns_chr_uring_cmd_iopoll(struct io_uring_cmd *ioucmd) 627 { 628 struct bio *bio; 629 int ret; 630 struct nvme_ns *ns; 631 struct request_queue *q; 632 633 rcu_read_lock(); 634 bio = READ_ONCE(ioucmd->cookie); 635 ns = container_of(file_inode(ioucmd->file)->i_cdev, 636 struct nvme_ns, cdev); 637 q = ns->queue; 638 if (test_bit(QUEUE_FLAG_POLL, &q->queue_flags) && bio && bio->bi_bdev) > 639 ret = bio_poll(bio, 0, 0); 640 rcu_read_unlock(); 641 return ret; 642 } 643 #ifdef CONFIG_NVME_MULTIPATH 644 static int nvme_ns_head_ctrl_ioctl(struct nvme_ns *ns, unsigned int cmd, 645 void __user *argp, struct nvme_ns_head *head, int srcu_idx) 646 __releases(&head->srcu) 647 { 648 struct nvme_ctrl *ctrl = ns->ctrl; 649 int ret; 650 651 nvme_get_ctrl(ns->ctrl); 652 srcu_read_unlock(&head->srcu, srcu_idx); 653 ret = nvme_ctrl_ioctl(ns->ctrl, cmd, argp); 654 655 nvme_put_ctrl(ctrl); 656 return ret; 657 } 658
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 2429b11eb9a8..77b6c2882afd 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -3976,6 +3976,7 @@ static const struct file_operations nvme_ns_chr_fops = { .unlocked_ioctl = nvme_ns_chr_ioctl, .compat_ioctl = compat_ptr_ioctl, .uring_cmd = nvme_ns_chr_uring_cmd, + .uring_cmd_iopoll = nvme_ns_chr_uring_cmd_iopoll, }; static int nvme_add_ns_cdev(struct nvme_ns *ns) diff --git a/drivers/nvme/host/ioctl.c b/drivers/nvme/host/ioctl.c index 27614bee7380..136f0fd25710 100644 --- a/drivers/nvme/host/ioctl.c +++ b/drivers/nvme/host/ioctl.c @@ -391,11 +391,19 @@ static void nvme_uring_cmd_end_io(struct request *req, blk_status_t err) struct nvme_uring_cmd_pdu *pdu = nvme_uring_cmd_pdu(ioucmd); /* extract bio before reusing the same field for request */ struct bio *bio = pdu->bio; + void *cookie = READ_ONCE(ioucmd->cookie); pdu->req = req; req->bio = bio; - /* this takes care of moving rest of completion-work to task context */ - io_uring_cmd_complete_in_task(ioucmd, nvme_uring_task_cb); + + /* + * For iopoll, complete it directly. + * Otherwise, move the completion to task work. + */ + if (cookie != NULL && blk_rq_is_poll(req)) + nvme_uring_task_cb(ioucmd); + else + io_uring_cmd_complete_in_task(ioucmd, nvme_uring_task_cb); } static int nvme_uring_cmd_io(struct nvme_ctrl *ctrl, struct nvme_ns *ns, @@ -445,7 +453,10 @@ static int nvme_uring_cmd_io(struct nvme_ctrl *ctrl, struct nvme_ns *ns, rq_flags = REQ_NOWAIT; blk_flags = BLK_MQ_REQ_NOWAIT; } + if (issue_flags & IO_URING_F_IOPOLL) + rq_flags |= REQ_POLLED; +retry: req = nvme_alloc_user_request(q, &c, nvme_to_user_ptr(d.addr), d.data_len, nvme_to_user_ptr(d.metadata), d.metadata_len, 0, &meta, d.timeout_ms ? @@ -456,6 +467,17 @@ static int nvme_uring_cmd_io(struct nvme_ctrl *ctrl, struct nvme_ns *ns, req->end_io = nvme_uring_cmd_end_io; req->end_io_data = ioucmd; + if (issue_flags & IO_URING_F_IOPOLL && rq_flags & REQ_POLLED) { + if (unlikely(!req->bio)) { + /* we can't poll this, so alloc regular req instead */ + blk_mq_free_request(req); + rq_flags &= ~REQ_POLLED; + goto retry; + } else { + WRITE_ONCE(ioucmd->cookie, req->bio); + req->bio->bi_opf |= REQ_POLLED; + } + } /* to free bio on completion, as req->bio will be null at that time */ pdu->bio = req->bio; pdu->meta = meta; @@ -559,9 +581,6 @@ long nvme_ns_chr_ioctl(struct file *file, unsigned int cmd, unsigned long arg) static int nvme_uring_cmd_checks(unsigned int issue_flags) { - /* IOPOLL not supported yet */ - if (issue_flags & IO_URING_F_IOPOLL) - return -EOPNOTSUPP; /* NVMe passthrough requires big SQE/CQE support */ if ((issue_flags & (IO_URING_F_SQE128|IO_URING_F_CQE32)) != @@ -604,6 +623,23 @@ int nvme_ns_chr_uring_cmd(struct io_uring_cmd *ioucmd, unsigned int issue_flags) return nvme_ns_uring_cmd(ns, ioucmd, issue_flags); } +int nvme_ns_chr_uring_cmd_iopoll(struct io_uring_cmd *ioucmd) +{ + struct bio *bio; + int ret; + struct nvme_ns *ns; + struct request_queue *q; + + rcu_read_lock(); + bio = READ_ONCE(ioucmd->cookie); + ns = container_of(file_inode(ioucmd->file)->i_cdev, + struct nvme_ns, cdev); + q = ns->queue; + if (test_bit(QUEUE_FLAG_POLL, &q->queue_flags) && bio && bio->bi_bdev) + ret = bio_poll(bio, 0, 0); + rcu_read_unlock(); + return ret; +} #ifdef CONFIG_NVME_MULTIPATH static int nvme_ns_head_ctrl_ioctl(struct nvme_ns *ns, unsigned int cmd, void __user *argp, struct nvme_ns_head *head, int srcu_idx) @@ -685,6 +721,29 @@ int nvme_ns_head_chr_uring_cmd(struct io_uring_cmd *ioucmd, srcu_read_unlock(&head->srcu, srcu_idx); return ret; } + +int nvme_ns_head_chr_uring_cmd_iopoll(struct io_uring_cmd *ioucmd) +{ + struct cdev *cdev = file_inode(ioucmd->file)->i_cdev; + struct nvme_ns_head *head = container_of(cdev, struct nvme_ns_head, cdev); + int srcu_idx = srcu_read_lock(&head->srcu); + struct nvme_ns *ns = nvme_find_path(head); + struct bio *bio; + int ret = 0; + struct request_queue *q; + + if (ns) { + rcu_read_lock(); + bio = READ_ONCE(ioucmd->private); + q = ns->queue; + if (test_bit(QUEUE_FLAG_POLL, &q->queue_flags) && bio + && bio->bi_bdev) + ret = bio_poll(bio, 0, 0); + rcu_read_unlock(); + } + srcu_read_unlock(&head->srcu, srcu_idx); + return ret; +} #endif /* CONFIG_NVME_MULTIPATH */ int nvme_dev_uring_cmd(struct io_uring_cmd *ioucmd, unsigned int issue_flags) @@ -692,6 +751,10 @@ int nvme_dev_uring_cmd(struct io_uring_cmd *ioucmd, unsigned int issue_flags) struct nvme_ctrl *ctrl = ioucmd->file->private_data; int ret; + /* IOPOLL not supported yet */ + if (issue_flags & IO_URING_F_IOPOLL) + return -EOPNOTSUPP; + ret = nvme_uring_cmd_checks(issue_flags); if (ret) return ret; diff --git a/drivers/nvme/host/multipath.c b/drivers/nvme/host/multipath.c index 6ef497c75a16..00f2f81e20fa 100644 --- a/drivers/nvme/host/multipath.c +++ b/drivers/nvme/host/multipath.c @@ -439,6 +439,7 @@ static const struct file_operations nvme_ns_head_chr_fops = { .unlocked_ioctl = nvme_ns_head_chr_ioctl, .compat_ioctl = compat_ptr_ioctl, .uring_cmd = nvme_ns_head_chr_uring_cmd, + .uring_cmd_iopoll = nvme_ns_head_chr_uring_cmd_iopoll, }; static int nvme_add_ns_head_cdev(struct nvme_ns_head *head) diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index bdc0ff7ed9ab..3f2d3dda6e6c 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h @@ -821,6 +821,8 @@ long nvme_ns_head_chr_ioctl(struct file *file, unsigned int cmd, unsigned long arg); long nvme_dev_ioctl(struct file *file, unsigned int cmd, unsigned long arg); +int nvme_ns_chr_uring_cmd_iopoll(struct io_uring_cmd *ioucmd); +int nvme_ns_head_chr_uring_cmd_iopoll(struct io_uring_cmd *ioucmd); int nvme_ns_chr_uring_cmd(struct io_uring_cmd *ioucmd, unsigned int issue_flags); int nvme_ns_head_chr_uring_cmd(struct io_uring_cmd *ioucmd,