[PATCH] net/fm10k: fix segment fault at calling fm10k_stats_get() from secondary process.
From 01ca235ebb510d68efe37a81b434c07bd335fc61 Mon Sep 17 00:00:00 2001 From: Lu Qiuwen <luqiuwen@iie.ac.cn> Date: Sat, 15 Jun 2019 14:28:01 +0800 Subject: [PATCH] net/fm10k: fix segment fault at calling fm10k_stats_get() from secondary process. The function pointers in fm10k_stats_get() which setup from primary process, when secondary process call these function pointers, a segment fault will happend. Signed-off-by: Lu Qiuwen <luqiuwen@iie.ac.cn> --- drivers/net/fm10k/base/fm10k_api.c | 20 ++++++++++++++++---- drivers/net/fm10k/base/fm10k_pf.c | 4 ++-- drivers/net/fm10k/base/fm10k_pf.h | 8 ++++++++ drivers/net/fm10k/base/fm10k_vf.c | 4 ++-- drivers/net/fm10k/base/fm10k_vf.h | 6 ++++++ 5 files changed, 34 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..207942788 100644 --- a/drivers/net/fm10k/base/fm10k_pf.h +++ b/drivers/net/fm10k/base/fm10k_pf.h @@ -184,4 +184,12 @@ 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..e433e8a94 100644 --- a/drivers/net/fm10k/base/fm10k_vf.h +++ b/drivers/net/fm10k/base/fm10k_vf.h @@ -89,4 +89,10 @@ 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
Hi,
Copying maintainers of fm10k for their review.
I'll merge it as soon as it is acked.
Thanks,
Yongseok
> On Jun 15, 2019, at 5:43 AM, Lu Qiuwen <luqiuwen@iie.ac.cn> wrote:
>
> From 01ca235ebb510d68efe37a81b434c07bd335fc61 Mon Sep 17 00:00:00 2001
> From: Lu Qiuwen <luqiuwen@iie.ac.cn>
> Date: Sat, 15 Jun 2019 14:28:01 +0800
> Subject: [PATCH] net/fm10k: fix segment fault at calling fm10k_stats_get()
> from secondary process.
>
> The function pointers in fm10k_stats_get() which setup from primary process, when secondary process call these function pointers, a segment fault will happend.
>
> Signed-off-by: Lu Qiuwen <luqiuwen@iie.ac.cn>
> ---
> drivers/net/fm10k/base/fm10k_api.c | 20 ++++++++++++++++----
> drivers/net/fm10k/base/fm10k_pf.c | 4 ++--
> drivers/net/fm10k/base/fm10k_pf.h | 8 ++++++++
> drivers/net/fm10k/base/fm10k_vf.c | 4 ++--
> drivers/net/fm10k/base/fm10k_vf.h | 6 ++++++
> 5 files changed, 34 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..207942788 100644
> --- a/drivers/net/fm10k/base/fm10k_pf.h
> +++ b/drivers/net/fm10k/base/fm10k_pf.h
> @@ -184,4 +184,12 @@ 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..e433e8a94 100644
> --- a/drivers/net/fm10k/base/fm10k_vf.h
> +++ b/drivers/net/fm10k/base/fm10k_vf.h
> @@ -89,4 +89,10 @@ 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
>
>
Hi Qiuwen, > -----Original Message----- > From: Yongseok Koh [mailto:yskoh@mellanox.com] > Sent: Tuesday, July 23, 2019 9:13 AM > To: Lu Qiuwen <luqiuwen@iie.ac.cn>; Zhang, Qi Z <qi.z.zhang@intel.com>; > Wang, Xiao W <xiao.w.wang@intel.com> > Cc: dpdk stable <stable@dpdk.org> > Subject: Re: [dpdk-stable] [PATCH 17.11] net/fm10k: fix segment fault at > calling fm10k_stats_get() > > Hi, > > Copying maintainers of fm10k for their review. > I'll merge it as soon as it is acked. > > > Thanks, > Yongseok > > > On Jun 15, 2019, at 5:43 AM, Lu Qiuwen <luqiuwen@iie.ac.cn> wrote: > > > > From 01ca235ebb510d68efe37a81b434c07bd335fc61 Mon Sep 17 00:00:00 > 2001 > > From: Lu Qiuwen <luqiuwen@iie.ac.cn> > > Date: Sat, 15 Jun 2019 14:28:01 +0800 > > Subject: [PATCH] net/fm10k: fix segment fault at calling fm10k_stats_get() > > from secondary process. > > > > The function pointers in fm10k_stats_get() which setup from primary > process, when secondary process call these function pointers, a segment > fault will happend. > > > > Signed-off-by: Lu Qiuwen <luqiuwen@iie.ac.cn> > > --- > > drivers/net/fm10k/base/fm10k_api.c | 20 ++++++++++++++++---- > > drivers/net/fm10k/base/fm10k_pf.c | 4 ++-- > > drivers/net/fm10k/base/fm10k_pf.h | 8 ++++++++ > > drivers/net/fm10k/base/fm10k_vf.c | 4 ++-- > > drivers/net/fm10k/base/fm10k_vf.h | 6 ++++++ > > 5 files changed, 34 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..207942788 100644 > > --- a/drivers/net/fm10k/base/fm10k_pf.h > > +++ b/drivers/net/fm10k/base/fm10k_pf.h > > @@ -184,4 +184,12 @@ 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); > > + > > + Above 2 empty lines should be removed. Do not introduce extra empty line. > > #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..e433e8a94 100644 > > --- a/drivers/net/fm10k/base/fm10k_vf.h > > +++ b/drivers/net/fm10k/base/fm10k_vf.h > > @@ -89,4 +89,10 @@ 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); > > + Idem. > > #endif /* _FM10K_VF_H */ > > -- > > 2.20.1.windows.1 > > > > I agree with what this patch fixes, ideally the "ops" basically should not be included in the shared data. Anyway, this patch is a quick fix. Besides, this patch should also go to dev@dpdk.org. Please address above minor issues and make a new version. Thanks, Xiao