mirror of
https://github.com/torvalds/linux.git
synced 2026-05-31 10:33:41 +02:00
mlx5-fixes-2023-10-12
-----BEGIN PGP SIGNATURE----- iQEzBAABCAAdFiEEGhZs6bAKwk/OTgTpSD+KveBX+j4FAmUoNpsACgkQSD+KveBX +j4Dfgf/dz6LIjdqdjaMoa2sJVZVTAA+OthlzAvLIak2iXrYB8z1f5y83f20Jg12 Mlah4qvUkg0WyGcAYrbW7pQ0/Mec64KrQ8Zce3C0UoDFjAYEB19gCMC6adx18wqD /jRl9JdOgnojCF5WccUd7yjvhVT1hrCKisk0eI8UDEji9V3d8qqdcgLA9whCdsij sQfyWO2mV3EAy4QJxbscT5mkz+iOZfMf26drqFNsPIzIhQ9FB6zjZkN3ubDmxy5n NtSRZpIJiP2H+CxDRiK7c8ZBZQW3G6R8A9+u5QVr3yp7y+PJAvOHby+y00FeOQwS bFA7jnBc25DtxiCIM0E+2Z3/rBM3Uw== =fmVP -----END PGP SIGNATURE----- Merge tag 'mlx5-fixes-2023-10-12' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux Saeed Mahameed says: ==================== mlx5 fixes 2023-10-12 This series provides bug fixes to mlx5 driver. * tag 'mlx5-fixes-2023-10-12' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux: net/mlx5e: Fix VF representors reporting zero counters to "ip -s" command net/mlx5e: Don't offload internal port if filter device is out device net/mlx5e: Take RTNL lock before triggering netdev notifiers net/mlx5e: XDP, Fix XDP_REDIRECT mpwqe page fragment leaks on shutdown net/mlx5e: RX, Fix page_pool allocation failure recovery for legacy rq net/mlx5e: RX, Fix page_pool allocation failure recovery for striding rq net/mlx5: Handle fw tracer change ownership event based on MTRC net/mlx5: Bridge, fix peer entry ageing in LAG mode net/mlx5: E-switch, register event handler before arming the event net/mlx5: Perform DMA operations in the right locations ==================== Link: https://lore.kernel.org/r/20231012195127.129585-1-saeed@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
commit
2d1c882d44
|
|
@ -2186,52 +2186,23 @@ static u16 cmdif_rev(struct mlx5_core_dev *dev)
|
|||
|
||||
int mlx5_cmd_init(struct mlx5_core_dev *dev)
|
||||
{
|
||||
int size = sizeof(struct mlx5_cmd_prot_block);
|
||||
int align = roundup_pow_of_two(size);
|
||||
struct mlx5_cmd *cmd = &dev->cmd;
|
||||
u32 cmd_l;
|
||||
int err;
|
||||
|
||||
cmd->pool = dma_pool_create("mlx5_cmd", mlx5_core_dma_dev(dev), size, align, 0);
|
||||
if (!cmd->pool)
|
||||
return -ENOMEM;
|
||||
|
||||
err = alloc_cmd_page(dev, cmd);
|
||||
if (err)
|
||||
goto err_free_pool;
|
||||
|
||||
cmd_l = (u32)(cmd->dma);
|
||||
if (cmd_l & 0xfff) {
|
||||
mlx5_core_err(dev, "invalid command queue address\n");
|
||||
err = -ENOMEM;
|
||||
goto err_cmd_page;
|
||||
}
|
||||
cmd->checksum_disabled = 1;
|
||||
|
||||
spin_lock_init(&cmd->alloc_lock);
|
||||
spin_lock_init(&cmd->token_lock);
|
||||
|
||||
create_msg_cache(dev);
|
||||
|
||||
set_wqname(dev);
|
||||
cmd->wq = create_singlethread_workqueue(cmd->wq_name);
|
||||
if (!cmd->wq) {
|
||||
mlx5_core_err(dev, "failed to create command workqueue\n");
|
||||
err = -ENOMEM;
|
||||
goto err_cache;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
mlx5_cmdif_debugfs_init(dev);
|
||||
|
||||
return 0;
|
||||
|
||||
err_cache:
|
||||
destroy_msg_cache(dev);
|
||||
err_cmd_page:
|
||||
free_cmd_page(dev, cmd);
|
||||
err_free_pool:
|
||||
dma_pool_destroy(cmd->pool);
|
||||
return err;
|
||||
}
|
||||
|
||||
void mlx5_cmd_cleanup(struct mlx5_core_dev *dev)
|
||||
|
|
@ -2240,15 +2211,15 @@ void mlx5_cmd_cleanup(struct mlx5_core_dev *dev)
|
|||
|
||||
mlx5_cmdif_debugfs_cleanup(dev);
|
||||
destroy_workqueue(cmd->wq);
|
||||
destroy_msg_cache(dev);
|
||||
free_cmd_page(dev, cmd);
|
||||
dma_pool_destroy(cmd->pool);
|
||||
}
|
||||
|
||||
int mlx5_cmd_enable(struct mlx5_core_dev *dev)
|
||||
{
|
||||
int size = sizeof(struct mlx5_cmd_prot_block);
|
||||
int align = roundup_pow_of_two(size);
|
||||
struct mlx5_cmd *cmd = &dev->cmd;
|
||||
u32 cmd_h, cmd_l;
|
||||
int err;
|
||||
|
||||
memset(&cmd->vars, 0, sizeof(cmd->vars));
|
||||
cmd->vars.cmdif_rev = cmdif_rev(dev);
|
||||
|
|
@ -2281,10 +2252,21 @@ int mlx5_cmd_enable(struct mlx5_core_dev *dev)
|
|||
sema_init(&cmd->vars.pages_sem, 1);
|
||||
sema_init(&cmd->vars.throttle_sem, DIV_ROUND_UP(cmd->vars.max_reg_cmds, 2));
|
||||
|
||||
cmd->pool = dma_pool_create("mlx5_cmd", mlx5_core_dma_dev(dev), size, align, 0);
|
||||
if (!cmd->pool)
|
||||
return -ENOMEM;
|
||||
|
||||
err = alloc_cmd_page(dev, cmd);
|
||||
if (err)
|
||||
goto err_free_pool;
|
||||
|
||||
cmd_h = (u32)((u64)(cmd->dma) >> 32);
|
||||
cmd_l = (u32)(cmd->dma);
|
||||
if (WARN_ON(cmd_l & 0xfff))
|
||||
return -EINVAL;
|
||||
if (cmd_l & 0xfff) {
|
||||
mlx5_core_err(dev, "invalid command queue address\n");
|
||||
err = -ENOMEM;
|
||||
goto err_cmd_page;
|
||||
}
|
||||
|
||||
iowrite32be(cmd_h, &dev->iseg->cmdq_addr_h);
|
||||
iowrite32be(cmd_l, &dev->iseg->cmdq_addr_l_sz);
|
||||
|
|
@ -2297,17 +2279,27 @@ int mlx5_cmd_enable(struct mlx5_core_dev *dev)
|
|||
cmd->mode = CMD_MODE_POLLING;
|
||||
cmd->allowed_opcode = CMD_ALLOWED_OPCODE_ALL;
|
||||
|
||||
create_msg_cache(dev);
|
||||
create_debugfs_files(dev);
|
||||
|
||||
return 0;
|
||||
|
||||
err_cmd_page:
|
||||
free_cmd_page(dev, cmd);
|
||||
err_free_pool:
|
||||
dma_pool_destroy(cmd->pool);
|
||||
return err;
|
||||
}
|
||||
|
||||
void mlx5_cmd_disable(struct mlx5_core_dev *dev)
|
||||
{
|
||||
struct mlx5_cmd *cmd = &dev->cmd;
|
||||
|
||||
clean_debug_files(dev);
|
||||
flush_workqueue(cmd->wq);
|
||||
clean_debug_files(dev);
|
||||
destroy_msg_cache(dev);
|
||||
free_cmd_page(dev, cmd);
|
||||
dma_pool_destroy(cmd->pool);
|
||||
}
|
||||
|
||||
void mlx5_cmd_set_state(struct mlx5_core_dev *dev,
|
||||
|
|
|
|||
|
|
@ -848,7 +848,7 @@ static void mlx5_fw_tracer_ownership_change(struct work_struct *work)
|
|||
|
||||
mlx5_core_dbg(tracer->dev, "FWTracer: ownership changed, current=(%d)\n", tracer->owner);
|
||||
if (tracer->owner) {
|
||||
tracer->owner = false;
|
||||
mlx5_fw_tracer_ownership_acquire(tracer);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -467,6 +467,17 @@ static int mlx5_esw_bridge_switchdev_event(struct notifier_block *nb,
|
|||
/* only handle the event on peers */
|
||||
if (mlx5_esw_bridge_is_local(dev, rep, esw))
|
||||
break;
|
||||
|
||||
fdb_info = container_of(info,
|
||||
struct switchdev_notifier_fdb_info,
|
||||
info);
|
||||
/* Mark for deletion to prevent the update wq task from
|
||||
* spuriously refreshing the entry which would mark it again as
|
||||
* offloaded in SW bridge. After this fallthrough to regular
|
||||
* async delete code.
|
||||
*/
|
||||
mlx5_esw_bridge_fdb_mark_deleted(dev, vport_num, esw_owner_vhca_id, br_offloads,
|
||||
fdb_info);
|
||||
fallthrough;
|
||||
case SWITCHDEV_FDB_ADD_TO_DEVICE:
|
||||
case SWITCHDEV_FDB_DEL_TO_DEVICE:
|
||||
|
|
|
|||
|
|
@ -24,7 +24,8 @@ static int mlx5e_set_int_port_tunnel(struct mlx5e_priv *priv,
|
|||
|
||||
route_dev = dev_get_by_index(dev_net(e->out_dev), e->route_dev_ifindex);
|
||||
|
||||
if (!route_dev || !netif_is_ovs_master(route_dev))
|
||||
if (!route_dev || !netif_is_ovs_master(route_dev) ||
|
||||
attr->parse_attr->filter_dev == e->out_dev)
|
||||
goto out;
|
||||
|
||||
err = mlx5e_set_fwd_to_int_port_actions(priv, attr, e->route_dev_ifindex,
|
||||
|
|
|
|||
|
|
@ -874,11 +874,11 @@ int mlx5e_xdp_xmit(struct net_device *dev, int n, struct xdp_frame **frames,
|
|||
}
|
||||
|
||||
out:
|
||||
if (flags & XDP_XMIT_FLUSH) {
|
||||
if (sq->mpwqe.wqe)
|
||||
mlx5e_xdp_mpwqe_complete(sq);
|
||||
if (sq->mpwqe.wqe)
|
||||
mlx5e_xdp_mpwqe_complete(sq);
|
||||
|
||||
if (flags & XDP_XMIT_FLUSH)
|
||||
mlx5e_xmit_xdp_doorbell(sq);
|
||||
}
|
||||
|
||||
return nxmit;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -701,7 +701,7 @@ mlx5e_rep_get_stats(struct net_device *dev, struct rtnl_link_stats64 *stats)
|
|||
|
||||
/* update HW stats in background for next time */
|
||||
mlx5e_queue_update_stats(priv);
|
||||
memcpy(stats, &priv->stats.vf_vport, sizeof(*stats));
|
||||
mlx5e_stats_copy_rep_stats(stats, &priv->stats.rep_stats);
|
||||
}
|
||||
|
||||
static int mlx5e_rep_change_mtu(struct net_device *netdev, int new_mtu)
|
||||
|
|
@ -769,6 +769,7 @@ static int mlx5e_rep_max_nch_limit(struct mlx5_core_dev *mdev)
|
|||
|
||||
static void mlx5e_build_rep_params(struct net_device *netdev)
|
||||
{
|
||||
const bool take_rtnl = netdev->reg_state == NETREG_REGISTERED;
|
||||
struct mlx5e_priv *priv = netdev_priv(netdev);
|
||||
struct mlx5e_rep_priv *rpriv = priv->ppriv;
|
||||
struct mlx5_eswitch_rep *rep = rpriv->rep;
|
||||
|
|
@ -794,8 +795,15 @@ static void mlx5e_build_rep_params(struct net_device *netdev)
|
|||
/* RQ */
|
||||
mlx5e_build_rq_params(mdev, params);
|
||||
|
||||
/* If netdev is already registered (e.g. move from nic profile to uplink,
|
||||
* RTNL lock must be held before triggering netdev notifiers.
|
||||
*/
|
||||
if (take_rtnl)
|
||||
rtnl_lock();
|
||||
/* update XDP supported features */
|
||||
mlx5e_set_xdp_feature(netdev);
|
||||
if (take_rtnl)
|
||||
rtnl_unlock();
|
||||
|
||||
/* CQ moderation params */
|
||||
params->rx_dim_enabled = MLX5_CAP_GEN(mdev, cq_moderation);
|
||||
|
|
|
|||
|
|
@ -457,26 +457,41 @@ static int mlx5e_alloc_rx_wqes(struct mlx5e_rq *rq, u16 ix, int wqe_bulk)
|
|||
static int mlx5e_refill_rx_wqes(struct mlx5e_rq *rq, u16 ix, int wqe_bulk)
|
||||
{
|
||||
int remaining = wqe_bulk;
|
||||
int i = 0;
|
||||
int total_alloc = 0;
|
||||
int refill_alloc;
|
||||
int refill;
|
||||
|
||||
/* The WQE bulk is split into smaller bulks that are sized
|
||||
* according to the page pool cache refill size to avoid overflowing
|
||||
* the page pool cache due to too many page releases at once.
|
||||
*/
|
||||
do {
|
||||
int refill = min_t(u16, rq->wqe.info.refill_unit, remaining);
|
||||
int alloc_count;
|
||||
refill = min_t(u16, rq->wqe.info.refill_unit, remaining);
|
||||
|
||||
mlx5e_free_rx_wqes(rq, ix + i, refill);
|
||||
alloc_count = mlx5e_alloc_rx_wqes(rq, ix + i, refill);
|
||||
i += alloc_count;
|
||||
if (unlikely(alloc_count != refill))
|
||||
break;
|
||||
mlx5e_free_rx_wqes(rq, ix + total_alloc, refill);
|
||||
refill_alloc = mlx5e_alloc_rx_wqes(rq, ix + total_alloc, refill);
|
||||
if (unlikely(refill_alloc != refill))
|
||||
goto err_free;
|
||||
|
||||
total_alloc += refill_alloc;
|
||||
remaining -= refill;
|
||||
} while (remaining);
|
||||
|
||||
return i;
|
||||
return total_alloc;
|
||||
|
||||
err_free:
|
||||
mlx5e_free_rx_wqes(rq, ix, total_alloc + refill_alloc);
|
||||
|
||||
for (int i = 0; i < total_alloc + refill; i++) {
|
||||
int j = mlx5_wq_cyc_ctr2ix(&rq->wqe.wq, ix + i);
|
||||
struct mlx5e_wqe_frag_info *frag;
|
||||
|
||||
frag = get_frag(rq, j);
|
||||
for (int k = 0; k < rq->wqe.info.num_frags; k++, frag++)
|
||||
frag->flags |= BIT(MLX5E_WQE_FRAG_SKIP_RELEASE);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -816,6 +831,8 @@ static int mlx5e_alloc_rx_mpwqe(struct mlx5e_rq *rq, u16 ix)
|
|||
mlx5e_page_release_fragmented(rq, frag_page);
|
||||
}
|
||||
|
||||
bitmap_fill(wi->skip_release_bitmap, rq->mpwqe.pages_per_wqe);
|
||||
|
||||
err:
|
||||
rq->stats->buff_alloc_err++;
|
||||
|
||||
|
|
|
|||
|
|
@ -484,11 +484,20 @@ struct mlx5e_stats {
|
|||
struct mlx5e_vnic_env_stats vnic;
|
||||
struct mlx5e_vport_stats vport;
|
||||
struct mlx5e_pport_stats pport;
|
||||
struct rtnl_link_stats64 vf_vport;
|
||||
struct mlx5e_pcie_stats pcie;
|
||||
struct mlx5e_rep_stats rep_stats;
|
||||
};
|
||||
|
||||
static inline void mlx5e_stats_copy_rep_stats(struct rtnl_link_stats64 *vf_vport,
|
||||
struct mlx5e_rep_stats *rep_stats)
|
||||
{
|
||||
memset(vf_vport, 0, sizeof(*vf_vport));
|
||||
vf_vport->rx_packets = rep_stats->vport_rx_packets;
|
||||
vf_vport->tx_packets = rep_stats->vport_tx_packets;
|
||||
vf_vport->rx_bytes = rep_stats->vport_rx_bytes;
|
||||
vf_vport->tx_bytes = rep_stats->vport_tx_bytes;
|
||||
}
|
||||
|
||||
extern mlx5e_stats_grp_t mlx5e_nic_stats_grps[];
|
||||
unsigned int mlx5e_nic_stats_grps_num(struct mlx5e_priv *priv);
|
||||
|
||||
|
|
|
|||
|
|
@ -4972,7 +4972,8 @@ static int scan_tc_matchall_fdb_actions(struct mlx5e_priv *priv,
|
|||
if (err)
|
||||
return err;
|
||||
|
||||
rpriv->prev_vf_vport_stats = priv->stats.vf_vport;
|
||||
mlx5e_stats_copy_rep_stats(&rpriv->prev_vf_vport_stats,
|
||||
&priv->stats.rep_stats);
|
||||
break;
|
||||
default:
|
||||
NL_SET_ERR_MSG_MOD(extack, "mlx5 supports only police action for matchall");
|
||||
|
|
@ -5012,7 +5013,7 @@ void mlx5e_tc_stats_matchall(struct mlx5e_priv *priv,
|
|||
u64 dbytes;
|
||||
u64 dpkts;
|
||||
|
||||
cur_stats = priv->stats.vf_vport;
|
||||
mlx5e_stats_copy_rep_stats(&cur_stats, &priv->stats.rep_stats);
|
||||
dpkts = cur_stats.rx_packets - rpriv->prev_vf_vport_stats.rx_packets;
|
||||
dbytes = cur_stats.rx_bytes - rpriv->prev_vf_vport_stats.rx_bytes;
|
||||
rpriv->prev_vf_vport_stats = cur_stats;
|
||||
|
|
|
|||
|
|
@ -1748,6 +1748,28 @@ void mlx5_esw_bridge_fdb_update_used(struct net_device *dev, u16 vport_num, u16
|
|||
entry->lastuse = jiffies;
|
||||
}
|
||||
|
||||
void mlx5_esw_bridge_fdb_mark_deleted(struct net_device *dev, u16 vport_num, u16 esw_owner_vhca_id,
|
||||
struct mlx5_esw_bridge_offloads *br_offloads,
|
||||
struct switchdev_notifier_fdb_info *fdb_info)
|
||||
{
|
||||
struct mlx5_esw_bridge_fdb_entry *entry;
|
||||
struct mlx5_esw_bridge *bridge;
|
||||
|
||||
bridge = mlx5_esw_bridge_from_port_lookup(vport_num, esw_owner_vhca_id, br_offloads);
|
||||
if (!bridge)
|
||||
return;
|
||||
|
||||
entry = mlx5_esw_bridge_fdb_lookup(bridge, fdb_info->addr, fdb_info->vid);
|
||||
if (!entry) {
|
||||
esw_debug(br_offloads->esw->dev,
|
||||
"FDB mark deleted entry with specified key not found (MAC=%pM,vid=%u,vport=%u)\n",
|
||||
fdb_info->addr, fdb_info->vid, vport_num);
|
||||
return;
|
||||
}
|
||||
|
||||
entry->flags |= MLX5_ESW_BRIDGE_FLAG_DELETED;
|
||||
}
|
||||
|
||||
void mlx5_esw_bridge_fdb_create(struct net_device *dev, u16 vport_num, u16 esw_owner_vhca_id,
|
||||
struct mlx5_esw_bridge_offloads *br_offloads,
|
||||
struct switchdev_notifier_fdb_info *fdb_info)
|
||||
|
|
@ -1810,7 +1832,8 @@ void mlx5_esw_bridge_update(struct mlx5_esw_bridge_offloads *br_offloads)
|
|||
unsigned long lastuse =
|
||||
(unsigned long)mlx5_fc_query_lastuse(entry->ingress_counter);
|
||||
|
||||
if (entry->flags & MLX5_ESW_BRIDGE_FLAG_ADDED_BY_USER)
|
||||
if (entry->flags & (MLX5_ESW_BRIDGE_FLAG_ADDED_BY_USER |
|
||||
MLX5_ESW_BRIDGE_FLAG_DELETED))
|
||||
continue;
|
||||
|
||||
if (time_after(lastuse, entry->lastuse))
|
||||
|
|
|
|||
|
|
@ -62,6 +62,9 @@ int mlx5_esw_bridge_vport_peer_unlink(struct net_device *br_netdev, u16 vport_nu
|
|||
void mlx5_esw_bridge_fdb_update_used(struct net_device *dev, u16 vport_num, u16 esw_owner_vhca_id,
|
||||
struct mlx5_esw_bridge_offloads *br_offloads,
|
||||
struct switchdev_notifier_fdb_info *fdb_info);
|
||||
void mlx5_esw_bridge_fdb_mark_deleted(struct net_device *dev, u16 vport_num, u16 esw_owner_vhca_id,
|
||||
struct mlx5_esw_bridge_offloads *br_offloads,
|
||||
struct switchdev_notifier_fdb_info *fdb_info);
|
||||
void mlx5_esw_bridge_fdb_create(struct net_device *dev, u16 vport_num, u16 esw_owner_vhca_id,
|
||||
struct mlx5_esw_bridge_offloads *br_offloads,
|
||||
struct switchdev_notifier_fdb_info *fdb_info);
|
||||
|
|
|
|||
|
|
@ -133,6 +133,7 @@ struct mlx5_esw_bridge_mdb_key {
|
|||
enum {
|
||||
MLX5_ESW_BRIDGE_FLAG_ADDED_BY_USER = BIT(0),
|
||||
MLX5_ESW_BRIDGE_FLAG_PEER = BIT(1),
|
||||
MLX5_ESW_BRIDGE_FLAG_DELETED = BIT(2),
|
||||
};
|
||||
|
||||
enum {
|
||||
|
|
|
|||
|
|
@ -1038,11 +1038,8 @@ const u32 *mlx5_esw_query_functions(struct mlx5_core_dev *dev)
|
|||
return ERR_PTR(err);
|
||||
}
|
||||
|
||||
static void mlx5_eswitch_event_handlers_register(struct mlx5_eswitch *esw)
|
||||
static void mlx5_eswitch_event_handler_register(struct mlx5_eswitch *esw)
|
||||
{
|
||||
MLX5_NB_INIT(&esw->nb, eswitch_vport_event, NIC_VPORT_CHANGE);
|
||||
mlx5_eq_notifier_register(esw->dev, &esw->nb);
|
||||
|
||||
if (esw->mode == MLX5_ESWITCH_OFFLOADS && mlx5_eswitch_is_funcs_handler(esw->dev)) {
|
||||
MLX5_NB_INIT(&esw->esw_funcs.nb, mlx5_esw_funcs_changed_handler,
|
||||
ESW_FUNCTIONS_CHANGED);
|
||||
|
|
@ -1050,13 +1047,11 @@ static void mlx5_eswitch_event_handlers_register(struct mlx5_eswitch *esw)
|
|||
}
|
||||
}
|
||||
|
||||
static void mlx5_eswitch_event_handlers_unregister(struct mlx5_eswitch *esw)
|
||||
static void mlx5_eswitch_event_handler_unregister(struct mlx5_eswitch *esw)
|
||||
{
|
||||
if (esw->mode == MLX5_ESWITCH_OFFLOADS && mlx5_eswitch_is_funcs_handler(esw->dev))
|
||||
mlx5_eq_notifier_unregister(esw->dev, &esw->esw_funcs.nb);
|
||||
|
||||
mlx5_eq_notifier_unregister(esw->dev, &esw->nb);
|
||||
|
||||
flush_workqueue(esw->work_queue);
|
||||
}
|
||||
|
||||
|
|
@ -1483,6 +1478,9 @@ int mlx5_eswitch_enable_locked(struct mlx5_eswitch *esw, int num_vfs)
|
|||
|
||||
mlx5_eswitch_update_num_of_vfs(esw, num_vfs);
|
||||
|
||||
MLX5_NB_INIT(&esw->nb, eswitch_vport_event, NIC_VPORT_CHANGE);
|
||||
mlx5_eq_notifier_register(esw->dev, &esw->nb);
|
||||
|
||||
if (esw->mode == MLX5_ESWITCH_LEGACY) {
|
||||
err = esw_legacy_enable(esw);
|
||||
} else {
|
||||
|
|
@ -1495,7 +1493,7 @@ int mlx5_eswitch_enable_locked(struct mlx5_eswitch *esw, int num_vfs)
|
|||
|
||||
esw->fdb_table.flags |= MLX5_ESW_FDB_CREATED;
|
||||
|
||||
mlx5_eswitch_event_handlers_register(esw);
|
||||
mlx5_eswitch_event_handler_register(esw);
|
||||
|
||||
esw_info(esw->dev, "Enable: mode(%s), nvfs(%d), necvfs(%d), active vports(%d)\n",
|
||||
esw->mode == MLX5_ESWITCH_LEGACY ? "LEGACY" : "OFFLOADS",
|
||||
|
|
@ -1622,7 +1620,8 @@ void mlx5_eswitch_disable_locked(struct mlx5_eswitch *esw)
|
|||
*/
|
||||
mlx5_esw_mode_change_notify(esw, MLX5_ESWITCH_LEGACY);
|
||||
|
||||
mlx5_eswitch_event_handlers_unregister(esw);
|
||||
mlx5_eq_notifier_unregister(esw->dev, &esw->nb);
|
||||
mlx5_eswitch_event_handler_unregister(esw);
|
||||
|
||||
esw_info(esw->dev, "Disable: mode(%s), nvfs(%d), necvfs(%d), active vports(%d)\n",
|
||||
esw->mode == MLX5_ESWITCH_LEGACY ? "LEGACY" : "OFFLOADS",
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user