2018-02-07 17:00 GMT+01:00 Willem de Bruijn <willemdebruijn.ker...@gmail.com>:
> On Wed, Jan 31, 2018 at 8:53 AM, Björn Töpel <bjorn.to...@gmail.com> wrote:
>> From: Björn Töpel <bjorn.to...@intel.com>
>>
>> The XDP_MEM_REG socket option allows a process to register a window of
>> user space memory to the kernel. This memory will later be used as
>> frame data buffer.
>>
>> Signed-off-by: Björn Töpel <bjorn.to...@intel.com>
>> ---
>
>> +static struct xsk_umem *xsk_mem_reg(u64 addr, u64 size, u32 frame_size,
>> +                                   u32 data_headroom)
>> +{
>> +       unsigned long lock_limit, locked, npages;
>> +       int ret = 0;
>> +       struct xsk_umem *umem;
>> +
>> +       if (!can_do_mlock())
>> +               return ERR_PTR(-EPERM);
>> +
>> +       umem = xsk_umem_create(addr, size, frame_size, data_headroom);
>> +       if (IS_ERR(umem))
>> +               return umem;
>> +
>> +       npages = PAGE_ALIGN(umem->nframes * umem->frame_size) >> PAGE_SHIFT;
>> +
>> +       down_write(&current->mm->mmap_sem);
>> +
>> +       locked = npages + current->mm->pinned_vm;
>> +       lock_limit = rlimit(RLIMIT_MEMLOCK) >> PAGE_SHIFT;
>> +
>> +       if (locked > lock_limit && !capable(CAP_IPC_LOCK)) {
>> +               ret = -ENOMEM;
>> +               goto out;
>> +       }
>> +
>> +       if (npages == 0 || npages > UINT_MAX) {
>> +               ret = -EINVAL;
>> +               goto out;
>> +       }
>> +       umem->npgs = npages;
>> +
>> +       ret = xsk_umem_pin_pages(umem);
>> +
>> +out:
>> +       if (ret < 0) {
>> +               put_pid(umem->pid);
>> +               kfree(umem);
>> +       } else {
>> +               current->mm->pinned_vm = locked;
>> +       }
>> +
>> +       up_write(&current->mm->mmap_sem);
>
> This limits per process. You may want to limit per user. See also
> mm_account_pinned_pages.

Ah, noted! Thanks for pointing that out!

Reply via email to