[dpdk-dev] i40evf: fix mac deletion when stop dev
Commit Message
When dev_stop is called in i40evf pmd driver, queues are switched off
to stop receiving and transmitting. But the mac address of this VF
still exists in VEB switch.
To stop the traffic from VSI level, the mac address need to be removed
too. Then the bandwidth for this SRIOV VSI can be freed.
This patch fix this issue.
Fixes: 4861cde46116 ("i40e: new poll mode driver")
Signed-off-by: Jingjing Wu <jingjing.wu@intel.com>
---
drivers/net/i40e/i40e_ethdev_vf.c | 7 +++++++
1 file changed, 7 insertions(+)
Comments
> -----Original Message-----
> From: Wu, Jingjing
> Sent: Monday, November 30, 2015 11:54 AM
> To: dev@dpdk.org
> Cc: Wu, Jingjing; Zhang, Helin; Pei, Yulong
> Subject: [PATCH] i40evf: fix mac deletion when stop dev
>
> When dev_stop is called in i40evf pmd driver, queues are switched off to
> stop receiving and transmitting. But the mac address of this VF still exists in
> VEB switch.
> To stop the traffic from VSI level, the mac address need to be removed too.
> Then the bandwidth for this SRIOV VSI can be freed.
> This patch fix this issue.
>
> Fixes: 4861cde46116 ("i40e: new poll mode driver")
>
> Signed-off-by: Jingjing Wu <jingjing.wu@intel.com>
> ---
> drivers/net/i40e/i40e_ethdev_vf.c | 7 +++++++
> 1 file changed, 7 insertions(+)
>
> diff --git a/drivers/net/i40e/i40e_ethdev_vf.c
> b/drivers/net/i40e/i40e_ethdev_vf.c
> index 5c554f2..14d2a50 100644
> --- a/drivers/net/i40e/i40e_ethdev_vf.c
> +++ b/drivers/net/i40e/i40e_ethdev_vf.c
> @@ -1878,7 +1878,9 @@ err_queue:
> static void
> i40evf_dev_stop(struct rte_eth_dev *dev) {
> + struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data-
> >dev_private);
> struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
> + struct ether_addr mac_addr;
>
> PMD_INIT_FUNC_TRACE();
>
> @@ -1892,6 +1894,11 @@ i40evf_dev_stop(struct rte_eth_dev *dev)
> rte_free(intr_handle->intr_vec);
> intr_handle->intr_vec = NULL;
> }
> + /* Set mac addr */
> + (void)rte_memcpy(mac_addr.addr_bytes, hw->mac.addr,
> + sizeof(mac_addr.addr_bytes));
Use ether_addr_copy() instead.
/Helin
> + /* Delete mac addr of this vf */
> + i40evf_del_mac_addr(dev, &mac_addr);
> }
>
> static int
> --
> 2.4.0
> > + /* Set mac addr */
> > + (void)rte_memcpy(mac_addr.addr_bytes, hw->mac.addr,
> > + sizeof(mac_addr.addr_bytes));
> Use ether_addr_copy() instead.
>
> /Helin
Thanks. But the types of mac_addr and hw->mac are different, cannot use ether_addr_copy.
Thanks
Jingjing
On Mon, 30 Nov 2015 11:54:09 +0800
Jingjing Wu <jingjing.wu@intel.com> wrote:
> + (void)rte_memcpy(mac_addr.addr_bytes, hw->mac.addr,
> + sizeof(mac_addr.addr_bytes))
Please don't add useless (void) cast.
I haven't seen that since lint on Unix.
2015-11-30 08:33, Stephen Hemminger:
> On Mon, 30 Nov 2015 11:54:09 +0800
> Jingjing Wu <jingjing.wu@intel.com> wrote:
>
> > + (void)rte_memcpy(mac_addr.addr_bytes, hw->mac.addr,
> > + sizeof(mac_addr.addr_bytes))
>
> Please don't add useless (void) cast.
> I haven't seen that since lint on Unix.
It is the style in i40e driver.
It may deserve a general cleanup.
2015-11-30 11:54, Jingjing Wu:
> When dev_stop is called in i40evf pmd driver, queues are switched off
> to stop receiving and transmitting. But the mac address of this VF
> still exists in VEB switch.
> To stop the traffic from VSI level, the mac address need to be removed
> too. Then the bandwidth for this SRIOV VSI can be freed.
> This patch fix this issue.
>
> Fixes: 4861cde46116 ("i40e: new poll mode driver")
>
> Signed-off-by: Jingjing Wu <jingjing.wu@intel.com>
Applied, thanks
@@ -1878,7 +1878,9 @@ err_queue:
static void
i40evf_dev_stop(struct rte_eth_dev *dev)
{
+ struct i40e_hw *hw = I40E_DEV_PRIVATE_TO_HW(dev->data->dev_private);
struct rte_intr_handle *intr_handle = &dev->pci_dev->intr_handle;
+ struct ether_addr mac_addr;
PMD_INIT_FUNC_TRACE();
@@ -1892,6 +1894,11 @@ i40evf_dev_stop(struct rte_eth_dev *dev)
rte_free(intr_handle->intr_vec);
intr_handle->intr_vec = NULL;
}
+ /* Set mac addr */
+ (void)rte_memcpy(mac_addr.addr_bytes, hw->mac.addr,
+ sizeof(mac_addr.addr_bytes));
+ /* Delete mac addr of this vf */
+ i40evf_del_mac_addr(dev, &mac_addr);
}
static int