1 // SPDX-License-Identifier: GPL-2.0
2 /* XDP user-space ring structure
3 * Copyright(c) 2018 Intel Corporation.
6 #include <linux/log2.h>
7 #include <linux/slab.h>
8 #include <linux/overflow.h>
9 #include <linux/vmalloc.h>
10 #include <net/xdp_sock_drv.h>
12 #include "xsk_queue.h"
14 static size_t xskq_get_ring_size(struct xsk_queue
*q
, bool umem_queue
)
16 struct xdp_umem_ring
*umem_ring
;
17 struct xdp_rxtx_ring
*rxtx_ring
;
20 return struct_size(umem_ring
, desc
, q
->nentries
);
21 return struct_size(rxtx_ring
, desc
, q
->nentries
);
24 struct xsk_queue
*xskq_create(u32 nentries
, bool umem_queue
)
29 q
= kzalloc(sizeof(*q
), GFP_KERNEL
);
33 q
->nentries
= nentries
;
34 q
->ring_mask
= nentries
- 1;
36 size
= xskq_get_ring_size(q
, umem_queue
);
38 /* size which is overflowing or close to SIZE_MAX will become 0 in
39 * PAGE_ALIGN(), checking SIZE_MAX is enough due to the previous
40 * is_power_of_2(), the rest will be handled by vmalloc_user()
42 if (unlikely(size
== SIZE_MAX
)) {
47 size
= PAGE_ALIGN(size
);
49 q
->ring
= vmalloc_user(size
);
55 q
->ring_vmalloc_size
= size
;
59 void xskq_destroy(struct xsk_queue
*q
)