[v5] net/fm10k: fix fm10k stats crash in multi-process

Message ID 20190807082422.20328-1-luqiuwen@iie.ac.cn (mailing list archive)
State Accepted, archived
Delegated to: Qi Zhang
Headers
Series [v5] net/fm10k: fix fm10k stats crash in multi-process |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK
ci/iol-Compile-Testing success Compile Testing PASS
ci/intel-Performance-Testing success Performance Testing PASS
ci/mellanox-Performance-Testing success Performance Testing PASS

Commit Message

Lu Qiuwen Aug. 7, 2019, 8:24 a.m. UTC
  The ops pointers in fm10k_stats_get() are set up from primary
process, when secondary process call these ops pointers,
a segment fault will happen.

Fixes: 7223d200c227 ("fm10k: add base driver")
Cc: jeffrey.b.shaw@intel.com

Signed-off-by: Lu Qiuwen <luqiuwen@iie.ac.cn>
Acked-by: Xiao Wang <xiao.w.wang@intel.com>
---
V5 - fix grammar problems in the commit messages.
V4 - fix the misspelled word in the commit message.
V3 - add patch version, fixes info and make title shorter.
V2 - delete some empty lines after the function declaration.
---
 drivers/net/fm10k/base/fm10k_api.c | 20 ++++++++++++++++----
 drivers/net/fm10k/base/fm10k_pf.c  |  4 ++--
 drivers/net/fm10k/base/fm10k_pf.h  |  6 ++++++
 drivers/net/fm10k/base/fm10k_vf.c  |  4 ++--
 drivers/net/fm10k/base/fm10k_vf.h  |  5 +++++
 5 files changed, 31 insertions(+), 8 deletions(-)
  

Comments

Xiaolong Ye Aug. 21, 2019, 6:41 a.m. UTC | #1
On 08/07, Lu Qiuwen wrote:
>The ops pointers in fm10k_stats_get() are set up from primary
>process, when secondary process call these ops pointers,
>a segment fault will happen.
>
>Fixes: 7223d200c227 ("fm10k: add base driver")
>Cc: jeffrey.b.shaw@intel.com
>
>Signed-off-by: Lu Qiuwen <luqiuwen@iie.ac.cn>
>Acked-by: Xiao Wang <xiao.w.wang@intel.com>
>---
>V5 - fix grammar problems in the commit messages.
>V4 - fix the misspelled word in the commit message.
>V3 - add patch version, fixes info and make title shorter.
>V2 - delete some empty lines after the function declaration.
>---
> drivers/net/fm10k/base/fm10k_api.c | 20 ++++++++++++++++----
> drivers/net/fm10k/base/fm10k_pf.c  |  4 ++--
> drivers/net/fm10k/base/fm10k_pf.h  |  6 ++++++
> drivers/net/fm10k/base/fm10k_vf.c  |  4 ++--
> drivers/net/fm10k/base/fm10k_vf.h  |  5 +++++
> 5 files changed, 31 insertions(+), 8 deletions(-)
>
>diff --git a/drivers/net/fm10k/base/fm10k_api.c b/drivers/net/fm10k/base/fm10k_api.c
>index c49d20dfb..e7b2fe710 100644
>--- a/drivers/net/fm10k/base/fm10k_api.c
>+++ b/drivers/net/fm10k/base/fm10k_api.c
>@@ -234,8 +234,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;
>+	}
> }
> 
> /**
>@@ -246,8 +252,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;
>+	}
> }
> 
> /**
>diff --git a/drivers/net/fm10k/base/fm10k_pf.c b/drivers/net/fm10k/base/fm10k_pf.c
>index db5f4912f..f5b6a9e2e 100644
>--- a/drivers/net/fm10k/base/fm10k_pf.c
>+++ b/drivers/net/fm10k/base/fm10k_pf.c
>@@ -1511,7 +1511,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;
>@@ -1584,7 +1584,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");
>diff --git a/drivers/net/fm10k/base/fm10k_pf.h b/drivers/net/fm10k/base/fm10k_pf.h
>index ca125c273..2c22bdd02 100644
>--- a/drivers/net/fm10k/base/fm10k_pf.h
>+++ b/drivers/net/fm10k/base/fm10k_pf.h
>@@ -184,4 +184,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 */
>diff --git a/drivers/net/fm10k/base/fm10k_vf.c b/drivers/net/fm10k/base/fm10k_vf.c
>index bd449773a..2f4b5f5d2 100644
>--- a/drivers/net/fm10k/base/fm10k_vf.c
>+++ b/drivers/net/fm10k/base/fm10k_vf.c
>@@ -526,7 +526,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");
>@@ -541,7 +541,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");
>diff --git a/drivers/net/fm10k/base/fm10k_vf.h b/drivers/net/fm10k/base/fm10k_vf.h
>index 116c56fcc..d4edd330e 100644
>--- a/drivers/net/fm10k/base/fm10k_vf.h
>+++ b/drivers/net/fm10k/base/fm10k_vf.h
>@@ -89,4 +89,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 */
>-- 
>2.20.1.windows.1
>

Reviewed-by: Xiaolong Ye <xiaolong.ye@intel.com>

Applied to dpdk-next-net-intel with "Cc: stable@dpdk.org" added. 

Thanks,
Xiaolong
  

Patch

diff --git a/drivers/net/fm10k/base/fm10k_api.c b/drivers/net/fm10k/base/fm10k_api.c
index c49d20dfb..e7b2fe710 100644
--- a/drivers/net/fm10k/base/fm10k_api.c
+++ b/drivers/net/fm10k/base/fm10k_api.c
@@ -234,8 +234,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;
+	}
 }
 
 /**
@@ -246,8 +252,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;
+	}
 }
 
 /**
diff --git a/drivers/net/fm10k/base/fm10k_pf.c b/drivers/net/fm10k/base/fm10k_pf.c
index db5f4912f..f5b6a9e2e 100644
--- a/drivers/net/fm10k/base/fm10k_pf.c
+++ b/drivers/net/fm10k/base/fm10k_pf.c
@@ -1511,7 +1511,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;
@@ -1584,7 +1584,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");
diff --git a/drivers/net/fm10k/base/fm10k_pf.h b/drivers/net/fm10k/base/fm10k_pf.h
index ca125c273..2c22bdd02 100644
--- a/drivers/net/fm10k/base/fm10k_pf.h
+++ b/drivers/net/fm10k/base/fm10k_pf.h
@@ -184,4 +184,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 */
diff --git a/drivers/net/fm10k/base/fm10k_vf.c b/drivers/net/fm10k/base/fm10k_vf.c
index bd449773a..2f4b5f5d2 100644
--- a/drivers/net/fm10k/base/fm10k_vf.c
+++ b/drivers/net/fm10k/base/fm10k_vf.c
@@ -526,7 +526,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");
@@ -541,7 +541,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");
diff --git a/drivers/net/fm10k/base/fm10k_vf.h b/drivers/net/fm10k/base/fm10k_vf.h
index 116c56fcc..d4edd330e 100644
--- a/drivers/net/fm10k/base/fm10k_vf.h
+++ b/drivers/net/fm10k/base/fm10k_vf.h
@@ -89,4 +89,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 */