mlx5-fixes-2020-04-08
-----BEGIN PGP SIGNATURE----- iQEzBAABCAAdFiEEGhZs6bAKwk/OTgTpSD+KveBX+j4FAl6OVGEACgkQSD+KveBX +j7E8gf+K3xqUtcXUL3sCx1M2kY2Kj4ZjvL9H3m286mTmTAbSwMdEOJWaHfWVqZJ 8cf3Df/keK723YH+xPYbSQPloUgSIpazIFzjP6fvAkLKAu/AhLoVhBj3TF5hFaib BrK8L/QKoY6GGSuZb4+VJTenPYUPGFjNTlAHbchRO9V7SA9ngKZIz34ipVI8U+lT kRE8+YVsNM4c4ia3A4VcgAN/MCAbn+bTojS8/O5+ZyFYr3ErdgwFRHMzRiVnYeHE 9WFO4or2AVk4yiI5hqzH1/nJdhjOUK930Al68dfNdrHmmZXnD4lX9M4I+AoNB3qh zzykSerxjUC4yx4t8Nrq3na0U6RiSA== =KWRI -----END PGP SIGNATURE----- Merge tag 'mlx5-fixes-2020-04-08' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux Saeed Mahameed says: ==================== Mellanox, mlx5 fixes 2020-04-08 This series introduces some fixes to mlx5 driver. Please pull and let me know if there is any problem. For -stable v5.3 ('net/mlx5: Fix frequent ioread PCI access during recovery') ('net/mlx5e: Add missing release firmware call') For -stable v5.4 ('net/mlx5e: Fix nest_level for vlan pop action') ('net/mlx5e: Fix pfnum in devlink port attribute') ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
3d61a39def
|
@ -23,7 +23,10 @@ static int mlx5_devlink_flash_update(struct devlink *devlink,
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
return mlx5_firmware_flash(dev, fw, extack);
|
err = mlx5_firmware_flash(dev, fw, extack);
|
||||||
|
release_firmware(fw);
|
||||||
|
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u8 mlx5_fw_ver_major(u32 version)
|
static u8 mlx5_fw_ver_major(u32 version)
|
||||||
|
|
|
@ -67,11 +67,9 @@ struct mlx5_ct_ft {
|
||||||
struct nf_flowtable *nf_ft;
|
struct nf_flowtable *nf_ft;
|
||||||
struct mlx5_tc_ct_priv *ct_priv;
|
struct mlx5_tc_ct_priv *ct_priv;
|
||||||
struct rhashtable ct_entries_ht;
|
struct rhashtable ct_entries_ht;
|
||||||
struct list_head ct_entries_list;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mlx5_ct_entry {
|
struct mlx5_ct_entry {
|
||||||
struct list_head list;
|
|
||||||
u16 zone;
|
u16 zone;
|
||||||
struct rhash_head node;
|
struct rhash_head node;
|
||||||
struct flow_rule *flow_rule;
|
struct flow_rule *flow_rule;
|
||||||
|
@ -617,8 +615,6 @@ mlx5_tc_ct_block_flow_offload_add(struct mlx5_ct_ft *ft,
|
||||||
if (err)
|
if (err)
|
||||||
goto err_insert;
|
goto err_insert;
|
||||||
|
|
||||||
list_add(&entry->list, &ft->ct_entries_list);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_insert:
|
err_insert:
|
||||||
|
@ -646,7 +642,6 @@ mlx5_tc_ct_block_flow_offload_del(struct mlx5_ct_ft *ft,
|
||||||
WARN_ON(rhashtable_remove_fast(&ft->ct_entries_ht,
|
WARN_ON(rhashtable_remove_fast(&ft->ct_entries_ht,
|
||||||
&entry->node,
|
&entry->node,
|
||||||
cts_ht_params));
|
cts_ht_params));
|
||||||
list_del(&entry->list);
|
|
||||||
kfree(entry);
|
kfree(entry);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -818,7 +813,6 @@ mlx5_tc_ct_add_ft_cb(struct mlx5_tc_ct_priv *ct_priv, u16 zone,
|
||||||
ft->zone = zone;
|
ft->zone = zone;
|
||||||
ft->nf_ft = nf_ft;
|
ft->nf_ft = nf_ft;
|
||||||
ft->ct_priv = ct_priv;
|
ft->ct_priv = ct_priv;
|
||||||
INIT_LIST_HEAD(&ft->ct_entries_list);
|
|
||||||
refcount_set(&ft->refcount, 1);
|
refcount_set(&ft->refcount, 1);
|
||||||
|
|
||||||
err = rhashtable_init(&ft->ct_entries_ht, &cts_ht_params);
|
err = rhashtable_init(&ft->ct_entries_ht, &cts_ht_params);
|
||||||
|
@ -847,12 +841,12 @@ err_init:
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
mlx5_tc_ct_flush_ft(struct mlx5_tc_ct_priv *ct_priv, struct mlx5_ct_ft *ft)
|
mlx5_tc_ct_flush_ft_entry(void *ptr, void *arg)
|
||||||
{
|
{
|
||||||
struct mlx5_ct_entry *entry;
|
struct mlx5_tc_ct_priv *ct_priv = arg;
|
||||||
|
struct mlx5_ct_entry *entry = ptr;
|
||||||
|
|
||||||
list_for_each_entry(entry, &ft->ct_entries_list, list)
|
mlx5_tc_ct_entry_del_rules(ct_priv, entry);
|
||||||
mlx5_tc_ct_entry_del_rules(ft->ct_priv, entry);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -863,9 +857,10 @@ mlx5_tc_ct_del_ft_cb(struct mlx5_tc_ct_priv *ct_priv, struct mlx5_ct_ft *ft)
|
||||||
|
|
||||||
nf_flow_table_offload_del_cb(ft->nf_ft,
|
nf_flow_table_offload_del_cb(ft->nf_ft,
|
||||||
mlx5_tc_ct_block_flow_offload, ft);
|
mlx5_tc_ct_block_flow_offload, ft);
|
||||||
mlx5_tc_ct_flush_ft(ct_priv, ft);
|
|
||||||
rhashtable_remove_fast(&ct_priv->zone_ht, &ft->node, zone_params);
|
rhashtable_remove_fast(&ct_priv->zone_ht, &ft->node, zone_params);
|
||||||
rhashtable_destroy(&ft->ct_entries_ht);
|
rhashtable_free_and_destroy(&ft->ct_entries_ht,
|
||||||
|
mlx5_tc_ct_flush_ft_entry,
|
||||||
|
ct_priv);
|
||||||
kfree(ft);
|
kfree(ft);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5526,8 +5526,8 @@ static void mlx5e_remove(struct mlx5_core_dev *mdev, void *vpriv)
|
||||||
#ifdef CONFIG_MLX5_CORE_EN_DCB
|
#ifdef CONFIG_MLX5_CORE_EN_DCB
|
||||||
mlx5e_dcbnl_delete_app(priv);
|
mlx5e_dcbnl_delete_app(priv);
|
||||||
#endif
|
#endif
|
||||||
mlx5e_devlink_port_unregister(priv);
|
|
||||||
unregister_netdev(priv->netdev);
|
unregister_netdev(priv->netdev);
|
||||||
|
mlx5e_devlink_port_unregister(priv);
|
||||||
mlx5e_detach(mdev, vpriv);
|
mlx5e_detach(mdev, vpriv);
|
||||||
mlx5e_destroy_netdev(priv);
|
mlx5e_destroy_netdev(priv);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2050,29 +2050,30 @@ static int register_devlink_port(struct mlx5_core_dev *dev,
|
||||||
struct mlx5_eswitch_rep *rep = rpriv->rep;
|
struct mlx5_eswitch_rep *rep = rpriv->rep;
|
||||||
struct netdev_phys_item_id ppid = {};
|
struct netdev_phys_item_id ppid = {};
|
||||||
unsigned int dl_port_index = 0;
|
unsigned int dl_port_index = 0;
|
||||||
|
u16 pfnum;
|
||||||
|
|
||||||
if (!is_devlink_port_supported(dev, rpriv))
|
if (!is_devlink_port_supported(dev, rpriv))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
mlx5e_rep_get_port_parent_id(rpriv->netdev, &ppid);
|
mlx5e_rep_get_port_parent_id(rpriv->netdev, &ppid);
|
||||||
|
pfnum = PCI_FUNC(dev->pdev->devfn);
|
||||||
|
|
||||||
if (rep->vport == MLX5_VPORT_UPLINK) {
|
if (rep->vport == MLX5_VPORT_UPLINK) {
|
||||||
devlink_port_attrs_set(&rpriv->dl_port,
|
devlink_port_attrs_set(&rpriv->dl_port,
|
||||||
DEVLINK_PORT_FLAVOUR_PHYSICAL,
|
DEVLINK_PORT_FLAVOUR_PHYSICAL,
|
||||||
PCI_FUNC(dev->pdev->devfn), false, 0,
|
pfnum, false, 0,
|
||||||
&ppid.id[0], ppid.id_len);
|
&ppid.id[0], ppid.id_len);
|
||||||
dl_port_index = vport_to_devlink_port_index(dev, rep->vport);
|
dl_port_index = vport_to_devlink_port_index(dev, rep->vport);
|
||||||
} else if (rep->vport == MLX5_VPORT_PF) {
|
} else if (rep->vport == MLX5_VPORT_PF) {
|
||||||
devlink_port_attrs_pci_pf_set(&rpriv->dl_port,
|
devlink_port_attrs_pci_pf_set(&rpriv->dl_port,
|
||||||
&ppid.id[0], ppid.id_len,
|
&ppid.id[0], ppid.id_len,
|
||||||
dev->pdev->devfn);
|
pfnum);
|
||||||
dl_port_index = rep->vport;
|
dl_port_index = rep->vport;
|
||||||
} else if (mlx5_eswitch_is_vf_vport(dev->priv.eswitch,
|
} else if (mlx5_eswitch_is_vf_vport(dev->priv.eswitch,
|
||||||
rpriv->rep->vport)) {
|
rpriv->rep->vport)) {
|
||||||
devlink_port_attrs_pci_vf_set(&rpriv->dl_port,
|
devlink_port_attrs_pci_vf_set(&rpriv->dl_port,
|
||||||
&ppid.id[0], ppid.id_len,
|
&ppid.id[0], ppid.id_len,
|
||||||
dev->pdev->devfn,
|
pfnum, rep->vport - 1);
|
||||||
rep->vport - 1);
|
|
||||||
dl_port_index = vport_to_devlink_port_index(dev, rep->vport);
|
dl_port_index = vport_to_devlink_port_index(dev, rep->vport);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1343,7 +1343,8 @@ mlx5e_tc_add_fdb_flow(struct mlx5e_priv *priv,
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
if (attr->action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR) {
|
if (attr->action & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR &&
|
||||||
|
!(attr->ct_attr.ct_action & TCA_CT_ACT_CLEAR)) {
|
||||||
err = mlx5e_attach_mod_hdr(priv, flow, parse_attr);
|
err = mlx5e_attach_mod_hdr(priv, flow, parse_attr);
|
||||||
dealloc_mod_hdr_actions(&parse_attr->mod_hdr_acts);
|
dealloc_mod_hdr_actions(&parse_attr->mod_hdr_acts);
|
||||||
if (err)
|
if (err)
|
||||||
|
@ -3558,12 +3559,13 @@ static int add_vlan_pop_action(struct mlx5e_priv *priv,
|
||||||
struct mlx5_esw_flow_attr *attr,
|
struct mlx5_esw_flow_attr *attr,
|
||||||
u32 *action)
|
u32 *action)
|
||||||
{
|
{
|
||||||
int nest_level = attr->parse_attr->filter_dev->lower_level;
|
|
||||||
struct flow_action_entry vlan_act = {
|
struct flow_action_entry vlan_act = {
|
||||||
.id = FLOW_ACTION_VLAN_POP,
|
.id = FLOW_ACTION_VLAN_POP,
|
||||||
};
|
};
|
||||||
int err = 0;
|
int nest_level, err = 0;
|
||||||
|
|
||||||
|
nest_level = attr->parse_attr->filter_dev->lower_level -
|
||||||
|
priv->netdev->lower_level;
|
||||||
while (nest_level--) {
|
while (nest_level--) {
|
||||||
err = parse_tc_vlan_action(priv, &vlan_act, attr, action);
|
err = parse_tc_vlan_action(priv, &vlan_act, attr, action);
|
||||||
if (err)
|
if (err)
|
||||||
|
|
|
@ -403,7 +403,6 @@ enum {
|
||||||
MLX5_ESW_ATTR_FLAG_VLAN_HANDLED = BIT(0),
|
MLX5_ESW_ATTR_FLAG_VLAN_HANDLED = BIT(0),
|
||||||
MLX5_ESW_ATTR_FLAG_SLOW_PATH = BIT(1),
|
MLX5_ESW_ATTR_FLAG_SLOW_PATH = BIT(1),
|
||||||
MLX5_ESW_ATTR_FLAG_NO_IN_PORT = BIT(2),
|
MLX5_ESW_ATTR_FLAG_NO_IN_PORT = BIT(2),
|
||||||
MLX5_ESW_ATTR_FLAG_HAIRPIN = BIT(3),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct mlx5_esw_flow_attr {
|
struct mlx5_esw_flow_attr {
|
||||||
|
|
|
@ -300,7 +300,6 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
|
||||||
bool split = !!(attr->split_count);
|
bool split = !!(attr->split_count);
|
||||||
struct mlx5_flow_handle *rule;
|
struct mlx5_flow_handle *rule;
|
||||||
struct mlx5_flow_table *fdb;
|
struct mlx5_flow_table *fdb;
|
||||||
bool hairpin = false;
|
|
||||||
int j, i = 0;
|
int j, i = 0;
|
||||||
|
|
||||||
if (esw->mode != MLX5_ESWITCH_OFFLOADS)
|
if (esw->mode != MLX5_ESWITCH_OFFLOADS)
|
||||||
|
@ -398,21 +397,16 @@ mlx5_eswitch_add_offloaded_rule(struct mlx5_eswitch *esw,
|
||||||
goto err_esw_get;
|
goto err_esw_get;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mlx5_eswitch_termtbl_required(esw, attr, &flow_act, spec)) {
|
if (mlx5_eswitch_termtbl_required(esw, attr, &flow_act, spec))
|
||||||
rule = mlx5_eswitch_add_termtbl_rule(esw, fdb, spec, attr,
|
rule = mlx5_eswitch_add_termtbl_rule(esw, fdb, spec, attr,
|
||||||
&flow_act, dest, i);
|
&flow_act, dest, i);
|
||||||
hairpin = true;
|
else
|
||||||
} else {
|
|
||||||
rule = mlx5_add_flow_rules(fdb, spec, &flow_act, dest, i);
|
rule = mlx5_add_flow_rules(fdb, spec, &flow_act, dest, i);
|
||||||
}
|
|
||||||
if (IS_ERR(rule))
|
if (IS_ERR(rule))
|
||||||
goto err_add_rule;
|
goto err_add_rule;
|
||||||
else
|
else
|
||||||
atomic64_inc(&esw->offloads.num_flows);
|
atomic64_inc(&esw->offloads.num_flows);
|
||||||
|
|
||||||
if (hairpin)
|
|
||||||
attr->flags |= MLX5_ESW_ATTR_FLAG_HAIRPIN;
|
|
||||||
|
|
||||||
return rule;
|
return rule;
|
||||||
|
|
||||||
err_add_rule:
|
err_add_rule:
|
||||||
|
@ -501,7 +495,7 @@ __mlx5_eswitch_del_rule(struct mlx5_eswitch *esw,
|
||||||
|
|
||||||
mlx5_del_flow_rules(rule);
|
mlx5_del_flow_rules(rule);
|
||||||
|
|
||||||
if (attr->flags & MLX5_ESW_ATTR_FLAG_HAIRPIN) {
|
if (!(attr->flags & MLX5_ESW_ATTR_FLAG_SLOW_PATH)) {
|
||||||
/* unref the term table */
|
/* unref the term table */
|
||||||
for (i = 0; i < MLX5_MAX_FLOW_FWD_VPORTS; i++) {
|
for (i = 0; i < MLX5_MAX_FLOW_FWD_VPORTS; i++) {
|
||||||
if (attr->dests[i].termtbl)
|
if (attr->dests[i].termtbl)
|
||||||
|
|
|
@ -243,7 +243,7 @@ recover_from_sw_reset:
|
||||||
if (mlx5_get_nic_state(dev) == MLX5_NIC_IFC_DISABLED)
|
if (mlx5_get_nic_state(dev) == MLX5_NIC_IFC_DISABLED)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
cond_resched();
|
msleep(20);
|
||||||
} while (!time_after(jiffies, end));
|
} while (!time_after(jiffies, end));
|
||||||
|
|
||||||
if (mlx5_get_nic_state(dev) != MLX5_NIC_IFC_DISABLED) {
|
if (mlx5_get_nic_state(dev) != MLX5_NIC_IFC_DISABLED) {
|
||||||
|
|
Loading…
Reference in New Issue