On 1/21/19 2:13 AM, Roman Penyaev wrote: > 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. Thanks, yes that is leaky. I'll fix that up. > 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? I don't really what that'd change, if we do it off the ->mmap() or when we setup the io_uring instance with io_uring_setup(2). We need this memory to be pinned, we can't fault on it. -- Jens Axboe