mirror of
https://git.proxmox.com/git/mirror_ubuntu-kernels.git
synced 2026-01-28 09:19:35 +00:00
Changing API xdp_return_frame() to take struct xdp_frame as argument, seems like a natural choice. But there are some subtle performance details here that needs extra care, which is a deliberate choice. When de-referencing xdp_frame on a remote CPU during DMA-TX completion, result in the cache-line is change to "Shared" state. Later when the page is reused for RX, then this xdp_frame cache-line is written, which change the state to "Modified". This situation already happens (naturally) for, virtio_net, tun and cpumap as the xdp_frame pointer is the queued object. In tun and cpumap, the ptr_ring is used for efficiently transferring cache-lines (with pointers) between CPUs. Thus, the only option is to de-referencing xdp_frame. It is only the ixgbe driver that had an optimization, in which it can avoid doing the de-reference of xdp_frame. The driver already have TX-ring queue, which (in case of remote DMA-TX completion) have to be transferred between CPUs anyhow. In this data area, we stored a struct xdp_mem_info and a data pointer, which allowed us to avoid de-referencing xdp_frame. To compensate for this, a prefetchw is used for telling the cache coherency protocol about our access pattern. My benchmarks show that this prefetchw is enough to compensate the ixgbe driver. V7: Adjust for commit |
||
|---|---|---|
| .. | ||
| i40e_adminq_cmd.h | ||
| i40e_adminq.c | ||
| i40e_adminq.h | ||
| i40e_alloc.h | ||
| i40e_client.c | ||
| i40e_client.h | ||
| i40e_common.c | ||
| i40e_dcb_nl.c | ||
| i40e_dcb.c | ||
| i40e_dcb.h | ||
| i40e_debugfs.c | ||
| i40e_devids.h | ||
| i40e_diag.c | ||
| i40e_diag.h | ||
| i40e_ethtool.c | ||
| i40e_hmc.c | ||
| i40e_hmc.h | ||
| i40e_lan_hmc.c | ||
| i40e_lan_hmc.h | ||
| i40e_main.c | ||
| i40e_nvm.c | ||
| i40e_osdep.h | ||
| i40e_prototype.h | ||
| i40e_ptp.c | ||
| i40e_register.h | ||
| i40e_status.h | ||
| i40e_trace.h | ||
| i40e_txrx.c | ||
| i40e_txrx.h | ||
| i40e_type.h | ||
| i40e_virtchnl_pf.c | ||
| i40e_virtchnl_pf.h | ||
| i40e.h | ||
| Makefile | ||