Hi Hao, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on f2e030dd7aaea5a937a2547dc980fab418fbc5e7] url: https://github.com/intel-lab-lkp/linux/commits/Hao-Xu/fast-poll-multishot-mode/20220506-150750 base: f2e030dd7aaea5a937a2547dc980fab418fbc5e7 config: x86_64-randconfig-s021 (https://download.01.org/0day-ci/archive/20220507/202205070134.WJEE4sX5-lkp@xxxxxxxxx/config) compiler: gcc-11 (Debian 11.2.0-20) 11.2.0 reproduce: # apt-get install sparse # sparse version: v0.6.4-dirty # https://github.com/intel-lab-lkp/linux/commit/6001c3e95550875d4328aa2ca8b342c42b0e644e git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Hao-Xu/fast-poll-multishot-mode/20220506-150750 git checkout 6001c3e95550875d4328aa2ca8b342c42b0e644e # save the config file mkdir build_dir && cp config build_dir/.config make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=x86_64 SHELL=/bin/bash If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <lkp@xxxxxxxxx> sparse warnings: (new ones prefixed by >>) fs/io_uring.c: note: in included file (through include/trace/trace_events.h, include/trace/define_trace.h, include/trace/events/io_uring.h): include/trace/events/io_uring.h:488:1: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned int [usertype] op_flags @@ got restricted __kernel_rwf_t const [usertype] rw_flags @@ include/trace/events/io_uring.h:488:1: sparse: expected unsigned int [usertype] op_flags include/trace/events/io_uring.h:488:1: sparse: got restricted __kernel_rwf_t const [usertype] rw_flags fs/io_uring.c: note: in included file (through include/trace/perf.h, include/trace/define_trace.h, include/trace/events/io_uring.h): include/trace/events/io_uring.h:488:1: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned int [usertype] op_flags @@ got restricted __kernel_rwf_t const [usertype] rw_flags @@ include/trace/events/io_uring.h:488:1: sparse: expected unsigned int [usertype] op_flags include/trace/events/io_uring.h:488:1: sparse: got restricted __kernel_rwf_t const [usertype] rw_flags fs/io_uring.c:3280:23: sparse: sparse: incorrect type in assignment (different base types) @@ expected unsigned int [usertype] flags @@ got restricted __kernel_rwf_t @@ fs/io_uring.c:3280:23: sparse: expected unsigned int [usertype] flags fs/io_uring.c:3280:23: sparse: got restricted __kernel_rwf_t fs/io_uring.c:3477:24: sparse: sparse: incorrect type in return expression (different address spaces) @@ expected void [noderef] __user * @@ got struct io_buffer *[assigned] kbuf @@ fs/io_uring.c:3477:24: sparse: expected void [noderef] __user * fs/io_uring.c:3477:24: sparse: got struct io_buffer *[assigned] kbuf fs/io_uring.c:3864:48: sparse: sparse: incorrect type in argument 2 (different base types) @@ expected restricted __kernel_rwf_t [usertype] flags @@ got unsigned int [usertype] flags @@ fs/io_uring.c:3864:48: sparse: expected restricted __kernel_rwf_t [usertype] flags fs/io_uring.c:3864:48: sparse: got unsigned int [usertype] flags fs/io_uring.c:5187:14: sparse: sparse: incorrect type in assignment (different address spaces) @@ expected struct file *file @@ got struct file [noderef] __rcu * @@ fs/io_uring.c:5187:14: sparse: expected struct file *file fs/io_uring.c:5187:14: sparse: got struct file [noderef] __rcu * fs/io_uring.c:5974:68: sparse: sparse: incorrect type in initializer (different base types) @@ expected restricted __poll_t [usertype] _key @@ got int apoll_events @@ fs/io_uring.c:5974:68: sparse: expected restricted __poll_t [usertype] _key fs/io_uring.c:5974:68: sparse: got int apoll_events fs/io_uring.c:5979:48: sparse: sparse: restricted __poll_t degrades to integer fs/io_uring.c:5983:59: sparse: sparse: restricted __poll_t degrades to integer fs/io_uring.c:5991:74: sparse: sparse: incorrect type in argument 1 (different base types) @@ expected restricted __poll_t [usertype] val @@ got int @@ fs/io_uring.c:5991:74: sparse: expected restricted __poll_t [usertype] val fs/io_uring.c:5991:74: sparse: got int fs/io_uring.c:5991:60: sparse: sparse: incorrect type in initializer (different base types) @@ expected restricted __poll_t [usertype] mask @@ got unsigned short @@ fs/io_uring.c:5991:60: sparse: expected restricted __poll_t [usertype] mask fs/io_uring.c:5991:60: sparse: got unsigned short fs/io_uring.c:5997:58: sparse: sparse: incorrect type in argument 3 (different base types) @@ expected signed int [usertype] res @@ got restricted __poll_t [usertype] mask @@ fs/io_uring.c:5997:58: sparse: expected signed int [usertype] res fs/io_uring.c:5997:58: sparse: got restricted __poll_t [usertype] mask fs/io_uring.c:6027:68: sparse: sparse: restricted __poll_t degrades to integer fs/io_uring.c:6027:57: sparse: sparse: incorrect type in argument 1 (different base types) @@ expected restricted __poll_t [usertype] val @@ got unsigned int @@ fs/io_uring.c:6027:57: sparse: expected restricted __poll_t [usertype] val fs/io_uring.c:6027:57: sparse: got unsigned int fs/io_uring.c:6108:45: sparse: sparse: incorrect type in argument 3 (different base types) @@ expected int events @@ got restricted __poll_t [usertype] events @@ fs/io_uring.c:6108:45: sparse: expected int events fs/io_uring.c:6108:45: sparse: got restricted __poll_t [usertype] events fs/io_uring.c:6143:40: sparse: sparse: incorrect type in argument 2 (different base types) @@ expected int mask @@ got restricted __poll_t [usertype] mask @@ fs/io_uring.c:6143:40: sparse: expected int mask fs/io_uring.c:6143:40: sparse: got restricted __poll_t [usertype] mask fs/io_uring.c:6143:50: sparse: sparse: incorrect type in argument 3 (different base types) @@ expected int events @@ got restricted __poll_t [usertype] events @@ fs/io_uring.c:6143:50: sparse: expected int events fs/io_uring.c:6143:50: sparse: got restricted __poll_t [usertype] events fs/io_uring.c:6235:24: sparse: sparse: incorrect type in return expression (different base types) @@ expected int @@ got restricted __poll_t [assigned] [usertype] mask @@ fs/io_uring.c:6235:24: sparse: expected int fs/io_uring.c:6235:24: sparse: got restricted __poll_t [assigned] [usertype] mask fs/io_uring.c:6252:40: sparse: sparse: incorrect type in argument 2 (different base types) @@ expected int mask @@ got restricted __poll_t [assigned] [usertype] mask @@ fs/io_uring.c:6252:40: sparse: expected int mask fs/io_uring.c:6252:40: sparse: got restricted __poll_t [assigned] [usertype] mask fs/io_uring.c:6252:50: sparse: sparse: incorrect type in argument 3 (different base types) @@ expected int events @@ got restricted __poll_t [usertype] events @@ fs/io_uring.c:6252:50: sparse: expected int events fs/io_uring.c:6252:50: sparse: got restricted __poll_t [usertype] events fs/io_uring.c:6262:47: sparse: sparse: incorrect type in argument 3 (different base types) @@ expected int events @@ got restricted __poll_t [usertype] events @@ fs/io_uring.c:6262:47: sparse: expected int events fs/io_uring.c:6262:47: sparse: got restricted __poll_t [usertype] events >> fs/io_uring.c:6287:33: sparse: sparse: incorrect type in initializer (different base types) @@ expected restricted __poll_t [usertype] mask @@ got int @@ fs/io_uring.c:6287:33: sparse: expected restricted __poll_t [usertype] mask fs/io_uring.c:6287:33: sparse: got int fs/io_uring.c:6300:22: sparse: sparse: invalid assignment: |= fs/io_uring.c:6300:22: sparse: left side has type restricted __poll_t fs/io_uring.c:6300:22: sparse: right side has type int fs/io_uring.c:6305:30: sparse: sparse: invalid assignment: &= fs/io_uring.c:6305:30: sparse: left side has type restricted __poll_t fs/io_uring.c:6305:30: sparse: right side has type int fs/io_uring.c:6307:22: sparse: sparse: invalid assignment: |= fs/io_uring.c:6307:22: sparse: left side has type restricted __poll_t fs/io_uring.c:6307:22: sparse: right side has type int fs/io_uring.c:6335:33: sparse: sparse: incorrect type in argument 5 (different base types) @@ expected int mask @@ got restricted __poll_t [assigned] [usertype] mask @@ fs/io_uring.c:6335:33: sparse: expected int mask fs/io_uring.c:6335:33: sparse: got restricted __poll_t [assigned] [usertype] mask fs/io_uring.c:6335:50: sparse: sparse: incorrect type in argument 6 (different base types) @@ expected int events @@ got restricted __poll_t [usertype] events @@ fs/io_uring.c:6335:50: sparse: expected int events fs/io_uring.c:6335:50: sparse: got restricted __poll_t [usertype] events fs/io_uring.c:6449:24: sparse: sparse: invalid assignment: |= fs/io_uring.c:6449:24: sparse: left side has type unsigned int fs/io_uring.c:6449:24: sparse: right side has type restricted __poll_t fs/io_uring.c:6450:65: sparse: sparse: restricted __poll_t degrades to integer fs/io_uring.c:6450:29: sparse: sparse: restricted __poll_t degrades to integer fs/io_uring.c:6450:38: sparse: sparse: incorrect type in return expression (different base types) @@ expected restricted __poll_t @@ got unsigned int @@ fs/io_uring.c:6450:38: sparse: expected restricted __poll_t fs/io_uring.c:6450:38: sparse: got unsigned int fs/io_uring.c:6502:27: sparse: sparse: incorrect type in assignment (different base types) @@ expected int apoll_events @@ got restricted __poll_t [usertype] events @@ fs/io_uring.c:6502:27: sparse: expected int apoll_events fs/io_uring.c:6502:27: sparse: got restricted __poll_t [usertype] events fs/io_uring.c:6541:43: sparse: sparse: invalid assignment: &= fs/io_uring.c:6541:43: sparse: left side has type restricted __poll_t fs/io_uring.c:6541:43: sparse: right side has type int fs/io_uring.c:6542:62: sparse: sparse: restricted __poll_t degrades to integer fs/io_uring.c:6542:43: sparse: sparse: invalid assignment: |= fs/io_uring.c:6542:43: sparse: left side has type restricted __poll_t fs/io_uring.c:6542:43: sparse: right side has type unsigned int fs/io_uring.c:2536:17: sparse: sparse: context imbalance in 'handle_prev_tw_list' - different lock contexts for basic block fs/io_uring.c:7610:39: sparse: sparse: marked inline, but without a definition fs/io_uring.c:7610:39: sparse: sparse: marked inline, but without a definition fs/io_uring.c:7610:39: sparse: sparse: marked inline, but without a definition fs/io_uring.c:7610:39: sparse: sparse: marked inline, but without a definition vim +6287 fs/io_uring.c 6280 6281 static int io_arm_poll_handler(struct io_kiocb *req, unsigned issue_flags) 6282 { 6283 const struct io_op_def *def = &io_op_defs[req->opcode]; 6284 struct io_ring_ctx *ctx = req->ctx; 6285 struct async_poll *apoll; 6286 struct io_poll_table ipt; > 6287 __poll_t mask = POLLERR | POLLPRI; 6288 int ret; 6289 6290 if (!def->pollin && !def->pollout) 6291 return IO_APOLL_ABORTED; 6292 if (!file_can_poll(req->file)) 6293 return IO_APOLL_ABORTED; 6294 if ((req->flags & (REQ_F_POLLED|REQ_F_PARTIAL_IO)) == REQ_F_POLLED) 6295 return IO_APOLL_ABORTED; 6296 if (!(req->flags & REQ_F_APOLL_MULTISHOT)) 6297 mask |= EPOLLONESHOT; 6298 6299 if (def->pollin) { 6300 mask |= POLLIN | POLLRDNORM; 6301 6302 /* If reading from MSG_ERRQUEUE using recvmsg, ignore POLLIN */ 6303 if ((req->opcode == IORING_OP_RECVMSG) && 6304 (req->sr_msg.msg_flags & MSG_ERRQUEUE)) 6305 mask &= ~POLLIN; 6306 } else { 6307 mask |= POLLOUT | POLLWRNORM; 6308 } 6309 if (def->poll_exclusive) 6310 mask |= EPOLLEXCLUSIVE; 6311 if (req->flags & REQ_F_POLLED) { 6312 apoll = req->apoll; 6313 } else if (!(issue_flags & IO_URING_F_UNLOCKED) && 6314 !list_empty(&ctx->apoll_cache)) { 6315 apoll = list_first_entry(&ctx->apoll_cache, struct async_poll, 6316 poll.wait.entry); 6317 list_del_init(&apoll->poll.wait.entry); 6318 } else { 6319 apoll = kmalloc(sizeof(*apoll), GFP_ATOMIC); 6320 if (unlikely(!apoll)) 6321 return IO_APOLL_ABORTED; 6322 } 6323 apoll->double_poll = NULL; 6324 req->apoll = apoll; 6325 req->flags |= REQ_F_POLLED; 6326 ipt.pt._qproc = io_async_queue_proc; 6327 6328 io_kbuf_recycle(req, issue_flags); 6329 6330 ret = __io_arm_poll_handler(req, &apoll->poll, &ipt, mask); 6331 if (ret || ipt.error) 6332 return ret ? IO_APOLL_READY : IO_APOLL_ABORTED; 6333 6334 trace_io_uring_poll_arm(ctx, req, req->cqe.user_data, req->opcode, 6335 mask, apoll->poll.events); 6336 return IO_APOLL_OK; 6337 } 6338 -- 0-DAY CI Kernel Test Service https://01.org/lkp