Commit 6a279f61 authored by David S. Miller's avatar David S. Miller

Merge tag 'mlx5-fixes-2021-08-09' of git://git.kernel.org/pub/scm/linux/kernel/git/saeed/linux

Saeed Mahameed says:

====================
mlx5 fixes 2021-08-09

This series introduces fixes to mlx5 driver.
Please pull and let me know if there is any problem.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents ea377dca bd37c288
...@@ -945,7 +945,6 @@ int mlx5_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, ...@@ -945,7 +945,6 @@ int mlx5_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
u32 *cqb = NULL; u32 *cqb = NULL;
void *cqc; void *cqc;
int cqe_size; int cqe_size;
unsigned int irqn;
int eqn; int eqn;
int err; int err;
...@@ -984,7 +983,7 @@ int mlx5_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, ...@@ -984,7 +983,7 @@ int mlx5_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
INIT_WORK(&cq->notify_work, notify_soft_wc_handler); INIT_WORK(&cq->notify_work, notify_soft_wc_handler);
} }
err = mlx5_vector2eqn(dev->mdev, vector, &eqn, &irqn); err = mlx5_vector2eqn(dev->mdev, vector, &eqn);
if (err) if (err)
goto err_cqb; goto err_cqb;
...@@ -1007,7 +1006,6 @@ int mlx5_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr, ...@@ -1007,7 +1006,6 @@ int mlx5_ib_create_cq(struct ib_cq *ibcq, const struct ib_cq_init_attr *attr,
goto err_cqb; goto err_cqb;
mlx5_ib_dbg(dev, "cqn 0x%x\n", cq->mcq.cqn); mlx5_ib_dbg(dev, "cqn 0x%x\n", cq->mcq.cqn);
cq->mcq.irqn = irqn;
if (udata) if (udata)
cq->mcq.tasklet_ctx.comp = mlx5_ib_cq_comp; cq->mcq.tasklet_ctx.comp = mlx5_ib_cq_comp;
else else
......
...@@ -975,7 +975,6 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_QUERY_EQN)( ...@@ -975,7 +975,6 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_QUERY_EQN)(
struct mlx5_ib_dev *dev; struct mlx5_ib_dev *dev;
int user_vector; int user_vector;
int dev_eqn; int dev_eqn;
unsigned int irqn;
int err; int err;
if (uverbs_copy_from(&user_vector, attrs, if (uverbs_copy_from(&user_vector, attrs,
...@@ -987,7 +986,7 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_QUERY_EQN)( ...@@ -987,7 +986,7 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_DEVX_QUERY_EQN)(
return PTR_ERR(c); return PTR_ERR(c);
dev = to_mdev(c->ibucontext.device); dev = to_mdev(c->ibucontext.device);
err = mlx5_vector2eqn(dev->mdev, user_vector, &dev_eqn, &irqn); err = mlx5_vector2eqn(dev->mdev, user_vector, &dev_eqn);
if (err < 0) if (err < 0)
return err; return err;
......
...@@ -134,6 +134,7 @@ int mlx5_core_create_cq(struct mlx5_core_dev *dev, struct mlx5_core_cq *cq, ...@@ -134,6 +134,7 @@ int mlx5_core_create_cq(struct mlx5_core_dev *dev, struct mlx5_core_cq *cq,
cq->cqn); cq->cqn);
cq->uar = dev->priv.uar; cq->uar = dev->priv.uar;
cq->irqn = eq->core.irqn;
return 0; return 0;
......
...@@ -1019,12 +1019,19 @@ int mlx5_fw_tracer_init(struct mlx5_fw_tracer *tracer) ...@@ -1019,12 +1019,19 @@ int mlx5_fw_tracer_init(struct mlx5_fw_tracer *tracer)
MLX5_NB_INIT(&tracer->nb, fw_tracer_event, DEVICE_TRACER); MLX5_NB_INIT(&tracer->nb, fw_tracer_event, DEVICE_TRACER);
mlx5_eq_notifier_register(dev, &tracer->nb); mlx5_eq_notifier_register(dev, &tracer->nb);
mlx5_fw_tracer_start(tracer); err = mlx5_fw_tracer_start(tracer);
if (err) {
mlx5_core_warn(dev, "FWTracer: Failed to start tracer %d\n", err);
goto err_notifier_unregister;
}
return 0; return 0;
err_notifier_unregister:
mlx5_eq_notifier_unregister(dev, &tracer->nb);
mlx5_core_destroy_mkey(dev, &tracer->buff.mkey);
err_dealloc_pd: err_dealloc_pd:
mlx5_core_dealloc_pd(dev, tracer->buff.pdn); mlx5_core_dealloc_pd(dev, tracer->buff.pdn);
cancel_work_sync(&tracer->read_fw_strings_work);
return err; return err;
} }
......
...@@ -124,6 +124,11 @@ static int mlx5e_route_lookup_ipv4_get(struct mlx5e_priv *priv, ...@@ -124,6 +124,11 @@ static int mlx5e_route_lookup_ipv4_get(struct mlx5e_priv *priv,
if (IS_ERR(rt)) if (IS_ERR(rt))
return PTR_ERR(rt); return PTR_ERR(rt);
if (rt->rt_type != RTN_UNICAST) {
ret = -ENETUNREACH;
goto err_rt_release;
}
if (mlx5_lag_is_multipath(mdev) && rt->rt_gw_family != AF_INET) { if (mlx5_lag_is_multipath(mdev) && rt->rt_gw_family != AF_INET) {
ret = -ENETUNREACH; ret = -ENETUNREACH;
goto err_rt_release; goto err_rt_release;
......
...@@ -1535,15 +1535,9 @@ static int mlx5e_alloc_cq_common(struct mlx5e_priv *priv, ...@@ -1535,15 +1535,9 @@ static int mlx5e_alloc_cq_common(struct mlx5e_priv *priv,
{ {
struct mlx5_core_dev *mdev = priv->mdev; struct mlx5_core_dev *mdev = priv->mdev;
struct mlx5_core_cq *mcq = &cq->mcq; struct mlx5_core_cq *mcq = &cq->mcq;
int eqn_not_used;
unsigned int irqn;
int err; int err;
u32 i; u32 i;
err = mlx5_vector2eqn(mdev, param->eq_ix, &eqn_not_used, &irqn);
if (err)
return err;
err = mlx5_cqwq_create(mdev, &param->wq, param->cqc, &cq->wq, err = mlx5_cqwq_create(mdev, &param->wq, param->cqc, &cq->wq,
&cq->wq_ctrl); &cq->wq_ctrl);
if (err) if (err)
...@@ -1557,7 +1551,6 @@ static int mlx5e_alloc_cq_common(struct mlx5e_priv *priv, ...@@ -1557,7 +1551,6 @@ static int mlx5e_alloc_cq_common(struct mlx5e_priv *priv,
mcq->vector = param->eq_ix; mcq->vector = param->eq_ix;
mcq->comp = mlx5e_completion_event; mcq->comp = mlx5e_completion_event;
mcq->event = mlx5e_cq_error_event; mcq->event = mlx5e_cq_error_event;
mcq->irqn = irqn;
for (i = 0; i < mlx5_cqwq_get_size(&cq->wq); i++) { for (i = 0; i < mlx5_cqwq_get_size(&cq->wq); i++) {
struct mlx5_cqe64 *cqe = mlx5_cqwq_get_wqe(&cq->wq, i); struct mlx5_cqe64 *cqe = mlx5_cqwq_get_wqe(&cq->wq, i);
...@@ -1605,11 +1598,10 @@ static int mlx5e_create_cq(struct mlx5e_cq *cq, struct mlx5e_cq_param *param) ...@@ -1605,11 +1598,10 @@ static int mlx5e_create_cq(struct mlx5e_cq *cq, struct mlx5e_cq_param *param)
void *in; void *in;
void *cqc; void *cqc;
int inlen; int inlen;
unsigned int irqn_not_used;
int eqn; int eqn;
int err; int err;
err = mlx5_vector2eqn(mdev, param->eq_ix, &eqn, &irqn_not_used); err = mlx5_vector2eqn(mdev, param->eq_ix, &eqn);
if (err) if (err)
return err; return err;
...@@ -1891,30 +1883,30 @@ static int mlx5e_open_queues(struct mlx5e_channel *c, ...@@ -1891,30 +1883,30 @@ static int mlx5e_open_queues(struct mlx5e_channel *c,
if (err) if (err)
goto err_close_icosq; goto err_close_icosq;
err = mlx5e_open_rxq_rq(c, params, &cparam->rq);
if (err)
goto err_close_sqs;
if (c->xdp) { if (c->xdp) {
err = mlx5e_open_xdpsq(c, params, &cparam->xdp_sq, NULL, err = mlx5e_open_xdpsq(c, params, &cparam->xdp_sq, NULL,
&c->rq_xdpsq, false); &c->rq_xdpsq, false);
if (err) if (err)
goto err_close_sqs; goto err_close_rq;
} }
err = mlx5e_open_rxq_rq(c, params, &cparam->rq);
if (err)
goto err_close_xdp_sq;
err = mlx5e_open_xdpsq(c, params, &cparam->xdp_sq, NULL, &c->xdpsq, true); err = mlx5e_open_xdpsq(c, params, &cparam->xdp_sq, NULL, &c->xdpsq, true);
if (err) if (err)
goto err_close_rq; goto err_close_xdp_sq;
return 0; return 0;
err_close_rq:
mlx5e_close_rq(&c->rq);
err_close_xdp_sq: err_close_xdp_sq:
if (c->xdp) if (c->xdp)
mlx5e_close_xdpsq(&c->rq_xdpsq); mlx5e_close_xdpsq(&c->rq_xdpsq);
err_close_rq:
mlx5e_close_rq(&c->rq);
err_close_sqs: err_close_sqs:
mlx5e_close_sqs(c); mlx5e_close_sqs(c);
...@@ -1949,9 +1941,9 @@ static int mlx5e_open_queues(struct mlx5e_channel *c, ...@@ -1949,9 +1941,9 @@ static int mlx5e_open_queues(struct mlx5e_channel *c,
static void mlx5e_close_queues(struct mlx5e_channel *c) static void mlx5e_close_queues(struct mlx5e_channel *c)
{ {
mlx5e_close_xdpsq(&c->xdpsq); mlx5e_close_xdpsq(&c->xdpsq);
mlx5e_close_rq(&c->rq);
if (c->xdp) if (c->xdp)
mlx5e_close_xdpsq(&c->rq_xdpsq); mlx5e_close_xdpsq(&c->rq_xdpsq);
mlx5e_close_rq(&c->rq);
mlx5e_close_sqs(c); mlx5e_close_sqs(c);
mlx5e_close_icosq(&c->icosq); mlx5e_close_icosq(&c->icosq);
mlx5e_close_icosq(&c->async_icosq); mlx5e_close_icosq(&c->async_icosq);
...@@ -1983,9 +1975,8 @@ static int mlx5e_open_channel(struct mlx5e_priv *priv, int ix, ...@@ -1983,9 +1975,8 @@ static int mlx5e_open_channel(struct mlx5e_priv *priv, int ix,
struct mlx5e_channel *c; struct mlx5e_channel *c;
unsigned int irq; unsigned int irq;
int err; int err;
int eqn;
err = mlx5_vector2eqn(priv->mdev, ix, &eqn, &irq); err = mlx5_vector2irqn(priv->mdev, ix, &irq);
if (err) if (err)
return err; return err;
......
...@@ -855,8 +855,8 @@ static int create_comp_eqs(struct mlx5_core_dev *dev) ...@@ -855,8 +855,8 @@ static int create_comp_eqs(struct mlx5_core_dev *dev)
return err; return err;
} }
int mlx5_vector2eqn(struct mlx5_core_dev *dev, int vector, int *eqn, static int vector2eqnirqn(struct mlx5_core_dev *dev, int vector, int *eqn,
unsigned int *irqn) unsigned int *irqn)
{ {
struct mlx5_eq_table *table = dev->priv.eq_table; struct mlx5_eq_table *table = dev->priv.eq_table;
struct mlx5_eq_comp *eq, *n; struct mlx5_eq_comp *eq, *n;
...@@ -865,8 +865,10 @@ int mlx5_vector2eqn(struct mlx5_core_dev *dev, int vector, int *eqn, ...@@ -865,8 +865,10 @@ int mlx5_vector2eqn(struct mlx5_core_dev *dev, int vector, int *eqn,
list_for_each_entry_safe(eq, n, &table->comp_eqs_list, list) { list_for_each_entry_safe(eq, n, &table->comp_eqs_list, list) {
if (i++ == vector) { if (i++ == vector) {
*eqn = eq->core.eqn; if (irqn)
*irqn = eq->core.irqn; *irqn = eq->core.irqn;
if (eqn)
*eqn = eq->core.eqn;
err = 0; err = 0;
break; break;
} }
...@@ -874,8 +876,18 @@ int mlx5_vector2eqn(struct mlx5_core_dev *dev, int vector, int *eqn, ...@@ -874,8 +876,18 @@ int mlx5_vector2eqn(struct mlx5_core_dev *dev, int vector, int *eqn,
return err; return err;
} }
int mlx5_vector2eqn(struct mlx5_core_dev *dev, int vector, int *eqn)
{
return vector2eqnirqn(dev, vector, eqn, NULL);
}
EXPORT_SYMBOL(mlx5_vector2eqn); EXPORT_SYMBOL(mlx5_vector2eqn);
int mlx5_vector2irqn(struct mlx5_core_dev *dev, int vector, unsigned int *irqn)
{
return vector2eqnirqn(dev, vector, NULL, irqn);
}
unsigned int mlx5_comp_vectors_count(struct mlx5_core_dev *dev) unsigned int mlx5_comp_vectors_count(struct mlx5_core_dev *dev)
{ {
return dev->priv.eq_table->num_comp_eqs; return dev->priv.eq_table->num_comp_eqs;
......
...@@ -579,7 +579,7 @@ static struct mlx5_esw_bridge *mlx5_esw_bridge_create(int ifindex, ...@@ -579,7 +579,7 @@ static struct mlx5_esw_bridge *mlx5_esw_bridge_create(int ifindex,
xa_init(&bridge->vports); xa_init(&bridge->vports);
bridge->ifindex = ifindex; bridge->ifindex = ifindex;
bridge->refcnt = 1; bridge->refcnt = 1;
bridge->ageing_time = BR_DEFAULT_AGEING_TIME; bridge->ageing_time = clock_t_to_jiffies(BR_DEFAULT_AGEING_TIME);
list_add(&bridge->list, &br_offloads->bridges); list_add(&bridge->list, &br_offloads->bridges);
return bridge; return bridge;
...@@ -1006,7 +1006,7 @@ int mlx5_esw_bridge_ageing_time_set(unsigned long ageing_time, struct mlx5_eswit ...@@ -1006,7 +1006,7 @@ int mlx5_esw_bridge_ageing_time_set(unsigned long ageing_time, struct mlx5_eswit
if (!vport->bridge) if (!vport->bridge)
return -EINVAL; return -EINVAL;
vport->bridge->ageing_time = ageing_time; vport->bridge->ageing_time = clock_t_to_jiffies(ageing_time);
return 0; return 0;
} }
......
...@@ -501,6 +501,7 @@ mlx5_esw_sample_offload(struct mlx5_esw_psample *esw_psample, ...@@ -501,6 +501,7 @@ mlx5_esw_sample_offload(struct mlx5_esw_psample *esw_psample,
err_offload_rule: err_offload_rule:
mlx5_esw_vporttbl_put(esw, &per_vport_tbl_attr); mlx5_esw_vporttbl_put(esw, &per_vport_tbl_attr);
err_default_tbl: err_default_tbl:
kfree(sample_flow);
return ERR_PTR(err); return ERR_PTR(err);
} }
......
...@@ -48,6 +48,7 @@ ...@@ -48,6 +48,7 @@
#include "lib/fs_chains.h" #include "lib/fs_chains.h"
#include "en_tc.h" #include "en_tc.h"
#include "en/mapping.h" #include "en/mapping.h"
#include "devlink.h"
#define mlx5_esw_for_each_rep(esw, i, rep) \ #define mlx5_esw_for_each_rep(esw, i, rep) \
xa_for_each(&((esw)->offloads.vport_reps), i, rep) xa_for_each(&((esw)->offloads.vport_reps), i, rep)
...@@ -3001,12 +3002,19 @@ int mlx5_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode, ...@@ -3001,12 +3002,19 @@ int mlx5_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode,
if (cur_mlx5_mode == mlx5_mode) if (cur_mlx5_mode == mlx5_mode)
goto unlock; goto unlock;
if (mode == DEVLINK_ESWITCH_MODE_SWITCHDEV) if (mode == DEVLINK_ESWITCH_MODE_SWITCHDEV) {
if (mlx5_devlink_trap_get_num_active(esw->dev)) {
NL_SET_ERR_MSG_MOD(extack,
"Can't change mode while devlink traps are active");
err = -EOPNOTSUPP;
goto unlock;
}
err = esw_offloads_start(esw, extack); err = esw_offloads_start(esw, extack);
else if (mode == DEVLINK_ESWITCH_MODE_LEGACY) } else if (mode == DEVLINK_ESWITCH_MODE_LEGACY) {
err = esw_offloads_stop(esw, extack); err = esw_offloads_stop(esw, extack);
else } else {
err = -EINVAL; err = -EINVAL;
}
unlock: unlock:
mlx5_esw_unlock(esw); mlx5_esw_unlock(esw);
......
...@@ -417,7 +417,6 @@ static int mlx5_fpga_conn_create_cq(struct mlx5_fpga_conn *conn, int cq_size) ...@@ -417,7 +417,6 @@ static int mlx5_fpga_conn_create_cq(struct mlx5_fpga_conn *conn, int cq_size)
struct mlx5_wq_param wqp; struct mlx5_wq_param wqp;
struct mlx5_cqe64 *cqe; struct mlx5_cqe64 *cqe;
int inlen, err, eqn; int inlen, err, eqn;
unsigned int irqn;
void *cqc, *in; void *cqc, *in;
__be64 *pas; __be64 *pas;
u32 i; u32 i;
...@@ -446,7 +445,7 @@ static int mlx5_fpga_conn_create_cq(struct mlx5_fpga_conn *conn, int cq_size) ...@@ -446,7 +445,7 @@ static int mlx5_fpga_conn_create_cq(struct mlx5_fpga_conn *conn, int cq_size)
goto err_cqwq; goto err_cqwq;
} }
err = mlx5_vector2eqn(mdev, smp_processor_id(), &eqn, &irqn); err = mlx5_vector2eqn(mdev, smp_processor_id(), &eqn);
if (err) { if (err) {
kvfree(in); kvfree(in);
goto err_cqwq; goto err_cqwq;
...@@ -476,7 +475,6 @@ static int mlx5_fpga_conn_create_cq(struct mlx5_fpga_conn *conn, int cq_size) ...@@ -476,7 +475,6 @@ static int mlx5_fpga_conn_create_cq(struct mlx5_fpga_conn *conn, int cq_size)
*conn->cq.mcq.arm_db = 0; *conn->cq.mcq.arm_db = 0;
conn->cq.mcq.vector = 0; conn->cq.mcq.vector = 0;
conn->cq.mcq.comp = mlx5_fpga_conn_cq_complete; conn->cq.mcq.comp = mlx5_fpga_conn_cq_complete;
conn->cq.mcq.irqn = irqn;
conn->cq.mcq.uar = fdev->conn_res.uar; conn->cq.mcq.uar = fdev->conn_res.uar;
tasklet_setup(&conn->cq.tasklet, mlx5_fpga_conn_cq_tasklet); tasklet_setup(&conn->cq.tasklet, mlx5_fpga_conn_cq_tasklet);
......
...@@ -104,4 +104,6 @@ void mlx5_core_eq_free_irqs(struct mlx5_core_dev *dev); ...@@ -104,4 +104,6 @@ void mlx5_core_eq_free_irqs(struct mlx5_core_dev *dev);
struct cpu_rmap *mlx5_eq_table_get_rmap(struct mlx5_core_dev *dev); struct cpu_rmap *mlx5_eq_table_get_rmap(struct mlx5_core_dev *dev);
#endif #endif
int mlx5_vector2irqn(struct mlx5_core_dev *dev, int vector, unsigned int *irqn);
#endif #endif
...@@ -1784,16 +1784,14 @@ static int __init init(void) ...@@ -1784,16 +1784,14 @@ static int __init init(void)
if (err) if (err)
goto err_sf; goto err_sf;
#ifdef CONFIG_MLX5_CORE_EN
err = mlx5e_init(); err = mlx5e_init();
if (err) { if (err)
pci_unregister_driver(&mlx5_core_driver); goto err_en;
goto err_debug;
}
#endif
return 0; return 0;
err_en:
mlx5_sf_driver_unregister();
err_sf: err_sf:
pci_unregister_driver(&mlx5_core_driver); pci_unregister_driver(&mlx5_core_driver);
err_debug: err_debug:
...@@ -1803,9 +1801,7 @@ static int __init init(void) ...@@ -1803,9 +1801,7 @@ static int __init init(void)
static void __exit cleanup(void) static void __exit cleanup(void)
{ {
#ifdef CONFIG_MLX5_CORE_EN
mlx5e_cleanup(); mlx5e_cleanup();
#endif
mlx5_sf_driver_unregister(); mlx5_sf_driver_unregister();
pci_unregister_driver(&mlx5_core_driver); pci_unregister_driver(&mlx5_core_driver);
mlx5_unregister_debugfs(); mlx5_unregister_debugfs();
......
...@@ -206,8 +206,13 @@ int mlx5_firmware_flash(struct mlx5_core_dev *dev, const struct firmware *fw, ...@@ -206,8 +206,13 @@ int mlx5_firmware_flash(struct mlx5_core_dev *dev, const struct firmware *fw,
int mlx5_fw_version_query(struct mlx5_core_dev *dev, int mlx5_fw_version_query(struct mlx5_core_dev *dev,
u32 *running_ver, u32 *stored_ver); u32 *running_ver, u32 *stored_ver);
#ifdef CONFIG_MLX5_CORE_EN
int mlx5e_init(void); int mlx5e_init(void);
void mlx5e_cleanup(void); void mlx5e_cleanup(void);
#else
static inline int mlx5e_init(void){ return 0; }
static inline void mlx5e_cleanup(void){}
#endif
static inline bool mlx5_sriov_is_enabled(struct mlx5_core_dev *dev) static inline bool mlx5_sriov_is_enabled(struct mlx5_core_dev *dev)
{ {
......
...@@ -214,6 +214,7 @@ static struct mlx5_irq *irq_request(struct mlx5_irq_pool *pool, int i) ...@@ -214,6 +214,7 @@ static struct mlx5_irq *irq_request(struct mlx5_irq_pool *pool, int i)
err = -ENOMEM; err = -ENOMEM;
goto err_cpumask; goto err_cpumask;
} }
irq->pool = pool;
kref_init(&irq->kref); kref_init(&irq->kref);
irq->index = i; irq->index = i;
err = xa_err(xa_store(&pool->irqs, irq->index, irq, GFP_KERNEL)); err = xa_err(xa_store(&pool->irqs, irq->index, irq, GFP_KERNEL));
...@@ -222,7 +223,6 @@ static struct mlx5_irq *irq_request(struct mlx5_irq_pool *pool, int i) ...@@ -222,7 +223,6 @@ static struct mlx5_irq *irq_request(struct mlx5_irq_pool *pool, int i)
irq->index, err); irq->index, err);
goto err_xa; goto err_xa;
} }
irq->pool = pool;
return irq; return irq;
err_xa: err_xa:
free_cpumask_var(irq->mask); free_cpumask_var(irq->mask);
...@@ -251,8 +251,11 @@ int mlx5_irq_attach_nb(struct mlx5_irq *irq, struct notifier_block *nb) ...@@ -251,8 +251,11 @@ int mlx5_irq_attach_nb(struct mlx5_irq *irq, struct notifier_block *nb)
int mlx5_irq_detach_nb(struct mlx5_irq *irq, struct notifier_block *nb) int mlx5_irq_detach_nb(struct mlx5_irq *irq, struct notifier_block *nb)
{ {
int err = 0;
err = atomic_notifier_chain_unregister(&irq->nh, nb);
irq_put(irq); irq_put(irq);
return atomic_notifier_chain_unregister(&irq->nh, nb); return err;
} }
struct cpumask *mlx5_irq_get_affinity_mask(struct mlx5_irq *irq) struct cpumask *mlx5_irq_get_affinity_mask(struct mlx5_irq *irq)
...@@ -437,6 +440,7 @@ irq_pool_alloc(struct mlx5_core_dev *dev, int start, int size, char *name, ...@@ -437,6 +440,7 @@ irq_pool_alloc(struct mlx5_core_dev *dev, int start, int size, char *name,
if (!pool) if (!pool)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
pool->dev = dev; pool->dev = dev;
mutex_init(&pool->lock);
xa_init_flags(&pool->irqs, XA_FLAGS_ALLOC); xa_init_flags(&pool->irqs, XA_FLAGS_ALLOC);
pool->xa_num_irqs.min = start; pool->xa_num_irqs.min = start;
pool->xa_num_irqs.max = start + size - 1; pool->xa_num_irqs.max = start + size - 1;
...@@ -445,7 +449,6 @@ irq_pool_alloc(struct mlx5_core_dev *dev, int start, int size, char *name, ...@@ -445,7 +449,6 @@ irq_pool_alloc(struct mlx5_core_dev *dev, int start, int size, char *name,
name); name);
pool->min_threshold = min_threshold * MLX5_EQ_REFS_PER_IRQ; pool->min_threshold = min_threshold * MLX5_EQ_REFS_PER_IRQ;
pool->max_threshold = max_threshold * MLX5_EQ_REFS_PER_IRQ; pool->max_threshold = max_threshold * MLX5_EQ_REFS_PER_IRQ;
mutex_init(&pool->lock);
mlx5_core_dbg(dev, "pool->name = %s, pool->size = %d, pool->start = %d", mlx5_core_dbg(dev, "pool->name = %s, pool->size = %d, pool->start = %d",
name, size, start); name, size, start);
return pool; return pool;
...@@ -459,6 +462,7 @@ static void irq_pool_free(struct mlx5_irq_pool *pool) ...@@ -459,6 +462,7 @@ static void irq_pool_free(struct mlx5_irq_pool *pool)
xa_for_each(&pool->irqs, index, irq) xa_for_each(&pool->irqs, index, irq)
irq_release(&irq->kref); irq_release(&irq->kref);
xa_destroy(&pool->irqs); xa_destroy(&pool->irqs);
mutex_destroy(&pool->lock);
kvfree(pool); kvfree(pool);
} }
......
...@@ -749,7 +749,6 @@ static struct mlx5dr_cq *dr_create_cq(struct mlx5_core_dev *mdev, ...@@ -749,7 +749,6 @@ static struct mlx5dr_cq *dr_create_cq(struct mlx5_core_dev *mdev,
struct mlx5_cqe64 *cqe; struct mlx5_cqe64 *cqe;
struct mlx5dr_cq *cq; struct mlx5dr_cq *cq;
int inlen, err, eqn; int inlen, err, eqn;
unsigned int irqn;
void *cqc, *in; void *cqc, *in;
__be64 *pas; __be64 *pas;
int vector; int vector;
...@@ -782,7 +781,7 @@ static struct mlx5dr_cq *dr_create_cq(struct mlx5_core_dev *mdev, ...@@ -782,7 +781,7 @@ static struct mlx5dr_cq *dr_create_cq(struct mlx5_core_dev *mdev,
goto err_cqwq; goto err_cqwq;
vector = raw_smp_processor_id() % mlx5_comp_vectors_count(mdev); vector = raw_smp_processor_id() % mlx5_comp_vectors_count(mdev);
err = mlx5_vector2eqn(mdev, vector, &eqn, &irqn); err = mlx5_vector2eqn(mdev, vector, &eqn);
if (err) { if (err) {
kvfree(in); kvfree(in);
goto err_cqwq; goto err_cqwq;
...@@ -818,7 +817,6 @@ static struct mlx5dr_cq *dr_create_cq(struct mlx5_core_dev *mdev, ...@@ -818,7 +817,6 @@ static struct mlx5dr_cq *dr_create_cq(struct mlx5_core_dev *mdev,
*cq->mcq.arm_db = cpu_to_be32(2 << 28); *cq->mcq.arm_db = cpu_to_be32(2 << 28);
cq->mcq.vector = 0; cq->mcq.vector = 0;
cq->mcq.irqn = irqn;
cq->mcq.uar = uar; cq->mcq.uar = uar;
return cq; return cq;
......
...@@ -352,6 +352,7 @@ static void dr_ste_v0_set_rx_decap(u8 *hw_ste_p) ...@@ -352,6 +352,7 @@ static void dr_ste_v0_set_rx_decap(u8 *hw_ste_p)
{ {
MLX5_SET(ste_rx_steering_mult, hw_ste_p, tunneling_action, MLX5_SET(ste_rx_steering_mult, hw_ste_p, tunneling_action,
DR_STE_TUNL_ACTION_DECAP); DR_STE_TUNL_ACTION_DECAP);
MLX5_SET(ste_rx_steering_mult, hw_ste_p, fail_on_error, 1);
} }
static void dr_ste_v0_set_rx_pop_vlan(u8 *hw_ste_p) static void dr_ste_v0_set_rx_pop_vlan(u8 *hw_ste_p)
...@@ -365,6 +366,7 @@ static void dr_ste_v0_set_rx_decap_l3(u8 *hw_ste_p, bool vlan) ...@@ -365,6 +366,7 @@ static void dr_ste_v0_set_rx_decap_l3(u8 *hw_ste_p, bool vlan)
MLX5_SET(ste_rx_steering_mult, hw_ste_p, tunneling_action, MLX5_SET(ste_rx_steering_mult, hw_ste_p, tunneling_action,
DR_STE_TUNL_ACTION_L3_DECAP); DR_STE_TUNL_ACTION_L3_DECAP);
MLX5_SET(ste_modify_packet, hw_ste_p, action_description, vlan ? 1 : 0); MLX5_SET(ste_modify_packet, hw_ste_p, action_description, vlan ? 1 : 0);
MLX5_SET(ste_rx_steering_mult, hw_ste_p, fail_on_error, 1);
} }
static void dr_ste_v0_set_rewrite_actions(u8 *hw_ste_p, u16 num_of_actions, static void dr_ste_v0_set_rewrite_actions(u8 *hw_ste_p, u16 num_of_actions,
......
...@@ -526,7 +526,6 @@ static int cq_create(struct mlx5_vdpa_net *ndev, u16 idx, u32 num_ent) ...@@ -526,7 +526,6 @@ static int cq_create(struct mlx5_vdpa_net *ndev, u16 idx, u32 num_ent)
void __iomem *uar_page = ndev->mvdev.res.uar->map; void __iomem *uar_page = ndev->mvdev.res.uar->map;
u32 out[MLX5_ST_SZ_DW(create_cq_out)]; u32 out[MLX5_ST_SZ_DW(create_cq_out)];
struct mlx5_vdpa_cq *vcq = &mvq->cq; struct mlx5_vdpa_cq *vcq = &mvq->cq;
unsigned int irqn;
__be64 *pas; __be64 *pas;
int inlen; int inlen;
void *cqc; void *cqc;
...@@ -566,7 +565,7 @@ static int cq_create(struct mlx5_vdpa_net *ndev, u16 idx, u32 num_ent) ...@@ -566,7 +565,7 @@ static int cq_create(struct mlx5_vdpa_net *ndev, u16 idx, u32 num_ent)
/* Use vector 0 by default. Consider adding code to choose least used /* Use vector 0 by default. Consider adding code to choose least used
* vector. * vector.
*/ */
err = mlx5_vector2eqn(mdev, 0, &eqn, &irqn); err = mlx5_vector2eqn(mdev, 0, &eqn);
if (err) if (err)
goto err_vec; goto err_vec;
......
...@@ -1044,8 +1044,7 @@ void mlx5_unregister_debugfs(void); ...@@ -1044,8 +1044,7 @@ void mlx5_unregister_debugfs(void);
void mlx5_fill_page_array(struct mlx5_frag_buf *buf, __be64 *pas); void mlx5_fill_page_array(struct mlx5_frag_buf *buf, __be64 *pas);
void mlx5_fill_page_frag_array_perm(struct mlx5_frag_buf *buf, __be64 *pas, u8 perm); void mlx5_fill_page_frag_array_perm(struct mlx5_frag_buf *buf, __be64 *pas, u8 perm);
void mlx5_fill_page_frag_array(struct mlx5_frag_buf *frag_buf, __be64 *pas); void mlx5_fill_page_frag_array(struct mlx5_frag_buf *frag_buf, __be64 *pas);
int mlx5_vector2eqn(struct mlx5_core_dev *dev, int vector, int *eqn, int mlx5_vector2eqn(struct mlx5_core_dev *dev, int vector, int *eqn);
unsigned int *irqn);
int mlx5_core_attach_mcg(struct mlx5_core_dev *dev, union ib_gid *mgid, u32 qpn); int mlx5_core_attach_mcg(struct mlx5_core_dev *dev, union ib_gid *mgid, u32 qpn);
int mlx5_core_detach_mcg(struct mlx5_core_dev *dev, union ib_gid *mgid, u32 qpn); int mlx5_core_detach_mcg(struct mlx5_core_dev *dev, union ib_gid *mgid, u32 qpn);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment