lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20230213102038.54cc9060@canb.auug.org.au>
Date:   Mon, 13 Feb 2023 10:20:38 +1100
From:   Stephen Rothwell <sfr@...b.auug.org.au>
To:     David Miller <davem@...emloft.net>,
        Networking <netdev@...r.kernel.org>
Cc:     Daniel Borkmann <daniel@...earbox.net>,
        Jakub Kicinski <kuba@...nel.org>,
        Larysa Zaremba <larysa.zaremba@...el.com>,
        Linux Kernel Mailing List <linux-kernel@...r.kernel.org>,
        Linux Next Mailing List <linux-next@...r.kernel.org>,
        Maciej Fijalkowski <maciej.fijalkowski@...el.com>
Subject: linux-next: manual merge of the net-next tree with the net tree

Hi all,

Today's linux-next merge of the net-next tree got a conflict in:

  drivers/net/ethernet/intel/ice/ice_xsk.c

between commit:

  1f090494170e ("ice: xsk: Fix cleaning of XDP_TX frames")

from the net tree and commit:

  a24b4c6e9aab ("ice: xsk: Do not convert to buff to frame for XDP_TX")

from the net-next tree.

I fixed it up (see below) and can carry the fix as necessary. This
is now fixed as far as linux-next is concerned, but any non trivial
conflicts should be mentioned to your upstream maintainer when your tree
is submitted for merging.  You may also want to consider cooperating
with the maintainer of the conflicting tree to minimise any particularly
complex conflicts.

-- 
Cheers,
Stephen Rothwell

diff --cc drivers/net/ethernet/intel/ice/ice_xsk.c
index 374b7f10b549,a25a68c69f22..000000000000
--- a/drivers/net/ethernet/intel/ice/ice_xsk.c
+++ b/drivers/net/ethernet/intel/ice/ice_xsk.c
@@@ -597,6 -597,107 +597,110 @@@ ice_construct_skb_zc(struct ice_rx_rin
  	return skb;
  }
  
+ /**
+  * ice_clean_xdp_irq_zc - AF_XDP ZC specific Tx cleaning routine
+  * @xdp_ring: XDP Tx ring
+  */
+ static void ice_clean_xdp_irq_zc(struct ice_tx_ring *xdp_ring)
+ {
+ 	u16 ntc = xdp_ring->next_to_clean;
+ 	struct ice_tx_desc *tx_desc;
+ 	u16 cnt = xdp_ring->count;
+ 	struct ice_tx_buf *tx_buf;
++	u16 completed_frames = 0;
+ 	u16 xsk_frames = 0;
+ 	u16 last_rs;
+ 	int i;
+ 
+ 	last_rs = xdp_ring->next_to_use ? xdp_ring->next_to_use - 1 : cnt - 1;
+ 	tx_desc = ICE_TX_DESC(xdp_ring, last_rs);
+ 	if (tx_desc->cmd_type_offset_bsz &
+ 	    cpu_to_le64(ICE_TX_DESC_DTYPE_DESC_DONE)) {
+ 		if (last_rs >= ntc)
 -			xsk_frames = last_rs - ntc + 1;
++			completed_frames = last_rs - ntc + 1;
+ 		else
 -			xsk_frames = last_rs + cnt - ntc + 1;
++			completed_frames = last_rs + cnt - ntc + 1;
+ 	}
+ 
 -	if (!xsk_frames)
++	if (!completed_frames)
+ 		return;
+ 
 -	if (likely(!xdp_ring->xdp_tx_active))
++	if (likely(!xdp_ring->xdp_tx_active)) {
++		xsk_frames = completed_frames;
+ 		goto skip;
++	}
+ 
+ 	ntc = xdp_ring->next_to_clean;
 -	for (i = 0; i < xsk_frames; i++) {
++	for (i = 0; i < completed_frames; i++) {
+ 		tx_buf = &xdp_ring->tx_buf[ntc];
+ 
+ 		if (tx_buf->xdp) {
+ 			xsk_buff_free(tx_buf->xdp);
+ 			xdp_ring->xdp_tx_active--;
+ 		} else {
+ 			xsk_frames++;
+ 		}
+ 
+ 		ntc++;
+ 		if (ntc == cnt)
+ 			ntc = 0;
+ 	}
+ skip:
+ 	tx_desc->cmd_type_offset_bsz = 0;
 -	xdp_ring->next_to_clean += xsk_frames;
++	xdp_ring->next_to_clean += completed_frames;
+ 	if (xdp_ring->next_to_clean >= cnt)
+ 		xdp_ring->next_to_clean -= cnt;
+ 	if (xsk_frames)
+ 		xsk_tx_completed(xdp_ring->xsk_pool, xsk_frames);
+ }
+ 
+ /**
+  * ice_xmit_xdp_tx_zc - AF_XDP ZC handler for XDP_TX
+  * @xdp: XDP buffer to xmit
+  * @xdp_ring: XDP ring to produce descriptor onto
+  *
+  * note that this function works directly on xdp_buff, no need to convert
+  * it to xdp_frame. xdp_buff pointer is stored to ice_tx_buf so that cleaning
+  * side will be able to xsk_buff_free() it.
+  *
+  * Returns ICE_XDP_TX for successfully produced desc, ICE_XDP_CONSUMED if there
+  * was not enough space on XDP ring
+  */
+ static int ice_xmit_xdp_tx_zc(struct xdp_buff *xdp,
+ 			      struct ice_tx_ring *xdp_ring)
+ {
+ 	u32 size = xdp->data_end - xdp->data;
+ 	u32 ntu = xdp_ring->next_to_use;
+ 	struct ice_tx_desc *tx_desc;
+ 	struct ice_tx_buf *tx_buf;
+ 	dma_addr_t dma;
+ 
+ 	if (ICE_DESC_UNUSED(xdp_ring) < ICE_RING_QUARTER(xdp_ring)) {
+ 		ice_clean_xdp_irq_zc(xdp_ring);
+ 		if (!ICE_DESC_UNUSED(xdp_ring)) {
+ 			xdp_ring->ring_stats->tx_stats.tx_busy++;
+ 			return ICE_XDP_CONSUMED;
+ 		}
+ 	}
+ 
+ 	dma = xsk_buff_xdp_get_dma(xdp);
+ 	xsk_buff_raw_dma_sync_for_device(xdp_ring->xsk_pool, dma, size);
+ 
+ 	tx_buf = &xdp_ring->tx_buf[ntu];
+ 	tx_buf->xdp = xdp;
+ 	tx_desc = ICE_TX_DESC(xdp_ring, ntu);
+ 	tx_desc->buf_addr = cpu_to_le64(dma);
+ 	tx_desc->cmd_type_offset_bsz = ice_build_ctob(ICE_TX_DESC_CMD_EOP,
+ 						      0, size, 0);
+ 	xdp_ring->xdp_tx_active++;
+ 
+ 	if (++ntu == xdp_ring->count)
+ 		ntu = 0;
+ 	xdp_ring->next_to_use = ntu;
+ 
+ 	return ICE_XDP_TX;
+ }
+ 
  /**
   * ice_run_xdp_zc - Executes an XDP program in zero-copy path
   * @rx_ring: Rx ring

Content of type "application/pgp-signature" skipped

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ