* [PATCH 0/4] random setup cleanups
@ 2025-11-10 13:04 Pavel Begunkov
2025-11-10 13:04 ` [PATCH 1/4] io_uring: add helper calculating region byte size Pavel Begunkov
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: Pavel Begunkov @ 2025-11-10 13:04 UTC (permalink / raw)
To: io-uring; +Cc: asml.silence
Simple cleanups extracted from another series. Nothing noteworthy
apart from that I needed Patch 1 in a couple of places already,
but it's still a good follow up to recent fixes.
Pavel Begunkov (4):
io_uring: add helper calculating region byte size
io_uring: pass sq entires in the params struct
io_uring: use mem_is_zero to check ring params
io_uring: move flags check to io_uring_sanitise_params
io_uring/io_uring.c | 22 ++++++++++++----------
io_uring/io_uring.h | 2 +-
io_uring/memmap.c | 4 ++--
io_uring/memmap.h | 5 +++++
io_uring/register.c | 2 +-
5 files changed, 21 insertions(+), 14 deletions(-)
--
2.49.0
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/4] io_uring: add helper calculating region byte size
2025-11-10 13:04 [PATCH 0/4] random setup cleanups Pavel Begunkov
@ 2025-11-10 13:04 ` Pavel Begunkov
2025-11-10 13:04 ` [PATCH 2/4] io_uring: pass sq entires in the params struct Pavel Begunkov
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Pavel Begunkov @ 2025-11-10 13:04 UTC (permalink / raw)
To: io-uring; +Cc: asml.silence
There has been type related issues with region size calculation, add an
utility helper function that returns the size and handles type
conversions right.
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
io_uring/memmap.c | 4 ++--
io_uring/memmap.h | 5 +++++
2 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/io_uring/memmap.c b/io_uring/memmap.c
index 24da17a5f08f..dc4bfc5b6fb8 100644
--- a/io_uring/memmap.c
+++ b/io_uring/memmap.c
@@ -134,7 +134,7 @@ static int io_region_init_ptr(struct io_mapped_region *mr)
static int io_region_pin_pages(struct io_mapped_region *mr,
struct io_uring_region_desc *reg)
{
- unsigned long size = mr->nr_pages << PAGE_SHIFT;
+ size_t size = io_region_size(mr);
struct page **pages;
int nr_pages;
@@ -154,7 +154,7 @@ static int io_region_allocate_pages(struct io_mapped_region *mr,
unsigned long mmap_offset)
{
gfp_t gfp = GFP_KERNEL_ACCOUNT | __GFP_ZERO | __GFP_NOWARN;
- size_t size = (size_t) mr->nr_pages << PAGE_SHIFT;
+ size_t size = io_region_size(mr);
unsigned long nr_allocated;
struct page **pages;
diff --git a/io_uring/memmap.h b/io_uring/memmap.h
index a6c63ca2c6f1..d2a940682d19 100644
--- a/io_uring/memmap.h
+++ b/io_uring/memmap.h
@@ -43,4 +43,9 @@ static inline void io_region_publish(struct io_ring_ctx *ctx,
*dst_region = *src_region;
}
+static inline size_t io_region_size(struct io_mapped_region *mr)
+{
+ return (size_t)mr->nr_pages << PAGE_SHIFT;
+}
+
#endif
--
2.49.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/4] io_uring: pass sq entires in the params struct
2025-11-10 13:04 [PATCH 0/4] random setup cleanups Pavel Begunkov
2025-11-10 13:04 ` [PATCH 1/4] io_uring: add helper calculating region byte size Pavel Begunkov
@ 2025-11-10 13:04 ` Pavel Begunkov
2025-11-10 13:04 ` [PATCH 3/4] io_uring: use mem_is_zero to check ring params Pavel Begunkov
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Pavel Begunkov @ 2025-11-10 13:04 UTC (permalink / raw)
To: io-uring; +Cc: asml.silence
There is no need to pass the user requested number of SQ entries
separately from the main parameter structure io_uring_params. Initialise
it at the beginning and stop passing it in favour of struct
io_uring_params::sq_entries.
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
io_uring/io_uring.c | 11 +++++++----
io_uring/io_uring.h | 2 +-
io_uring/register.c | 2 +-
3 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c
index d11d0e9723a1..023b0e3a829c 100644
--- a/io_uring/io_uring.c
+++ b/io_uring/io_uring.c
@@ -3479,8 +3479,10 @@ static int io_uring_sanitise_params(struct io_uring_params *p)
return 0;
}
-int io_uring_fill_params(unsigned entries, struct io_uring_params *p)
+int io_uring_fill_params(struct io_uring_params *p)
{
+ unsigned entries = p->sq_entries;
+
if (!entries)
return -EINVAL;
if (entries > IORING_MAX_ENTRIES) {
@@ -3542,7 +3544,7 @@ int io_uring_fill_params(unsigned entries, struct io_uring_params *p)
return 0;
}
-static __cold int io_uring_create(unsigned entries, struct io_uring_params *p,
+static __cold int io_uring_create(struct io_uring_params *p,
struct io_uring_params __user *params)
{
struct io_ring_ctx *ctx;
@@ -3554,7 +3556,7 @@ static __cold int io_uring_create(unsigned entries, struct io_uring_params *p,
if (ret)
return ret;
- ret = io_uring_fill_params(entries, p);
+ ret = io_uring_fill_params(p);
if (unlikely(ret))
return ret;
@@ -3693,7 +3695,8 @@ static long io_uring_setup(u32 entries, struct io_uring_params __user *params)
if (p.flags & ~IORING_SETUP_FLAGS)
return -EINVAL;
- return io_uring_create(entries, &p, params);
+ p.sq_entries = entries;
+ return io_uring_create(&p, params);
}
static inline int io_uring_allowed(void)
diff --git a/io_uring/io_uring.h b/io_uring/io_uring.h
index 23c268ab1c8f..b2251446497a 100644
--- a/io_uring/io_uring.h
+++ b/io_uring/io_uring.h
@@ -136,7 +136,7 @@ static inline bool io_should_wake(struct io_wait_queue *iowq)
unsigned long rings_size(unsigned int flags, unsigned int sq_entries,
unsigned int cq_entries, size_t *sq_offset);
-int io_uring_fill_params(unsigned entries, struct io_uring_params *p);
+int io_uring_fill_params(struct io_uring_params *p);
bool io_cqe_cache_refill(struct io_ring_ctx *ctx, bool overflow, bool cqe32);
int io_run_task_work_sig(struct io_ring_ctx *ctx);
int io_run_local_work(struct io_ring_ctx *ctx, int min_events, int max_events);
diff --git a/io_uring/register.c b/io_uring/register.c
index 023f5e7a18da..afb924ceb9b6 100644
--- a/io_uring/register.c
+++ b/io_uring/register.c
@@ -416,7 +416,7 @@ static int io_register_resize_rings(struct io_ring_ctx *ctx, void __user *arg)
/* properties that are always inherited */
p.flags |= (ctx->flags & COPY_FLAGS);
- ret = io_uring_fill_params(p.sq_entries, &p);
+ ret = io_uring_fill_params(&p);
if (unlikely(ret))
return ret;
--
2.49.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 3/4] io_uring: use mem_is_zero to check ring params
2025-11-10 13:04 [PATCH 0/4] random setup cleanups Pavel Begunkov
2025-11-10 13:04 ` [PATCH 1/4] io_uring: add helper calculating region byte size Pavel Begunkov
2025-11-10 13:04 ` [PATCH 2/4] io_uring: pass sq entires in the params struct Pavel Begunkov
@ 2025-11-10 13:04 ` Pavel Begunkov
2025-11-10 13:04 ` [PATCH 4/4] io_uring: move flags check to io_uring_sanitise_params Pavel Begunkov
2025-11-10 22:02 ` [PATCH 0/4] random setup cleanups Jens Axboe
4 siblings, 0 replies; 6+ messages in thread
From: Pavel Begunkov @ 2025-11-10 13:04 UTC (permalink / raw)
To: io-uring; +Cc: asml.silence
mem_is_zero() does the job without hand rolled loops, use that to verify
reserved fields of ring params.
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
io_uring/io_uring.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c
index 023b0e3a829c..af7b4cbe9850 100644
--- a/io_uring/io_uring.c
+++ b/io_uring/io_uring.c
@@ -3684,14 +3684,12 @@ static __cold int io_uring_create(struct io_uring_params *p,
static long io_uring_setup(u32 entries, struct io_uring_params __user *params)
{
struct io_uring_params p;
- int i;
if (copy_from_user(&p, params, sizeof(p)))
return -EFAULT;
- for (i = 0; i < ARRAY_SIZE(p.resv); i++) {
- if (p.resv[i])
- return -EINVAL;
- }
+
+ if (!mem_is_zero(&p.resv, sizeof(p.resv)))
+ return -EINVAL;
if (p.flags & ~IORING_SETUP_FLAGS)
return -EINVAL;
--
2.49.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 4/4] io_uring: move flags check to io_uring_sanitise_params
2025-11-10 13:04 [PATCH 0/4] random setup cleanups Pavel Begunkov
` (2 preceding siblings ...)
2025-11-10 13:04 ` [PATCH 3/4] io_uring: use mem_is_zero to check ring params Pavel Begunkov
@ 2025-11-10 13:04 ` Pavel Begunkov
2025-11-10 22:02 ` [PATCH 0/4] random setup cleanups Jens Axboe
4 siblings, 0 replies; 6+ messages in thread
From: Pavel Begunkov @ 2025-11-10 13:04 UTC (permalink / raw)
To: io-uring; +Cc: asml.silence
io_uring_sanitise_params() sanitises most of the setup flags invariants,
move the IORING_SETUP_FLAGS check from io_uring_setup() into it.
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
---
io_uring/io_uring.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/io_uring/io_uring.c b/io_uring/io_uring.c
index af7b4cbe9850..7e069d56b8a1 100644
--- a/io_uring/io_uring.c
+++ b/io_uring/io_uring.c
@@ -3430,6 +3430,9 @@ static int io_uring_sanitise_params(struct io_uring_params *p)
{
unsigned flags = p->flags;
+ if (flags & ~IORING_SETUP_FLAGS)
+ return -EINVAL;
+
/* There is no way to mmap rings without a real fd */
if ((flags & IORING_SETUP_REGISTERED_FD_ONLY) &&
!(flags & IORING_SETUP_NO_MMAP))
@@ -3691,8 +3694,6 @@ static long io_uring_setup(u32 entries, struct io_uring_params __user *params)
if (!mem_is_zero(&p.resv, sizeof(p.resv)))
return -EINVAL;
- if (p.flags & ~IORING_SETUP_FLAGS)
- return -EINVAL;
p.sq_entries = entries;
return io_uring_create(&p, params);
}
--
2.49.0
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 0/4] random setup cleanups
2025-11-10 13:04 [PATCH 0/4] random setup cleanups Pavel Begunkov
` (3 preceding siblings ...)
2025-11-10 13:04 ` [PATCH 4/4] io_uring: move flags check to io_uring_sanitise_params Pavel Begunkov
@ 2025-11-10 22:02 ` Jens Axboe
4 siblings, 0 replies; 6+ messages in thread
From: Jens Axboe @ 2025-11-10 22:02 UTC (permalink / raw)
To: io-uring, Pavel Begunkov
On Mon, 10 Nov 2025 13:04:48 +0000, Pavel Begunkov wrote:
> Simple cleanups extracted from another series. Nothing noteworthy
> apart from that I needed Patch 1 in a couple of places already,
> but it's still a good follow up to recent fixes.
>
> Pavel Begunkov (4):
> io_uring: add helper calculating region byte size
> io_uring: pass sq entires in the params struct
> io_uring: use mem_is_zero to check ring params
> io_uring: move flags check to io_uring_sanitise_params
>
> [...]
Applied, thanks!
[1/4] io_uring: add helper calculating region byte size
commit: c5b09a6d1dfab3ac97230cc91a32d19a8f692232
[2/4] io_uring: pass sq entires in the params struct
(no commit info)
[3/4] io_uring: use mem_is_zero to check ring params
commit: 44d5ba73f6147b36316c713094ef56a7d93e5076
[4/4] io_uring: move flags check to io_uring_sanitise_params
commit: 4d7352becf5609047112f91883071a289c44e221
Best regards,
--
Jens Axboe
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2025-11-10 22:02 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-10 13:04 [PATCH 0/4] random setup cleanups Pavel Begunkov
2025-11-10 13:04 ` [PATCH 1/4] io_uring: add helper calculating region byte size Pavel Begunkov
2025-11-10 13:04 ` [PATCH 2/4] io_uring: pass sq entires in the params struct Pavel Begunkov
2025-11-10 13:04 ` [PATCH 3/4] io_uring: use mem_is_zero to check ring params Pavel Begunkov
2025-11-10 13:04 ` [PATCH 4/4] io_uring: move flags check to io_uring_sanitise_params Pavel Begunkov
2025-11-10 22:02 ` [PATCH 0/4] random setup cleanups Jens Axboe
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox