mirror of https://gitee.com/openkylin/linux.git
mlx5-fixes-2019-01-25
-----BEGIN PGP SIGNATURE----- iQEcBAABAgAGBQJcS2rdAAoJEEg/ir3gV/o+CZ8IAMX4yWUWjzgrIDdOc1OEgHJQ FDCMtTDm/I+m1UInAgoigRia2RyIL99N81Vrx+p+otCOml/U5IXPt5tuJfSNQYZ3 p9MibQSXtKJ9jhowOVZdYlTx9CXti75BS45wHKZPlL7V+gCC2Q7/8aviuRlkQKAN 4pQNDreNiiB8PznXG/yCyzEu0Kc9M/Bv89xdLynVpDTxBfEfI8xSv4PttUcAxaQ5 Fs/489wuODyhAczOquQj1dvn61zUamaPp6z0h+GbZOCQv0AO7ABRZl+7o5C5r+rA i7R4ak6WIgW3snIzhCdpynPfas8kUIvxJjkNCZuoFsefrBRsNv5RvtfCkuzyms4= =3epF -----END PGP SIGNATURE----- Merge tag 'mlx5-fixes-2019-01-25' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux Saeed Mahameed says: ==================== Mellanox, mlx5 fixes 2019-01-25 This series introduces some fixes to mlx5 driver. For more information please see tag log below. Please pull and let me know if there is any problem. For -stable v4.13 ('net/mlx5e: Allow MAC invalidation while spoofchk is ON') For -stable v4.18 ('Revert "net/mlx5e: E-Switch, Initialize eswitch only if eswitch manager"') ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
3da15ad3e9
|
@ -950,7 +950,7 @@ static int mlx5e_open_rq(struct mlx5e_channel *c,
|
|||
if (params->rx_dim_enabled)
|
||||
__set_bit(MLX5E_RQ_STATE_AM, &c->rq.state);
|
||||
|
||||
if (params->pflags & MLX5E_PFLAG_RX_NO_CSUM_COMPLETE)
|
||||
if (MLX5E_GET_PFLAG(params, MLX5E_PFLAG_RX_NO_CSUM_COMPLETE))
|
||||
__set_bit(MLX5E_RQ_STATE_NO_CSUM_COMPLETE, &c->rq.state);
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -1126,9 +1126,17 @@ static int mlx5e_rep_get_phys_port_name(struct net_device *dev,
|
|||
struct mlx5e_priv *priv = netdev_priv(dev);
|
||||
struct mlx5e_rep_priv *rpriv = priv->ppriv;
|
||||
struct mlx5_eswitch_rep *rep = rpriv->rep;
|
||||
int ret;
|
||||
int ret, pf_num;
|
||||
|
||||
ret = mlx5_lag_get_pf_num(priv->mdev, &pf_num);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (rep->vport == FDB_UPLINK_VPORT)
|
||||
ret = snprintf(buf, len, "p%d", pf_num);
|
||||
else
|
||||
ret = snprintf(buf, len, "pf%dvf%d", pf_num, rep->vport - 1);
|
||||
|
||||
ret = snprintf(buf, len, "%d", rep->vport - 1);
|
||||
if (ret >= len)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
|
@ -1285,6 +1293,18 @@ static int mlx5e_uplink_rep_set_mac(struct net_device *netdev, void *addr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int mlx5e_uplink_rep_set_vf_vlan(struct net_device *dev, int vf, u16 vlan, u8 qos,
|
||||
__be16 vlan_proto)
|
||||
{
|
||||
netdev_warn_once(dev, "legacy vf vlan setting isn't supported in switchdev mode\n");
|
||||
|
||||
if (vlan != 0)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
/* allow setting 0-vid for compatibility with libvirt */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct switchdev_ops mlx5e_rep_switchdev_ops = {
|
||||
.switchdev_port_attr_get = mlx5e_attr_get,
|
||||
};
|
||||
|
@ -1319,6 +1339,7 @@ static const struct net_device_ops mlx5e_netdev_ops_uplink_rep = {
|
|||
.ndo_set_vf_rate = mlx5e_set_vf_rate,
|
||||
.ndo_get_vf_config = mlx5e_get_vf_config,
|
||||
.ndo_get_vf_stats = mlx5e_get_vf_stats,
|
||||
.ndo_set_vf_vlan = mlx5e_uplink_rep_set_vf_vlan,
|
||||
};
|
||||
|
||||
bool mlx5e_eswitch_rep(struct net_device *netdev)
|
||||
|
|
|
@ -1134,13 +1134,6 @@ static int esw_vport_ingress_config(struct mlx5_eswitch *esw,
|
|||
int err = 0;
|
||||
u8 *smac_v;
|
||||
|
||||
if (vport->info.spoofchk && !is_valid_ether_addr(vport->info.mac)) {
|
||||
mlx5_core_warn(esw->dev,
|
||||
"vport[%d] configure ingress rules failed, illegal mac with spoofchk\n",
|
||||
vport->vport);
|
||||
return -EPERM;
|
||||
}
|
||||
|
||||
esw_vport_cleanup_ingress_rules(esw, vport);
|
||||
|
||||
if (!vport->info.vlan && !vport->info.qos && !vport->info.spoofchk) {
|
||||
|
@ -1728,7 +1721,7 @@ int mlx5_eswitch_init(struct mlx5_core_dev *dev)
|
|||
int vport_num;
|
||||
int err;
|
||||
|
||||
if (!MLX5_ESWITCH_MANAGER(dev))
|
||||
if (!MLX5_VPORT_MANAGER(dev))
|
||||
return 0;
|
||||
|
||||
esw_info(dev,
|
||||
|
@ -1797,7 +1790,7 @@ int mlx5_eswitch_init(struct mlx5_core_dev *dev)
|
|||
|
||||
void mlx5_eswitch_cleanup(struct mlx5_eswitch *esw)
|
||||
{
|
||||
if (!esw || !MLX5_ESWITCH_MANAGER(esw->dev))
|
||||
if (!esw || !MLX5_VPORT_MANAGER(esw->dev))
|
||||
return;
|
||||
|
||||
esw_info(esw->dev, "cleanup\n");
|
||||
|
@ -1827,13 +1820,10 @@ int mlx5_eswitch_set_vport_mac(struct mlx5_eswitch *esw,
|
|||
mutex_lock(&esw->state_lock);
|
||||
evport = &esw->vports[vport];
|
||||
|
||||
if (evport->info.spoofchk && !is_valid_ether_addr(mac)) {
|
||||
if (evport->info.spoofchk && !is_valid_ether_addr(mac))
|
||||
mlx5_core_warn(esw->dev,
|
||||
"MAC invalidation is not allowed when spoofchk is on, vport(%d)\n",
|
||||
"Set invalid MAC while spoofchk is on, vport(%d)\n",
|
||||
vport);
|
||||
err = -EPERM;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
err = mlx5_modify_nic_vport_mac_address(esw->dev, vport, mac);
|
||||
if (err) {
|
||||
|
@ -1979,6 +1969,10 @@ int mlx5_eswitch_set_vport_spoofchk(struct mlx5_eswitch *esw,
|
|||
evport = &esw->vports[vport];
|
||||
pschk = evport->info.spoofchk;
|
||||
evport->info.spoofchk = spoofchk;
|
||||
if (pschk && !is_valid_ether_addr(evport->info.mac))
|
||||
mlx5_core_warn(esw->dev,
|
||||
"Spoofchk in set while MAC is invalid, vport(%d)\n",
|
||||
evport->vport);
|
||||
if (evport->enabled && esw->mode == SRIOV_LEGACY)
|
||||
err = esw_vport_ingress_config(esw, evport);
|
||||
if (err)
|
||||
|
|
|
@ -616,6 +616,27 @@ void mlx5_lag_add(struct mlx5_core_dev *dev, struct net_device *netdev)
|
|||
}
|
||||
}
|
||||
|
||||
int mlx5_lag_get_pf_num(struct mlx5_core_dev *dev, int *pf_num)
|
||||
{
|
||||
struct mlx5_lag *ldev;
|
||||
int n;
|
||||
|
||||
ldev = mlx5_lag_dev_get(dev);
|
||||
if (!ldev) {
|
||||
mlx5_core_warn(dev, "no lag device, can't get pf num\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
for (n = 0; n < MLX5_MAX_PORTS; n++)
|
||||
if (ldev->pf[n].dev == dev) {
|
||||
*pf_num = n;
|
||||
return 0;
|
||||
}
|
||||
|
||||
mlx5_core_warn(dev, "wasn't able to locate pf in the lag device\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Must be called with intf_mutex held */
|
||||
void mlx5_lag_remove(struct mlx5_core_dev *dev)
|
||||
{
|
||||
|
|
|
@ -187,6 +187,8 @@ static inline int mlx5_lag_is_lacp_owner(struct mlx5_core_dev *dev)
|
|||
MLX5_CAP_GEN(dev, lag_master);
|
||||
}
|
||||
|
||||
int mlx5_lag_get_pf_num(struct mlx5_core_dev *dev, int *pf_num);
|
||||
|
||||
void mlx5_reload_interface(struct mlx5_core_dev *mdev, int protocol);
|
||||
void mlx5_lag_update(struct mlx5_core_dev *dev);
|
||||
|
||||
|
|
|
@ -44,14 +44,15 @@ static struct mlx5_core_rsc_common *
|
|||
mlx5_get_rsc(struct mlx5_qp_table *table, u32 rsn)
|
||||
{
|
||||
struct mlx5_core_rsc_common *common;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock(&table->lock);
|
||||
spin_lock_irqsave(&table->lock, flags);
|
||||
|
||||
common = radix_tree_lookup(&table->tree, rsn);
|
||||
if (common)
|
||||
atomic_inc(&common->refcount);
|
||||
|
||||
spin_unlock(&table->lock);
|
||||
spin_unlock_irqrestore(&table->lock, flags);
|
||||
|
||||
return common;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue