diff options
| author | Jonathan Cameron <Jonathan.Cameron@huawei.com> | 2025-09-13 15:00:48 +0100 | 
|---|---|---|
| committer | Jonathan Cameron <Jonathan.Cameron@huawei.com> | 2025-09-13 15:00:48 +0100 | 
| commit | 421d4487ef2ead206f57a8950ea9bdd1f7a7b39a (patch) | |
| tree | b679546eeaa70f88b5c8d6caeb79e214efb68121 /io_uring | |
| parent | 3422b4bc606eee2ba7758ea9347c83332eeec3e3 (diff) | |
| parent | 1b237f190eb3d36f52dffe07a40b5eb210280e00 (diff) | |
Merge tag 'v6.17-rc3' into togreg
Linux 6.17-rc3
Diffstat (limited to 'io_uring')
| -rw-r--r-- | io_uring/futex.c | 3 | ||||
| -rw-r--r-- | io_uring/io-wq.c | 8 | ||||
| -rw-r--r-- | io_uring/io_uring.c | 1 | ||||
| -rw-r--r-- | io_uring/net.c | 27 | 
4 files changed, 27 insertions, 12 deletions
| diff --git a/io_uring/futex.c b/io_uring/futex.c index 692462d50c8c..9113a44984f3 100644 --- a/io_uring/futex.c +++ b/io_uring/futex.c @@ -288,6 +288,7 @@ int io_futex_wait(struct io_kiocb *req, unsigned int issue_flags)  		goto done_unlock;  	} +	req->flags |= REQ_F_ASYNC_DATA;  	req->async_data = ifd;  	ifd->q = futex_q_init;  	ifd->q.bitset = iof->futex_mask; @@ -309,6 +310,8 @@ done:  	if (ret < 0)  		req_set_fail(req);  	io_req_set_res(req, ret, 0); +	req->async_data = NULL; +	req->flags &= ~REQ_F_ASYNC_DATA;  	kfree(ifd);  	return IOU_COMPLETE;  } diff --git a/io_uring/io-wq.c b/io_uring/io-wq.c index be91edf34f01..17dfaa0395c4 100644 --- a/io_uring/io-wq.c +++ b/io_uring/io-wq.c @@ -357,6 +357,13 @@ static void create_worker_cb(struct callback_head *cb)  	worker = container_of(cb, struct io_worker, create_work);  	wq = worker->wq;  	acct = worker->acct; + +	rcu_read_lock(); +	do_create = !io_acct_activate_free_worker(acct); +	rcu_read_unlock(); +	if (!do_create) +		goto no_need_create; +  	raw_spin_lock(&acct->workers_lock);  	if (acct->nr_workers < acct->max_workers) { @@ -367,6 +374,7 @@ static void create_worker_cb(struct callback_head *cb)  	if (do_create) {  		create_io_worker(wq, acct);  	} else { +no_need_create:  		atomic_dec(&acct->nr_running);  		io_worker_ref_put(wq);  	} diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c index 4ef69dd58734..93633613a165 100644 --- a/io_uring/io_uring.c +++ b/io_uring/io_uring.c @@ -2119,6 +2119,7 @@ static int io_init_req(struct io_ring_ctx *ctx, struct io_kiocb *req,  	req->file = NULL;  	req->tctx = current->io_uring;  	req->cancel_seq_set = false; +	req->async_data = NULL;  	if (unlikely(opcode >= IORING_OP_LAST)) {  		req->opcode = 0; diff --git a/io_uring/net.c b/io_uring/net.c index dd96e355982f..d69f2afa4f7a 100644 --- a/io_uring/net.c +++ b/io_uring/net.c @@ -494,6 +494,15 @@ static int io_bundle_nbufs(struct io_async_msghdr *kmsg, int ret)  	return nbufs;  } +static int io_net_kbuf_recyle(struct io_kiocb *req, +			      struct io_async_msghdr *kmsg, int len) +{ +	req->flags |= REQ_F_BL_NO_RECYCLE; +	if (req->flags & REQ_F_BUFFERS_COMMIT) +		io_kbuf_commit(req, req->buf_list, len, io_bundle_nbufs(kmsg, len)); +	return IOU_RETRY; +} +  static inline bool io_send_finish(struct io_kiocb *req, int *ret,  				  struct io_async_msghdr *kmsg,  				  unsigned issue_flags) @@ -562,8 +571,7 @@ int io_sendmsg(struct io_kiocb *req, unsigned int issue_flags)  			kmsg->msg.msg_controllen = 0;  			kmsg->msg.msg_control = NULL;  			sr->done_io += ret; -			req->flags |= REQ_F_BL_NO_RECYCLE; -			return -EAGAIN; +			return io_net_kbuf_recyle(req, kmsg, ret);  		}  		if (ret == -ERESTARTSYS)  			ret = -EINTR; @@ -674,8 +682,7 @@ retry_bundle:  			sr->len -= ret;  			sr->buf += ret;  			sr->done_io += ret; -			req->flags |= REQ_F_BL_NO_RECYCLE; -			return -EAGAIN; +			return io_net_kbuf_recyle(req, kmsg, ret);  		}  		if (ret == -ERESTARTSYS)  			ret = -EINTR; @@ -1071,8 +1078,7 @@ retry_multishot:  		}  		if (ret > 0 && io_net_retry(sock, flags)) {  			sr->done_io += ret; -			req->flags |= REQ_F_BL_NO_RECYCLE; -			return IOU_RETRY; +			return io_net_kbuf_recyle(req, kmsg, ret);  		}  		if (ret == -ERESTARTSYS)  			ret = -EINTR; @@ -1218,8 +1224,7 @@ retry_multishot:  			sr->len -= ret;  			sr->buf += ret;  			sr->done_io += ret; -			req->flags |= REQ_F_BL_NO_RECYCLE; -			return -EAGAIN; +			return io_net_kbuf_recyle(req, kmsg, ret);  		}  		if (ret == -ERESTARTSYS)  			ret = -EINTR; @@ -1500,8 +1505,7 @@ int io_send_zc(struct io_kiocb *req, unsigned int issue_flags)  			zc->len -= ret;  			zc->buf += ret;  			zc->done_io += ret; -			req->flags |= REQ_F_BL_NO_RECYCLE; -			return -EAGAIN; +			return io_net_kbuf_recyle(req, kmsg, ret);  		}  		if (ret == -ERESTARTSYS)  			ret = -EINTR; @@ -1571,8 +1575,7 @@ int io_sendmsg_zc(struct io_kiocb *req, unsigned int issue_flags)  		if (ret > 0 && io_net_retry(sock, flags)) {  			sr->done_io += ret; -			req->flags |= REQ_F_BL_NO_RECYCLE; -			return -EAGAIN; +			return io_net_kbuf_recyle(req, kmsg, ret);  		}  		if (ret == -ERESTARTSYS)  			ret = -EINTR; | 
