From: Tao Cui <[email protected]>

A handful of io_uring allocations still scale with user controlled
counts on plain GFP_KERNEL: the per-ring io-wq and its workers, the
alloc cache entry arrays, the provided buffer peek and import iovec
arrays, and the registered eventfd contexts.  The tctx side is covered
by commit 0b34e7b20a48 ("io_uring: charge tctx nodes and
personalities").

Charge what is left.

Signed-off-by: Tao Cui <[email protected]>
---
 io_uring/alloc_cache.c | 3 ++-
 io_uring/eventfd.c     | 2 +-
 io_uring/io-wq.c       | 4 ++--
 io_uring/kbuf.c        | 2 +-
 4 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/io_uring/alloc_cache.c b/io_uring/alloc_cache.c
index 58423888b736..f41df1878633 100644
--- a/io_uring/alloc_cache.c
+++ b/io_uring/alloc_cache.c
@@ -22,7 +22,8 @@ bool io_alloc_cache_init(struct io_alloc_cache *cache,
                         unsigned max_nr, unsigned int size,
                         unsigned int init_bytes)
 {
-       cache->entries = kvmalloc_array(max_nr, sizeof(void *), GFP_KERNEL);
+       cache->entries = kvmalloc_array(max_nr, sizeof(void *),
+                                     GFP_KERNEL_ACCOUNT);
        if (!cache->entries)
                return true;
 
diff --git a/io_uring/eventfd.c b/io_uring/eventfd.c
index 63fe6e5d79ba..52f5d5b85f30 100644
--- a/io_uring/eventfd.c
+++ b/io_uring/eventfd.c
@@ -132,7 +132,7 @@ int io_eventfd_register(struct io_ring_ctx *ctx, void 
__user *arg,
        if (copy_from_user(&fd, fds, sizeof(*fds)))
                return -EFAULT;
 
-       ev_fd = kmalloc_obj(*ev_fd);
+       ev_fd = kmalloc_obj(*ev_fd, GFP_KERNEL_ACCOUNT);
        if (!ev_fd)
                return -ENOMEM;
 
diff --git a/io_uring/io-wq.c b/io_uring/io-wq.c
index 92df54c6f50c..98f3aa378baf 100644
--- a/io_uring/io-wq.c
+++ b/io_uring/io-wq.c
@@ -981,7 +981,7 @@ static bool create_io_worker(struct io_wq *wq, struct 
io_wq_acct *acct)
 
        __set_current_state(TASK_RUNNING);
 
-       worker = kzalloc_obj(*worker);
+       worker = kzalloc_obj(*worker, GFP_KERNEL_ACCOUNT);
        if (!worker) {
 fail:
                atomic_dec(&acct->nr_running);
@@ -1358,7 +1358,7 @@ struct io_wq *io_wq_create(unsigned bounded, struct 
io_wq_data *data)
        if (WARN_ON_ONCE(!bounded))
                return ERR_PTR(-EINVAL);
 
-       wq = kzalloc_obj(struct io_wq);
+       wq = kzalloc_obj(struct io_wq, GFP_KERNEL_ACCOUNT);
        if (!wq)
                return ERR_PTR(-ENOMEM);
 
diff --git a/io_uring/kbuf.c b/io_uring/kbuf.c
index abf44f5dba26..bc6e552a91dd 100644
--- a/io_uring/kbuf.c
+++ b/io_uring/kbuf.c
@@ -288,7 +288,7 @@ static int io_ring_buffers_peek(struct io_kiocb *req, 
struct buf_sel_arg *arg,
         * a speculative peek operation.
         */
        if (arg->mode & KBUF_MODE_EXPAND && nr_avail > nr_iovs && arg->max_len) 
{
-               iov = kmalloc_objs(struct iovec, nr_avail);
+               iov = kmalloc_objs(struct iovec, nr_avail, GFP_KERNEL_ACCOUNT);
                if (unlikely(!iov))
                        return -ENOMEM;
                arg->iovs = iov;
-- 
2.43.0


Reply via email to