diff mbox series

[bpf-next] xsk: support allocations of large umems

Message ID 1578995365-7050-1-git-send-email-magnus.karlsson@intel.com
State Accepted
Delegated to: BPF Maintainers
Headers show
Series [bpf-next] xsk: support allocations of large umems | expand

Commit Message

Magnus Karlsson Jan. 14, 2020, 9:49 a.m. UTC
When registering a umem area that is sufficiently large (>1G on an
x86), kmalloc cannot be used to allocate one of the internal data
structures, as the size requested gets too large. Use kvmalloc instead
that falls back on vmalloc if the allocation is too large for kmalloc.

Also add accounting for this structure as it is triggered by a user
space action (the XDP_UMEM_REG setsockopt) and it is by far the
largest structure of kernel allocated memory in xsk.

Signed-off-by: Magnus Karlsson <magnus.karlsson@intel.com>
Reported-by: Ryan Goodfellow <rgoodfel@isi.edu>
---
 net/xdp/xdp_umem.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

Comments

Jonathan Lemon Jan. 15, 2020, 7:10 p.m. UTC | #1
On 14 Jan 2020, at 1:49, Magnus Karlsson wrote:

> When registering a umem area that is sufficiently large (>1G on an
> x86), kmalloc cannot be used to allocate one of the internal data
> structures, as the size requested gets too large. Use kvmalloc instead
> that falls back on vmalloc if the allocation is too large for kmalloc.
>
> Also add accounting for this structure as it is triggered by a user
> space action (the XDP_UMEM_REG setsockopt) and it is by far the
> largest structure of kernel allocated memory in xsk.
>
> Signed-off-by: Magnus Karlsson <magnus.karlsson@intel.com>
> Reported-by: Ryan Goodfellow <rgoodfel@isi.edu>

Acked-by: Jonathan Lemon <jonathan.lemon@gmail.com>
Alexei Starovoitov Jan. 15, 2020, 7:43 p.m. UTC | #2
On Wed, Jan 15, 2020 at 11:10 AM Jonathan Lemon
<jonathan.lemon@gmail.com> wrote:
>
>
>
> On 14 Jan 2020, at 1:49, Magnus Karlsson wrote:
>
> > When registering a umem area that is sufficiently large (>1G on an
> > x86), kmalloc cannot be used to allocate one of the internal data
> > structures, as the size requested gets too large. Use kvmalloc instead
> > that falls back on vmalloc if the allocation is too large for kmalloc.
> >
> > Also add accounting for this structure as it is triggered by a user
> > space action (the XDP_UMEM_REG setsockopt) and it is by far the
> > largest structure of kernel allocated memory in xsk.
> >
> > Signed-off-by: Magnus Karlsson <magnus.karlsson@intel.com>
> > Reported-by: Ryan Goodfellow <rgoodfel@isi.edu>
>
> Acked-by: Jonathan Lemon <jonathan.lemon@gmail.com>

Applied. Thanks
diff mbox series

Patch

diff --git a/net/xdp/xdp_umem.c b/net/xdp/xdp_umem.c
index 3049af2..f93e917 100644
--- a/net/xdp/xdp_umem.c
+++ b/net/xdp/xdp_umem.c
@@ -249,7 +249,7 @@  static void xdp_umem_release(struct xdp_umem *umem)
 	xdp_umem_unmap_pages(umem);
 	xdp_umem_unpin_pages(umem);
 
-	kfree(umem->pages);
+	kvfree(umem->pages);
 	umem->pages = NULL;
 
 	xdp_umem_unaccount_pages(umem);
@@ -409,7 +409,8 @@  static int xdp_umem_reg(struct xdp_umem *umem, struct xdp_umem_reg *mr)
 	if (err)
 		goto out_account;
 
-	umem->pages = kcalloc(umem->npgs, sizeof(*umem->pages), GFP_KERNEL);
+	umem->pages = kvcalloc(umem->npgs, sizeof(*umem->pages),
+			       GFP_KERNEL_ACCOUNT);
 	if (!umem->pages) {
 		err = -ENOMEM;
 		goto out_pin;
@@ -419,7 +420,7 @@  static int xdp_umem_reg(struct xdp_umem *umem, struct xdp_umem_reg *mr)
 	if (!err)
 		return 0;
 
-	kfree(umem->pages);
+	kvfree(umem->pages);
 
 out_pin:
 	xdp_umem_unpin_pages(umem);