[dpdk-dev] fm10k: fix wrong Rx func is used

Message ID 1448589345-16239-1-git-send-email-jing.d.chen@intel.com (mailing list archive)
State Accepted, archived
Headers

Commit Message

Chen, Jing D Nov. 27, 2015, 1:55 a.m. UTC
  From: "Chen Jing D(Mark)" <jing.d.chen@intel.com>

Steps to reproduce the bug:
1. All Rx offloading is disabled and start the device, then
   Vector Rx is used.
2. Stop the device. Re-configure to enable hw_ip_checksum = 1,
   start the device again.
3. In this case, assume regular Rx should be used since Vector
   Rx doesn't support ip checksum offload. But actually Vector
   Rx is used and cause checksum won't be done by hardware.

The reason is after re-configuring, driver misses an "else" in
func fm10k_set_rx_function(). Then Rx func in last round are
used.

Fixes:77a8ab47("fm10k: select best Rx function")

Reported-by: Xiao Wang <xiao.w.wang@intel.com>
Signed-off-by: Chen Jing D(Mark) <jing.d.chen@intel.com>
---
 drivers/net/fm10k/fm10k_ethdev.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)
  

Comments

Xiao Wang Nov. 27, 2015, 5:38 a.m. UTC | #1
Hi,

> -----Original Message-----
> From: Chen, Jing D
> Sent: Friday, November 27, 2015 9:56 AM
> To: dev@dpdk.org
> Cc: Wang, Xiao W <xiao.w.wang@intel.com>; Chen, Jing D
> <jing.d.chen@intel.com>
> Subject: [PATCH] fm10k: fix wrong Rx func is used
> 
> From: "Chen Jing D(Mark)" <jing.d.chen@intel.com>
> 
> Steps to reproduce the bug:
> 1. All Rx offloading is disabled and start the device, then
>    Vector Rx is used.
> 2. Stop the device. Re-configure to enable hw_ip_checksum = 1,
>    start the device again.
> 3. In this case, assume regular Rx should be used since Vector
>    Rx doesn't support ip checksum offload. But actually Vector
>    Rx is used and cause checksum won't be done by hardware.
> 
> The reason is after re-configuring, driver misses an "else" in func
> fm10k_set_rx_function(). Then Rx func in last round are used.
> 
> Fixes:77a8ab47("fm10k: select best Rx function")
> 
> Reported-by: Xiao Wang <xiao.w.wang@intel.com>
> Signed-off-by: Chen Jing D(Mark) <jing.d.chen@intel.com>
> ---
>  drivers/net/fm10k/fm10k_ethdev.c |    2 ++
>  1 files changed, 2 insertions(+), 0 deletions(-)
> 
> diff --git a/drivers/net/fm10k/fm10k_ethdev.c
> b/drivers/net/fm10k/fm10k_ethdev.c
> index 4f23ce3..e4aed94 100644
> --- a/drivers/net/fm10k/fm10k_ethdev.c
> +++ b/drivers/net/fm10k/fm10k_ethdev.c
> @@ -2486,6 +2486,8 @@ fm10k_set_rx_function(struct rte_eth_dev *dev)
>  			dev->rx_pkt_burst = fm10k_recv_pkts_vec;
>  	} else if (dev->data->scattered_rx)
>  		dev->rx_pkt_burst = fm10k_recv_scattered_pkts;
> +	else
> +		dev->rx_pkt_burst = fm10k_recv_pkts;
> 
>  	rx_using_sse =
>  		(dev->rx_pkt_burst == fm10k_recv_scattered_pkts_vec ||
> --
> 1.7.7.6
Acked-by: Xiao Wang <xiao.w.wang@intel.com>
  
Thomas Monjalon Nov. 27, 2015, 6:50 p.m. UTC | #2
2015-11-27 09:55, Chen Jing D:
> From: "Chen Jing D(Mark)" <jing.d.chen@intel.com>
> 
> Steps to reproduce the bug:
> 1. All Rx offloading is disabled and start the device, then
>    Vector Rx is used.
> 2. Stop the device. Re-configure to enable hw_ip_checksum = 1,
>    start the device again.
> 3. In this case, assume regular Rx should be used since Vector
>    Rx doesn't support ip checksum offload. But actually Vector
>    Rx is used and cause checksum won't be done by hardware.
> 
> The reason is after re-configuring, driver misses an "else" in
> func fm10k_set_rx_function(). Then Rx func in last round are
> used.
> 
> Fixes:77a8ab47("fm10k: select best Rx function")

git log -1 --abbrev=12 --format='Fixes: %h ("%s")' 77a8ab47
Fixes: 77a8ab47eb38 ("fm10k: select best Rx function")

> Reported-by: Xiao Wang <xiao.w.wang@intel.com>
> Signed-off-by: Chen Jing D(Mark) <jing.d.chen@intel.com>
Acked-by: Xiao Wang <xiao.w.wang@intel.com>

Applied, thanks
  

Patch

diff --git a/drivers/net/fm10k/fm10k_ethdev.c b/drivers/net/fm10k/fm10k_ethdev.c
index 4f23ce3..e4aed94 100644
--- a/drivers/net/fm10k/fm10k_ethdev.c
+++ b/drivers/net/fm10k/fm10k_ethdev.c
@@ -2486,6 +2486,8 @@  fm10k_set_rx_function(struct rte_eth_dev *dev)
 			dev->rx_pkt_burst = fm10k_recv_pkts_vec;
 	} else if (dev->data->scattered_rx)
 		dev->rx_pkt_burst = fm10k_recv_scattered_pkts;
+	else
+		dev->rx_pkt_burst = fm10k_recv_pkts;
 
 	rx_using_sse =
 		(dev->rx_pkt_burst == fm10k_recv_scattered_pkts_vec ||