[v2] net/ifc: do not notify before HW ready

Message ID 20180914012517.44977-1-xiao.w.wang@intel.com (mailing list archive)
State Accepted, archived
Delegated to: Qi Zhang
Headers
Series [v2] net/ifc: do not notify before HW ready |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Xiao Wang Sept. 14, 2018, 1:25 a.m. UTC
  If the device is not clearly reset by the previous driver and holds
some invalid ring addr, and the relay thread kicks it before HW is
properly re-configured, a bad DMA request may happen.

Besides, the notify_addr which is used by the relay thread is set in
the vdpa_ifcvf_start function, if a kick relay happens before
vdpa_ifcvf_start finishes, a null addr is accessed.

Fixes: a3f8150eac6d ("net/ifcvf: add ifcvf vDPA driver")

Signed-off-by: Xiao Wang <xiao.w.wang@intel.com>
---
v2:
* Add description for the fix in the commit log.
---
 drivers/net/ifc/ifcvf_vdpa.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
  

Comments

Xiaolong Ye Sept. 14, 2018, 8:41 a.m. UTC | #1
Looks good to me.

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

Thanks,
Xiaolong

On 09/14, Xiao Wang wrote:
>If the device is not clearly reset by the previous driver and holds
>some invalid ring addr, and the relay thread kicks it before HW is
>properly re-configured, a bad DMA request may happen.
>
>Besides, the notify_addr which is used by the relay thread is set in
>the vdpa_ifcvf_start function, if a kick relay happens before
>vdpa_ifcvf_start finishes, a null addr is accessed.
>
>Fixes: a3f8150eac6d ("net/ifcvf: add ifcvf vDPA driver")
>
>Signed-off-by: Xiao Wang <xiao.w.wang@intel.com>
>---
>v2:
>* Add description for the fix in the commit log.
>---
> drivers/net/ifc/ifcvf_vdpa.c | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
>diff --git a/drivers/net/ifc/ifcvf_vdpa.c b/drivers/net/ifc/ifcvf_vdpa.c
>index 3c5430dc0..7d3085d8d 100644
>--- a/drivers/net/ifc/ifcvf_vdpa.c
>+++ b/drivers/net/ifc/ifcvf_vdpa.c
>@@ -503,11 +503,11 @@ update_datapath(struct ifcvf_internal *internal)
> 		if (ret)
> 			goto err;
> 
>-		ret = setup_notify_relay(internal);
>+		ret = vdpa_ifcvf_start(internal);
> 		if (ret)
> 			goto err;
> 
>-		ret = vdpa_ifcvf_start(internal);
>+		ret = setup_notify_relay(internal);
> 		if (ret)
> 			goto err;
> 
>@@ -515,12 +515,12 @@ update_datapath(struct ifcvf_internal *internal)
> 	} else if (rte_atomic32_read(&internal->running) &&
> 		   (!rte_atomic32_read(&internal->started) ||
> 		    !rte_atomic32_read(&internal->dev_attached))) {
>-		vdpa_ifcvf_stop(internal);
>-
> 		ret = unset_notify_relay(internal);
> 		if (ret)
> 			goto err;
> 
>+		vdpa_ifcvf_stop(internal);
>+
> 		ret = vdpa_disable_vfio_intr(internal);
> 		if (ret)
> 			goto err;
>-- 
>2.15.1
>
  
Qi Zhang Sept. 18, 2018, 2:20 p.m. UTC | #2
> -----Original Message-----
> From: dev [mailto:dev-bounces@dpdk.org] On Behalf Of Ye Xiaolong
> Sent: Friday, September 14, 2018 4:42 PM
> To: Wang, Xiao W <xiao.w.wang@intel.com>
> Cc: Bie, Tiwei <tiwei.bie@intel.com>; dev@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v2] net/ifc: do not notify before HW ready
> 
> Looks good to me.
> 
> Reviewed-by: Ye Xiaolong <xiaolong.ye@intel.com>
> 
> Thanks,
> Xiaolong
> 
> On 09/14, Xiao Wang wrote:
> >If the device is not clearly reset by the previous driver and holds
> >some invalid ring addr, and the relay thread kicks it before HW is
> >properly re-configured, a bad DMA request may happen.
> >
> >Besides, the notify_addr which is used by the relay thread is set in
> >the vdpa_ifcvf_start function, if a kick relay happens before
> >vdpa_ifcvf_start finishes, a null addr is accessed.
> >
> >Fixes: a3f8150eac6d ("net/ifcvf: add ifcvf vDPA driver")
> >
> >Signed-off-by: Xiao Wang <xiao.w.wang@intel.com>

Applied to dpdk-next-net-intel.

Thanks
Qi
  
Kevin Traynor Sept. 25, 2018, 5:15 p.m. UTC | #3
On 09/14/2018 02:25 AM, Xiao Wang wrote:
> If the device is not clearly reset by the previous driver and holds
> some invalid ring addr, and the relay thread kicks it before HW is
> properly re-configured, a bad DMA request may happen.
> 
> Besides, the notify_addr which is used by the relay thread is set in
> the vdpa_ifcvf_start function, if a kick relay happens before
> vdpa_ifcvf_start finishes, a null addr is accessed.
> 
> Fixes: a3f8150eac6d ("net/ifcvf: add ifcvf vDPA driver")
> 

Looks like this should be in stable branch too. Can you confirm?	

> Signed-off-by: Xiao Wang <xiao.w.wang@intel.com>
> ---
> v2:
> * Add description for the fix in the commit log.
> ---
>  drivers/net/ifc/ifcvf_vdpa.c | 8 ++++----
>  1 file changed, 4 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/net/ifc/ifcvf_vdpa.c b/drivers/net/ifc/ifcvf_vdpa.c
> index 3c5430dc0..7d3085d8d 100644
> --- a/drivers/net/ifc/ifcvf_vdpa.c
> +++ b/drivers/net/ifc/ifcvf_vdpa.c
> @@ -503,11 +503,11 @@ update_datapath(struct ifcvf_internal *internal)
>  		if (ret)
>  			goto err;
>  
> -		ret = setup_notify_relay(internal);
> +		ret = vdpa_ifcvf_start(internal);
>  		if (ret)
>  			goto err;
>  
> -		ret = vdpa_ifcvf_start(internal);
> +		ret = setup_notify_relay(internal);
>  		if (ret)
>  			goto err;
>  
> @@ -515,12 +515,12 @@ update_datapath(struct ifcvf_internal *internal)
>  	} else if (rte_atomic32_read(&internal->running) &&
>  		   (!rte_atomic32_read(&internal->started) ||
>  		    !rte_atomic32_read(&internal->dev_attached))) {
> -		vdpa_ifcvf_stop(internal);
> -
>  		ret = unset_notify_relay(internal);
>  		if (ret)
>  			goto err;
>  
> +		vdpa_ifcvf_stop(internal);
> +
>  		ret = vdpa_disable_vfio_intr(internal);
>  		if (ret)
>  			goto err;
>
  
Xiao Wang Sept. 26, 2018, 12:12 a.m. UTC | #4
Hi,

> -----Original Message-----
> From: Kevin Traynor [mailto:ktraynor@redhat.com]
> Sent: Wednesday, September 26, 2018 1:16 AM
> To: Wang, Xiao W <xiao.w.wang@intel.com>
> Cc: Ye, Xiaolong <xiaolong.ye@intel.com>; Bie, Tiwei <tiwei.bie@intel.com>;
> dev@dpdk.org; stable@dpdk.org
> Subject: Re: [dpdk-dev] [PATCH v2] net/ifc: do not notify before HW ready
> 
> On 09/14/2018 02:25 AM, Xiao Wang wrote:
> > If the device is not clearly reset by the previous driver and holds
> > some invalid ring addr, and the relay thread kicks it before HW is
> > properly re-configured, a bad DMA request may happen.
> >
> > Besides, the notify_addr which is used by the relay thread is set in
> > the vdpa_ifcvf_start function, if a kick relay happens before
> > vdpa_ifcvf_start finishes, a null addr is accessed.
> >
> > Fixes: a3f8150eac6d ("net/ifcvf: add ifcvf vDPA driver")
> >
> 
> Looks like this should be in stable branch too. Can you confirm?	

Yes, they should go also into stable branch, thanks for the notice.

BRs,
Xiao
  
Ferruh Yigit Sept. 26, 2018, 7:53 a.m. UTC | #5
On 9/26/2018 1:12 AM, Wang, Xiao W wrote:
> Hi,
> 
>> -----Original Message-----
>> From: Kevin Traynor [mailto:ktraynor@redhat.com]
>> Sent: Wednesday, September 26, 2018 1:16 AM
>> To: Wang, Xiao W <xiao.w.wang@intel.com>
>> Cc: Ye, Xiaolong <xiaolong.ye@intel.com>; Bie, Tiwei <tiwei.bie@intel.com>;
>> dev@dpdk.org; stable@dpdk.org
>> Subject: Re: [dpdk-dev] [PATCH v2] net/ifc: do not notify before HW ready
>>
>> On 09/14/2018 02:25 AM, Xiao Wang wrote:
>>> If the device is not clearly reset by the previous driver and holds
>>> some invalid ring addr, and the relay thread kicks it before HW is
>>> properly re-configured, a bad DMA request may happen.
>>>
>>> Besides, the notify_addr which is used by the relay thread is set in
>>> the vdpa_ifcvf_start function, if a kick relay happens before
>>> vdpa_ifcvf_start finishes, a null addr is accessed.
>>>
>>> Fixes: a3f8150eac6d ("net/ifcvf: add ifcvf vDPA driver")
>>>
>>
>> Looks like this should be in stable branch too. Can you confirm?	
> 
> Yes, they should go also into stable branch, thanks for the notice.

"Cc: stable@dpdk.org" already has been added while merging next-net
Commit c5ea24905585 ("net/ifc: do not notify before HW ready")

Thanks for checking.
  

Patch

diff --git a/drivers/net/ifc/ifcvf_vdpa.c b/drivers/net/ifc/ifcvf_vdpa.c
index 3c5430dc0..7d3085d8d 100644
--- a/drivers/net/ifc/ifcvf_vdpa.c
+++ b/drivers/net/ifc/ifcvf_vdpa.c
@@ -503,11 +503,11 @@  update_datapath(struct ifcvf_internal *internal)
 		if (ret)
 			goto err;
 
-		ret = setup_notify_relay(internal);
+		ret = vdpa_ifcvf_start(internal);
 		if (ret)
 			goto err;
 
-		ret = vdpa_ifcvf_start(internal);
+		ret = setup_notify_relay(internal);
 		if (ret)
 			goto err;
 
@@ -515,12 +515,12 @@  update_datapath(struct ifcvf_internal *internal)
 	} else if (rte_atomic32_read(&internal->running) &&
 		   (!rte_atomic32_read(&internal->started) ||
 		    !rte_atomic32_read(&internal->dev_attached))) {
-		vdpa_ifcvf_stop(internal);
-
 		ret = unset_notify_relay(internal);
 		if (ret)
 			goto err;
 
+		vdpa_ifcvf_stop(internal);
+
 		ret = vdpa_disable_vfio_intr(internal);
 		if (ret)
 			goto err;