On 2019-01-18 17:12, Jens Axboe wrote:

[...]

+
+static int io_uring_create(unsigned entries, struct io_uring_params *p,
+                          bool compat)
+{
+       struct user_struct *user = NULL;
+       struct io_ring_ctx *ctx;
+       int ret;
+
+       if (entries > IORING_MAX_ENTRIES)
+               return -EINVAL;
+
+       /*
+        * Use twice as many entries for the CQ ring. It's possible for the
+        * application to drive a higher depth than the size of the SQ ring,
+        * since the sqes are only used at submission time. This allows for
+        * some flexibility in overcommitting a bit.
+        */
+       p->sq_entries = roundup_pow_of_two(entries);
+       p->cq_entries = 2 * p->sq_entries;
+
+       if (!capable(CAP_IPC_LOCK)) {
+               user = get_uid(current_user());
+               ret = __io_account_mem(user, ring_pages(p->sq_entries,
+                                                       p->cq_entries));
+               if (ret) {
+                       free_uid(user);
+                       return ret;
+               }
+       }
+
+       ctx = io_ring_ctx_alloc(p);
+       if (!ctx)
+               return -ENOMEM;

Hi Jens,

It seems pages should be "unaccounted" back here and uid freed if path
with "if (!capable(CAP_IPC_LOCK))" above was taken.

But really, could please someone explain me what is wrong with allocating
all urings in mmap() without touching RLIMIT_MEMLOCK at all?  Thus all
memory will be accounted to the caller app and if app is greedy it will
be killed by oom.  What I'm missing?

--
Roman


Reply via email to