DPDK patches and discussions
 help / color / mirror / Atom feed
* [PATCH] net/ice: Localize dynamic mbuf timestamp data
@ 2025-05-06 17:50 Jake Freeland
  0 siblings, 0 replies; only message in thread
From: Jake Freeland @ 2025-05-06 17:50 UTC (permalink / raw)
  To: Bruce Richardson, Anatoly Burakov; +Cc: Jake Freeland, dev

The ice_timestamp_dynfield_offset and ice_timestamp_dynflag global
variables are used to access the dynamic mbuf timestamp field when
timestamp offloading is enabled.

Move these into the ice_rx_queue structure, located in shared
rte_eth_dev_data, so they can be accessed by secondary processes.

Signed-off-by: Jake Freeland <jfree@FreeBSD.org>
---
 drivers/net/intel/ice/ice_ethdev.c | 13 -------------
 drivers/net/intel/ice/ice_rxtx.c   | 27 +++++++++++++--------------
 drivers/net/intel/ice/ice_rxtx.h   |  6 ++----
 3 files changed, 15 insertions(+), 31 deletions(-)

diff --git a/drivers/net/intel/ice/ice_ethdev.c b/drivers/net/intel/ice/ice_ethdev.c
index 21d3795954..2ec7eab7fa 100644
--- a/drivers/net/intel/ice/ice_ethdev.c
+++ b/drivers/net/intel/ice/ice_ethdev.c
@@ -44,9 +44,6 @@
 
 #define ICE_CYCLECOUNTER_MASK  0xffffffffffffffffULL
 
-uint64_t ice_timestamp_dynflag;
-int ice_timestamp_dynfield_offset = -1;
-
 static const char * const ice_valid_args[] = {
 	ICE_SAFE_MODE_SUPPORT_ARG,
 	ICE_PROTO_XTR_ARG,
@@ -3977,16 +3974,6 @@ ice_dev_start(struct rte_eth_dev *dev)
 		}
 	}
 
-	if (dev->data->dev_conf.rxmode.offloads & RTE_ETH_RX_OFFLOAD_TIMESTAMP) {
-		/* Register mbuf field and flag for Rx timestamp */
-		ret = rte_mbuf_dyn_rx_timestamp_register(&ice_timestamp_dynfield_offset,
-							 &ice_timestamp_dynflag);
-		if (ret) {
-			PMD_DRV_LOG(ERR, "Cannot register mbuf field/flag for timestamp");
-			goto tx_err;
-		}
-	}
-
 	/* program Rx queues' context in hardware*/
 	for (nb_rxq = 0; nb_rxq < data->nb_rx_queues; nb_rxq++) {
 		ret = ice_rx_queue_start(dev, nb_rxq);
diff --git a/drivers/net/intel/ice/ice_rxtx.c b/drivers/net/intel/ice/ice_rxtx.c
index 40ac01e782..ba1435b9de 100644
--- a/drivers/net/intel/ice/ice_rxtx.c
+++ b/drivers/net/intel/ice/ice_rxtx.c
@@ -275,17 +275,16 @@ ice_program_hw_rx_queue(struct ice_rx_queue *rxq)
 		return -EINVAL;
 	}
 
-	if (!rxq->ts_enable && (rxq->offloads & RTE_ETH_RX_OFFLOAD_TIMESTAMP)) {
+	if (rxq->ts_flag == 0 && (rxq->offloads & RTE_ETH_RX_OFFLOAD_TIMESTAMP)) {
 		/* Register mbuf field and flag for Rx timestamp */
 		err = rte_mbuf_dyn_rx_timestamp_register(
-				&ice_timestamp_dynfield_offset,
-				&ice_timestamp_dynflag);
+				&rxq->ts_offset,
+				&rxq->ts_flag);
 		if (err) {
 			PMD_DRV_LOG(ERR,
 				"Cannot register mbuf field/flag for timestamp");
 			return -EINVAL;
 		}
-		rxq->ts_enable = true;
 	}
 
 	memset(&rx_ctx, 0, sizeof(rx_ctx));
@@ -679,7 +678,7 @@ ice_rx_queue_start(struct rte_eth_dev *dev, uint16_t rx_queue_id)
 		return 0;
 
 	if (dev->data->dev_conf.rxmode.offloads & RTE_ETH_RX_OFFLOAD_TIMESTAMP)
-		rxq->ts_enable = true;
+		rxq->offloads |= RTE_ETH_RX_OFFLOAD_TIMESTAMP;
 	err = ice_program_hw_rx_queue(rxq);
 	if (err) {
 		PMD_DRV_LOG(ERR, "fail to program RX queue %u",
@@ -1785,7 +1784,7 @@ ice_rx_scan_hw_ring(struct ice_rx_queue *rxq)
 			ice_rxd_to_vlan_tci(mb, &rxdp[j]);
 			rxd_to_pkt_fields_ops[rxq->rxdid](rxq, mb, &rxdp[j]);
 #ifndef RTE_LIBRTE_ICE_16BYTE_RX_DESC
-			if (ice_timestamp_dynflag > 0 &&
+			if (rxq->ts_flag > 0 &&
 			    (rxq->offloads & RTE_ETH_RX_OFFLOAD_TIMESTAMP)) {
 				rxq->time_high =
 				rte_le_to_cpu_32(rxdp[j].wb.flex_ts.ts_high);
@@ -1804,9 +1803,9 @@ ice_rx_scan_hw_ring(struct ice_rx_queue *rxq)
 				rxq->hw_time_update = rte_get_timer_cycles() /
 						     (rte_get_timer_hz() / 1000);
 				*RTE_MBUF_DYNFIELD(mb,
-						   ice_timestamp_dynfield_offset,
+						   rxq->ts_offset,
 						   rte_mbuf_timestamp_t *) = ts_ns;
-				pkt_flags |= ice_timestamp_dynflag;
+				pkt_flags |= rxq->ts_flag;
 			}
 
 			if (ad->ptp_ena && ((mb->packet_type &
@@ -2153,7 +2152,7 @@ ice_recv_scattered_pkts(void *rx_queue,
 		rxd_to_pkt_fields_ops[rxq->rxdid](rxq, first_seg, &rxd);
 		pkt_flags = ice_rxd_error_to_pkt_flags(rx_stat_err0);
 #ifndef RTE_LIBRTE_ICE_16BYTE_RX_DESC
-		if (ice_timestamp_dynflag > 0 &&
+		if (rxq->ts_flag > 0 &&
 		    (rxq->offloads & RTE_ETH_RX_OFFLOAD_TIMESTAMP)) {
 			rxq->time_high =
 			   rte_le_to_cpu_32(rxd.wb.flex_ts.ts_high);
@@ -2171,9 +2170,9 @@ ice_recv_scattered_pkts(void *rx_queue,
 			rxq->hw_time_update = rte_get_timer_cycles() /
 					     (rte_get_timer_hz() / 1000);
 			*RTE_MBUF_DYNFIELD(first_seg,
-					   (ice_timestamp_dynfield_offset),
+					   (rxq->ts_offset),
 					   rte_mbuf_timestamp_t *) = ts_ns;
-			pkt_flags |= ice_timestamp_dynflag;
+			pkt_flags |= rxq->ts_flag;
 		}
 
 		if (ad->ptp_ena && ((first_seg->packet_type & RTE_PTYPE_L2_MASK)
@@ -2651,7 +2650,7 @@ ice_recv_pkts(void *rx_queue,
 		rxd_to_pkt_fields_ops[rxq->rxdid](rxq, rxm, &rxd);
 		pkt_flags = ice_rxd_error_to_pkt_flags(rx_stat_err0);
 #ifndef RTE_LIBRTE_ICE_16BYTE_RX_DESC
-		if (ice_timestamp_dynflag > 0 &&
+		if (rxq->ts_flag > 0 &&
 		    (rxq->offloads & RTE_ETH_RX_OFFLOAD_TIMESTAMP)) {
 			rxq->time_high =
 			   rte_le_to_cpu_32(rxd.wb.flex_ts.ts_high);
@@ -2669,9 +2668,9 @@ ice_recv_pkts(void *rx_queue,
 			rxq->hw_time_update = rte_get_timer_cycles() /
 					     (rte_get_timer_hz() / 1000);
 			*RTE_MBUF_DYNFIELD(rxm,
-					   (ice_timestamp_dynfield_offset),
+					   (rxq->ts_offset),
 					   rte_mbuf_timestamp_t *) = ts_ns;
-			pkt_flags |= ice_timestamp_dynflag;
+			pkt_flags |= rxq->ts_flag;
 		}
 
 		if (ad->ptp_ena && ((rxm->packet_type & RTE_PTYPE_L2_MASK) ==
diff --git a/drivers/net/intel/ice/ice_rxtx.h b/drivers/net/intel/ice/ice_rxtx.h
index 276d40b57f..500d630679 100644
--- a/drivers/net/intel/ice/ice_rxtx.h
+++ b/drivers/net/intel/ice/ice_rxtx.h
@@ -65,9 +65,6 @@
 #define ICE_TX_OFFLOAD_NOTSUP_MASK \
 		(RTE_MBUF_F_TX_OFFLOAD_MASK ^ ICE_TX_OFFLOAD_MASK)
 
-extern uint64_t ice_timestamp_dynflag;
-extern int ice_timestamp_dynfield_offset;
-
 /* Max header size can be 2K - 64 bytes */
 #define ICE_RX_HDR_BUF_SIZE    (2048 - 64)
 
@@ -143,7 +140,8 @@ struct ice_rx_queue {
 	/* address of temp buffer for RX split mbufs */
 	struct rte_eth_rxseg_split rxseg[ICE_RX_MAX_NSEG];
 	uint32_t rxseg_nb;
-	bool ts_enable; /* if rxq timestamp is enabled */
+	int ts_offset; /* dynamic mbuf timestamp field offset */
+	uint64_t ts_flag; /* dynamic mbuf timestamp flag */
 };
 
 /* Offload features */
-- 
2.47.2


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2025-05-06 17:50 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-05-06 17:50 [PATCH] net/ice: Localize dynamic mbuf timestamp data Jake Freeland

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).