Message ID | 20211213153111.110877-2-maciej.fijalkowski@intel.com (mailing list archive) |
---|---|
State | Awaiting Upstream |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | ice: xsk: Rx processing fixes | expand |
> -----Original Message----- > From: Intel-wired-lan <intel-wired-lan-bounces@osuosl.org> On Behalf Of > Maciej Fijalkowski > Sent: Monday, December 13, 2021 9:01 PM > To: intel-wired-lan@lists.osuosl.org > Cc: Mathew, Elza <elza.mathew@intel.com>; netdev@vger.kernel.org; > kuba@kernel.org; bpf@vger.kernel.org; davem@davemloft.net; Karlsson, > Magnus <magnus.karlsson@intel.com> > Subject: [Intel-wired-lan] [PATCH v2 intel-net 1/6] ice: xsk: return xsk buffers > back to pool when cleaning the ring > > Currently we only NULL the xdp_buff pointer in the internal SW ring but we > never give it back to the xsk buffer pool. This means that buffers can be > leaked out of the buff pool and never be used again. > > Add missing xsk_buff_free() call to the routine that is supposed to clean the > entries that are left in the ring so that these buffers in the umem can be used > by other sockets. > > Also, only go through the space that is actually left to be cleaned instead of a > whole ring. > > Fixes: 2d4238f55697 ("ice: Add support for AF_XDP") > Signed-off-by: Magnus Karlsson <magnus.karlsson@intel.com> > Signed-off-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com> > --- > drivers/net/ethernet/intel/ice/ice_xsk.c | 12 ++++++------ > 1 file changed, 6 insertions(+), 6 deletions(-) > Tested-by: Kiran Bhandare <kiranx.bhandare@intel.com> A Contingent Worker at Intel
diff --git a/drivers/net/ethernet/intel/ice/ice_xsk.c b/drivers/net/ethernet/intel/ice/ice_xsk.c index bb9a80847298..8593717a755e 100644 --- a/drivers/net/ethernet/intel/ice/ice_xsk.c +++ b/drivers/net/ethernet/intel/ice/ice_xsk.c @@ -811,14 +811,14 @@ bool ice_xsk_any_rx_ring_ena(struct ice_vsi *vsi) */ void ice_xsk_clean_rx_ring(struct ice_rx_ring *rx_ring) { - u16 i; - - for (i = 0; i < rx_ring->count; i++) { - struct xdp_buff **xdp = &rx_ring->xdp_buf[i]; + u16 count_mask = rx_ring->count - 1; + u16 ntc = rx_ring->next_to_clean; + u16 ntu = rx_ring->next_to_use; - if (!xdp) - continue; + for ( ; ntc != ntu; ntc = (ntc + 1) & count_mask) { + struct xdp_buff **xdp = &rx_ring->xdp_buf[ntc]; + xsk_buff_free(*xdp); *xdp = NULL; } }