net/fm10k: fix stats crash in multi-process
authorLu Qiuwen <luqiuwen@iie.ac.cn>
Wed, 7 Aug 2019 08:24:22 +0000 (16:24 +0800)
committerFerruh Yigit <ferruh.yigit@intel.com>
Mon, 26 Aug 2019 10:43:23 +0000 (12:43 +0200)
The ops pointers in fm10k_stats_get() are set up from primary
process, when secondary process calls these ops pointers,
a segment fault will happen.

Fixes: 7223d200c227 ("fm10k: add base driver")
Cc: stable@dpdk.org
Signed-off-by: Lu Qiuwen <luqiuwen@iie.ac.cn>
Acked-by: Xiao Wang <xiao.w.wang@intel.com>
Reviewed-by: Xiaolong Ye <xiaolong.ye@intel.com>
drivers/net/fm10k/base/fm10k_api.c
drivers/net/fm10k/base/fm10k_pf.c
drivers/net/fm10k/base/fm10k_pf.h
drivers/net/fm10k/base/fm10k_vf.c
drivers/net/fm10k/base/fm10k_vf.h

index 7802a1c..dfb50a1 100644 (file)
@@ -205,8 +205,14 @@ s32 fm10k_read_mac_addr(struct fm10k_hw *hw)
  * */
 void fm10k_update_hw_stats(struct fm10k_hw *hw, struct fm10k_hw_stats *stats)
 {
-       if (hw->mac.ops.update_hw_stats)
-               hw->mac.ops.update_hw_stats(hw, stats);
+       switch (hw->mac.type) {
+       case fm10k_mac_pf:
+               return fm10k_update_hw_stats_pf(hw, stats);
+       case fm10k_mac_vf:
+               return fm10k_update_hw_stats_vf(hw, stats);
+       default:
+               break;
+       }
 }
 
 /**
@@ -217,8 +223,14 @@ void fm10k_update_hw_stats(struct fm10k_hw *hw, struct fm10k_hw_stats *stats)
  * */
 void fm10k_rebind_hw_stats(struct fm10k_hw *hw, struct fm10k_hw_stats *stats)
 {
-       if (hw->mac.ops.rebind_hw_stats)
-               hw->mac.ops.rebind_hw_stats(hw, stats);
+       switch (hw->mac.type) {
+       case fm10k_mac_pf:
+               return fm10k_rebind_hw_stats_pf(hw, stats);
+       case fm10k_mac_vf:
+               return fm10k_rebind_hw_stats_vf(hw, stats);
+       default:
+               break;
+       }
 }
 
 /**
index 3efe98c..439dd22 100644 (file)
@@ -1482,7 +1482,7 @@ const struct fm10k_msg_data fm10k_iov_msg_data_pf[] = {
  *  This function collects and aggregates global and per queue hardware
  *  statistics.
  **/
-STATIC void fm10k_update_hw_stats_pf(struct fm10k_hw *hw,
+void fm10k_update_hw_stats_pf(struct fm10k_hw *hw,
                                     struct fm10k_hw_stats *stats)
 {
        u32 timeout, ur, ca, um, xec, vlan_drop, loopback_drop, nodesc_drop;
@@ -1555,7 +1555,7 @@ STATIC void fm10k_update_hw_stats_pf(struct fm10k_hw *hw,
  *  This function resets the base for global and per queue hardware
  *  statistics.
  **/
-STATIC void fm10k_rebind_hw_stats_pf(struct fm10k_hw *hw,
+void fm10k_rebind_hw_stats_pf(struct fm10k_hw *hw,
                                     struct fm10k_hw_stats *stats)
 {
        DEBUGFUNC("fm10k_rebind_hw_stats_pf");
index a3c6133..1c2e999 100644 (file)
@@ -155,4 +155,10 @@ extern const struct fm10k_msg_data fm10k_iov_msg_data_pf[];
 #endif
 
 s32 fm10k_init_ops_pf(struct fm10k_hw *hw);
+
+void fm10k_update_hw_stats_pf(struct fm10k_hw *hw,
+                                    struct fm10k_hw_stats *stats);
+
+void fm10k_rebind_hw_stats_pf(struct fm10k_hw *hw,
+                                    struct fm10k_hw_stats *stats);
 #endif /* _FM10K_PF_H */
index d4e095b..6809c3c 100644 (file)
@@ -497,7 +497,7 @@ const struct fm10k_tlv_attr fm10k_1588_msg_attr[] = {
  *
  *  This function collects and aggregates per queue hardware statistics.
  **/
-STATIC void fm10k_update_hw_stats_vf(struct fm10k_hw *hw,
+void fm10k_update_hw_stats_vf(struct fm10k_hw *hw,
                                     struct fm10k_hw_stats *stats)
 {
        DEBUGFUNC("fm10k_update_hw_stats_vf");
@@ -512,7 +512,7 @@ STATIC void fm10k_update_hw_stats_vf(struct fm10k_hw *hw,
  *
  *  This function resets the base for queue hardware statistics.
  **/
-STATIC void fm10k_rebind_hw_stats_vf(struct fm10k_hw *hw,
+void fm10k_rebind_hw_stats_vf(struct fm10k_hw *hw,
                                     struct fm10k_hw_stats *stats)
 {
        DEBUGFUNC("fm10k_rebind_hw_stats_vf");
index 071fed2..c90880d 100644 (file)
@@ -60,4 +60,9 @@ extern const struct fm10k_tlv_attr fm10k_1588_msg_attr[];
        FM10K_MSG_HANDLER(FM10K_VF_MSG_ID_1588, fm10k_1588_msg_attr, func)
 
 s32 fm10k_init_ops_vf(struct fm10k_hw *hw);
+
+void fm10k_update_hw_stats_vf(struct fm10k_hw *hw,
+                                    struct fm10k_hw_stats *stats);
+void fm10k_rebind_hw_stats_vf(struct fm10k_hw *hw,
+                                    struct fm10k_hw_stats *stats);
 #endif /* _FM10K_VF_H */