Message ID | 20230307141520.793891-6-ming.lei@redhat.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | io_uring/ublk: add IORING_OP_FUSED_CMD | expand |
Hi Ming, I love your patch! Perhaps something to improve: [auto build test WARNING on axboe-block/for-next] [also build test WARNING on linus/master v6.3-rc1 next-20230309] [cannot apply to char-misc/char-misc-testing char-misc/char-misc-next char-misc/char-misc-linus] [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/Ming-Lei/io_uring-add-IO_URING_F_FUSED-and-prepare-for-supporting-OP_FUSED_CMD/20230307-222928 base: https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next patch link: https://lore.kernel.org/r/20230307141520.793891-6-ming.lei%40redhat.com patch subject: [PATCH V2 05/17] io_uring: support OP_SEND_ZC/OP_RECV for fused slave request config: i386-randconfig-a003 (https://download.01.org/0day-ci/archive/20230309/202303091544.WIDavyIo-lkp@intel.com/config) compiler: gcc-11 (Debian 11.3.0-8) 11.3.0 reproduce (this is a W=1 build): # https://github.com/intel-lab-lkp/linux/commit/0a921da27026b3ba08aeceb432dd983480281344 git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Ming-Lei/io_uring-add-IO_URING_F_FUSED-and-prepare-for-supporting-OP_FUSED_CMD/20230307-222928 git checkout 0a921da27026b3ba08aeceb432dd983480281344 # save the config file mkdir build_dir && cp config build_dir/.config make W=1 O=build_dir ARCH=i386 olddefconfig 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> | Link: https://lore.kernel.org/oe-kbuild-all/202303091544.WIDavyIo-lkp@intel.com/ All warnings (new ones prefixed by >>): In file included from include/linux/bits.h:6, from include/linux/bitops.h:6, from include/linux/kernel.h:22, from io_uring/net.c:2: include/vdso/bits.h:7:40: warning: left shift count >= width of type [-Wshift-count-overflow] 7 | #define BIT(nr) (UL(1) << (nr)) | ^~ include/linux/io_uring_types.h:475:35: note: in expansion of macro 'BIT' 475 | REQ_F_FUSED_SLAVE = BIT(REQ_F_FUSED_SLAVE_BIT), | ^~~ io_uring/net.c: In function 'io_send': >> io_uring/net.c:385:48: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 385 | ret = io_import_kbuf_for_slave((u64)sr->buf, sr->len, | ^ io_uring/net.c: In function 'io_recv': io_uring/net.c:880:48: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 880 | ret = io_import_kbuf_for_slave((u64)sr->buf, sr->len, ITER_DEST, | ^ io_uring/net.c: In function 'io_send_zc': io_uring/net.c:1135:48: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 1135 | ret = io_import_kbuf_for_slave((u64)zc->buf, zc->len, | ^ vim +385 io_uring/net.c 343 344 int io_send(struct io_kiocb *req, unsigned int issue_flags) 345 { 346 struct sockaddr_storage __address; 347 struct io_sr_msg *sr = io_kiocb_to_cmd(req, struct io_sr_msg); 348 struct msghdr msg; 349 struct socket *sock; 350 unsigned flags; 351 int min_ret = 0; 352 int ret; 353 354 msg.msg_name = NULL; 355 msg.msg_control = NULL; 356 msg.msg_controllen = 0; 357 msg.msg_namelen = 0; 358 msg.msg_ubuf = NULL; 359 360 if (sr->addr) { 361 if (req_has_async_data(req)) { 362 struct io_async_msghdr *io = req->async_data; 363 364 msg.msg_name = &io->addr; 365 } else { 366 ret = move_addr_to_kernel(sr->addr, sr->addr_len, &__address); 367 if (unlikely(ret < 0)) 368 return ret; 369 msg.msg_name = (struct sockaddr *)&__address; 370 } 371 msg.msg_namelen = sr->addr_len; 372 } 373 374 if (!(req->flags & REQ_F_POLLED) && 375 (sr->flags & IORING_RECVSEND_POLL_FIRST)) 376 return io_setup_async_addr(req, &__address, issue_flags); 377 378 sock = sock_from_file(req->file); 379 if (unlikely(!sock)) 380 return -ENOTSOCK; 381 382 if (!(req->flags & REQ_F_FUSED_SLAVE)) 383 ret = import_ubuf(ITER_SOURCE, sr->buf, sr->len, &msg.msg_iter); 384 else > 385 ret = io_import_kbuf_for_slave((u64)sr->buf, sr->len, 386 ITER_SOURCE, &msg.msg_iter, req); 387 if (unlikely(ret)) 388 return ret; 389 390 flags = sr->msg_flags; 391 if (issue_flags & IO_URING_F_NONBLOCK) 392 flags |= MSG_DONTWAIT; 393 if (flags & MSG_WAITALL) 394 min_ret = iov_iter_count(&msg.msg_iter); 395 396 msg.msg_flags = flags; 397 ret = sock_sendmsg(sock, &msg); 398 if (ret < min_ret) { 399 if (ret == -EAGAIN && (issue_flags & IO_URING_F_NONBLOCK)) 400 return io_setup_async_addr(req, &__address, issue_flags); 401 402 if (ret > 0 && io_net_retry(sock, flags)) { 403 sr->len -= ret; 404 sr->buf += ret; 405 sr->done_io += ret; 406 req->flags |= REQ_F_PARTIAL_IO; 407 return io_setup_async_addr(req, &__address, issue_flags); 408 } 409 if (ret == -ERESTARTSYS) 410 ret = -EINTR; 411 req_set_fail(req); 412 } 413 if (ret >= 0) 414 ret += sr->done_io; 415 else if (sr->done_io) 416 ret = sr->done_io; 417 io_req_set_res(req, ret, 0); 418 return IOU_OK; 419 } 420
Hi Ming, I love your patch! Perhaps something to improve: [auto build test WARNING on axboe-block/for-next] [also build test WARNING on linus/master v6.3-rc1 next-20230309] [cannot apply to char-misc/char-misc-testing char-misc/char-misc-next char-misc/char-misc-linus] [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/Ming-Lei/io_uring-add-IO_URING_F_FUSED-and-prepare-for-supporting-OP_FUSED_CMD/20230307-222928 base: https://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git for-next patch link: https://lore.kernel.org/r/20230307141520.793891-6-ming.lei%40redhat.com patch subject: [PATCH V2 05/17] io_uring: support OP_SEND_ZC/OP_RECV for fused slave request config: sparc64-randconfig-s031-20230308 (https://download.01.org/0day-ci/archive/20230310/202303100159.i9Bzx24n-lkp@intel.com/config) compiler: sparc64-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/0a921da27026b3ba08aeceb432dd983480281344 git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Ming-Lei/io_uring-add-IO_URING_F_FUSED-and-prepare-for-supporting-OP_FUSED_CMD/20230307-222928 git checkout 0a921da27026b3ba08aeceb432dd983480281344 # 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=sparc64 olddefconfig COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=sparc64 SHELL=/bin/bash If you fix the issue, kindly add following tag where applicable | Reported-by: kernel test robot <lkp@intel.com> | Link: https://lore.kernel.org/oe-kbuild-all/202303100159.i9Bzx24n-lkp@intel.com/ sparse warnings: (new ones prefixed by >>) io_uring/net.c: note: in included file (through io_uring/io_uring.h): io_uring/slist.h:116:29: sparse: sparse: no newline at end of file io_uring/net.c: note: in included file (through io_uring/io_uring.h): include/linux/io_uring_types.h:179:37: sparse: sparse: array of flexible structures >> io_uring/net.c:385:49: sparse: sparse: cast removes address space '__user' of expression io_uring/net.c:880:49: sparse: sparse: cast removes address space '__user' of expression io_uring/net.c:1135:49: sparse: sparse: cast removes address space '__user' of expression vim +/__user +385 io_uring/net.c 343 344 int io_send(struct io_kiocb *req, unsigned int issue_flags) 345 { 346 struct sockaddr_storage __address; 347 struct io_sr_msg *sr = io_kiocb_to_cmd(req, struct io_sr_msg); 348 struct msghdr msg; 349 struct socket *sock; 350 unsigned flags; 351 int min_ret = 0; 352 int ret; 353 354 msg.msg_name = NULL; 355 msg.msg_control = NULL; 356 msg.msg_controllen = 0; 357 msg.msg_namelen = 0; 358 msg.msg_ubuf = NULL; 359 360 if (sr->addr) { 361 if (req_has_async_data(req)) { 362 struct io_async_msghdr *io = req->async_data; 363 364 msg.msg_name = &io->addr; 365 } else { 366 ret = move_addr_to_kernel(sr->addr, sr->addr_len, &__address); 367 if (unlikely(ret < 0)) 368 return ret; 369 msg.msg_name = (struct sockaddr *)&__address; 370 } 371 msg.msg_namelen = sr->addr_len; 372 } 373 374 if (!(req->flags & REQ_F_POLLED) && 375 (sr->flags & IORING_RECVSEND_POLL_FIRST)) 376 return io_setup_async_addr(req, &__address, issue_flags); 377 378 sock = sock_from_file(req->file); 379 if (unlikely(!sock)) 380 return -ENOTSOCK; 381 382 if (!(req->flags & REQ_F_FUSED_SLAVE)) 383 ret = import_ubuf(ITER_SOURCE, sr->buf, sr->len, &msg.msg_iter); 384 else > 385 ret = io_import_kbuf_for_slave((u64)sr->buf, sr->len, 386 ITER_SOURCE, &msg.msg_iter, req); 387 if (unlikely(ret)) 388 return ret; 389 390 flags = sr->msg_flags; 391 if (issue_flags & IO_URING_F_NONBLOCK) 392 flags |= MSG_DONTWAIT; 393 if (flags & MSG_WAITALL) 394 min_ret = iov_iter_count(&msg.msg_iter); 395 396 msg.msg_flags = flags; 397 ret = sock_sendmsg(sock, &msg); 398 if (ret < min_ret) { 399 if (ret == -EAGAIN && (issue_flags & IO_URING_F_NONBLOCK)) 400 return io_setup_async_addr(req, &__address, issue_flags); 401 402 if (ret > 0 && io_net_retry(sock, flags)) { 403 sr->len -= ret; 404 sr->buf += ret; 405 sr->done_io += ret; 406 req->flags |= REQ_F_PARTIAL_IO; 407 return io_setup_async_addr(req, &__address, issue_flags); 408 } 409 if (ret == -ERESTARTSYS) 410 ret = -EINTR; 411 req_set_fail(req); 412 } 413 if (ret >= 0) 414 ret += sr->done_io; 415 else if (sr->done_io) 416 ret = sr->done_io; 417 io_req_set_res(req, ret, 0); 418 return IOU_OK; 419 } 420
diff --git a/io_uring/net.c b/io_uring/net.c index b7f190ca528e..9ec6a77b4e82 100644 --- a/io_uring/net.c +++ b/io_uring/net.c @@ -16,6 +16,7 @@ #include "net.h" #include "notif.h" #include "rsrc.h" +#include "fused_cmd.h" #if defined(CONFIG_NET) struct io_shutdown { @@ -378,7 +379,11 @@ int io_send(struct io_kiocb *req, unsigned int issue_flags) if (unlikely(!sock)) return -ENOTSOCK; - ret = import_ubuf(ITER_SOURCE, sr->buf, sr->len, &msg.msg_iter); + if (!(req->flags & REQ_F_FUSED_SLAVE)) + ret = import_ubuf(ITER_SOURCE, sr->buf, sr->len, &msg.msg_iter); + else + ret = io_import_kbuf_for_slave((u64)sr->buf, sr->len, + ITER_SOURCE, &msg.msg_iter, req); if (unlikely(ret)) return ret; @@ -869,7 +874,11 @@ int io_recv(struct io_kiocb *req, unsigned int issue_flags) sr->buf = buf; } - ret = import_ubuf(ITER_DEST, sr->buf, len, &msg.msg_iter); + if (!(req->flags & REQ_F_FUSED_SLAVE)) + ret = import_ubuf(ITER_DEST, sr->buf, len, &msg.msg_iter); + else + ret = io_import_kbuf_for_slave((u64)sr->buf, sr->len, ITER_DEST, + &msg.msg_iter, req); if (unlikely(ret)) goto out_free; @@ -983,6 +992,9 @@ int io_send_zc_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe) if (zc->flags & IORING_RECVSEND_FIXED_BUF) { unsigned idx = READ_ONCE(sqe->buf_index); + if (req->flags & REQ_F_FUSED_SLAVE) + return -EINVAL; + if (unlikely(idx >= ctx->nr_user_bufs)) return -EFAULT; idx = array_index_nospec(idx, ctx->nr_user_bufs); @@ -1119,8 +1131,15 @@ int io_send_zc(struct io_kiocb *req, unsigned int issue_flags) if (unlikely(ret)) return ret; msg.sg_from_iter = io_sg_from_iter; + } else if (req->flags & REQ_F_FUSED_SLAVE) { + ret = io_import_kbuf_for_slave((u64)zc->buf, zc->len, + ITER_SOURCE, &msg.msg_iter, req); + if (unlikely(ret)) + return ret; + msg.sg_from_iter = io_sg_from_iter; } else { io_notif_set_extended(zc->notif); + ret = import_ubuf(ITER_SOURCE, zc->buf, zc->len, &msg.msg_iter); if (unlikely(ret)) return ret; diff --git a/io_uring/opdef.c b/io_uring/opdef.c index f044629e5475..0a9d39a9db16 100644 --- a/io_uring/opdef.c +++ b/io_uring/opdef.c @@ -271,6 +271,7 @@ const struct io_issue_def io_issue_defs[] = { .audit_skip = 1, .ioprio = 1, .manual_alloc = 1, + .fused_slave = 1, #if defined(CONFIG_NET) .prep = io_sendmsg_prep, .issue = io_send, @@ -285,6 +286,7 @@ const struct io_issue_def io_issue_defs[] = { .buffer_select = 1, .audit_skip = 1, .ioprio = 1, + .fused_slave = 1, #if defined(CONFIG_NET) .prep = io_recvmsg_prep, .issue = io_recv, @@ -411,6 +413,7 @@ const struct io_issue_def io_issue_defs[] = { .audit_skip = 1, .ioprio = 1, .manual_alloc = 1, + .fused_slave = 1, #if defined(CONFIG_NET) .prep = io_send_zc_prep, .issue = io_send_zc,
Start to allow fused slave request to support OP_SEND_ZC/OP_RECV, and the buffer can be retrieved from master request. Once the slave request is completed, the master buffer will be returned back. Signed-off-by: Ming Lei <ming.lei@redhat.com> --- io_uring/net.c | 23 +++++++++++++++++++++-- io_uring/opdef.c | 3 +++ 2 files changed, 24 insertions(+), 2 deletions(-)