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
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
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
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
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
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?
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?
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