From: Jens Axboe <[email protected]>
To: Peter Zijlstra <[email protected]>
Cc: [email protected], [email protected],
[email protected]
Subject: Re: [PATCH 06/10] io_uring: add support for futex wake and wait
Date: Tue, 25 Jul 2023 15:24:30 -0600 [thread overview]
Message-ID: <[email protected]> (raw)
In-Reply-To: <[email protected]>
On 7/25/23 2:42?PM, Jens Axboe wrote:
> On 7/25/23 9:19?AM, Peter Zijlstra wrote:
>> On Tue, Jul 25, 2023 at 07:57:28AM -0600, Jens Axboe wrote:
>>
>>> Something like the below - totally untested, but just to show what I
>>> mean. Will need to get split and folded into the two separate patches.
>>> Will test and fold them later today.
>>>
>>>
>>> diff --git a/io_uring/futex.c b/io_uring/futex.c
>>> index 4c9f2c841b98..b0f90154d974 100644
>>> --- a/io_uring/futex.c
>>> +++ b/io_uring/futex.c
>>> @@ -168,7 +168,7 @@ bool io_futex_remove_all(struct io_ring_ctx *ctx, struct task_struct *task,
>>> return found;
>>> }
>>>
>>> -int io_futex_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
>>> +static int __io_futex_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
>>> {
>>> struct io_futex *iof = io_kiocb_to_cmd(req, struct io_futex);
>>> u32 flags;
>>> @@ -179,9 +179,6 @@ int io_futex_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
>>> iof->uaddr = u64_to_user_ptr(READ_ONCE(sqe->addr));
>>> iof->futex_val = READ_ONCE(sqe->addr2);
>>> iof->futex_mask = READ_ONCE(sqe->addr3);
>>> - iof->futex_nr = READ_ONCE(sqe->len);
>>> - if (iof->futex_nr && req->opcode != IORING_OP_FUTEX_WAITV)
>>> - return -EINVAL;
>>>
>>> flags = READ_ONCE(sqe->futex_flags);
>>> if (flags & ~FUTEX2_MASK)
>>> @@ -191,14 +188,36 @@ int io_futex_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
>>> if (!futex_flags_valid(iof->futex_flags))
>>> return -EINVAL;
>>>
>>> - if (!futex_validate_input(iof->futex_flags, iof->futex_val) ||
>>> - !futex_validate_input(iof->futex_flags, iof->futex_mask))
>>> + if (!futex_validate_input(iof->futex_flags, iof->futex_mask))
>>> return -EINVAL;
>>>
>>> - iof->futexv_owned = 0;
>>> return 0;
>>> }
>>
>> I think you can/should split more into io_futex_prep(), specifically
>> waitv should also have zero @val and @mask.
>
> Yep, I'll include that. Updating them now...
It ends up just being this incremental for the very last patch, moving
all the waitv related prep to the wait prep and not relying on the
non-vectored one at all.
diff --git a/io_uring/futex.c b/io_uring/futex.c
index 4c9f2c841b98..e885aac12df8 100644
--- a/io_uring/futex.c
+++ b/io_uring/futex.c
@@ -179,9 +179,6 @@ int io_futex_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
iof->uaddr = u64_to_user_ptr(READ_ONCE(sqe->addr));
iof->futex_val = READ_ONCE(sqe->addr2);
iof->futex_mask = READ_ONCE(sqe->addr3);
- iof->futex_nr = READ_ONCE(sqe->len);
- if (iof->futex_nr && req->opcode != IORING_OP_FUTEX_WAITV)
- return -EINVAL;
flags = READ_ONCE(sqe->futex_flags);
if (flags & ~FUTEX2_MASK)
@@ -195,7 +192,6 @@ int io_futex_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
!futex_validate_input(iof->futex_flags, iof->futex_mask))
return -EINVAL;
- iof->futexv_owned = 0;
return 0;
}
@@ -220,10 +216,13 @@ int io_futexv_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
struct futex_vector *futexv;
int ret;
- ret = io_futex_prep(req, sqe);
- if (ret)
- return ret;
+ /* No flags or mask supported for waitv */
+ if (unlikely(sqe->fd || sqe->buf_index || sqe->file_index ||
+ sqe->addr2 || sqe->addr3))
+ return -EINVAL;
+ iof->uaddr = u64_to_user_ptr(READ_ONCE(sqe->addr));
+ iof->futex_nr = READ_ONCE(sqe->len);
if (!iof->futex_nr || iof->futex_nr > FUTEX_WAITV_MAX)
return -EINVAL;
@@ -238,6 +237,7 @@ int io_futexv_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe)
return ret;
}
+ iof->futexv_owned = 0;
req->flags |= REQ_F_ASYNC_DATA;
req->async_data = futexv;
return 0;
--
Jens Axboe
next prev parent reply other threads:[~2023-07-25 21:24 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-20 22:18 [PATCHSET v3 0/10] Add io_uring futex/futexv support Jens Axboe
2023-07-20 22:18 ` [PATCH 01/10] futex: Clarify FUTEX2 flags Jens Axboe
2023-07-20 22:18 ` [PATCH 02/10] futex: Extend the " Jens Axboe
2023-07-20 22:18 ` [PATCH 03/10] futex: Flag conversion Jens Axboe
2023-07-20 22:18 ` [PATCH 04/10] futex: factor out the futex wake handling Jens Axboe
2023-07-20 22:18 ` [PATCH 05/10] futex: abstract out a __futex_wake_mark() helper Jens Axboe
2023-07-20 22:18 ` [PATCH 06/10] io_uring: add support for futex wake and wait Jens Axboe
2023-07-21 11:30 ` Peter Zijlstra
2023-07-21 11:37 ` Peter Zijlstra
2023-07-21 14:43 ` Jens Axboe
2023-07-21 15:29 ` Jens Axboe
2023-07-25 13:00 ` Peter Zijlstra
2023-07-25 13:48 ` Jens Axboe
2023-07-25 13:57 ` Jens Axboe
2023-07-25 15:19 ` Peter Zijlstra
2023-07-25 20:42 ` Jens Axboe
2023-07-25 21:24 ` Jens Axboe [this message]
2023-07-25 14:06 ` Peter Zijlstra
2023-07-20 22:18 ` [PATCH 07/10] futex: add wake_data to struct futex_q Jens Axboe
2023-07-20 22:18 ` [PATCH 08/10] futex: make futex_parse_waitv() available as a helper Jens Axboe
2023-07-20 22:18 ` [PATCH 09/10] futex: make the vectored futex operations available Jens Axboe
2023-07-20 22:18 ` [PATCH 10/10] io_uring: add support for vectored futex waits Jens Axboe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox