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 <jf...@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