mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 19:00:25 +00:00
{net,vdpa}/mlx5: Configure interface MAC into mpfs L2 table
commit7c9f131f36
upstream. net/mlx5: Expose MPFS configuration API MPFS is the multi physical function switch that bridges traffic between the physical port and any physical functions associated with it. The driver is required to add or remove MAC entries to properly forward incoming traffic to the correct physical function. We export the API to control MPFS so that other drivers, such as mlx5_vdpa are able to add MAC addresses of their network interfaces. The MAC address of the vdpa interface must be configured into the MPFS L2 address. Failing to do so could cause, in some NIC configurations, failure to forward packets to the vdpa network device instance. Fix this by adding calls to update the MPFS table. CC: <mst@redhat.com> CC: <jasowang@redhat.com> CC: <virtualization@lists.linux-foundation.org> Fixes:1a86b377aa
("vdpa/mlx5: Add VDPA driver for supported mlx5 devices") Signed-off-by: Eli Cohen <elic@nvidia.com> Signed-off-by: Saeed Mahameed <saeedm@nvidia.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
bbd00c4d50
commit
89a0e388c6
6 changed files with 42 additions and 5 deletions
|
@ -35,6 +35,7 @@
|
|||
#include <linux/ipv6.h>
|
||||
#include <linux/tcp.h>
|
||||
#include <linux/mlx5/fs.h>
|
||||
#include <linux/mlx5/mpfs.h>
|
||||
#include "en.h"
|
||||
#include "lib/mpfs.h"
|
||||
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
#include <linux/mlx5/mlx5_ifc.h>
|
||||
#include <linux/mlx5/vport.h>
|
||||
#include <linux/mlx5/fs.h>
|
||||
#include <linux/mlx5/mpfs.h>
|
||||
#include "esw/acl/lgcy.h"
|
||||
#include "mlx5_core.h"
|
||||
#include "lib/eq.h"
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
#include <linux/etherdevice.h>
|
||||
#include <linux/mlx5/driver.h>
|
||||
#include <linux/mlx5/mlx5_ifc.h>
|
||||
#include <linux/mlx5/mpfs.h>
|
||||
#include <linux/mlx5/eswitch.h>
|
||||
#include "mlx5_core.h"
|
||||
#include "lib/mpfs.h"
|
||||
|
@ -175,6 +176,7 @@ int mlx5_mpfs_add_mac(struct mlx5_core_dev *dev, u8 *mac)
|
|||
mutex_unlock(&mpfs->lock);
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(mlx5_mpfs_add_mac);
|
||||
|
||||
int mlx5_mpfs_del_mac(struct mlx5_core_dev *dev, u8 *mac)
|
||||
{
|
||||
|
@ -206,3 +208,4 @@ int mlx5_mpfs_del_mac(struct mlx5_core_dev *dev, u8 *mac)
|
|||
mutex_unlock(&mpfs->lock);
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL(mlx5_mpfs_del_mac);
|
||||
|
|
|
@ -84,12 +84,9 @@ struct l2addr_node {
|
|||
#ifdef CONFIG_MLX5_MPFS
|
||||
int mlx5_mpfs_init(struct mlx5_core_dev *dev);
|
||||
void mlx5_mpfs_cleanup(struct mlx5_core_dev *dev);
|
||||
int mlx5_mpfs_add_mac(struct mlx5_core_dev *dev, u8 *mac);
|
||||
int mlx5_mpfs_del_mac(struct mlx5_core_dev *dev, u8 *mac);
|
||||
#else /* #ifndef CONFIG_MLX5_MPFS */
|
||||
static inline int mlx5_mpfs_init(struct mlx5_core_dev *dev) { return 0; }
|
||||
static inline void mlx5_mpfs_cleanup(struct mlx5_core_dev *dev) {}
|
||||
static inline int mlx5_mpfs_add_mac(struct mlx5_core_dev *dev, u8 *mac) { return 0; }
|
||||
static inline int mlx5_mpfs_del_mac(struct mlx5_core_dev *dev, u8 *mac) { return 0; }
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
@ -9,6 +9,7 @@
|
|||
#include <linux/mlx5/vport.h>
|
||||
#include <linux/mlx5/fs.h>
|
||||
#include <linux/mlx5/device.h>
|
||||
#include <linux/mlx5/mpfs.h>
|
||||
#include "mlx5_vnet.h"
|
||||
#include "mlx5_vdpa_ifc.h"
|
||||
#include "mlx5_vdpa.h"
|
||||
|
@ -1839,11 +1840,16 @@ static int mlx5_vdpa_set_map(struct vdpa_device *vdev, struct vhost_iotlb *iotlb
|
|||
static void mlx5_vdpa_free(struct vdpa_device *vdev)
|
||||
{
|
||||
struct mlx5_vdpa_dev *mvdev = to_mvdev(vdev);
|
||||
struct mlx5_core_dev *pfmdev;
|
||||
struct mlx5_vdpa_net *ndev;
|
||||
|
||||
ndev = to_mlx5_vdpa_ndev(mvdev);
|
||||
|
||||
free_resources(ndev);
|
||||
if (!is_zero_ether_addr(ndev->config.mac)) {
|
||||
pfmdev = pci_get_drvdata(pci_physfn(mvdev->mdev->pdev));
|
||||
mlx5_mpfs_del_mac(pfmdev, ndev->config.mac);
|
||||
}
|
||||
mlx5_vdpa_free_resources(&ndev->mvdev);
|
||||
mutex_destroy(&ndev->reslock);
|
||||
}
|
||||
|
@ -1962,6 +1968,7 @@ static void init_mvqs(struct mlx5_vdpa_net *ndev)
|
|||
void *mlx5_vdpa_add_dev(struct mlx5_core_dev *mdev)
|
||||
{
|
||||
struct virtio_net_config *config;
|
||||
struct mlx5_core_dev *pfmdev;
|
||||
struct mlx5_vdpa_dev *mvdev;
|
||||
struct mlx5_vdpa_net *ndev;
|
||||
u32 max_vqs;
|
||||
|
@ -1990,10 +1997,17 @@ void *mlx5_vdpa_add_dev(struct mlx5_core_dev *mdev)
|
|||
if (err)
|
||||
goto err_mtu;
|
||||
|
||||
if (!is_zero_ether_addr(config->mac)) {
|
||||
pfmdev = pci_get_drvdata(pci_physfn(mdev->pdev));
|
||||
err = mlx5_mpfs_add_mac(pfmdev, config->mac);
|
||||
if (err)
|
||||
goto err_mtu;
|
||||
}
|
||||
|
||||
mvdev->vdev.dma_dev = mdev->device;
|
||||
err = mlx5_vdpa_alloc_resources(&ndev->mvdev);
|
||||
if (err)
|
||||
goto err_mtu;
|
||||
goto err_mpfs;
|
||||
|
||||
err = alloc_resources(ndev);
|
||||
if (err)
|
||||
|
@ -2009,6 +2023,9 @@ void *mlx5_vdpa_add_dev(struct mlx5_core_dev *mdev)
|
|||
free_resources(ndev);
|
||||
err_res:
|
||||
mlx5_vdpa_free_resources(&ndev->mvdev);
|
||||
err_mpfs:
|
||||
if (!is_zero_ether_addr(config->mac))
|
||||
mlx5_mpfs_del_mac(pfmdev, config->mac);
|
||||
err_mtu:
|
||||
mutex_destroy(&ndev->reslock);
|
||||
put_device(&mvdev->vdev.dev);
|
||||
|
|
18
include/linux/mlx5/mpfs.h
Normal file
18
include/linux/mlx5/mpfs.h
Normal file
|
@ -0,0 +1,18 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
|
||||
* Copyright (c) 2021 Mellanox Technologies Ltd.
|
||||
*/
|
||||
|
||||
#ifndef _MLX5_MPFS_
|
||||
#define _MLX5_MPFS_
|
||||
|
||||
struct mlx5_core_dev;
|
||||
|
||||
#ifdef CONFIG_MLX5_MPFS
|
||||
int mlx5_mpfs_add_mac(struct mlx5_core_dev *dev, u8 *mac);
|
||||
int mlx5_mpfs_del_mac(struct mlx5_core_dev *dev, u8 *mac);
|
||||
#else /* #ifndef CONFIG_MLX5_MPFS */
|
||||
static inline int mlx5_mpfs_add_mac(struct mlx5_core_dev *dev, u8 *mac) { return 0; }
|
||||
static inline int mlx5_mpfs_del_mac(struct mlx5_core_dev *dev, u8 *mac) { return 0; }
|
||||
#endif
|
||||
|
||||
#endif
|
Loading…
Reference in a new issue