DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH] ethdev: fix secondary process change share memory
@ 2020-01-09 12:27 Fang TongHao
  2020-01-10  7:30 ` Jeff Guo
  2020-01-13  5:03 ` [dpdk-dev] [PATCH v2] Fixes: ethdev: secondary process change shared memory Fang TongHao
  0 siblings, 2 replies; 22+ messages in thread
From: Fang TongHao @ 2020-01-09 12:27 UTC (permalink / raw)
  To: thomas, ferruh.yigit, arybchenko
  Cc: cunming.liang, jia.guo, dev, stable, Fang TongHao

Hi all,I am from Sangfor Tech.I found a bug when using DPDK in
multiprocess scenario.The secondary process enters
"rte_eth_dev_pci_copy_info" function when initializing.Then it
sets the value of struct "rte_eth_dev_data.dev_flags" to zero,
but this struct is shared by primary process and secondary
process, and the value change is unexpected by primary process.
This may cause very serious damage.I think
the secondary process should not enter "rte_eth_dev_pci_copy_info"
function or changes the value of struct "rte_eth_dev_data.dev_flags"
in shared memory.
I fixed this bug by adding an if-statement to forbid the secondary
process changing the above-mentioned value.
Thansk, All.

Signed-off-by: Fang TongHao <fangtonghao@sangfor.com.cn>
---
 lib/librte_ethdev/rte_ethdev_pci.h | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/lib/librte_ethdev/rte_ethdev_pci.h b/lib/librte_ethdev/rte_ethdev_pci.h
index ccdbb46ec..916de8a14 100644
--- a/lib/librte_ethdev/rte_ethdev_pci.h
+++ b/lib/librte_ethdev/rte_ethdev_pci.h
@@ -59,15 +59,16 @@ rte_eth_copy_pci_info(struct rte_eth_dev *eth_dev,
 	}
 
 	eth_dev->intr_handle = &pci_dev->intr_handle;
-
-	eth_dev->data->dev_flags = 0;
-	if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
-		eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
-	if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_RMV)
-		eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_RMV;
-
-	eth_dev->data->kdrv = pci_dev->kdrv;
-	eth_dev->data->numa_node = pci_dev->device.numa_node;
+	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
+		eth_dev->data->dev_flags = 0;
+		if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
+			eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
+		if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_RMV)
+			eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_RMV;
+
+		eth_dev->data->kdrv = pci_dev->kdrv;
+		eth_dev->data->numa_node = pci_dev->device.numa_node;
+	}
 }
 
 static inline int
-- 
2.24.1.windows.2


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [dpdk-dev] [PATCH] ethdev: fix secondary process change share memory
  2020-01-09 12:27 [dpdk-dev] [PATCH] ethdev: fix secondary process change share memory Fang TongHao
@ 2020-01-10  7:30 ` Jeff Guo
  2020-01-10  7:53   ` 方统浩50450
  2020-01-13  5:03 ` [dpdk-dev] [PATCH v2] Fixes: ethdev: secondary process change shared memory Fang TongHao
  1 sibling, 1 reply; 22+ messages in thread
From: Jeff Guo @ 2020-01-10  7:30 UTC (permalink / raw)
  To: Fang TongHao, thomas, ferruh.yigit, arybchenko; +Cc: cunming.liang, dev, stable

hi, tonghao


On 1/9/2020 8:27 PM, Fang TongHao wrote:
> Hi all,I am from Sangfor Tech.I found a bug when using DPDK in
> multiprocess scenario.The secondary process enters
> "rte_eth_dev_pci_copy_info" function when initializing.Then it
> sets the value of struct "rte_eth_dev_data.dev_flags" to zero,
> but this struct is shared by primary process and secondary
> process, and the value change is unexpected by primary process.
> This may cause very serious damage.I think
> the secondary process should not enter "rte_eth_dev_pci_copy_info"
> function or changes the value of struct "rte_eth_dev_data.dev_flags"
> in shared memory.
> I fixed this bug by adding an if-statement to forbid the secondary
> process changing the above-mentioned value.
> Thansk, All.


i think the format of commit log should be refined to be more formal 
like as below. what do you think?

ethdev: XXXXXXXXX

XXXXXXXX


> Signed-off-by: Fang TongHao <fangtonghao@sangfor.com.cn>


if it is a fix, suggest to add the line as "Fixes: XXXXXXXX ("ethdev: 
XXXXXXX") to trace it.


> ---
>   lib/librte_ethdev/rte_ethdev_pci.h | 19 ++++++++++---------
>   1 file changed, 10 insertions(+), 9 deletions(-)
>
> diff --git a/lib/librte_ethdev/rte_ethdev_pci.h b/lib/librte_ethdev/rte_ethdev_pci.h
> index ccdbb46ec..916de8a14 100644
> --- a/lib/librte_ethdev/rte_ethdev_pci.h
> +++ b/lib/librte_ethdev/rte_ethdev_pci.h
> @@ -59,15 +59,16 @@ rte_eth_copy_pci_info(struct rte_eth_dev *eth_dev,
>   	}
>   
>   	eth_dev->intr_handle = &pci_dev->intr_handle;
> -
> -	eth_dev->data->dev_flags = 0;
> -	if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
> -		eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
> -	if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_RMV)
> -		eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_RMV;
> -
> -	eth_dev->data->kdrv = pci_dev->kdrv;
> -	eth_dev->data->numa_node = pci_dev->device.numa_node;
> +	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
> +		eth_dev->data->dev_flags = 0;
> +		if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
> +			eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
> +		if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_RMV)
> +			eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_RMV;
> +
> +		eth_dev->data->kdrv = pci_dev->kdrv;
> +		eth_dev->data->numa_node = pci_dev->device.numa_node;


 From the change log, you said that "rte_eth_dev_data.dev_flags" should 
not be touched by secondary process, but you don't mention about

data->kdrv and data->numa_node, could you also explain them in the log 
if they need to process as the same.


> +	}
>   }
>   
>   static inline int

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [dpdk-dev] [PATCH] ethdev: fix secondary process change share memory
  2020-01-10  7:30 ` Jeff Guo
@ 2020-01-10  7:53   ` 方统浩50450
  0 siblings, 0 replies; 22+ messages in thread
From: 方统浩50450 @ 2020-01-10  7:53 UTC (permalink / raw)
  To: Jeff Guo; +Cc: thomas, ferruh.yigit, arybchenko, cunming.liang, dev, stable

thanks for your correction 
I will rewrite my commit log and send email again


方统浩50450
邮箱:fangtonghao@sangfor.com.cn
签名由 网易邮箱大师 定制


On 01/10/2020 15:30, Jeff Guo wrote:

hi, tonghao


 On 1/9/2020 8:27 PM, Fang TongHao wrote:
 > Hi all,I am from Sangfor Tech.I found a bug when using DPDK in
 > multiprocess scenario.The secondary process enters
 > "rte_eth_dev_pci_copy_info" function when initializing.Then it
 > sets the value of struct "rte_eth_dev_data.dev_flags" to zero,
 > but this struct is shared by primary process and secondary
 > process, and the value change is unexpected by primary process.
 > This may cause very serious damage.I think
 > the secondary process should not enter "rte_eth_dev_pci_copy_info"
 > function or changes the value of struct "rte_eth_dev_data.dev_flags"
 > in shared memory.
 > I fixed this bug by adding an if-statement to forbid the secondary
 > process changing the above-mentioned value.
 > Thansk, All.


 i think the format of commit log should be refined to be more formal
 like as below. what do you think?

 ethdev: XXXXXXXXX

 XXXXXXXX


 > Signed-off-by: Fang TongHao <fangtonghao@sangfor.com.cn>


 if it is a fix, suggest to add the line as "Fixes: XXXXXXXX ("ethdev:
 XXXXXXX") to trace it.


 > ---
 >   lib/librte_ethdev/rte_ethdev_pci.h | 19 ++++++++++---------
 >   1 file changed, 10 insertions(+), 9 deletions(-)
 >
 > diff --git a/lib/librte_ethdev/rte_ethdev_pci.h b/lib/librte_ethdev/rte_ethdev_pci.h
 > index ccdbb46ec..916de8a14 100644
 > --- a/lib/librte_ethdev/rte_ethdev_pci.h
 > +++ b/lib/librte_ethdev/rte_ethdev_pci.h
 > @@ -59,15 +59,16 @@ rte_eth_copy_pci_info(struct rte_eth_dev *eth_dev,
 >       }
 >   
 >       eth_dev->intr_handle = &pci_dev->intr_handle;
 > -
 > -    eth_dev->data->dev_flags = 0;
 > -    if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
 > -        eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
 > -    if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_RMV)
 > -        eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_RMV;
 > -
 > -    eth_dev->data->kdrv = pci_dev->kdrv;
 > -    eth_dev->data->numa_node = pci_dev->device.numa_node;
 > +    if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
 > +        eth_dev->data->dev_flags = 0;
 > +        if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
 > +            eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
 > +        if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_RMV)
 > +            eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_RMV;
 > +
 > +        eth_dev->data->kdrv = pci_dev->kdrv;
 > +        eth_dev->data->numa_node = pci_dev->device.numa_node;


 From the change log, you said that "rte_eth_dev_data.dev_flags" should
 not be touched by secondary process, but you don't mention about

 data->kdrv and data->numa_node, could you also explain them in the log
 if they need to process as the same.


 > +    }
 >   }
 >   
 >   static inline int





^ permalink raw reply	[flat|nested] 22+ messages in thread

* [dpdk-dev] [PATCH v2] Fixes: ethdev: secondary process change shared memory
  2020-01-09 12:27 [dpdk-dev] [PATCH] ethdev: fix secondary process change share memory Fang TongHao
  2020-01-10  7:30 ` Jeff Guo
@ 2020-01-13  5:03 ` Fang TongHao
  2020-01-14 14:45   ` Ferruh Yigit
  2020-01-17  2:08   ` [dpdk-dev] [PATCH v3] " Fang TongHao
  1 sibling, 2 replies; 22+ messages in thread
From: Fang TongHao @ 2020-01-13  5:03 UTC (permalink / raw)
  To: thomas, ferruh.yigit, arybchenko
  Cc: dev, stable, jia.guo, cunming.liang, qi.z.zhang, jungle845943968,
	Fang TongHao

Secondary process calls “rte_eth_dev_pci_allocate”
function and enters rte_eth_copy_pci_info function
when initializing.Then it sets the value of struct
"rte_eth_dev_data.dev_flags" to zero and reset it,
but this struct is shared by primary process and
secondary process.To fix this bug,by adding an
if-statement to forbid the secondaryprocess changing
the above-mentioned value.

Signed-off-by: Fang TongHao <fangtonghao@sangfor.com.cn>
---
 lib/librte_ethdev/rte_ethdev_pci.h | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/lib/librte_ethdev/rte_ethdev_pci.h b/lib/librte_ethdev/rte_ethdev_pci.h
index ccdbb46ec..e7dae0545 100644
--- a/lib/librte_ethdev/rte_ethdev_pci.h
+++ b/lib/librte_ethdev/rte_ethdev_pci.h
@@ -60,14 +60,16 @@ rte_eth_copy_pci_info(struct rte_eth_dev *eth_dev,
 
 	eth_dev->intr_handle = &pci_dev->intr_handle;
 
-	eth_dev->data->dev_flags = 0;
-	if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
-		eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
-	if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_RMV)
-		eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_RMV;
-
-	eth_dev->data->kdrv = pci_dev->kdrv;
-	eth_dev->data->numa_node = pci_dev->device.numa_node;
+	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
+		eth_dev->data->dev_flags = 0;
+		if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
+			eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
+		if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_RMV)
+			eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_RMV;
+
+		eth_dev->data->kdrv = pci_dev->kdrv;
+		eth_dev->data->numa_node = pci_dev->device.numa_node;
+	}
 }
 
 static inline int
-- 
2.24.1.windows.2


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [dpdk-dev] [PATCH v2] Fixes: ethdev: secondary process change shared memory
  2020-01-13  5:03 ` [dpdk-dev] [PATCH v2] Fixes: ethdev: secondary process change shared memory Fang TongHao
@ 2020-01-14 14:45   ` Ferruh Yigit
  2020-01-15  6:49     ` 方统浩50450
  2020-01-17  2:08   ` [dpdk-dev] [PATCH v3] " Fang TongHao
  1 sibling, 1 reply; 22+ messages in thread
From: Ferruh Yigit @ 2020-01-14 14:45 UTC (permalink / raw)
  To: Fang TongHao, thomas, arybchenko
  Cc: dev, stable, jia.guo, cunming.liang, qi.z.zhang, jungle845943968

On 1/13/2020 5:03 AM, Fang TongHao wrote:
> Secondary process calls “rte_eth_dev_pci_allocate”
> function and enters rte_eth_copy_pci_info function
> when initializing.Then it sets the value of struct
> "rte_eth_dev_data.dev_flags" to zero and reset it,
> but this struct is shared by primary process and
> secondary process.To fix this bug,by adding an
> if-statement to forbid the secondaryprocess changing
> the above-mentioned value.

Hi Fang,

Thanks for the fix, I agree with the problem statement, but not sure if this
should be handled in the helper function or in the place where the function is
called. Helper function is simple on what it does, do we need to put the primary
process logic in it.

Can you please give more details of the bug you have encounter, is it seen by a
specific PMD?

Thanks,
ferruh

> 
> Signed-off-by: Fang TongHao <fangtonghao@sangfor.com.cn>
> ---
>  lib/librte_ethdev/rte_ethdev_pci.h | 18 ++++++++++--------
>  1 file changed, 10 insertions(+), 8 deletions(-)
> 
> diff --git a/lib/librte_ethdev/rte_ethdev_pci.h b/lib/librte_ethdev/rte_ethdev_pci.h
> index ccdbb46ec..e7dae0545 100644
> --- a/lib/librte_ethdev/rte_ethdev_pci.h
> +++ b/lib/librte_ethdev/rte_ethdev_pci.h
> @@ -60,14 +60,16 @@ rte_eth_copy_pci_info(struct rte_eth_dev *eth_dev,
>  
>  	eth_dev->intr_handle = &pci_dev->intr_handle;
>  
> -	eth_dev->data->dev_flags = 0;
> -	if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
> -		eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
> -	if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_RMV)
> -		eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_RMV;
> -
> -	eth_dev->data->kdrv = pci_dev->kdrv;
> -	eth_dev->data->numa_node = pci_dev->device.numa_node;
> +	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
> +		eth_dev->data->dev_flags = 0;
> +		if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
> +			eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
> +		if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_RMV)
> +			eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_RMV;
> +
> +		eth_dev->data->kdrv = pci_dev->kdrv;
> +		eth_dev->data->numa_node = pci_dev->device.numa_node;
> +	}
>  }
>  
>  static inline int
> 


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [dpdk-dev] [PATCH v2] Fixes: ethdev: secondary process change shared memory
  2020-01-14 14:45   ` Ferruh Yigit
@ 2020-01-15  6:49     ` 方统浩50450
  2020-01-15 18:35       ` Ferruh Yigit
  0 siblings, 1 reply; 22+ messages in thread
From: 方统浩50450 @ 2020-01-15  6:49 UTC (permalink / raw)
  To: Ferruh Yigit
  Cc: thomas, arybchenko, dev, stable, jia.guo, cunming.liang,
	qi.z.zhang, jungle845943968

Hi Ferruh, thanks for your message.


We developed a ethtool-dpdk which is secondary process based dpdk 17.08 version. Our device
support hotplug detach, but hotplug deatch is failed when we use ethtool-dpdk.We found the
secondary process will change the shared memory when initializing.Secondary process calls
"rte_eth_dev_pci_allocate" function and enters "rte_eth_copy_pci_info" function.
(rte_eth_dev_pci_generic_probe -> rte_eth_dev_pci_allocate -> rte_eth_copy_pci_info)
Then it sets the value of struct "rte_eth_dev_data.dev_flags" to zero.In our platform, this value
is equal to 0x0003.(RTE_ETH_DEV_DETACHABLE | RTE_ETH_DEV_INTR_LSC),but after reset
the "dev_flags", the value changed to 0x0002.(RTE_ETH_DEV_DETACHABLE).So, our device hotplug
detach is failed.I found the similar problem in other dpdk version, include dpdk 19.11.Even though
the deivce hotplug detach is discarded,but i think the shared memory changed is unexpected by primary
process.


Our driver is ixgbe, i think this problem has a little relationship with driver, Secondary process
enters "rte_eth_copy_pci_info" by "rte_eth_dev_pci_allocate".And I agree your opinion, the helper
function should simple on what it does.I have two ways to fix this problem, one is add an if-statement

in "rte_eth_dev_pci_allocate" function to forbid secondary process enters "rte_eth_copy_pci_info" function,
another way is add an if-statement in "rte_eth_copy_pci_info" function to forbid secondary process change
shared memory.And First way need to ensure the "rte_eth_copy_pci_info" function won't be called anywhere else.
I think the second way is simple and lower risk.


Please forgive me because my poor english....



发件人:Ferruh Yigit <ferruh.yigit@intel.com>
发送日期:2020-01-14 22:45:33
收件人:Fang TongHao <fangtonghao@sangfor.com.cn>,thomas@monjalon.net,arybchenko@solarflare.com
抄送人:dev@dpdk.org,stable@dpdk.org,jia.guo@intel.com,cunming.liang@intel.com,qi.z.zhang@intel.com,jungle845943968@outlook.com
主题:Re: [dpdk-dev] [PATCH v2] Fixes: ethdev: secondary process change shared memory>On 1/13/2020 5:03 AM, Fang TongHao wrote:
>> Secondary process calls “rte_eth_dev_pci_allocate”
>> function and enters rte_eth_copy_pci_info function
>> when initializing.Then it sets the value of struct
>> "rte_eth_dev_data.dev_flags" to zero and reset it,
>> but this struct is shared by primary process and
>> secondary process.To fix this bug,by adding an
>> if-statement to forbid the secondaryprocess changing
>> the above-mentioned value.
>
>Hi Fang,
>
>Thanks for the fix, I agree with the problem statement, but not sure if this
>should be handled in the helper function or in the place where the function is
>called. Helper function is simple on what it does, do we need to put the primary
>process logic in it.
>
>Can you please give more details of the bug you have encounter, is it seen by a
>specific PMD?
>
>Thanks,
>ferruh
>
>> 
>> Signed-off-by: Fang TongHao <fangtonghao@sangfor.com.cn>
>> ---
>>  lib/librte_ethdev/rte_ethdev_pci.h | 18 ++++++++++--------
>>  1 file changed, 10 insertions(+), 8 deletions(-)
>> 
>> diff --git a/lib/librte_ethdev/rte_ethdev_pci.h b/lib/librte_ethdev/rte_ethdev_pci.h
>> index ccdbb46ec..e7dae0545 100644
>> --- a/lib/librte_ethdev/rte_ethdev_pci.h
>> +++ b/lib/librte_ethdev/rte_ethdev_pci.h
>> @@ -60,14 +60,16 @@ rte_eth_copy_pci_info(struct rte_eth_dev *eth_dev,
>>  
>>  	eth_dev->intr_handle = &pci_dev->intr_handle;
>>  
>> -	eth_dev->data->dev_flags = 0;
>> -	if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
>> -		eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
>> -	if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_RMV)
>> -		eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_RMV;
>> -
>> -	eth_dev->data->kdrv = pci_dev->kdrv;
>> -	eth_dev->data->numa_node = pci_dev->device.numa_node;
>> +	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
>> +		eth_dev->data->dev_flags = 0;
>> +		if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
>> +			eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
>> +		if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_RMV)
>> +			eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_RMV;
>> +
>> +		eth_dev->data->kdrv = pci_dev->kdrv;
>> +		eth_dev->data->numa_node = pci_dev->device.numa_node;
>> +	}
>>  }
>>  
>>  static inline int
>> 
>





^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [dpdk-dev] [PATCH v2] Fixes: ethdev: secondary process change shared memory
  2020-01-15  6:49     ` 方统浩50450
@ 2020-01-15 18:35       ` Ferruh Yigit
  2020-01-15 20:43         ` Thomas Monjalon
  0 siblings, 1 reply; 22+ messages in thread
From: Ferruh Yigit @ 2020-01-15 18:35 UTC (permalink / raw)
  To: 方统浩50450
  Cc: thomas, arybchenko, dev, stable, jia.guo, cunming.liang,
	qi.z.zhang, jungle845943968, Jerin Jacob Kollanukkaran

On 1/15/2020 6:49 AM, 方统浩50450 wrote:
> Hi Ferruh, thanks for your message.
> 
> 
> We developed a ethtool-dpdk which is secondary process based dpdk 17.08 version. Our device
> support hotplug detach, but hotplug deatch is failed when we use ethtool-dpdk.We found the
> secondary process will change the shared memory when initializing.Secondary process calls
> "rte_eth_dev_pci_allocate" function and enters "rte_eth_copy_pci_info" function.
> (rte_eth_dev_pci_generic_probe -> rte_eth_dev_pci_allocate -> rte_eth_copy_pci_info)
> Then it sets the value of struct "rte_eth_dev_data.dev_flags" to zero.In our platform, this value
> is equal to 0x0003.(RTE_ETH_DEV_DETACHABLE | RTE_ETH_DEV_INTR_LSC),but after reset
> the "dev_flags", the value changed to 0x0002.(RTE_ETH_DEV_DETACHABLE).So, our device hotplug
> detach is failed.I found the similar problem in other dpdk version, include dpdk 19.11.Even though
> the deivce hotplug detach is discarded,but i think the shared memory changed is unexpected by primary
> process.

I agree this is the problem.
In the driver code, 'rte_eth_copy_pci_info' is called only by primary process,
but the generic code is faulty.

And in 19.11 additionally 'eth_dev_pci_specific_init' also seems has same problem.

> 
> 
> Our driver is ixgbe, i think this problem has a little relationship with driver, Secondary process
> enters "rte_eth_copy_pci_info" by "rte_eth_dev_pci_allocate".And I agree your opinion, the helper
> function should simple on what it does.I have two ways to fix this problem, one is add an if-statement
> 
> in "rte_eth_dev_pci_allocate" function to forbid secondary process enters "rte_eth_copy_pci_info" function,
> another way is add an if-statement in "rte_eth_copy_pci_info" function to forbid secondary process change
> shared memory.And First way need to ensure the "rte_eth_copy_pci_info" function won't be called anywhere else.
> I think the second way is simple and lower risk.

Yes these are the two options.

I agree adding check in the 'rte_eth_copy_pci_info' covers all cases and safer.
BUT my concern was adding decision making to simple/leaf function and make it
harder to debug/use, instead of giving what primary/secondary process should
call decision in higher level.

But I just recognized that some PMDs are calling 'rte_eth_copy_pci_info' on
secondary process, like mlx4 or szedata2, and most probably this is not their
intention.
And 'eth_dev->intr_handle' set in 'rte_eth_copy_pci_info', not calling this
function may have side affect of 'eth_dev->intr_handle' not set in secondary.

With above considerations I am OK to your proposal to cover all cases, Thomas,
Andrew, any concern?

@Fang, only can you please make a new version to update the
'rte_eth_copy_pci_info' function comment to document shared data is not updated
for the secondary process?

Thanks,
ferruh

> 
> 
> Please forgive me because my poor english....
> 
> 
> 
> 发件人:Ferruh Yigit <ferruh.yigit@intel.com>
> 发送日期:2020-01-14 22:45:33
> 收件人:Fang TongHao <fangtonghao@sangfor.com.cn>,thomas@monjalon.net,arybchenko@solarflare.com
> 抄送人:dev@dpdk.org,stable@dpdk.org,jia.guo@intel.com,cunming.liang@intel.com,qi.z.zhang@intel.com,jungle845943968@outlook.com
> 主题:Re: [dpdk-dev] [PATCH v2] Fixes: ethdev: secondary process change shared memory>On 1/13/2020 5:03 AM, Fang TongHao wrote:
>>> Secondary process calls “rte_eth_dev_pci_allocate”
>>> function and enters rte_eth_copy_pci_info function
>>> when initializing.Then it sets the value of struct
>>> "rte_eth_dev_data.dev_flags" to zero and reset it,
>>> but this struct is shared by primary process and
>>> secondary process.To fix this bug,by adding an
>>> if-statement to forbid the secondaryprocess changing
>>> the above-mentioned value.
>>
>> Hi Fang,
>>
>> Thanks for the fix, I agree with the problem statement, but not sure if this
>> should be handled in the helper function or in the place where the function is
>> called. Helper function is simple on what it does, do we need to put the primary
>> process logic in it.
>>
>> Can you please give more details of the bug you have encounter, is it seen by a
>> specific PMD?
>>
>> Thanks,
>> ferruh
>>
>>>
>>> Signed-off-by: Fang TongHao <fangtonghao@sangfor.com.cn>
>>> ---
>>>  lib/librte_ethdev/rte_ethdev_pci.h | 18 ++++++++++--------
>>>  1 file changed, 10 insertions(+), 8 deletions(-)
>>>
>>> diff --git a/lib/librte_ethdev/rte_ethdev_pci.h b/lib/librte_ethdev/rte_ethdev_pci.h
>>> index ccdbb46ec..e7dae0545 100644
>>> --- a/lib/librte_ethdev/rte_ethdev_pci.h
>>> +++ b/lib/librte_ethdev/rte_ethdev_pci.h
>>> @@ -60,14 +60,16 @@ rte_eth_copy_pci_info(struct rte_eth_dev *eth_dev,
>>>  
>>>  	eth_dev->intr_handle = &pci_dev->intr_handle;
>>>  
>>> -	eth_dev->data->dev_flags = 0;
>>> -	if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
>>> -		eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
>>> -	if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_RMV)
>>> -		eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_RMV;
>>> -
>>> -	eth_dev->data->kdrv = pci_dev->kdrv;
>>> -	eth_dev->data->numa_node = pci_dev->device.numa_node;
>>> +	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
>>> +		eth_dev->data->dev_flags = 0;
>>> +		if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
>>> +			eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
>>> +		if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_RMV)
>>> +			eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_RMV;
>>> +
>>> +		eth_dev->data->kdrv = pci_dev->kdrv;
>>> +		eth_dev->data->numa_node = pci_dev->device.numa_node;
>>> +	}
>>>  }
>>>  
>>>  static inline int
>>>
>>
> 
> 
> 
> 


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [dpdk-dev] [PATCH v2] Fixes: ethdev: secondary process change shared memory
  2020-01-15 18:35       ` Ferruh Yigit
@ 2020-01-15 20:43         ` Thomas Monjalon
  2020-01-16  7:43           ` Andrew Rybchenko
  2020-01-16  9:00           ` Ferruh Yigit
  0 siblings, 2 replies; 22+ messages in thread
From: Thomas Monjalon @ 2020-01-15 20:43 UTC (permalink / raw)
  To: Ferruh Yigit
  Cc: 方统浩50450, arybchenko, dev, stable, jia.guo,
	cunming.liang, qi.z.zhang, jungle845943968,
	Jerin Jacob Kollanukkaran

15/01/2020 19:35, Ferruh Yigit:
> On 1/15/2020 6:49 AM, 方统浩50450 wrote:
> > Hi Ferruh, thanks for your message.
> > 
> > 
> > We developed a ethtool-dpdk which is secondary process based dpdk 17.08 version. Our device
> > support hotplug detach, but hotplug deatch is failed when we use ethtool-dpdk.We found the
> > secondary process will change the shared memory when initializing.Secondary process calls
> > "rte_eth_dev_pci_allocate" function and enters "rte_eth_copy_pci_info" function.
> > (rte_eth_dev_pci_generic_probe -> rte_eth_dev_pci_allocate -> rte_eth_copy_pci_info)
> > Then it sets the value of struct "rte_eth_dev_data.dev_flags" to zero.In our platform, this value
> > is equal to 0x0003.(RTE_ETH_DEV_DETACHABLE | RTE_ETH_DEV_INTR_LSC),but after reset
> > the "dev_flags", the value changed to 0x0002.(RTE_ETH_DEV_DETACHABLE).So, our device hotplug
> > detach is failed.I found the similar problem in other dpdk version, include dpdk 19.11.Even though
> > the deivce hotplug detach is discarded,but i think the shared memory changed is unexpected by primary
> > process.
> 
> I agree this is the problem.
> In the driver code, 'rte_eth_copy_pci_info' is called only by primary process,
> but the generic code is faulty.
> 
> And in 19.11 additionally 'eth_dev_pci_specific_init' also seems has same problem.
> 
> > Our driver is ixgbe, i think this problem has a little relationship with driver, Secondary process
> > enters "rte_eth_copy_pci_info" by "rte_eth_dev_pci_allocate".And I agree your opinion, the helper
> > function should simple on what it does.I have two ways to fix this problem, one is add an if-statement
> > 
> > in "rte_eth_dev_pci_allocate" function to forbid secondary process enters "rte_eth_copy_pci_info" function,
> > another way is add an if-statement in "rte_eth_copy_pci_info" function to forbid secondary process change
> > shared memory.And First way need to ensure the "rte_eth_copy_pci_info" function won't be called anywhere else.
> > I think the second way is simple and lower risk.
> 
> Yes these are the two options.
> 
> I agree adding check in the 'rte_eth_copy_pci_info' covers all cases and safer.
> BUT my concern was adding decision making to simple/leaf function and make it
> harder to debug/use, instead of giving what primary/secondary process should
> call decision in higher level.
> 
> But I just recognized that some PMDs are calling 'rte_eth_copy_pci_info' on
> secondary process, like mlx4 or szedata2, and most probably this is not their
> intention.
> And 'eth_dev->intr_handle' set in 'rte_eth_copy_pci_info', not calling this
> function may have side affect of 'eth_dev->intr_handle' not set in secondary.
> 
> With above considerations I am OK to your proposal to cover all cases, Thomas,
> Andrew, any concern?

Do you mean drivers need to be fixed?




^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [dpdk-dev] [PATCH v2] Fixes: ethdev: secondary process change shared memory
  2020-01-15 20:43         ` Thomas Monjalon
@ 2020-01-16  7:43           ` Andrew Rybchenko
  2020-01-16  9:04             ` Ferruh Yigit
  2020-01-16  9:00           ` Ferruh Yigit
  1 sibling, 1 reply; 22+ messages in thread
From: Andrew Rybchenko @ 2020-01-16  7:43 UTC (permalink / raw)
  To: Thomas Monjalon, Ferruh Yigit
  Cc: 方统浩50450, dev, stable, jia.guo,
	cunming.liang, qi.z.zhang, jungle845943968,
	Jerin Jacob Kollanukkaran

On 1/15/20 11:43 PM, Thomas Monjalon wrote:
> 15/01/2020 19:35, Ferruh Yigit:
>> On 1/15/2020 6:49 AM, 方统浩50450 wrote:
>>> Hi Ferruh, thanks for your message.
>>>
>>>
>>> We developed a ethtool-dpdk which is secondary process based dpdk 17.08 version. Our device
>>> support hotplug detach, but hotplug deatch is failed when we use ethtool-dpdk.We found the
>>> secondary process will change the shared memory when initializing.Secondary process calls
>>> "rte_eth_dev_pci_allocate" function and enters "rte_eth_copy_pci_info" function.
>>> (rte_eth_dev_pci_generic_probe -> rte_eth_dev_pci_allocate -> rte_eth_copy_pci_info)
>>> Then it sets the value of struct "rte_eth_dev_data.dev_flags" to zero.In our platform, this value
>>> is equal to 0x0003.(RTE_ETH_DEV_DETACHABLE | RTE_ETH_DEV_INTR_LSC),but after reset
>>> the "dev_flags", the value changed to 0x0002.(RTE_ETH_DEV_DETACHABLE).So, our device hotplug
>>> detach is failed.I found the similar problem in other dpdk version, include dpdk 19.11.Even though
>>> the deivce hotplug detach is discarded,but i think the shared memory changed is unexpected by primary
>>> process.

Hold on, just for my understanding. As far as I can see
RTE_ETH_DEV_DETACHABLE was removed in 17.11. Does it
change something in above description?

>> I agree this is the problem.
>> In the driver code, 'rte_eth_copy_pci_info' is called only by primary process,
>>
>> but the generic code is faulty.
>>
>> And in 19.11 additionally 'eth_dev_pci_specific_init' also seems has same problem.

Yes, as I understand RTE_ETH_DEV_CLOSE_REMOVE,
RTE_ETH_DEV_BONDED_SLAVE, RTE_ETH_DEV_REPRESENTOR and
RTE_ETH_DEV_NOLIVE_MAC_ADDR may be lost because of
reinit (if not restored in other branches). Bad anyway.

>>> Our driver is ixgbe, i think this problem has a little relationship with driver, Secondary process
>>> enters "rte_eth_copy_pci_info" by "rte_eth_dev_pci_allocate".And I agree your opinion, the helper
>>> function should simple on what it does.I have two ways to fix this problem, one is add an if-statement
>>>
>>> in "rte_eth_dev_pci_allocate" function to forbid secondary process enters "rte_eth_copy_pci_info" function,
>>> another way is add an if-statement in "rte_eth_copy_pci_info" function to forbid secondary process change
>>> shared memory.And First way need to ensure the "rte_eth_copy_pci_info" function won't be called anywhere else.
>>> I think the second way is simple and lower risk.
>>
>> Yes these are the two options.
>>
>> I agree adding check in the 'rte_eth_copy_pci_info' covers all cases and safer.
>> BUT my concern was adding decision making to simple/leaf function and make it
>> harder to debug/use, instead of giving what primary/secondary process should
>> call decision in higher level.
>>
>> But I just recognized that some PMDs are calling 'rte_eth_copy_pci_info' on
>> secondary process, like mlx4 or szedata2, and most probably this is not their
>> intention.
>> And 'eth_dev->intr_handle' set in 'rte_eth_copy_pci_info', not calling this
>> function may have side affect of 'eth_dev->intr_handle' not set in secondary.
>>
>> With above considerations I am OK to your proposal to cover all cases, Thomas,
>> Andrew, any concern?

I would put if condition in rte_eth_copy_pci_info().
It is the function which writes shared space from
secondary process when it should not be done and it
should be fixed there.

> Do you mean drivers need to be fixed?

I'm not sure that I fully understand it. Since copy function
cares about intr_handle copying I'm afraid that it is not
100% correct to skip it in secondary process completely as
many drivers do right now. Basically it makes eth_dev structure
in secondary process inconsistent. However, it looks like
most of these drivers simply obtain handle from pci_dev
directly and it explains why they are not affected.
There are exceptions which are potentially bugs, e.g.
drivers/net/ice/ice_ethdev.c: ice_interrupt_handler at the end.

I think that it would be better if intr_handle is always
correct in eth_dev (both primary and secondary cases) and
drivers use it instead of the same from pci_dev.

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [dpdk-dev] [PATCH v2] Fixes: ethdev: secondary process change shared memory
  2020-01-15 20:43         ` Thomas Monjalon
  2020-01-16  7:43           ` Andrew Rybchenko
@ 2020-01-16  9:00           ` Ferruh Yigit
  1 sibling, 0 replies; 22+ messages in thread
From: Ferruh Yigit @ 2020-01-16  9:00 UTC (permalink / raw)
  To: Thomas Monjalon
  Cc: 方统浩50450, arybchenko, dev, stable, jia.guo,
	cunming.liang, qi.z.zhang, jungle845943968,
	Jerin Jacob Kollanukkaran

On 1/15/2020 8:43 PM, Thomas Monjalon wrote:
> 15/01/2020 19:35, Ferruh Yigit:
>> On 1/15/2020 6:49 AM, 方统浩50450 wrote:
>>> Hi Ferruh, thanks for your message.
>>>
>>>
>>> We developed a ethtool-dpdk which is secondary process based dpdk 17.08 version. Our device
>>> support hotplug detach, but hotplug deatch is failed when we use ethtool-dpdk.We found the
>>> secondary process will change the shared memory when initializing.Secondary process calls
>>> "rte_eth_dev_pci_allocate" function and enters "rte_eth_copy_pci_info" function.
>>> (rte_eth_dev_pci_generic_probe -> rte_eth_dev_pci_allocate -> rte_eth_copy_pci_info)
>>> Then it sets the value of struct "rte_eth_dev_data.dev_flags" to zero.In our platform, this value
>>> is equal to 0x0003.(RTE_ETH_DEV_DETACHABLE | RTE_ETH_DEV_INTR_LSC),but after reset
>>> the "dev_flags", the value changed to 0x0002.(RTE_ETH_DEV_DETACHABLE).So, our device hotplug
>>> detach is failed.I found the similar problem in other dpdk version, include dpdk 19.11.Even though
>>> the deivce hotplug detach is discarded,but i think the shared memory changed is unexpected by primary
>>> process.
>>
>> I agree this is the problem.
>> In the driver code, 'rte_eth_copy_pci_info' is called only by primary process,
>> but the generic code is faulty.
>>
>> And in 19.11 additionally 'eth_dev_pci_specific_init' also seems has same problem.
>>
>>> Our driver is ixgbe, i think this problem has a little relationship with driver, Secondary process
>>> enters "rte_eth_copy_pci_info" by "rte_eth_dev_pci_allocate".And I agree your opinion, the helper
>>> function should simple on what it does.I have two ways to fix this problem, one is add an if-statement
>>>
>>> in "rte_eth_dev_pci_allocate" function to forbid secondary process enters "rte_eth_copy_pci_info" function,
>>> another way is add an if-statement in "rte_eth_copy_pci_info" function to forbid secondary process change
>>> shared memory.And First way need to ensure the "rte_eth_copy_pci_info" function won't be called anywhere else.
>>> I think the second way is simple and lower risk.
>>
>> Yes these are the two options.
>>
>> I agree adding check in the 'rte_eth_copy_pci_info' covers all cases and safer.
>> BUT my concern was adding decision making to simple/leaf function and make it
>> harder to debug/use, instead of giving what primary/secondary process should
>> call decision in higher level.
>>
>> But I just recognized that some PMDs are calling 'rte_eth_copy_pci_info' on
>> secondary process, like mlx4 or szedata2, and most probably this is not their
>> intention.
>> And 'eth_dev->intr_handle' set in 'rte_eth_copy_pci_info', not calling this
>> function may have side affect of 'eth_dev->intr_handle' not set in secondary.
>>
>> With above considerations I am OK to your proposal to cover all cases, Thomas,
>> Andrew, any concern?
> 
> Do you mean drivers need to be fixed?
> 

either it or 'rte_eth_copy_pci_info'.

Right now 'rte_eth_copy_pci_info' updates the shared memory, calling it in
secondary overwrites the memory set by primary.

Options Fang mentioned:
1) Don't call 'rte_eth_copy_pci_info' from secondary process path, this requires
fixing 'rte_eth_dev_pci_allocate', 'eth_dev_pci_specific_init' and possibly some
drivers.

2) Add a check inside the 'rte_eth_copy_pci_info' to prevent updating shared
memory if it is secondary process.

Fang's patch does (2), and I am OK with it as well after latest findings.

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [dpdk-dev] [PATCH v2] Fixes: ethdev: secondary process change shared memory
  2020-01-16  7:43           ` Andrew Rybchenko
@ 2020-01-16  9:04             ` Ferruh Yigit
  2020-01-16 11:35               ` 方统浩50450
  0 siblings, 1 reply; 22+ messages in thread
From: Ferruh Yigit @ 2020-01-16  9:04 UTC (permalink / raw)
  To: Andrew Rybchenko, Thomas Monjalon
  Cc: 方统浩50450, dev, stable, jia.guo,
	cunming.liang, qi.z.zhang, jungle845943968,
	Jerin Jacob Kollanukkaran

On 1/16/2020 7:43 AM, Andrew Rybchenko wrote:
> On 1/15/20 11:43 PM, Thomas Monjalon wrote:
>> 15/01/2020 19:35, Ferruh Yigit:
>>> On 1/15/2020 6:49 AM, 方统浩50450 wrote:
>>>> Hi Ferruh, thanks for your message.
>>>>
>>>>
>>>> We developed a ethtool-dpdk which is secondary process based dpdk 17.08 version. Our device
>>>> support hotplug detach, but hotplug deatch is failed when we use ethtool-dpdk.We found the
>>>> secondary process will change the shared memory when initializing.Secondary process calls
>>>> "rte_eth_dev_pci_allocate" function and enters "rte_eth_copy_pci_info" function.
>>>> (rte_eth_dev_pci_generic_probe -> rte_eth_dev_pci_allocate -> rte_eth_copy_pci_info)
>>>> Then it sets the value of struct "rte_eth_dev_data.dev_flags" to zero.In our platform, this value
>>>> is equal to 0x0003.(RTE_ETH_DEV_DETACHABLE | RTE_ETH_DEV_INTR_LSC),but after reset
>>>> the "dev_flags", the value changed to 0x0002.(RTE_ETH_DEV_DETACHABLE).So, our device hotplug
>>>> detach is failed.I found the similar problem in other dpdk version, include dpdk 19.11.Even though
>>>> the deivce hotplug detach is discarded,but i think the shared memory changed is unexpected by primary
>>>> process.
> 
> Hold on, just for my understanding. As far as I can see
> RTE_ETH_DEV_DETACHABLE was removed in 17.11. Does it
> change something in above description?

Overall secondary overwrites primary values, I think we should fix it
independent from the flags involved.

> 
>>> I agree this is the problem.
>>> In the driver code, 'rte_eth_copy_pci_info' is called only by primary process,
>>>
>>> but the generic code is faulty.
>>>
>>> And in 19.11 additionally 'eth_dev_pci_specific_init' also seems has same problem.
> 
> Yes, as I understand RTE_ETH_DEV_CLOSE_REMOVE,
> RTE_ETH_DEV_BONDED_SLAVE, RTE_ETH_DEV_REPRESENTOR and
> RTE_ETH_DEV_NOLIVE_MAC_ADDR may be lost because of
> reinit (if not restored in other branches). Bad anyway.
> 
>>>> Our driver is ixgbe, i think this problem has a little relationship with driver, Secondary process
>>>> enters "rte_eth_copy_pci_info" by "rte_eth_dev_pci_allocate".And I agree your opinion, the helper
>>>> function should simple on what it does.I have two ways to fix this problem, one is add an if-statement
>>>>
>>>> in "rte_eth_dev_pci_allocate" function to forbid secondary process enters "rte_eth_copy_pci_info" function,
>>>> another way is add an if-statement in "rte_eth_copy_pci_info" function to forbid secondary process change
>>>> shared memory.And First way need to ensure the "rte_eth_copy_pci_info" function won't be called anywhere else.
>>>> I think the second way is simple and lower risk.
>>>
>>> Yes these are the two options.
>>>
>>> I agree adding check in the 'rte_eth_copy_pci_info' covers all cases and safer.
>>> BUT my concern was adding decision making to simple/leaf function and make it
>>> harder to debug/use, instead of giving what primary/secondary process should
>>> call decision in higher level.
>>>
>>> But I just recognized that some PMDs are calling 'rte_eth_copy_pci_info' on
>>> secondary process, like mlx4 or szedata2, and most probably this is not their
>>> intention.
>>> And 'eth_dev->intr_handle' set in 'rte_eth_copy_pci_info', not calling this
>>> function may have side affect of 'eth_dev->intr_handle' not set in secondary.
>>>
>>> With above considerations I am OK to your proposal to cover all cases, Thomas,
>>> Andrew, any concern?
> 
> I would put if condition in rte_eth_copy_pci_info().
> It is the function which writes shared space from
> secondary process when it should not be done and it
> should be fixed there.

OK

> 
>> Do you mean drivers need to be fixed?
> 
> I'm not sure that I fully understand it. Since copy function
> cares about intr_handle copying I'm afraid that it is not
> 100% correct to skip it in secondary process completely as
> many drivers do right now. Basically it makes eth_dev structure
> in secondary process inconsistent. However, it looks like
> most of these drivers simply obtain handle from pci_dev
> directly and it explains why they are not affected.
> There are exceptions which are potentially bugs, e.g.
> drivers/net/ice/ice_ethdev.c: ice_interrupt_handler at the end.
> 
> I think that it would be better if intr_handle is always
> correct in eth_dev (both primary and secondary cases) and
> drivers use it instead of the same from pci_dev.
> 

OK

So this suggest going on with Fang's patch. I only requested an additional note
in function comment related to this secondary check.

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [dpdk-dev] [PATCH v2] Fixes: ethdev: secondary process change shared memory
  2020-01-16  9:04             ` Ferruh Yigit
@ 2020-01-16 11:35               ` 方统浩50450
  2020-01-16 12:18                 ` Ferruh Yigit
  0 siblings, 1 reply; 22+ messages in thread
From: 方统浩50450 @ 2020-01-16 11:35 UTC (permalink / raw)
  To: Ferruh Yigit
  Cc: Andrew Rybchenko, Thomas Monjalon, dev, stable, jia.guo,
	cunming.liang, qi.z.zhang, jungle845943968,
	Jerin Jacob Kollanukkaran





>@Fang, only can you please make a new version to update the
>'rte_eth_copy_pci_info' function comment to document shared data is not updated
>for the secondary process?
>So this suggest going on with Fang's patch. I only requested an additional note
>in function comment related to this secondary check.
@Ferruh Yigit
Should I update a new version patch of "rte_eth_copy_pci_info" function and explain
wthether the regular functioning of secondary process is affected or not?
I cant figure out what you need me to do.




发件人:Ferruh Yigit <ferruh.yigit@intel.com>
发送日期:2020-01-16 17:04:09
收件人:Andrew Rybchenko <arybchenko@solarflare.com>,Thomas Monjalon <thomas@monjalon.net>
抄送人:"方统浩50450" <fangtonghao@sangfor.com.cn>,dev@dpdk.org,stable@dpdk.org,jia.guo@intel.com,cunming.liang@intel.com,qi.z.zhang@intel.com,jungle845943968@outlook.com,Jerin Jacob Kollanukkaran <jerinj@marvell.com>
主题:Re: [dpdk-dev] [PATCH v2] Fixes: ethdev: secondary process change shared memory>On 1/16/2020 7:43 AM, Andrew Rybchenko wrote:
>> On 1/15/20 11:43 PM, Thomas Monjalon wrote:
>>> 15/01/2020 19:35, Ferruh Yigit:
>>>> On 1/15/2020 6:49 AM, 方统浩50450 wrote:
>>>>> Hi Ferruh, thanks for your message.
>>>>>
>>>>>
>>>>> We developed a ethtool-dpdk which is secondary process based dpdk 17.08 version. Our device
>>>>> support hotplug detach, but hotplug deatch is failed when we use ethtool-dpdk.We found the
>>>>> secondary process will change the shared memory when initializing.Secondary process calls
>>>>> "rte_eth_dev_pci_allocate" function and enters "rte_eth_copy_pci_info" function.
>>>>> (rte_eth_dev_pci_generic_probe -> rte_eth_dev_pci_allocate -> rte_eth_copy_pci_info)
>>>>> Then it sets the value of struct "rte_eth_dev_data.dev_flags" to zero.In our platform, this value
>>>>> is equal to 0x0003.(RTE_ETH_DEV_DETACHABLE | RTE_ETH_DEV_INTR_LSC),but after reset
>>>>> the "dev_flags", the value changed to 0x0002.(RTE_ETH_DEV_DETACHABLE).So, our device hotplug
>>>>> detach is failed.I found the similar problem in other dpdk version, include dpdk 19.11.Even though
>>>>> the deivce hotplug detach is discarded,but i think the shared memory changed is unexpected by primary
>>>>> process.
>> 
>> Hold on, just for my understanding. As far as I can see
>> RTE_ETH_DEV_DETACHABLE was removed in 17.11. Does it
>> change something in above description?
>
>Overall secondary overwrites primary values, I think we should fix it
>independent from the flags involved.
>
>> 
>>>> I agree this is the problem.
>>>> In the driver code, 'rte_eth_copy_pci_info' is called only by primary process,
>>>>
>>>> but the generic code is faulty.
>>>>
>>>> And in 19.11 additionally 'eth_dev_pci_specific_init' also seems has same problem.
>> 
>> Yes, as I understand RTE_ETH_DEV_CLOSE_REMOVE,
>> RTE_ETH_DEV_BONDED_SLAVE, RTE_ETH_DEV_REPRESENTOR and
>> RTE_ETH_DEV_NOLIVE_MAC_ADDR may be lost because of
>> reinit (if not restored in other branches). Bad anyway.
>> 
>>>>> Our driver is ixgbe, i think this problem has a little relationship with driver, Secondary process
>>>>> enters "rte_eth_copy_pci_info" by "rte_eth_dev_pci_allocate".And I agree your opinion, the helper
>>>>> function should simple on what it does.I have two ways to fix this problem, one is add an if-statement
>>>>>
>>>>> in "rte_eth_dev_pci_allocate" function to forbid secondary process enters "rte_eth_copy_pci_info" function,
>>>>> another way is add an if-statement in "rte_eth_copy_pci_info" function to forbid secondary process change
>>>>> shared memory.And First way need to ensure the "rte_eth_copy_pci_info" function won't be called anywhere else.
>>>>> I think the second way is simple and lower risk.
>>>>
>>>> Yes these are the two options.
>>>>
>>>> I agree adding check in the 'rte_eth_copy_pci_info' covers all cases and safer.
>>>> BUT my concern was adding decision making to simple/leaf function and make it
>>>> harder to debug/use, instead of giving what primary/secondary process should
>>>> call decision in higher level.
>>>>
>>>> But I just recognized that some PMDs are calling 'rte_eth_copy_pci_info' on
>>>> secondary process, like mlx4 or szedata2, and most probably this is not their
>>>> intention.
>>>> And 'eth_dev->intr_handle' set in 'rte_eth_copy_pci_info', not calling this
>>>> function may have side affect of 'eth_dev->intr_handle' not set in secondary.
>>>>
>>>> With above considerations I am OK to your proposal to cover all cases, Thomas,
>>>> Andrew, any concern?
>> 
>> I would put if condition in rte_eth_copy_pci_info().
>> It is the function which writes shared space from
>> secondary process when it should not be done and it
>> should be fixed there.
>
>OK
>
>> 
>>> Do you mean drivers need to be fixed?
>> 
>> I'm not sure that I fully understand it. Since copy function
>> cares about intr_handle copying I'm afraid that it is not
>> 100% correct to skip it in secondary process completely as
>> many drivers do right now. Basically it makes eth_dev structure
>> in secondary process inconsistent. However, it looks like
>> most of these drivers simply obtain handle from pci_dev
>> directly and it explains why they are not affected.
>> There are exceptions which are potentially bugs, e.g.
>> drivers/net/ice/ice_ethdev.c: ice_interrupt_handler at the end.
>> 
>> I think that it would be better if intr_handle is always
>> correct in eth_dev (both primary and secondary cases) and
>> drivers use it instead of the same from pci_dev.
>> 
>
>OK
>
>So this suggest going on with Fang's patch. I only requested an additional note
>in function comment related to this secondary check.





^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [dpdk-dev] [PATCH v2] Fixes: ethdev: secondary process change shared memory
  2020-01-16 11:35               ` 方统浩50450
@ 2020-01-16 12:18                 ` Ferruh Yigit
  2020-01-17  2:11                   ` 方统浩50450
  0 siblings, 1 reply; 22+ messages in thread
From: Ferruh Yigit @ 2020-01-16 12:18 UTC (permalink / raw)
  To: 方统浩50450
  Cc: Andrew Rybchenko, Thomas Monjalon, dev, stable, jia.guo,
	cunming.liang, qi.z.zhang, jungle845943968,
	Jerin Jacob Kollanukkaran

On 1/16/2020 11:35 AM, 方统浩50450 wrote:
> 
> 
>>@Fang, only can you please make a new version to update the
>>'rte_eth_copy_pci_info' function comment to document shared data is not updated
>>for the secondary process?
> 
>>So this suggest going on with Fang's patch. I only requested an additional note
>>in function comment related to this secondary check.
> 
> @Ferruh Yigit
> Should I update a new version patch of "rte_eth_copy_pci_info" function and explain
> wthether the regular functioning of secondary process is affected or not?
> I cant figure out what you need me to do.

Hi Fang,

Yes can you please send a new version of your patch.
In new version, additionally update the 'rte_eth_copy_pci_info()' function
comment to document that function updates 'eth_dev->data' only for primary process.

Thanks,
ferruh

> 
> 
> 发件人:Ferruh Yigit <ferruh.yigit@intel.com>
> 发送日期:2020-01-16 17:04:09
> 收件人:Andrew Rybchenko <arybchenko@solarflare.com>,Thomas Monjalon <thomas@monjalon.net>
> 抄送人:"方统浩50450" <fangtonghao@sangfor.com.cn>,dev@dpdk.org,stable@dpdk.org,jia.guo@intel.com,cunming.liang@intel.com,qi.z.zhang@intel.com,jungle845943968@outlook.com,Jerin Jacob Kollanukkaran <jerinj@marvell.com>
> 主题:Re: [dpdk-dev] [PATCH v2] Fixes: ethdev: secondary process change shared memory>On 1/16/2020 7:43 AM, Andrew Rybchenko wrote:
>>> On 1/15/20 11:43 PM, Thomas Monjalon wrote:
>>>> 15/01/2020 19:35, Ferruh Yigit:
>>>>> On 1/15/2020 6:49 AM, 方统浩50450 wrote:
>>>>>> Hi Ferruh, thanks for your message.
>>>>>>
>>>>>>
>>>>>> We developed a ethtool-dpdk which is secondary process based dpdk 17.08 version. Our device
>>>>>> support hotplug detach, but hotplug deatch is failed when we use ethtool-dpdk.We found the
>>>>>> secondary process will change the shared memory when initializing.Secondary process calls
>>>>>> "rte_eth_dev_pci_allocate" function and enters "rte_eth_copy_pci_info" function.
>>>>>> (rte_eth_dev_pci_generic_probe -> rte_eth_dev_pci_allocate -> rte_eth_copy_pci_info)
>>>>>> Then it sets the value of struct "rte_eth_dev_data.dev_flags" to zero.In our platform, this value
>>>>>> is equal to 0x0003.(RTE_ETH_DEV_DETACHABLE | RTE_ETH_DEV_INTR_LSC),but after reset
>>>>>> the "dev_flags", the value changed to 0x0002.(RTE_ETH_DEV_DETACHABLE).So, our device hotplug
>>>>>> detach is failed.I found the similar problem in other dpdk version, include dpdk 19.11.Even though
>>>>>> the deivce hotplug detach is discarded,but i think the shared memory changed is unexpected by primary
>>>>>> process.
>>> 
>>> Hold on, just for my understanding. As far as I can see
>>> RTE_ETH_DEV_DETACHABLE was removed in 17.11. Does it
>>> change something in above description?
>>
>>Overall secondary overwrites primary values, I think we should fix it
>>independent from the flags involved.
>>
>>> 
>>>>> I agree this is the problem.
>>>>> In the driver code, 'rte_eth_copy_pci_info' is called only by primary process,
>>>>>
>>>>> but the generic code is faulty.
>>>>>
>>>>> And in 19.11 additionally 'eth_dev_pci_specific_init' also seems has same problem.
>>> 
>>> Yes, as I understand RTE_ETH_DEV_CLOSE_REMOVE,
>>> RTE_ETH_DEV_BONDED_SLAVE, RTE_ETH_DEV_REPRESENTOR and
>>> RTE_ETH_DEV_NOLIVE_MAC_ADDR may be lost because of
>>> reinit (if not restored in other branches). Bad anyway.
>>> 
>>>>>> Our driver is ixgbe, i think this problem has a little relationship with driver, Secondary process
>>>>>> enters "rte_eth_copy_pci_info" by "rte_eth_dev_pci_allocate".And I agree your opinion, the helper
>>>>>> function should simple on what it does.I have two ways to fix this problem, one is add an if-statement
>>>>>>
>>>>>> in "rte_eth_dev_pci_allocate" function to forbid secondary process enters "rte_eth_copy_pci_info" function,
>>>>>> another way is add an if-statement in "rte_eth_copy_pci_info" function to forbid secondary process change
>>>>>> shared memory.And First way need to ensure the "rte_eth_copy_pci_info" function won't be called anywhere else.
>>>>>> I think the second way is simple and lower risk.
>>>>>
>>>>> Yes these are the two options.
>>>>>
>>>>> I agree adding check in the 'rte_eth_copy_pci_info' covers all cases and safer.
>>>>> BUT my concern was adding decision making to simple/leaf function and make it
>>>>> harder to debug/use, instead of giving what primary/secondary process should
>>>>> call decision in higher level.
>>>>>
>>>>> But I just recognized that some PMDs are calling 'rte_eth_copy_pci_info' on
>>>>> secondary process, like mlx4 or szedata2, and most probably this is not their
>>>>> intention.
>>>>> And 'eth_dev->intr_handle' set in 'rte_eth_copy_pci_info', not calling this
>>>>> function may have side affect of 'eth_dev->intr_handle' not set in secondary.
>>>>>
>>>>> With above considerations I am OK to your proposal to cover all cases, Thomas,
>>>>> Andrew, any concern?
>>> 
>>> I would put if condition in rte_eth_copy_pci_info().
>>> It is the function which writes shared space from
>>> secondary process when it should not be done and it
>>> should be fixed there.
>>
>>OK
>>
>>> 
>>>> Do you mean drivers need to be fixed?
>>> 
>>> I'm not sure that I fully understand it. Since copy function
>>> cares about intr_handle copying I'm afraid that it is not
>>> 100% correct to skip it in secondary process completely as
>>> many drivers do right now. Basically it makes eth_dev structure
>>> in secondary process inconsistent. However, it looks like
>>> most of these drivers simply obtain handle from pci_dev
>>> directly and it explains why they are not affected.
>>> There are exceptions which are potentially bugs, e.g.
>>> drivers/net/ice/ice_ethdev.c: ice_interrupt_handler at the end.
>>> 
>>> I think that it would be better if intr_handle is always
>>> correct in eth_dev (both primary and secondary cases) and
>>> drivers use it instead of the same from pci_dev.
>>> 
>>
>>OK
>>
>>So this suggest going on with Fang's patch. I only requested an additional note
>>in function comment related to this secondary check.
> 
> 


^ permalink raw reply	[flat|nested] 22+ messages in thread

* [dpdk-dev] [PATCH v3] Fixes: ethdev: secondary process change shared memory
  2020-01-13  5:03 ` [dpdk-dev] [PATCH v2] Fixes: ethdev: secondary process change shared memory Fang TongHao
  2020-01-14 14:45   ` Ferruh Yigit
@ 2020-01-17  2:08   ` Fang TongHao
  2020-01-17  8:33     ` Andrew Rybchenko
  1 sibling, 1 reply; 22+ messages in thread
From: Fang TongHao @ 2020-01-17  2:08 UTC (permalink / raw)
  To: ferruh.yigit, thomas, arybchenko
  Cc: dev, stable, jia.guo, cunming.liang, qi.z.zhang, jungle845943968,
	jerinj, Fang TongHao

Fixes the secondary process changed shared memory
in "rte_eth_copy_pci_info" function.In that function
only primary can update the value of "eth_dev->data"
which shared by primary and secondary.

Signed-off-by: Fang TongHao <fangtonghao@sangfor.com.cn>
---
 lib/librte_ethdev/rte_ethdev_pci.h | 18 ++++++++++--------
 1 file changed, 10 insertions(+), 8 deletions(-)

diff --git a/lib/librte_ethdev/rte_ethdev_pci.h b/lib/librte_ethdev/rte_ethdev_pci.h
index ccdbb46ec..e7dae0545 100644
--- a/lib/librte_ethdev/rte_ethdev_pci.h
+++ b/lib/librte_ethdev/rte_ethdev_pci.h
@@ -60,14 +60,16 @@ rte_eth_copy_pci_info(struct rte_eth_dev *eth_dev,
 
 	eth_dev->intr_handle = &pci_dev->intr_handle;
 
-	eth_dev->data->dev_flags = 0;
-	if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
-		eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
-	if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_RMV)
-		eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_RMV;
-
-	eth_dev->data->kdrv = pci_dev->kdrv;
-	eth_dev->data->numa_node = pci_dev->device.numa_node;
+	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
+		eth_dev->data->dev_flags = 0;
+		if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
+			eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
+		if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_RMV)
+			eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_RMV;
+
+		eth_dev->data->kdrv = pci_dev->kdrv;
+		eth_dev->data->numa_node = pci_dev->device.numa_node;
+	}
 }
 
 static inline int
-- 
2.24.1.windows.2


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [dpdk-dev] [PATCH v2] Fixes: ethdev: secondary process change shared memory
  2020-01-16 12:18                 ` Ferruh Yigit
@ 2020-01-17  2:11                   ` 方统浩50450
  0 siblings, 0 replies; 22+ messages in thread
From: 方统浩50450 @ 2020-01-17  2:11 UTC (permalink / raw)
  To: Ferruh Yigit
  Cc: Andrew Rybchenko, Thomas Monjalon, dev, stable, jia.guo,
	cunming.liang, qi.z.zhang, jungle845943968,
	Jerin Jacob Kollanukkaran


ok, I send a new version of my patch and rewrite commit log again.
you can check my patch in https://patches.dpdk.org/patch/64819/






发件人:Ferruh Yigit <ferruh.yigit@intel.com>
发送日期:2020-01-16 20:18:18
收件人:"方统浩50450" <fangtonghao@sangfor.com.cn>
抄送人:Andrew Rybchenko <arybchenko@solarflare.com>,Thomas Monjalon <thomas@monjalon.net>,dev@dpdk.org,stable@dpdk.org,jia.guo@intel.com,cunming.liang@intel.com,qi.z.zhang@intel.com,jungle845943968@outlook.com,Jerin Jacob Kollanukkaran <jerinj@marvell.com>
主题:Re: [dpdk-dev] [PATCH v2] Fixes: ethdev: secondary process change shared memory>On 1/16/2020 11:35 AM, 方统浩50450 wrote:
>> 
>> 
>>>@Fang, only can you please make a new version to update the
>>>'rte_eth_copy_pci_info' function comment to document shared data is not updated
>>>for the secondary process?
>> 
>>>So this suggest going on with Fang's patch. I only requested an additional note
>>>in function comment related to this secondary check.
>> 
>> @Ferruh Yigit
>> Should I update a new version patch of "rte_eth_copy_pci_info" function and explain
>> wthether the regular functioning of secondary process is affected or not?
>> I cant figure out what you need me to do.
>
>Hi Fang,
>
>Yes can you please send a new version of your patch.
>In new version, additionally update the 'rte_eth_copy_pci_info()' function
>comment to document that function updates 'eth_dev->data' only for primary process.
>
>Thanks,
>ferruh
>
>> 
>> 
>> 发件人:Ferruh Yigit <ferruh.yigit@intel.com>
>> 发送日期:2020-01-16 17:04:09
>> 收件人:Andrew Rybchenko <arybchenko@solarflare.com>,Thomas Monjalon <thomas@monjalon.net>
>> 抄送人:"方统浩50450" <fangtonghao@sangfor.com.cn>,dev@dpdk.org,stable@dpdk.org,jia.guo@intel.com,cunming.liang@intel.com,qi.z.zhang@intel.com,jungle845943968@outlook.com,Jerin Jacob Kollanukkaran <jerinj@marvell.com>
>> 主题:Re: [dpdk-dev] [PATCH v2] Fixes: ethdev: secondary process change shared memory>On 1/16/2020 7:43 AM, Andrew Rybchenko wrote:
>>>> On 1/15/20 11:43 PM, Thomas Monjalon wrote:
>>>>> 15/01/2020 19:35, Ferruh Yigit:
>>>>>> On 1/15/2020 6:49 AM, 方统浩50450 wrote:
>>>>>>> Hi Ferruh, thanks for your message.
>>>>>>>
>>>>>>>
>>>>>>> We developed a ethtool-dpdk which is secondary process based dpdk 17.08 version. Our device
>>>>>>> support hotplug detach, but hotplug deatch is failed when we use ethtool-dpdk.We found the
>>>>>>> secondary process will change the shared memory when initializing.Secondary process calls
>>>>>>> "rte_eth_dev_pci_allocate" function and enters "rte_eth_copy_pci_info" function.
>>>>>>> (rte_eth_dev_pci_generic_probe -> rte_eth_dev_pci_allocate -> rte_eth_copy_pci_info)
>>>>>>> Then it sets the value of struct "rte_eth_dev_data.dev_flags" to zero.In our platform, this value
>>>>>>> is equal to 0x0003.(RTE_ETH_DEV_DETACHABLE | RTE_ETH_DEV_INTR_LSC),but after reset
>>>>>>> the "dev_flags", the value changed to 0x0002.(RTE_ETH_DEV_DETACHABLE).So, our device hotplug
>>>>>>> detach is failed.I found the similar problem in other dpdk version, include dpdk 19.11.Even though
>>>>>>> the deivce hotplug detach is discarded,but i think the shared memory changed is unexpected by primary
>>>>>>> process.
>>>> 
>>>> Hold on, just for my understanding. As far as I can see
>>>> RTE_ETH_DEV_DETACHABLE was removed in 17.11. Does it
>>>> change something in above description?
>>>
>>>Overall secondary overwrites primary values, I think we should fix it
>>>independent from the flags involved.
>>>
>>>> 
>>>>>> I agree this is the problem.
>>>>>> In the driver code, 'rte_eth_copy_pci_info' is called only by primary process,
>>>>>>
>>>>>> but the generic code is faulty.
>>>>>>
>>>>>> And in 19.11 additionally 'eth_dev_pci_specific_init' also seems has same problem.
>>>> 
>>>> Yes, as I understand RTE_ETH_DEV_CLOSE_REMOVE,
>>>> RTE_ETH_DEV_BONDED_SLAVE, RTE_ETH_DEV_REPRESENTOR and
>>>> RTE_ETH_DEV_NOLIVE_MAC_ADDR may be lost because of
>>>> reinit (if not restored in other branches). Bad anyway.
>>>> 
>>>>>>> Our driver is ixgbe, i think this problem has a little relationship with driver, Secondary process
>>>>>>> enters "rte_eth_copy_pci_info" by "rte_eth_dev_pci_allocate".And I agree your opinion, the helper
>>>>>>> function should simple on what it does.I have two ways to fix this problem, one is add an if-statement
>>>>>>>
>>>>>>> in "rte_eth_dev_pci_allocate" function to forbid secondary process enters "rte_eth_copy_pci_info" function,
>>>>>>> another way is add an if-statement in "rte_eth_copy_pci_info" function to forbid secondary process change
>>>>>>> shared memory.And First way need to ensure the "rte_eth_copy_pci_info" function won't be called anywhere else.
>>>>>>> I think the second way is simple and lower risk.
>>>>>>
>>>>>> Yes these are the two options.
>>>>>>
>>>>>> I agree adding check in the 'rte_eth_copy_pci_info' covers all cases and safer.
>>>>>> BUT my concern was adding decision making to simple/leaf function and make it
>>>>>> harder to debug/use, instead of giving what primary/secondary process should
>>>>>> call decision in higher level.
>>>>>>
>>>>>> But I just recognized that some PMDs are calling 'rte_eth_copy_pci_info' on
>>>>>> secondary process, like mlx4 or szedata2, and most probably this is not their
>>>>>> intention.
>>>>>> And 'eth_dev->intr_handle' set in 'rte_eth_copy_pci_info', not calling this
>>>>>> function may have side affect of 'eth_dev->intr_handle' not set in secondary.
>>>>>>
>>>>>> With above considerations I am OK to your proposal to cover all cases, Thomas,
>>>>>> Andrew, any concern?
>>>> 
>>>> I would put if condition in rte_eth_copy_pci_info().
>>>> It is the function which writes shared space from
>>>> secondary process when it should not be done and it
>>>> should be fixed there.
>>>
>>>OK
>>>
>>>> 
>>>>> Do you mean drivers need to be fixed?
>>>> 
>>>> I'm not sure that I fully understand it. Since copy function
>>>> cares about intr_handle copying I'm afraid that it is not
>>>> 100% correct to skip it in secondary process completely as
>>>> many drivers do right now. Basically it makes eth_dev structure
>>>> in secondary process inconsistent. However, it looks like
>>>> most of these drivers simply obtain handle from pci_dev
>>>> directly and it explains why they are not affected.
>>>> There are exceptions which are potentially bugs, e.g.
>>>> drivers/net/ice/ice_ethdev.c: ice_interrupt_handler at the end.
>>>> 
>>>> I think that it would be better if intr_handle is always
>>>> correct in eth_dev (both primary and secondary cases) and
>>>> drivers use it instead of the same from pci_dev.
>>>> 
>>>
>>>OK
>>>
>>>So this suggest going on with Fang's patch. I only requested an additional note
>>>in function comment related to this secondary check.
>> 
>> 
>





^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [dpdk-dev] [PATCH v3] Fixes: ethdev: secondary process change shared memory
  2020-01-17  2:08   ` [dpdk-dev] [PATCH v3] " Fang TongHao
@ 2020-01-17  8:33     ` Andrew Rybchenko
  2020-01-17 17:58       ` Ferruh Yigit
  0 siblings, 1 reply; 22+ messages in thread
From: Andrew Rybchenko @ 2020-01-17  8:33 UTC (permalink / raw)
  To: Fang TongHao, ferruh.yigit, thomas
  Cc: dev, stable, jia.guo, cunming.liang, qi.z.zhang, jungle845943968, jerinj

On 1/17/20 5:08 AM, Fang TongHao wrote:

Summary does not comply with [1].

> Fixes the secondary process changed shared memory
> in "rte_eth_copy_pci_info" function.In that function
> only primary can update the value of "eth_dev->data"
> which shared by primary and secondary.

Consider:
Avoid overwriting device flags and other information in device
data stored in shared memory when a secondary process
probes PCI device.

Fixes tag and CC to stable is required in accordance with [2].

> Signed-off-by: Fang TongHao <fangtonghao@sangfor.com.cn>

[1]
https://doc.dpdk.org/guides/contributing/patches.html#commit-messages-subject-line
[2]
https://doc.dpdk.org/guides/contributing/patches.html#commit-messages-body


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [dpdk-dev] [PATCH v3] Fixes: ethdev: secondary process change shared memory
  2020-01-17  8:33     ` Andrew Rybchenko
@ 2020-01-17 17:58       ` Ferruh Yigit
  0 siblings, 0 replies; 22+ messages in thread
From: Ferruh Yigit @ 2020-01-17 17:58 UTC (permalink / raw)
  To: Andrew Rybchenko, Fang TongHao, thomas
  Cc: dev, stable, jia.guo, cunming.liang, qi.z.zhang, jungle845943968, jerinj

On 1/17/2020 8:33 AM, Andrew Rybchenko wrote:
> On 1/17/20 5:08 AM, Fang TongHao wrote:
> 
> Summary does not comply with [1].
> 
>> Fixes the secondary process changed shared memory
>> in "rte_eth_copy_pci_info" function.In that function
>> only primary can update the value of "eth_dev->data"
>> which shared by primary and secondary.
> 
> Consider:
> Avoid overwriting device flags and other information in device
> data stored in shared memory when a secondary process
> probes PCI device.
> 
> Fixes tag and CC to stable is required in accordance with [2].
> 
>> Signed-off-by: Fang TongHao <fangtonghao@sangfor.com.cn>
> 
> [1]
> https://doc.dpdk.org/guides/contributing/patches.html#commit-messages-subject-line
> [2]
> https://doc.dpdk.org/guides/contributing/patches.html#commit-messages-body
> 

For sake of having the patch in -rc1, I have updated as suggested while merging,
commit log become as following:

    ethdev: fix secondary process memory overwrite

    Avoid overwriting device flags and other information in device
    data stored in shared memory when a secondary process
    probes PCI device.

    Fixes: 494adb7f63f2 ("ethdev: add device fields from PCI layer")
    Cc: stable@dpdk.org

    Signed-off-by: Fang TongHao <fangtonghao@sangfor.com.cn>
    Reviewed-by: Andrew Rybchenko <arybchenko@solarflare.com>
    Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>


And I have added a not the the function comment as following:
   * Copy pci device info to the Ethernet device data.
 + * Shared memory (eth_dev->data) only updated by primary process, so it is safe
 + * to call this function from both primary and secondary processes.
  *


Applied to dpdk-next-net/master, thanks.

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [dpdk-dev] [PATCH] ethdev: fix secondary process change share memory
  2020-01-09  2:35 Fang TongHao
@ 2020-01-15 10:30 ` Burakov, Anatoly
  0 siblings, 0 replies; 22+ messages in thread
From: Burakov, Anatoly @ 2020-01-15 10:30 UTC (permalink / raw)
  To: Fang TongHao, dev; +Cc: stable

On 09-Jan-20 2:35 AM, Fang TongHao wrote:
> Hi all,I am from Sangfor Tech.I found a bug when using DPDK in
> multiprocess scenario.The secondary process enters
> "rte_eth_dev_pci_copy_info" function when initializing.Then it
> sets the value of struct "rte_eth_dev_data.dev_flags" to zero,
> but this struct is shared by primary process and secondary
> process, and the value change is unexpected by primary process.
> This may cause very serious damage.I think
> the secondary process should not enter "rte_eth_dev_pci_copy_info"
> function or changes the value of struct "rte_eth_dev_data.dev_flags"
> in shared memory.
> I fixed this bug by adding an if-statement to forbid the secondary
> process changing the above-mentioned value.
> Thansk, All.

Hi,

Thanks for your contribution! However, your patch could use some 
improvements, as it currently doesn't meet the standards expected by the 
DPDK community.

First of all, the commit log shouldn't read like an email :) Suggested 
rewording:

----
When secondary process enters `rte_eth_copy_pci_info`, it resets the 
rte_eth_dev_data.dev_flags to zero. This may cause unintended 
consequences because this is a structure that is shared between primary 
and secondary processes. Fix it by only overwriting the flags if the 
process is primary.
---

Your commit message has also incorrectly called out the offending 
function as `rte_eth_dev_copy_pci_info`, while it is actually named 
`rte_eth_copy_pci_info`.

Also, a Fixes: tag is missing. Please use git blame to find the commit 
that introduced the issue, and use the 'fixline' formatting. Please see 
Contribution Guidelines[1] on how to properly format fixline.

You will find instructions on how to submit a version 2 of the patch in 
the same document[2].

[1] 
https://doc.dpdk.org/guides/contributing/patches.html#commit-messages-body

[2] 
https://doc.dpdk.org/guides/contributing/patches.html#steps-to-getting-your-patch-merged

-- 
Thanks,
Anatoly

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [dpdk-dev] [PATCH] ethdev: fix secondary process change share memory
  2020-01-10 15:32 ` Stephen Hemminger
@ 2020-01-13  3:02   ` 方统浩50450
  0 siblings, 0 replies; 22+ messages in thread
From: 方统浩50450 @ 2020-01-13  3:02 UTC (permalink / raw)
  To: Stephen Hemminger
  Cc: thomas, ferruh.yigit, arybchenko, dev, stable, cunming.liang, jia.guo

secondary process will enter rte_eth_copy_pci_info function when initializing.
rte_eth_dev_pci_copy_info -> rte_eth_copy_pci_info




发件人:Stephen Hemminger <stephen@networkplumber.org>
发送日期:2020-01-10 23:32:15
收件人:Fang TongHao <fangtonghao@sangfor.com.cn>
抄送人:thomas@monjalon.net,ferruh.yigit@intel.com,arybchenko@solarflare.com,dev@dpdk.org,stable@dpdk.org,cunming.liang@intel.com,jia.guo@intel.com
主题:Re: [dpdk-dev] [PATCH] ethdev: fix secondary process change share memory>On Thu,  9 Jan 2020 11:14:25 +0800
>Fang TongHao <fangtonghao@sangfor.com.cn> wrote:
>
>> Hi all,I am from Sangfor Tech.I found a bug when using DPDK in
>> multiprocess scenario.The secondary process enters
>> "rte_eth_dev_pci_copy_info" function when initializing.Then it
>> sets the value of struct "rte_eth_dev_data.dev_flags" to zero,
>> but this struct is shared by primary process and secondary
>> process, and the value change is unexpected by primary process.
>> This may cause very serious damage.I think
>> the secondary process should not enter "rte_eth_dev_pci_copy_info"
>> function or changes the value of struct "rte_eth_dev_data.dev_flags"
>> in shared memory.
>> I fixed this bug by adding an if-statement to forbid the secondary
>> process changing the above-mentioned value.
>> Thansk, All.
>> 
>> Signed-off-by: Fang TongHao <fangtonghao@sangfor.com.cn>
>
>Most of the drivers avoid calling rte_eth_dev_pci_copy_info
>in the secondary process, which one are you using?





^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [dpdk-dev] [PATCH] ethdev: fix secondary process change share memory
  2020-01-09  3:14 [dpdk-dev] [PATCH] ethdev: fix secondary process change share memory Fang TongHao
@ 2020-01-10 15:32 ` Stephen Hemminger
  2020-01-13  3:02   ` 方统浩50450
  0 siblings, 1 reply; 22+ messages in thread
From: Stephen Hemminger @ 2020-01-10 15:32 UTC (permalink / raw)
  To: Fang TongHao
  Cc: thomas, ferruh.yigit, arybchenko, dev, stable, cunming.liang, jia.guo

On Thu,  9 Jan 2020 11:14:25 +0800
Fang TongHao <fangtonghao@sangfor.com.cn> wrote:

> Hi all,I am from Sangfor Tech.I found a bug when using DPDK in
> multiprocess scenario.The secondary process enters
> "rte_eth_dev_pci_copy_info" function when initializing.Then it
> sets the value of struct "rte_eth_dev_data.dev_flags" to zero,
> but this struct is shared by primary process and secondary
> process, and the value change is unexpected by primary process.
> This may cause very serious damage.I think
> the secondary process should not enter "rte_eth_dev_pci_copy_info"
> function or changes the value of struct "rte_eth_dev_data.dev_flags"
> in shared memory.
> I fixed this bug by adding an if-statement to forbid the secondary
> process changing the above-mentioned value.
> Thansk, All.
> 
> Signed-off-by: Fang TongHao <fangtonghao@sangfor.com.cn>

Most of the drivers avoid calling rte_eth_dev_pci_copy_info
in the secondary process, which one are you using?

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [dpdk-dev] [PATCH] ethdev: fix secondary process change share memory
@ 2020-01-09  3:14 Fang TongHao
  2020-01-10 15:32 ` Stephen Hemminger
  0 siblings, 1 reply; 22+ messages in thread
From: Fang TongHao @ 2020-01-09  3:14 UTC (permalink / raw)
  To: thomas, ferruh.yigit, arybchenko
  Cc: dev, stable, cunming.liang, jia.guo, Fang TongHao

Hi all,I am from Sangfor Tech.I found a bug when using DPDK in
multiprocess scenario.The secondary process enters
"rte_eth_dev_pci_copy_info" function when initializing.Then it
sets the value of struct "rte_eth_dev_data.dev_flags" to zero,
but this struct is shared by primary process and secondary
process, and the value change is unexpected by primary process.
This may cause very serious damage.I think
the secondary process should not enter "rte_eth_dev_pci_copy_info"
function or changes the value of struct "rte_eth_dev_data.dev_flags"
in shared memory.
I fixed this bug by adding an if-statement to forbid the secondary
process changing the above-mentioned value.
Thansk, All.

Signed-off-by: Fang TongHao <fangtonghao@sangfor.com.cn>
---
 lib/librte_ethdev/rte_ethdev_pci.h | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/lib/librte_ethdev/rte_ethdev_pci.h b/lib/librte_ethdev/rte_ethdev_pci.h
index ccdbb46ec..916de8a14 100644
--- a/lib/librte_ethdev/rte_ethdev_pci.h
+++ b/lib/librte_ethdev/rte_ethdev_pci.h
@@ -59,15 +59,16 @@ rte_eth_copy_pci_info(struct rte_eth_dev *eth_dev,
 	}
 
 	eth_dev->intr_handle = &pci_dev->intr_handle;
-
-	eth_dev->data->dev_flags = 0;
-	if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
-		eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
-	if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_RMV)
-		eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_RMV;
-
-	eth_dev->data->kdrv = pci_dev->kdrv;
-	eth_dev->data->numa_node = pci_dev->device.numa_node;
+	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
+		eth_dev->data->dev_flags = 0;
+		if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
+			eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
+		if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_RMV)
+			eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_RMV;
+
+		eth_dev->data->kdrv = pci_dev->kdrv;
+		eth_dev->data->numa_node = pci_dev->device.numa_node;
+	}
 }
 
 static inline int
-- 
2.24.1.windows.2


^ permalink raw reply	[flat|nested] 22+ messages in thread

* [dpdk-dev] [PATCH] ethdev: fix secondary process change share memory
@ 2020-01-09  2:35 Fang TongHao
  2020-01-15 10:30 ` Burakov, Anatoly
  0 siblings, 1 reply; 22+ messages in thread
From: Fang TongHao @ 2020-01-09  2:35 UTC (permalink / raw)
  To: dev; +Cc: Fang TongHao, stable

Hi all,I am from Sangfor Tech.I found a bug when using DPDK in
multiprocess scenario.The secondary process enters
"rte_eth_dev_pci_copy_info" function when initializing.Then it
sets the value of struct "rte_eth_dev_data.dev_flags" to zero,
but this struct is shared by primary process and secondary
process, and the value change is unexpected by primary process.
This may cause very serious damage.I think
the secondary process should not enter "rte_eth_dev_pci_copy_info"
function or changes the value of struct "rte_eth_dev_data.dev_flags"
in shared memory.
I fixed this bug by adding an if-statement to forbid the secondary
process changing the above-mentioned value.
Thansk, All.
Cc: stable@dpdk.org

Signed-off-by: Fang TongHao <fangtonghao@sangfor.com.cn>
---
 lib/librte_ethdev/rte_ethdev_pci.h | 19 ++++++++++---------
 1 file changed, 10 insertions(+), 9 deletions(-)

diff --git a/lib/librte_ethdev/rte_ethdev_pci.h b/lib/librte_ethdev/rte_ethdev_pci.h
index ccdbb46ec..916de8a14 100644
--- a/lib/librte_ethdev/rte_ethdev_pci.h
+++ b/lib/librte_ethdev/rte_ethdev_pci.h
@@ -59,15 +59,16 @@ rte_eth_copy_pci_info(struct rte_eth_dev *eth_dev,
 	}
 
 	eth_dev->intr_handle = &pci_dev->intr_handle;
-
-	eth_dev->data->dev_flags = 0;
-	if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
-		eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
-	if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_RMV)
-		eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_RMV;
-
-	eth_dev->data->kdrv = pci_dev->kdrv;
-	eth_dev->data->numa_node = pci_dev->device.numa_node;
+	if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
+		eth_dev->data->dev_flags = 0;
+		if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_LSC)
+			eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;
+		if (pci_dev->driver->drv_flags & RTE_PCI_DRV_INTR_RMV)
+			eth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_RMV;
+
+		eth_dev->data->kdrv = pci_dev->kdrv;
+		eth_dev->data->numa_node = pci_dev->device.numa_node;
+	}
 }
 
 static inline int
-- 
2.24.1.windows.2


^ permalink raw reply	[flat|nested] 22+ messages in thread

end of thread, other threads:[~2020-01-17 17:58 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-01-09 12:27 [dpdk-dev] [PATCH] ethdev: fix secondary process change share memory Fang TongHao
2020-01-10  7:30 ` Jeff Guo
2020-01-10  7:53   ` 方统浩50450
2020-01-13  5:03 ` [dpdk-dev] [PATCH v2] Fixes: ethdev: secondary process change shared memory Fang TongHao
2020-01-14 14:45   ` Ferruh Yigit
2020-01-15  6:49     ` 方统浩50450
2020-01-15 18:35       ` Ferruh Yigit
2020-01-15 20:43         ` Thomas Monjalon
2020-01-16  7:43           ` Andrew Rybchenko
2020-01-16  9:04             ` Ferruh Yigit
2020-01-16 11:35               ` 方统浩50450
2020-01-16 12:18                 ` Ferruh Yigit
2020-01-17  2:11                   ` 方统浩50450
2020-01-16  9:00           ` Ferruh Yigit
2020-01-17  2:08   ` [dpdk-dev] [PATCH v3] " Fang TongHao
2020-01-17  8:33     ` Andrew Rybchenko
2020-01-17 17:58       ` Ferruh Yigit
  -- strict thread matches above, loose matches on Subject: below --
2020-01-09  3:14 [dpdk-dev] [PATCH] ethdev: fix secondary process change share memory Fang TongHao
2020-01-10 15:32 ` Stephen Hemminger
2020-01-13  3:02   ` 方统浩50450
2020-01-09  2:35 Fang TongHao
2020-01-15 10:30 ` Burakov, Anatoly

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).