From: Dapeng Yu <dapengx...@intel.com>

The sharing of function pointer may cause crash of secondary process.
This patch fixes it.

Fixes: 7a340b0b4e03 ("net/ice: refactor Rx FlexiMD handling")
Cc: sta...@dpdk.org

Signed-off-by: Dapeng Yu <dapengx...@intel.com>
---
 drivers/net/ice/ice_rxtx.c | 35 +++++++++++++++++++++++------------
 drivers/net/ice/ice_rxtx.h |  2 +-
 2 files changed, 24 insertions(+), 13 deletions(-)

diff --git a/drivers/net/ice/ice_rxtx.c b/drivers/net/ice/ice_rxtx.c
index ff362c21d9..7bb0ac4de3 100644
--- a/drivers/net/ice/ice_rxtx.c
+++ b/drivers/net/ice/ice_rxtx.c
@@ -205,51 +205,62 @@ ice_rxd_to_pkt_fields_by_comms_aux_v2(struct ice_rx_queue 
*rxq,
 #endif
 }
 
+static const ice_rxd_to_pkt_fields_t rxd_to_pkt_fields[] = {
+       [ICE_RXDID_COMMS_AUX_VLAN] = ice_rxd_to_pkt_fields_by_comms_aux_v1,
+       [ICE_RXDID_COMMS_AUX_IPV4] = ice_rxd_to_pkt_fields_by_comms_aux_v1,
+       [ICE_RXDID_COMMS_AUX_IPV6] = ice_rxd_to_pkt_fields_by_comms_aux_v1,
+       [ICE_RXDID_COMMS_AUX_IPV6_FLOW] = ice_rxd_to_pkt_fields_by_comms_aux_v1,
+       [ICE_RXDID_COMMS_AUX_TCP] = ice_rxd_to_pkt_fields_by_comms_aux_v1,
+       [ICE_RXDID_COMMS_AUX_IP_OFFSET] = ice_rxd_to_pkt_fields_by_comms_aux_v2,
+       [ICE_RXDID_COMMS_GENERIC] = ice_rxd_to_pkt_fields_by_comms_generic,
+       [ICE_RXDID_COMMS_OVS] = ice_rxd_to_pkt_fields_by_comms_ovs,
+};
+
 void
 ice_select_rxd_to_pkt_fields_handler(struct ice_rx_queue *rxq, uint32_t rxdid)
 {
        switch (rxdid) {
        case ICE_RXDID_COMMS_AUX_VLAN:
                rxq->xtr_ol_flag = rte_net_ice_dynflag_proto_xtr_vlan_mask;
-               rxq->rxd_to_pkt_fields = ice_rxd_to_pkt_fields_by_comms_aux_v1;
+               rxq->rxdid = ICE_RXDID_COMMS_AUX_VLAN;
                break;
 
        case ICE_RXDID_COMMS_AUX_IPV4:
                rxq->xtr_ol_flag = rte_net_ice_dynflag_proto_xtr_ipv4_mask;
-               rxq->rxd_to_pkt_fields = ice_rxd_to_pkt_fields_by_comms_aux_v1;
+               rxq->rxdid = ICE_RXDID_COMMS_AUX_IPV4;
                break;
 
        case ICE_RXDID_COMMS_AUX_IPV6:
                rxq->xtr_ol_flag = rte_net_ice_dynflag_proto_xtr_ipv6_mask;
-               rxq->rxd_to_pkt_fields = ice_rxd_to_pkt_fields_by_comms_aux_v1;
+               rxq->rxdid = ICE_RXDID_COMMS_AUX_IPV6;
                break;
 
        case ICE_RXDID_COMMS_AUX_IPV6_FLOW:
                rxq->xtr_ol_flag = rte_net_ice_dynflag_proto_xtr_ipv6_flow_mask;
-               rxq->rxd_to_pkt_fields = ice_rxd_to_pkt_fields_by_comms_aux_v1;
+               rxq->rxdid = ICE_RXDID_COMMS_AUX_IPV6_FLOW;
                break;
 
        case ICE_RXDID_COMMS_AUX_TCP:
                rxq->xtr_ol_flag = rte_net_ice_dynflag_proto_xtr_tcp_mask;
-               rxq->rxd_to_pkt_fields = ice_rxd_to_pkt_fields_by_comms_aux_v1;
+               rxq->rxdid = ICE_RXDID_COMMS_AUX_TCP;
                break;
 
        case ICE_RXDID_COMMS_AUX_IP_OFFSET:
                rxq->xtr_ol_flag = rte_net_ice_dynflag_proto_xtr_ip_offset_mask;
-               rxq->rxd_to_pkt_fields = ice_rxd_to_pkt_fields_by_comms_aux_v2;
+               rxq->rxdid = ICE_RXDID_COMMS_AUX_IP_OFFSET;
                break;
 
        case ICE_RXDID_COMMS_GENERIC:
-               rxq->rxd_to_pkt_fields = ice_rxd_to_pkt_fields_by_comms_generic;
+               rxq->rxdid = ICE_RXDID_COMMS_GENERIC;
                break;
 
        case ICE_RXDID_COMMS_OVS:
-               rxq->rxd_to_pkt_fields = ice_rxd_to_pkt_fields_by_comms_ovs;
+               rxq->rxdid = ICE_RXDID_COMMS_OVS;
                break;
 
        default:
                /* update this according to the RXDID for PROTO_XTR_NONE */
-               rxq->rxd_to_pkt_fields = ice_rxd_to_pkt_fields_by_comms_ovs;
+               rxq->rxdid = ICE_RXDID_COMMS_OVS;
                break;
        }
 
@@ -1622,7 +1633,7 @@ ice_rx_scan_hw_ring(struct ice_rx_queue *rxq)
                        mb->packet_type = ptype_tbl[ICE_RX_FLEX_DESC_PTYPE_M &
                                rte_le_to_cpu_16(rxdp[j].wb.ptype_flex_flags0)];
                        ice_rxd_to_vlan_tci(mb, &rxdp[j]);
-                       rxq->rxd_to_pkt_fields(rxq, mb, &rxdp[j]);
+                       rxd_to_pkt_fields[rxq->rxdid](rxq, mb, &rxdp[j]);
 #ifndef RTE_LIBRTE_ICE_16BYTE_RX_DESC
                        if (rxq->offloads & DEV_RX_OFFLOAD_TIMESTAMP) {
                                ts_ns = ice_tstamp_convert_32b_64b(hw,
@@ -1939,7 +1950,7 @@ ice_recv_scattered_pkts(void *rx_queue,
                first_seg->packet_type = ptype_tbl[ICE_RX_FLEX_DESC_PTYPE_M &
                        rte_le_to_cpu_16(rxd.wb.ptype_flex_flags0)];
                ice_rxd_to_vlan_tci(first_seg, &rxd);
-               rxq->rxd_to_pkt_fields(rxq, first_seg, &rxd);
+               rxd_to_pkt_fields[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 (rxq->offloads & DEV_RX_OFFLOAD_TIMESTAMP) {
@@ -2370,7 +2381,7 @@ ice_recv_pkts(void *rx_queue,
                rxm->packet_type = ptype_tbl[ICE_RX_FLEX_DESC_PTYPE_M &
                        rte_le_to_cpu_16(rxd.wb.ptype_flex_flags0)];
                ice_rxd_to_vlan_tci(rxm, &rxd);
-               rxq->rxd_to_pkt_fields(rxq, rxm, &rxd);
+               rxd_to_pkt_fields[rxq->rxdid](rxq, rxm, &rxd);
                pkt_flags = ice_rxd_error_to_pkt_flags(rx_stat_err0);
 #ifndef RTE_LIBRTE_ICE_16BYTE_RX_DESC
                if (rxq->offloads & DEV_RX_OFFLOAD_TIMESTAMP) {
diff --git a/drivers/net/ice/ice_rxtx.h b/drivers/net/ice/ice_rxtx.h
index e1c644fb63..146dc1f95d 100644
--- a/drivers/net/ice/ice_rxtx.h
+++ b/drivers/net/ice/ice_rxtx.h
@@ -89,7 +89,7 @@ struct ice_rx_queue {
        bool rx_deferred_start; /* don't start this queue in dev start */
        uint8_t proto_xtr; /* Protocol extraction from flexible descriptor */
        uint64_t xtr_ol_flag; /* Protocol extraction offload flag */
-       ice_rxd_to_pkt_fields_t rxd_to_pkt_fields; /* handle FlexiMD by RXDID */
+       uint32_t rxdid; /* Receive Flex Descriptor profile ID */
        ice_rx_release_mbufs_t rx_rel_mbufs;
        uint64_t offloads;
        uint32_t time_high;
-- 
2.27.0

Reply via email to