mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2024-12-28 16:52:18 +00:00
xdp: get rid of xdp_frame::mem.id
Initially, xdp_frame::mem.id was used to search for the corresponding &page_pool to return the page correctly. However, after that struct page was extended to have a direct pointer to its PP (netmem has it as well), further keeping of this field makes no sense. xdp_return_frame_bulk() still used it to do a lookup, and this leftover is now removed. Remove xdp_frame::mem and replace it with ::mem_type, as only memory type still matters and we need to know it to be able to free the frame correctly. As a cute side effect, we can now make every scalar field in &xdp_frame of 4 byte width, speeding up accesses to them. Reviewed-by: Toke Høiland-Jørgensen <toke@redhat.com> Signed-off-by: Alexander Lobakin <aleksander.lobakin@intel.com> Link: https://patch.msgid.link/20241211172649.761483-3-aleksander.lobakin@intel.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
fcc680a647
commit
56d95b0adf
@ -2281,7 +2281,7 @@ static int dpaa_a050385_wa_xdpf(struct dpaa_priv *priv,
|
||||
new_xdpf->len = xdpf->len;
|
||||
new_xdpf->headroom = priv->tx_headroom;
|
||||
new_xdpf->frame_sz = DPAA_BP_RAW_SIZE;
|
||||
new_xdpf->mem.type = MEM_TYPE_PAGE_ORDER0;
|
||||
new_xdpf->mem_type = MEM_TYPE_PAGE_ORDER0;
|
||||
|
||||
/* Release the initial buffer */
|
||||
xdp_return_frame_rx_napi(xdpf);
|
||||
|
@ -634,7 +634,7 @@ static struct xdp_frame *veth_xdp_rcv_one(struct veth_rq *rq,
|
||||
break;
|
||||
case XDP_TX:
|
||||
orig_frame = *frame;
|
||||
xdp->rxq->mem = frame->mem;
|
||||
xdp->rxq->mem.type = frame->mem_type;
|
||||
if (unlikely(veth_xdp_tx(rq, xdp, bq) < 0)) {
|
||||
trace_xdp_exception(rq->dev, xdp_prog, act);
|
||||
frame = &orig_frame;
|
||||
@ -646,7 +646,7 @@ static struct xdp_frame *veth_xdp_rcv_one(struct veth_rq *rq,
|
||||
goto xdp_xmit;
|
||||
case XDP_REDIRECT:
|
||||
orig_frame = *frame;
|
||||
xdp->rxq->mem = frame->mem;
|
||||
xdp->rxq->mem.type = frame->mem_type;
|
||||
if (xdp_do_redirect(rq->dev, xdp, xdp_prog)) {
|
||||
frame = &orig_frame;
|
||||
stats->rx_drops++;
|
||||
|
@ -169,13 +169,13 @@ xdp_get_buff_len(const struct xdp_buff *xdp)
|
||||
|
||||
struct xdp_frame {
|
||||
void *data;
|
||||
u16 len;
|
||||
u16 headroom;
|
||||
u32 len;
|
||||
u32 headroom;
|
||||
u32 metasize; /* uses lower 8-bits */
|
||||
/* Lifetime of xdp_rxq_info is limited to NAPI/enqueue time,
|
||||
* while mem info is valid on remote CPU.
|
||||
* while mem_type is valid on remote CPU.
|
||||
*/
|
||||
struct xdp_mem_info mem;
|
||||
enum xdp_mem_type mem_type:32;
|
||||
struct net_device *dev_rx; /* used by cpumap */
|
||||
u32 frame_sz;
|
||||
u32 flags; /* supported values defined in xdp_buff_flags */
|
||||
@ -306,13 +306,13 @@ struct xdp_frame *xdp_convert_buff_to_frame(struct xdp_buff *xdp)
|
||||
if (unlikely(xdp_update_frame_from_buff(xdp, xdp_frame) < 0))
|
||||
return NULL;
|
||||
|
||||
/* rxq only valid until napi_schedule ends, convert to xdp_mem_info */
|
||||
xdp_frame->mem = xdp->rxq->mem;
|
||||
/* rxq only valid until napi_schedule ends, convert to xdp_mem_type */
|
||||
xdp_frame->mem_type = xdp->rxq->mem.type;
|
||||
|
||||
return xdp_frame;
|
||||
}
|
||||
|
||||
void __xdp_return(void *data, struct xdp_mem_info *mem, bool napi_direct,
|
||||
void __xdp_return(void *data, enum xdp_mem_type mem_type, bool napi_direct,
|
||||
struct xdp_buff *xdp);
|
||||
void xdp_return_frame(struct xdp_frame *xdpf);
|
||||
void xdp_return_frame_rx_napi(struct xdp_frame *xdpf);
|
||||
|
@ -190,7 +190,7 @@ static int cpu_map_bpf_prog_run_xdp(struct bpf_cpu_map_entry *rcpu,
|
||||
int err;
|
||||
|
||||
rxq.dev = xdpf->dev_rx;
|
||||
rxq.mem = xdpf->mem;
|
||||
rxq.mem.type = xdpf->mem_type;
|
||||
/* TODO: report queue_index to xdp_rxq_info */
|
||||
|
||||
xdp_convert_frame_to_buff(xdpf, &xdp);
|
||||
|
@ -153,7 +153,7 @@ static void xdp_test_run_init_page(netmem_ref netmem, void *arg)
|
||||
new_ctx->data = new_ctx->data_meta + meta_len;
|
||||
|
||||
xdp_update_frame_from_buff(new_ctx, frm);
|
||||
frm->mem = new_ctx->rxq->mem;
|
||||
frm->mem_type = new_ctx->rxq->mem.type;
|
||||
|
||||
memcpy(&head->orig_ctx, new_ctx, sizeof(head->orig_ctx));
|
||||
}
|
||||
@ -246,7 +246,7 @@ static void reset_ctx(struct xdp_page_head *head)
|
||||
head->ctx.data_meta = head->orig_ctx.data_meta;
|
||||
head->ctx.data_end = head->orig_ctx.data_end;
|
||||
xdp_update_frame_from_buff(&head->ctx, head->frame);
|
||||
head->frame->mem = head->orig_ctx.rxq->mem;
|
||||
head->frame->mem_type = head->orig_ctx.rxq->mem.type;
|
||||
}
|
||||
|
||||
static int xdp_recv_frames(struct xdp_frame **frames, int nframes,
|
||||
|
@ -4119,13 +4119,13 @@ static int bpf_xdp_frags_increase_tail(struct xdp_buff *xdp, int offset)
|
||||
}
|
||||
|
||||
static void bpf_xdp_shrink_data_zc(struct xdp_buff *xdp, int shrink,
|
||||
struct xdp_mem_info *mem_info, bool release)
|
||||
enum xdp_mem_type mem_type, bool release)
|
||||
{
|
||||
struct xdp_buff *zc_frag = xsk_buff_get_tail(xdp);
|
||||
|
||||
if (release) {
|
||||
xsk_buff_del_tail(zc_frag);
|
||||
__xdp_return(NULL, mem_info, false, zc_frag);
|
||||
__xdp_return(NULL, mem_type, false, zc_frag);
|
||||
} else {
|
||||
zc_frag->data_end -= shrink;
|
||||
}
|
||||
@ -4134,18 +4134,18 @@ static void bpf_xdp_shrink_data_zc(struct xdp_buff *xdp, int shrink,
|
||||
static bool bpf_xdp_shrink_data(struct xdp_buff *xdp, skb_frag_t *frag,
|
||||
int shrink)
|
||||
{
|
||||
struct xdp_mem_info *mem_info = &xdp->rxq->mem;
|
||||
enum xdp_mem_type mem_type = xdp->rxq->mem.type;
|
||||
bool release = skb_frag_size(frag) == shrink;
|
||||
|
||||
if (mem_info->type == MEM_TYPE_XSK_BUFF_POOL) {
|
||||
bpf_xdp_shrink_data_zc(xdp, shrink, mem_info, release);
|
||||
if (mem_type == MEM_TYPE_XSK_BUFF_POOL) {
|
||||
bpf_xdp_shrink_data_zc(xdp, shrink, mem_type, release);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (release) {
|
||||
struct page *page = skb_frag_page(frag);
|
||||
|
||||
__xdp_return(page_address(page), mem_info, false, NULL);
|
||||
__xdp_return(page_address(page), mem_type, false, NULL);
|
||||
}
|
||||
|
||||
out:
|
||||
|
@ -430,12 +430,12 @@ EXPORT_SYMBOL_GPL(xdp_rxq_info_attach_page_pool);
|
||||
* is used for those calls sites. Thus, allowing for faster recycling
|
||||
* of xdp_frames/pages in those cases.
|
||||
*/
|
||||
void __xdp_return(void *data, struct xdp_mem_info *mem, bool napi_direct,
|
||||
void __xdp_return(void *data, enum xdp_mem_type mem_type, bool napi_direct,
|
||||
struct xdp_buff *xdp)
|
||||
{
|
||||
struct page *page;
|
||||
|
||||
switch (mem->type) {
|
||||
switch (mem_type) {
|
||||
case MEM_TYPE_PAGE_POOL:
|
||||
page = virt_to_head_page(data);
|
||||
if (napi_direct && xdp_return_frame_no_direct())
|
||||
@ -458,7 +458,7 @@ void __xdp_return(void *data, struct xdp_mem_info *mem, bool napi_direct,
|
||||
break;
|
||||
default:
|
||||
/* Not possible, checked in xdp_rxq_info_reg_mem_model() */
|
||||
WARN(1, "Incorrect XDP memory type (%d) usage", mem->type);
|
||||
WARN(1, "Incorrect XDP memory type (%d) usage", mem_type);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -475,10 +475,10 @@ void xdp_return_frame(struct xdp_frame *xdpf)
|
||||
for (i = 0; i < sinfo->nr_frags; i++) {
|
||||
struct page *page = skb_frag_page(&sinfo->frags[i]);
|
||||
|
||||
__xdp_return(page_address(page), &xdpf->mem, false, NULL);
|
||||
__xdp_return(page_address(page), xdpf->mem_type, false, NULL);
|
||||
}
|
||||
out:
|
||||
__xdp_return(xdpf->data, &xdpf->mem, false, NULL);
|
||||
__xdp_return(xdpf->data, xdpf->mem_type, false, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(xdp_return_frame);
|
||||
|
||||
@ -494,10 +494,10 @@ void xdp_return_frame_rx_napi(struct xdp_frame *xdpf)
|
||||
for (i = 0; i < sinfo->nr_frags; i++) {
|
||||
struct page *page = skb_frag_page(&sinfo->frags[i]);
|
||||
|
||||
__xdp_return(page_address(page), &xdpf->mem, true, NULL);
|
||||
__xdp_return(page_address(page), xdpf->mem_type, true, NULL);
|
||||
}
|
||||
out:
|
||||
__xdp_return(xdpf->data, &xdpf->mem, true, NULL);
|
||||
__xdp_return(xdpf->data, xdpf->mem_type, true, NULL);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(xdp_return_frame_rx_napi);
|
||||
|
||||
@ -516,7 +516,7 @@ EXPORT_SYMBOL_GPL(xdp_return_frame_rx_napi);
|
||||
void xdp_return_frame_bulk(struct xdp_frame *xdpf,
|
||||
struct xdp_frame_bulk *bq)
|
||||
{
|
||||
if (xdpf->mem.type != MEM_TYPE_PAGE_POOL) {
|
||||
if (xdpf->mem_type != MEM_TYPE_PAGE_POOL) {
|
||||
xdp_return_frame(xdpf);
|
||||
return;
|
||||
}
|
||||
@ -553,10 +553,11 @@ void xdp_return_buff(struct xdp_buff *xdp)
|
||||
for (i = 0; i < sinfo->nr_frags; i++) {
|
||||
struct page *page = skb_frag_page(&sinfo->frags[i]);
|
||||
|
||||
__xdp_return(page_address(page), &xdp->rxq->mem, true, xdp);
|
||||
__xdp_return(page_address(page), xdp->rxq->mem.type, true,
|
||||
xdp);
|
||||
}
|
||||
out:
|
||||
__xdp_return(xdp->data, &xdp->rxq->mem, true, xdp);
|
||||
__xdp_return(xdp->data, xdp->rxq->mem.type, true, xdp);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(xdp_return_buff);
|
||||
|
||||
@ -602,7 +603,7 @@ struct xdp_frame *xdp_convert_zc_to_xdp_frame(struct xdp_buff *xdp)
|
||||
xdpf->headroom = 0;
|
||||
xdpf->metasize = metasize;
|
||||
xdpf->frame_sz = PAGE_SIZE;
|
||||
xdpf->mem.type = MEM_TYPE_PAGE_ORDER0;
|
||||
xdpf->mem_type = MEM_TYPE_PAGE_ORDER0;
|
||||
|
||||
xsk_buff_free(xdp);
|
||||
return xdpf;
|
||||
@ -672,7 +673,7 @@ struct sk_buff *__xdp_build_skb_from_frame(struct xdp_frame *xdpf,
|
||||
* - RX ring dev queue index (skb_record_rx_queue)
|
||||
*/
|
||||
|
||||
if (xdpf->mem.type == MEM_TYPE_PAGE_POOL)
|
||||
if (xdpf->mem_type == MEM_TYPE_PAGE_POOL)
|
||||
skb_mark_for_recycle(skb);
|
||||
|
||||
/* Allow SKB to reuse area used by xdp_frame */
|
||||
@ -719,8 +720,7 @@ struct xdp_frame *xdpf_clone(struct xdp_frame *xdpf)
|
||||
nxdpf = addr;
|
||||
nxdpf->data = addr + headroom;
|
||||
nxdpf->frame_sz = PAGE_SIZE;
|
||||
nxdpf->mem.type = MEM_TYPE_PAGE_ORDER0;
|
||||
nxdpf->mem.id = 0;
|
||||
nxdpf->mem_type = MEM_TYPE_PAGE_ORDER0;
|
||||
|
||||
return nxdpf;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user