Import of kernel-5.14.0-687.29.1.el9_8
This commit is contained in:
parent
c5be03ff15
commit
30a2dd6bc3
@ -12,7 +12,7 @@ RHEL_MINOR = 8
|
||||
#
|
||||
# Use this spot to avoid future merge conflicts.
|
||||
# Do not trim this comment.
|
||||
RHEL_RELEASE = 687.5.1
|
||||
RHEL_RELEASE = 687.29.1
|
||||
|
||||
#
|
||||
# ZSTREAM
|
||||
|
||||
@ -1016,9 +1016,13 @@ EXPORT_SYMBOL_GPL(af_alg_sendpage);
|
||||
void af_alg_free_resources(struct af_alg_async_req *areq)
|
||||
{
|
||||
struct sock *sk = areq->sk;
|
||||
struct af_alg_ctx *ctx;
|
||||
|
||||
af_alg_free_areq_sgls(areq);
|
||||
sock_kfree_s(sk, areq, areq->areqlen);
|
||||
|
||||
ctx = alg_sk(sk)->private;
|
||||
ctx->inflight = false;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(af_alg_free_resources);
|
||||
|
||||
@ -1088,17 +1092,24 @@ EXPORT_SYMBOL_GPL(af_alg_poll);
|
||||
struct af_alg_async_req *af_alg_alloc_areq(struct sock *sk,
|
||||
unsigned int areqlen)
|
||||
{
|
||||
struct af_alg_async_req *areq = sock_kmalloc(sk, areqlen, GFP_KERNEL);
|
||||
struct af_alg_ctx *ctx = alg_sk(sk)->private;
|
||||
struct af_alg_async_req *areq;
|
||||
|
||||
/* Only one AIO request can be in flight. */
|
||||
if (ctx->inflight)
|
||||
return ERR_PTR(-EBUSY);
|
||||
|
||||
areq = sock_kmalloc(sk, areqlen, GFP_KERNEL);
|
||||
if (unlikely(!areq))
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
memset(areq, 0, areqlen);
|
||||
|
||||
ctx->inflight = true;
|
||||
|
||||
areq->areqlen = areqlen;
|
||||
areq->sk = sk;
|
||||
areq->last_rsgl = NULL;
|
||||
INIT_LIST_HEAD(&areq->rsgl_list);
|
||||
areq->tsgl = NULL;
|
||||
areq->tsgl_entries = 0;
|
||||
|
||||
return areq;
|
||||
}
|
||||
|
||||
@ -424,9 +424,8 @@ static int hash_accept_parent_nokey(void *private, struct sock *sk)
|
||||
if (!ctx)
|
||||
return -ENOMEM;
|
||||
|
||||
ctx->result = NULL;
|
||||
memset(ctx, 0, len);
|
||||
ctx->len = len;
|
||||
ctx->more = false;
|
||||
crypto_init_wait(&ctx->wait);
|
||||
|
||||
ask->private = ctx;
|
||||
|
||||
@ -250,9 +250,8 @@ static int rng_accept_parent(void *private, struct sock *sk)
|
||||
if (!ctx)
|
||||
return -ENOMEM;
|
||||
|
||||
memset(ctx, 0, len);
|
||||
ctx->len = len;
|
||||
ctx->addtl = NULL;
|
||||
ctx->addtl_len = 0;
|
||||
|
||||
/*
|
||||
* No seeding done at that point -- if multiple accepts are
|
||||
|
||||
@ -584,6 +584,9 @@ dpll_msg_add_pin_ref_sync(struct sk_buff *msg, struct dpll_pin *pin,
|
||||
if (!dpll_pin_available(ref_sync_pin))
|
||||
continue;
|
||||
ref_sync_pin_priv = dpll_pin_on_dpll_priv(dpll, ref_sync_pin);
|
||||
/* Pin may have been unregistered from this dpll already */
|
||||
if (!ref_sync_pin_priv)
|
||||
continue;
|
||||
if (WARN_ON(!ops->ref_sync_get))
|
||||
return -EOPNOTSUPP;
|
||||
ret = ops->ref_sync_get(pin, pin_priv, ref_sync_pin,
|
||||
|
||||
@ -965,40 +965,63 @@ err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* This ioctl is disabled for security reasons but also it failed
|
||||
* to follow process in terms of adding testing in igt and verifying
|
||||
* all the corner cases which made fixing security bugs in it even
|
||||
* harder than necessary.
|
||||
*
|
||||
* To re-enable this ioctl
|
||||
* 1. land working IGT tests in igt-gpu-tools that cover
|
||||
* all corner cases and race conditions.
|
||||
* 2. handle idr_preload
|
||||
* 3. handle == 0
|
||||
* 4. handle == new_handle semantics definition.
|
||||
*/
|
||||
int drm_gem_change_handle_ioctl(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv)
|
||||
{
|
||||
struct drm_gem_change_handle *args = data;
|
||||
struct drm_gem_object *obj;
|
||||
int ret;
|
||||
int new_handle, ret;
|
||||
|
||||
if (!drm_core_check_feature(dev, DRIVER_GEM))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
obj = drm_gem_object_lookup(file_priv, args->handle);
|
||||
if (!obj)
|
||||
return -ENOENT;
|
||||
/* idr_alloc() limitation. */
|
||||
if (args->new_handle > INT_MAX)
|
||||
return -EINVAL;
|
||||
new_handle = args->new_handle;
|
||||
|
||||
if (args->handle == args->new_handle) {
|
||||
ret = 0;
|
||||
goto out;
|
||||
}
|
||||
if (args->handle == new_handle)
|
||||
return 0;
|
||||
|
||||
mutex_lock(&file_priv->prime.lock);
|
||||
|
||||
spin_lock(&file_priv->table_lock);
|
||||
ret = idr_alloc(&file_priv->object_idr, obj,
|
||||
args->new_handle, args->new_handle + 1, GFP_NOWAIT);
|
||||
ret = idr_alloc(&file_priv->object_idr, NULL, new_handle, new_handle + 1,
|
||||
GFP_NOWAIT);
|
||||
|
||||
if (ret < 0) {
|
||||
spin_unlock(&file_priv->table_lock);
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
obj = idr_replace(&file_priv->object_idr, NULL, args->handle);
|
||||
if (IS_ERR_OR_NULL(obj)) {
|
||||
idr_remove(&file_priv->object_idr, new_handle);
|
||||
spin_unlock(&file_priv->table_lock);
|
||||
ret = -ENOENT;
|
||||
goto out_unlock;
|
||||
}
|
||||
spin_unlock(&file_priv->table_lock);
|
||||
|
||||
if (ret < 0)
|
||||
goto out_unlock;
|
||||
|
||||
if (obj->dma_buf) {
|
||||
ret = drm_prime_add_buf_handle(&file_priv->prime, obj->dma_buf, args->new_handle);
|
||||
ret = drm_prime_add_buf_handle(&file_priv->prime, obj->dma_buf,
|
||||
new_handle);
|
||||
if (ret < 0) {
|
||||
spin_lock(&file_priv->table_lock);
|
||||
idr_remove(&file_priv->object_idr, args->new_handle);
|
||||
idr_remove(&file_priv->object_idr, new_handle);
|
||||
idr_replace(&file_priv->object_idr, obj, args->handle);
|
||||
spin_unlock(&file_priv->table_lock);
|
||||
goto out_unlock;
|
||||
}
|
||||
@ -1010,12 +1033,12 @@ int drm_gem_change_handle_ioctl(struct drm_device *dev, void *data,
|
||||
|
||||
spin_lock(&file_priv->table_lock);
|
||||
idr_remove(&file_priv->object_idr, args->handle);
|
||||
obj = idr_replace(&file_priv->object_idr, obj, new_handle);
|
||||
spin_unlock(&file_priv->table_lock);
|
||||
WARN_ON(obj != NULL);
|
||||
|
||||
out_unlock:
|
||||
mutex_unlock(&file_priv->prime.lock);
|
||||
out:
|
||||
drm_gem_object_put(obj);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -653,7 +653,8 @@ static const struct drm_ioctl_desc drm_ioctls[] = {
|
||||
DRM_IOCTL_DEF(DRM_IOCTL_GEM_CLOSE, drm_gem_close_ioctl, DRM_RENDER_ALLOW),
|
||||
DRM_IOCTL_DEF(DRM_IOCTL_GEM_FLINK, drm_gem_flink_ioctl, DRM_AUTH),
|
||||
DRM_IOCTL_DEF(DRM_IOCTL_GEM_OPEN, drm_gem_open_ioctl, DRM_AUTH),
|
||||
DRM_IOCTL_DEF(DRM_IOCTL_GEM_CHANGE_HANDLE, drm_gem_change_handle_ioctl, DRM_RENDER_ALLOW),
|
||||
/* see drm_gem.c:drm_gem_change_handle_ioctl for why this is invalid */
|
||||
DRM_IOCTL_DEF(DRM_IOCTL_GEM_CHANGE_HANDLE, drm_invalid_op, DRM_RENDER_ALLOW),
|
||||
|
||||
DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETRESOURCES, drm_mode_getresources, 0),
|
||||
|
||||
|
||||
@ -557,12 +557,20 @@ static int mlx5_query_port_roce(struct ib_device *device, u32 port_num,
|
||||
* of an error it will still be zeroed out.
|
||||
* Use native port in case of reps
|
||||
*/
|
||||
if (dev->is_rep)
|
||||
err = mlx5_query_port_ptys(mdev, out, sizeof(out), MLX5_PTYS_EN,
|
||||
1, 0);
|
||||
else
|
||||
err = mlx5_query_port_ptys(mdev, out, sizeof(out), MLX5_PTYS_EN,
|
||||
mdev_port_num, 0);
|
||||
if (dev->is_rep) {
|
||||
struct mlx5_eswitch_rep *rep;
|
||||
|
||||
rep = dev->port[port_num - 1].rep;
|
||||
if (rep) {
|
||||
mdev = mlx5_eswitch_get_core_dev(rep->esw);
|
||||
WARN_ON(!mdev);
|
||||
}
|
||||
mdev_port_num = 1;
|
||||
}
|
||||
|
||||
err = mlx5_query_port_ptys(mdev, out, sizeof(out), MLX5_PTYS_EN,
|
||||
mdev_port_num, 0);
|
||||
|
||||
if (err)
|
||||
goto out;
|
||||
ext = !!MLX5_GET_ETH_PROTO(ptys_reg, out, true, eth_proto_capability);
|
||||
@ -2874,7 +2882,6 @@ static void mlx5_ib_handle_event(struct work_struct *_work)
|
||||
container_of(_work, struct mlx5_ib_event_work, work);
|
||||
struct mlx5_ib_dev *ibdev;
|
||||
struct ib_event ibev;
|
||||
bool fatal = false;
|
||||
|
||||
if (work->is_slave) {
|
||||
ibdev = mlx5_ib_get_ibdev_from_mpi(work->mpi);
|
||||
@ -2885,12 +2892,6 @@ static void mlx5_ib_handle_event(struct work_struct *_work)
|
||||
}
|
||||
|
||||
switch (work->event) {
|
||||
case MLX5_DEV_EVENT_SYS_ERROR:
|
||||
ibev.event = IB_EVENT_DEVICE_FATAL;
|
||||
mlx5_ib_handle_internal_error(ibdev);
|
||||
ibev.element.port_num = (u8)(unsigned long)work->param;
|
||||
fatal = true;
|
||||
break;
|
||||
case MLX5_EVENT_TYPE_PORT_CHANGE:
|
||||
if (handle_port_change(ibdev, work->param, &ibev))
|
||||
goto out;
|
||||
@ -2912,8 +2913,6 @@ static void mlx5_ib_handle_event(struct work_struct *_work)
|
||||
if (ibdev->ib_active)
|
||||
ib_dispatch_event(&ibev);
|
||||
|
||||
if (fatal)
|
||||
ibdev->ib_active = false;
|
||||
out:
|
||||
kfree(work);
|
||||
}
|
||||
@ -2957,6 +2956,66 @@ static int mlx5_ib_event_slave_port(struct notifier_block *nb,
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static void mlx5_ib_handle_sys_error_event(struct work_struct *_work)
|
||||
{
|
||||
struct mlx5_ib_event_work *work =
|
||||
container_of(_work, struct mlx5_ib_event_work, work);
|
||||
struct mlx5_ib_dev *ibdev = work->dev;
|
||||
struct ib_event ibev;
|
||||
|
||||
ibev.event = IB_EVENT_DEVICE_FATAL;
|
||||
mlx5_ib_handle_internal_error(ibdev);
|
||||
ibev.element.port_num = (u8)(unsigned long)work->param;
|
||||
ibev.device = &ibdev->ib_dev;
|
||||
|
||||
if (!rdma_is_port_valid(&ibdev->ib_dev, ibev.element.port_num)) {
|
||||
mlx5_ib_warn(ibdev, "warning: event on port %d\n", ibev.element.port_num);
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (ibdev->ib_active)
|
||||
ib_dispatch_event(&ibev);
|
||||
|
||||
ibdev->ib_active = false;
|
||||
out:
|
||||
kfree(work);
|
||||
}
|
||||
|
||||
static int mlx5_ib_sys_error_event(struct notifier_block *nb,
|
||||
unsigned long event, void *param)
|
||||
{
|
||||
struct mlx5_ib_event_work *work;
|
||||
|
||||
if (event != MLX5_DEV_EVENT_SYS_ERROR)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
work = kmalloc(sizeof(*work), GFP_ATOMIC);
|
||||
if (!work)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
INIT_WORK(&work->work, mlx5_ib_handle_sys_error_event);
|
||||
work->dev = container_of(nb, struct mlx5_ib_dev, sys_error_events);
|
||||
work->is_slave = false;
|
||||
work->param = param;
|
||||
work->event = event;
|
||||
|
||||
queue_work(mlx5_ib_event_wq, &work->work);
|
||||
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static int mlx5_ib_stage_sys_error_notifier_init(struct mlx5_ib_dev *dev)
|
||||
{
|
||||
dev->sys_error_events.notifier_call = mlx5_ib_sys_error_event;
|
||||
mlx5_notifier_register(dev->mdev, &dev->sys_error_events);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void mlx5_ib_stage_sys_error_notifier_cleanup(struct mlx5_ib_dev *dev)
|
||||
{
|
||||
mlx5_notifier_unregister(dev->mdev, &dev->sys_error_events);
|
||||
}
|
||||
|
||||
static int mlx5_ib_get_plane_num(struct mlx5_core_dev *mdev, u8 *num_plane)
|
||||
{
|
||||
struct mlx5_hca_vport_context vport_ctx;
|
||||
@ -3040,7 +3099,7 @@ int mlx5_ib_dev_res_cq_init(struct mlx5_ib_dev *dev)
|
||||
* devr->c0 is set once, never changed until device unload.
|
||||
* Avoid taking the mutex if initialization is already done.
|
||||
*/
|
||||
if (devr->c0)
|
||||
if (smp_load_acquire(&devr->c0))
|
||||
return 0;
|
||||
|
||||
mutex_lock(&devr->cq_lock);
|
||||
@ -3066,7 +3125,7 @@ int mlx5_ib_dev_res_cq_init(struct mlx5_ib_dev *dev)
|
||||
}
|
||||
|
||||
devr->p0 = pd;
|
||||
devr->c0 = cq;
|
||||
smp_store_release(&devr->c0, cq);
|
||||
|
||||
unlock:
|
||||
mutex_unlock(&devr->cq_lock);
|
||||
@ -3084,7 +3143,7 @@ int mlx5_ib_dev_res_srq_init(struct mlx5_ib_dev *dev)
|
||||
* devr->s1 is set once, never changed until device unload.
|
||||
* Avoid taking the mutex if initialization is already done.
|
||||
*/
|
||||
if (devr->s1)
|
||||
if (smp_load_acquire(&devr->s1))
|
||||
return 0;
|
||||
|
||||
mutex_lock(&devr->srq_lock);
|
||||
@ -3126,7 +3185,7 @@ int mlx5_ib_dev_res_srq_init(struct mlx5_ib_dev *dev)
|
||||
}
|
||||
|
||||
devr->s0 = s0;
|
||||
devr->s1 = s1;
|
||||
smp_store_release(&devr->s1, s1);
|
||||
|
||||
unlock:
|
||||
mutex_unlock(&devr->srq_lock);
|
||||
@ -4463,12 +4522,16 @@ static int mlx5_ib_stage_caps_init(struct mlx5_ib_dev *dev)
|
||||
MLX5_HCA_CAP_2_GENERAL_OBJECT_TYPES_RDMA_CTRL) {
|
||||
err = mlx5_ib_init_ucaps(dev);
|
||||
if (err)
|
||||
return err;
|
||||
goto err_ucaps;
|
||||
}
|
||||
|
||||
dev->ib_dev.use_cq_dim = true;
|
||||
|
||||
return 0;
|
||||
|
||||
err_ucaps:
|
||||
bitmap_free(dev->var_table.bitmap);
|
||||
return err;
|
||||
}
|
||||
|
||||
static const struct ib_device_ops mlx5_ib_dev_port_ops = {
|
||||
@ -4803,6 +4866,9 @@ static const struct mlx5_ib_profile pf_profile = {
|
||||
STAGE_CREATE(MLX5_IB_STAGE_WHITELIST_UID,
|
||||
mlx5_ib_devx_init,
|
||||
mlx5_ib_devx_cleanup),
|
||||
STAGE_CREATE(MLX5_IB_STAGE_SYS_ERROR_NOTIFIER,
|
||||
mlx5_ib_stage_sys_error_notifier_init,
|
||||
mlx5_ib_stage_sys_error_notifier_cleanup),
|
||||
STAGE_CREATE(MLX5_IB_STAGE_IB_REG,
|
||||
mlx5_ib_stage_ib_reg_init,
|
||||
mlx5_ib_stage_ib_reg_cleanup),
|
||||
@ -4860,6 +4926,9 @@ const struct mlx5_ib_profile raw_eth_profile = {
|
||||
STAGE_CREATE(MLX5_IB_STAGE_WHITELIST_UID,
|
||||
mlx5_ib_devx_init,
|
||||
mlx5_ib_devx_cleanup),
|
||||
STAGE_CREATE(MLX5_IB_STAGE_SYS_ERROR_NOTIFIER,
|
||||
mlx5_ib_stage_sys_error_notifier_init,
|
||||
mlx5_ib_stage_sys_error_notifier_cleanup),
|
||||
STAGE_CREATE(MLX5_IB_STAGE_IB_REG,
|
||||
mlx5_ib_stage_ib_reg_init,
|
||||
mlx5_ib_stage_ib_reg_cleanup),
|
||||
|
||||
@ -1003,6 +1003,7 @@ enum mlx5_ib_stages {
|
||||
MLX5_IB_STAGE_BFREG,
|
||||
MLX5_IB_STAGE_PRE_IB_REG_UMR,
|
||||
MLX5_IB_STAGE_WHITELIST_UID,
|
||||
MLX5_IB_STAGE_SYS_ERROR_NOTIFIER,
|
||||
MLX5_IB_STAGE_IB_REG,
|
||||
MLX5_IB_STAGE_DEVICE_NOTIFIER,
|
||||
MLX5_IB_STAGE_POST_IB_REG_UMR,
|
||||
@ -1161,6 +1162,7 @@ struct mlx5_ib_dev {
|
||||
/* protect accessing data_direct_dev */
|
||||
struct mutex data_direct_lock;
|
||||
struct notifier_block mdev_events;
|
||||
struct notifier_block sys_error_events;
|
||||
struct notifier_block lag_events;
|
||||
int num_ports;
|
||||
/* serialize update of capability mask
|
||||
|
||||
@ -1604,6 +1604,11 @@ static int create_raw_packet_qp(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
|
||||
}
|
||||
|
||||
if (qp->rq.wqe_cnt) {
|
||||
if (!rq->base.ubuffer.umem) {
|
||||
err = -EINVAL;
|
||||
goto err_destroy_sq;
|
||||
}
|
||||
|
||||
rq->base.container_mibqp = qp;
|
||||
|
||||
if (qp->flags & IB_QP_CREATE_CVLAN_STRIPPING)
|
||||
|
||||
@ -314,7 +314,14 @@ destroy:
|
||||
xa_cmpxchg_irq(&table->dct_xa, dct->mqp.qpn, XA_ZERO_ENTRY, dct, 0);
|
||||
return err;
|
||||
}
|
||||
xa_erase_irq(&table->dct_xa, dct->mqp.qpn);
|
||||
|
||||
/*
|
||||
* A race can occur where a concurrent create gets the same dctn
|
||||
* (after hardware released it) and overwrites XA_ZERO_ENTRY with
|
||||
* its new DCT before we reach here. In that case, we must not erase
|
||||
* the entry as it now belongs to the new DCT.
|
||||
*/
|
||||
xa_cmpxchg_irq(&table->dct_xa, dct->mqp.qpn, XA_ZERO_ENTRY, NULL, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@ -683,7 +683,14 @@ int mlx5_cmd_destroy_srq(struct mlx5_ib_dev *dev, struct mlx5_core_srq *srq)
|
||||
xa_cmpxchg_irq(&table->array, srq->srqn, XA_ZERO_ENTRY, srq, 0);
|
||||
return err;
|
||||
}
|
||||
xa_erase_irq(&table->array, srq->srqn);
|
||||
|
||||
/*
|
||||
* A race can occur where a concurrent create gets the same srqn
|
||||
* (after hardware released it) and overwrites XA_ZERO_ENTRY with
|
||||
* its new SRQ before we reach here. In that case, we must not erase
|
||||
* the entry as it now belongs to the new SRQ.
|
||||
*/
|
||||
xa_cmpxchg_irq(&table->array, srq->srqn, XA_ZERO_ENTRY, NULL, 0);
|
||||
|
||||
mlx5_core_res_put(&srq->common);
|
||||
wait_for_completion(&srq->common.free);
|
||||
|
||||
@ -195,7 +195,7 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_GET_DATA_DIRECT_SYSFS_PATH)(
|
||||
int out_len = uverbs_attr_get_len(attrs,
|
||||
MLX5_IB_ATTR_GET_DATA_DIRECT_SYSFS_PATH);
|
||||
u32 dev_path_len;
|
||||
char *dev_path;
|
||||
char *dev_path = NULL;
|
||||
int ret;
|
||||
|
||||
c = to_mucontext(ib_uverbs_get_ucontext(attrs));
|
||||
@ -223,9 +223,9 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_GET_DATA_DIRECT_SYSFS_PATH)(
|
||||
|
||||
ret = uverbs_copy_to(attrs, MLX5_IB_ATTR_GET_DATA_DIRECT_SYSFS_PATH, dev_path,
|
||||
dev_path_len);
|
||||
kfree(dev_path);
|
||||
|
||||
end:
|
||||
kfree(dev_path);
|
||||
mutex_unlock(&dev->data_direct_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -146,7 +146,7 @@ int mlx5r_umr_resource_init(struct mlx5_ib_dev *dev)
|
||||
* UMR qp is set once, never changed until device unload.
|
||||
* Avoid taking the mutex if initialization is already done.
|
||||
*/
|
||||
if (dev->umrc.qp)
|
||||
if (smp_load_acquire(&dev->umrc.qp))
|
||||
return 0;
|
||||
|
||||
mutex_lock(&dev->umrc.init_lock);
|
||||
@ -184,7 +184,7 @@ int mlx5r_umr_resource_init(struct mlx5_ib_dev *dev)
|
||||
sema_init(&dev->umrc.sem, MAX_UMR_WR);
|
||||
mutex_init(&dev->umrc.lock);
|
||||
dev->umrc.state = MLX5_UMR_STATE_ACTIVE;
|
||||
dev->umrc.qp = qp;
|
||||
smp_store_release(&dev->umrc.qp, qp);
|
||||
|
||||
mutex_unlock(&dev->umrc.init_lock);
|
||||
return 0;
|
||||
|
||||
@ -107,9 +107,7 @@ mlx5_devlink_info_get(struct devlink *devlink, struct devlink_info_req *req,
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
err = mlx5_fw_version_query(dev, &running_fw, &stored_fw);
|
||||
if (err)
|
||||
return err;
|
||||
mlx5_fw_version_query(dev, &running_fw, &stored_fw);
|
||||
|
||||
snprintf(version_str, sizeof(version_str), "%d.%d.%04d",
|
||||
mlx5_fw_ver_major(running_fw), mlx5_fw_ver_minor(running_fw),
|
||||
|
||||
@ -44,7 +44,6 @@ static void mlx5e_reset_txqsq_cc_pc(struct mlx5e_txqsq *sq)
|
||||
"SQ 0x%x: cc (0x%x) != pc (0x%x)\n",
|
||||
sq->sqn, sq->cc, sq->pc);
|
||||
sq->cc = 0;
|
||||
sq->dma_fifo_cc = 0;
|
||||
sq->pc = 0;
|
||||
}
|
||||
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
|
||||
// Copyright (c) 2021, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
|
||||
#include <linux/iopoll.h>
|
||||
#include <linux/math64.h>
|
||||
#include "lib/aso.h"
|
||||
#include "en/tc/post_act.h"
|
||||
@ -115,7 +116,6 @@ mlx5e_tc_meter_modify(struct mlx5_core_dev *mdev,
|
||||
struct mlx5e_flow_meters *flow_meters;
|
||||
u8 cir_man, cir_exp, cbs_man, cbs_exp;
|
||||
struct mlx5_aso_wqe *aso_wqe;
|
||||
unsigned long expires;
|
||||
struct mlx5_aso *aso;
|
||||
u64 rate, burst;
|
||||
u8 ds_cnt;
|
||||
@ -187,12 +187,8 @@ mlx5e_tc_meter_modify(struct mlx5_core_dev *mdev,
|
||||
mlx5_aso_post_wqe(aso, true, &aso_wqe->ctrl);
|
||||
|
||||
/* With newer FW, the wait for the first ASO WQE is more than 2us, put the wait 10ms. */
|
||||
expires = jiffies + msecs_to_jiffies(10);
|
||||
do {
|
||||
err = mlx5_aso_poll_cq(aso, true);
|
||||
if (err)
|
||||
usleep_range(2, 10);
|
||||
} while (err && time_is_after_jiffies(expires));
|
||||
read_poll_timeout(mlx5_aso_poll_cq, err, !err, 10, 10 * USEC_PER_MSEC,
|
||||
false, aso, true);
|
||||
mutex_unlock(&flow_meters->aso_lock);
|
||||
|
||||
return err;
|
||||
|
||||
@ -259,7 +259,6 @@ static void mlx5e_ipsec_init_limits(struct mlx5e_ipsec_sa_entry *sa_entry,
|
||||
static void mlx5e_ipsec_init_macs(struct mlx5e_ipsec_sa_entry *sa_entry,
|
||||
struct mlx5_accel_esp_xfrm_attrs *attrs)
|
||||
{
|
||||
struct mlx5_core_dev *mdev = mlx5e_ipsec_sa2dev(sa_entry);
|
||||
struct mlx5e_ipsec_addr *addrs = &attrs->addrs;
|
||||
struct net_device *netdev = sa_entry->dev;
|
||||
struct xfrm_state *x = sa_entry->x;
|
||||
@ -276,7 +275,7 @@ static void mlx5e_ipsec_init_macs(struct mlx5e_ipsec_sa_entry *sa_entry,
|
||||
attrs->type != XFRM_DEV_OFFLOAD_PACKET)
|
||||
return;
|
||||
|
||||
mlx5_query_mac_address(mdev, addr);
|
||||
ether_addr_copy(addr, netdev->dev_addr);
|
||||
switch (attrs->dir) {
|
||||
case XFRM_DEV_OFFLOAD_IN:
|
||||
src = attrs->dmac;
|
||||
@ -795,8 +794,10 @@ static int mlx5e_xfrm_add_state(struct net_device *dev,
|
||||
sa_entry->dev = dev;
|
||||
sa_entry->ipsec = ipsec;
|
||||
/* Check if this SA is originated from acquire flow temporary SA */
|
||||
if (x->xso.flags & XFRM_DEV_OFFLOAD_FLAG_ACQ)
|
||||
goto out;
|
||||
if (x->xso.flags & XFRM_DEV_OFFLOAD_FLAG_ACQ) {
|
||||
x->xso.offload_handle = (unsigned long)sa_entry;
|
||||
return 0;
|
||||
}
|
||||
|
||||
err = mlx5e_xfrm_validate_state(priv->mdev, x, extack);
|
||||
if (err)
|
||||
@ -873,7 +874,6 @@ static int mlx5e_xfrm_add_state(struct net_device *dev,
|
||||
xa_unlock_bh(&ipsec->sadb);
|
||||
}
|
||||
|
||||
out:
|
||||
x->xso.offload_handle = (unsigned long)sa_entry;
|
||||
if (allow_tunnel_mode)
|
||||
mlx5_eswitch_unblock_encap(priv->mdev);
|
||||
|
||||
@ -287,6 +287,7 @@ struct mlx5e_ipsec_sa_entry {
|
||||
struct mlx5e_ipsec_dwork *dwork;
|
||||
struct mlx5e_ipsec_limits limits;
|
||||
u32 rx_mapped_id;
|
||||
u8 ctx[MLX5_ST_SZ_BYTES(ipsec_aso)];
|
||||
};
|
||||
|
||||
struct mlx5_accel_pol_xfrm_attrs {
|
||||
|
||||
@ -1,6 +1,8 @@
|
||||
// SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB
|
||||
/* Copyright (c) 2017, Mellanox Technologies inc. All rights reserved. */
|
||||
|
||||
#include <linux/iopoll.h>
|
||||
|
||||
#include "mlx5_core.h"
|
||||
#include "en.h"
|
||||
#include "ipsec.h"
|
||||
@ -310,10 +312,11 @@ static void mlx5e_ipsec_aso_update(struct mlx5e_ipsec_sa_entry *sa_entry,
|
||||
mlx5e_ipsec_aso_query(sa_entry, data);
|
||||
}
|
||||
|
||||
static void mlx5e_ipsec_update_esn_state(struct mlx5e_ipsec_sa_entry *sa_entry,
|
||||
u32 mode_param)
|
||||
static void
|
||||
mlx5e_ipsec_update_esn_state(struct mlx5e_ipsec_sa_entry *sa_entry,
|
||||
u32 mode_param,
|
||||
struct mlx5_accel_esp_xfrm_attrs *attrs)
|
||||
{
|
||||
struct mlx5_accel_esp_xfrm_attrs attrs = {};
|
||||
struct mlx5_wqe_aso_ctrl_seg data = {};
|
||||
|
||||
if (mode_param < MLX5E_IPSEC_ESN_SCOPE_MID) {
|
||||
@ -323,18 +326,7 @@ static void mlx5e_ipsec_update_esn_state(struct mlx5e_ipsec_sa_entry *sa_entry,
|
||||
sa_entry->esn_state.overlap = 1;
|
||||
}
|
||||
|
||||
mlx5e_ipsec_build_accel_xfrm_attrs(sa_entry, &attrs);
|
||||
|
||||
/* It is safe to execute the modify below unlocked since the only flows
|
||||
* that could affect this HW object, are create, destroy and this work.
|
||||
*
|
||||
* Creation flow can't co-exist with this modify work, the destruction
|
||||
* flow would cancel this work, and this work is a single entity that
|
||||
* can't conflict with it self.
|
||||
*/
|
||||
spin_unlock_bh(&sa_entry->x->lock);
|
||||
mlx5_accel_esp_modify_xfrm(sa_entry, &attrs);
|
||||
spin_lock_bh(&sa_entry->x->lock);
|
||||
mlx5e_ipsec_build_accel_xfrm_attrs(sa_entry, attrs);
|
||||
|
||||
data.data_offset_condition_operand =
|
||||
MLX5_IPSEC_ASO_REMOVE_FLOW_PKT_CNT_OFFSET;
|
||||
@ -370,20 +362,18 @@ static void mlx5e_ipsec_aso_update_soft(struct mlx5e_ipsec_sa_entry *sa_entry,
|
||||
static void mlx5e_ipsec_handle_limits(struct mlx5e_ipsec_sa_entry *sa_entry)
|
||||
{
|
||||
struct mlx5_accel_esp_xfrm_attrs *attrs = &sa_entry->attrs;
|
||||
struct mlx5e_ipsec *ipsec = sa_entry->ipsec;
|
||||
struct mlx5e_ipsec_aso *aso = ipsec->aso;
|
||||
bool soft_arm, hard_arm;
|
||||
u64 hard_cnt;
|
||||
|
||||
lockdep_assert_held(&sa_entry->x->lock);
|
||||
|
||||
soft_arm = !MLX5_GET(ipsec_aso, aso->ctx, soft_lft_arm);
|
||||
hard_arm = !MLX5_GET(ipsec_aso, aso->ctx, hard_lft_arm);
|
||||
soft_arm = !MLX5_GET(ipsec_aso, sa_entry->ctx, soft_lft_arm);
|
||||
hard_arm = !MLX5_GET(ipsec_aso, sa_entry->ctx, hard_lft_arm);
|
||||
if (!soft_arm && !hard_arm)
|
||||
/* It is not lifetime event */
|
||||
return;
|
||||
|
||||
hard_cnt = MLX5_GET(ipsec_aso, aso->ctx, remove_flow_pkt_cnt);
|
||||
hard_cnt = MLX5_GET(ipsec_aso, sa_entry->ctx, remove_flow_pkt_cnt);
|
||||
if (!hard_cnt || hard_arm) {
|
||||
/* It is possible to see packet counter equal to zero without
|
||||
* hard limit event armed. Such situation can be if packet
|
||||
@ -453,11 +443,11 @@ static void mlx5e_ipsec_handle_event(struct work_struct *_work)
|
||||
struct mlx5e_ipsec_work *work =
|
||||
container_of(_work, struct mlx5e_ipsec_work, work);
|
||||
struct mlx5e_ipsec_sa_entry *sa_entry = work->data;
|
||||
struct mlx5_accel_esp_xfrm_attrs tmp = {};
|
||||
struct mlx5_accel_esp_xfrm_attrs *attrs;
|
||||
struct mlx5e_ipsec_aso *aso;
|
||||
bool need_modify = false;
|
||||
int ret;
|
||||
|
||||
aso = sa_entry->ipsec->aso;
|
||||
attrs = &sa_entry->attrs;
|
||||
|
||||
spin_lock_bh(&sa_entry->x->lock);
|
||||
@ -465,18 +455,22 @@ static void mlx5e_ipsec_handle_event(struct work_struct *_work)
|
||||
if (ret)
|
||||
goto unlock;
|
||||
|
||||
if (attrs->replay_esn.trigger &&
|
||||
!MLX5_GET(ipsec_aso, aso->ctx, esn_event_arm)) {
|
||||
u32 mode_param = MLX5_GET(ipsec_aso, aso->ctx, mode_parameter);
|
||||
|
||||
mlx5e_ipsec_update_esn_state(sa_entry, mode_param);
|
||||
}
|
||||
|
||||
if (attrs->lft.soft_packet_limit != XFRM_INF)
|
||||
mlx5e_ipsec_handle_limits(sa_entry);
|
||||
|
||||
if (attrs->replay_esn.trigger &&
|
||||
!MLX5_GET(ipsec_aso, sa_entry->ctx, esn_event_arm)) {
|
||||
u32 mode_param = MLX5_GET(ipsec_aso, sa_entry->ctx,
|
||||
mode_parameter);
|
||||
|
||||
mlx5e_ipsec_update_esn_state(sa_entry, mode_param, &tmp);
|
||||
need_modify = true;
|
||||
}
|
||||
|
||||
unlock:
|
||||
spin_unlock_bh(&sa_entry->x->lock);
|
||||
if (need_modify)
|
||||
mlx5_accel_esp_modify_xfrm(sa_entry, &tmp);
|
||||
kfree(work);
|
||||
}
|
||||
|
||||
@ -600,7 +594,6 @@ int mlx5e_ipsec_aso_query(struct mlx5e_ipsec_sa_entry *sa_entry,
|
||||
struct mlx5_wqe_aso_ctrl_seg *ctrl;
|
||||
struct mlx5e_hw_objs *res;
|
||||
struct mlx5_aso_wqe *wqe;
|
||||
unsigned long expires;
|
||||
u8 ds_cnt;
|
||||
int ret;
|
||||
|
||||
@ -622,13 +615,10 @@ int mlx5e_ipsec_aso_query(struct mlx5e_ipsec_sa_entry *sa_entry,
|
||||
mlx5e_ipsec_aso_copy(ctrl, data);
|
||||
|
||||
mlx5_aso_post_wqe(aso->aso, false, &wqe->ctrl);
|
||||
expires = jiffies + msecs_to_jiffies(10);
|
||||
do {
|
||||
ret = mlx5_aso_poll_cq(aso->aso, false);
|
||||
if (ret)
|
||||
/* We are in atomic context */
|
||||
udelay(10);
|
||||
} while (ret && time_is_after_jiffies(expires));
|
||||
read_poll_timeout_atomic(mlx5_aso_poll_cq, ret, !ret, 10,
|
||||
10 * USEC_PER_MSEC, false, aso->aso, false);
|
||||
if (!ret)
|
||||
memcpy(sa_entry->ctx, aso->ctx, MLX5_ST_SZ_BYTES(ipsec_aso));
|
||||
spin_unlock_bh(&aso->lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -5,6 +5,7 @@
|
||||
#include <linux/mlx5/mlx5_ifc.h>
|
||||
#include <linux/xarray.h>
|
||||
#include <linux/if_vlan.h>
|
||||
#include <linux/iopoll.h>
|
||||
|
||||
#include "en.h"
|
||||
#include "lib/aso.h"
|
||||
@ -1385,7 +1386,8 @@ static int macsec_aso_set_arm_event(struct mlx5_core_dev *mdev, struct mlx5e_mac
|
||||
MLX5_ACCESS_ASO_OPC_MOD_MACSEC);
|
||||
macsec_aso_build_ctrl(aso, &aso_wqe->aso_ctrl, in);
|
||||
mlx5_aso_post_wqe(maso, false, &aso_wqe->ctrl);
|
||||
err = mlx5_aso_poll_cq(maso, false);
|
||||
read_poll_timeout(mlx5_aso_poll_cq, err, !err, 10, 10 * USEC_PER_MSEC,
|
||||
false, maso, false);
|
||||
mutex_unlock(&aso->aso_lock);
|
||||
|
||||
return err;
|
||||
@ -1397,7 +1399,6 @@ static int macsec_aso_query(struct mlx5_core_dev *mdev, struct mlx5e_macsec *mac
|
||||
struct mlx5e_macsec_aso *aso;
|
||||
struct mlx5_aso_wqe *aso_wqe;
|
||||
struct mlx5_aso *maso;
|
||||
unsigned long expires;
|
||||
int err;
|
||||
|
||||
aso = &macsec->aso;
|
||||
@ -1411,12 +1412,8 @@ static int macsec_aso_query(struct mlx5_core_dev *mdev, struct mlx5e_macsec *mac
|
||||
macsec_aso_build_wqe_ctrl_seg(aso, &aso_wqe->aso_ctrl, NULL);
|
||||
|
||||
mlx5_aso_post_wqe(maso, false, &aso_wqe->ctrl);
|
||||
expires = jiffies + msecs_to_jiffies(10);
|
||||
do {
|
||||
err = mlx5_aso_poll_cq(maso, false);
|
||||
if (err)
|
||||
usleep_range(2, 10);
|
||||
} while (err && time_is_after_jiffies(expires));
|
||||
read_poll_timeout(mlx5_aso_poll_cq, err, !err, 10, 10 * USEC_PER_MSEC,
|
||||
false, maso, false);
|
||||
|
||||
if (err)
|
||||
goto err_out;
|
||||
|
||||
@ -1566,8 +1566,11 @@ static int mlx5e_create_rxfh_context(struct net_device *dev,
|
||||
rxfh->indir, rxfh->key,
|
||||
hfunc == ETH_RSS_HASH_NO_CHANGE ? NULL : &hfunc,
|
||||
rxfh->input_xfrm == RXH_XFRM_NO_CHANGE ? NULL : &symmetric);
|
||||
if (err)
|
||||
if (err) {
|
||||
WARN_ON(mlx5e_rx_res_rss_destroy(priv->rx_res,
|
||||
rxfh->rss_context));
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
mlx5e_rx_res_rss_get_rxfh(priv->rx_res, rxfh->rss_context,
|
||||
ethtool_rxfh_context_indir(ctx),
|
||||
|
||||
@ -6636,9 +6636,11 @@ static int mlx5e_resume(struct auxiliary_device *adev)
|
||||
return err;
|
||||
|
||||
actual_adev = mlx5_sd_get_adev(mdev, adev, edev->idx);
|
||||
if (actual_adev)
|
||||
return _mlx5e_resume(actual_adev);
|
||||
return 0;
|
||||
if (actual_adev) {
|
||||
err = _mlx5e_resume(actual_adev);
|
||||
mlx5_sd_put_adev(actual_adev, adev);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
static int _mlx5e_suspend(struct auxiliary_device *adev, bool pre_netdev_reg)
|
||||
@ -6677,6 +6679,8 @@ static int mlx5e_suspend(struct auxiliary_device *adev, pm_message_t state)
|
||||
err = _mlx5e_suspend(actual_adev, false);
|
||||
|
||||
mlx5_sd_cleanup(mdev);
|
||||
if (actual_adev)
|
||||
mlx5_sd_put_adev(actual_adev, adev);
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -6735,6 +6739,14 @@ static int _mlx5e_probe(struct auxiliary_device *adev)
|
||||
goto err_resume;
|
||||
}
|
||||
|
||||
/* mlx5e_fix_features() returns early when the device is not present
|
||||
* to avoid dereferencing cleared priv during profile changes.
|
||||
* This also causes it to be a no-op during register_netdev(), where
|
||||
* the device is not yet present.
|
||||
* Trigger an additional features update that will actually work.
|
||||
*/
|
||||
mlx5e_update_features(netdev);
|
||||
|
||||
mlx5e_dcbnl_init_app(priv);
|
||||
mlx5_core_uplink_netdev_set(mdev, netdev);
|
||||
mlx5e_params_print_info(mdev, &priv->channels.params);
|
||||
@ -6766,9 +6778,19 @@ static int mlx5e_probe(struct auxiliary_device *adev,
|
||||
return err;
|
||||
|
||||
actual_adev = mlx5_sd_get_adev(mdev, adev, edev->idx);
|
||||
if (actual_adev)
|
||||
return _mlx5e_probe(actual_adev);
|
||||
if (actual_adev) {
|
||||
err = _mlx5e_probe(actual_adev);
|
||||
if (err)
|
||||
goto sd_cleanup;
|
||||
mlx5_sd_put_adev(actual_adev, adev);
|
||||
}
|
||||
return 0;
|
||||
|
||||
sd_cleanup:
|
||||
mlx5_sd_cleanup(mdev);
|
||||
if (actual_adev)
|
||||
mlx5_sd_put_adev(actual_adev, adev);
|
||||
return err;
|
||||
}
|
||||
|
||||
static void _mlx5e_remove(struct auxiliary_device *adev)
|
||||
@ -6820,6 +6842,8 @@ static void mlx5e_remove(struct auxiliary_device *adev)
|
||||
_mlx5e_remove(actual_adev);
|
||||
|
||||
mlx5_sd_cleanup(mdev);
|
||||
if (actual_adev)
|
||||
mlx5_sd_put_adev(actual_adev, adev);
|
||||
}
|
||||
|
||||
static const struct auxiliary_device_id mlx5e_id_table[] = {
|
||||
|
||||
@ -142,7 +142,8 @@ static int mlx5_esw_ipsec_modify_flow_dests(struct mlx5_eswitch *esw,
|
||||
|
||||
attr = flow->attr;
|
||||
esw_attr = attr->esw_attr;
|
||||
if (esw_attr->out_count - esw_attr->split_count > 1)
|
||||
if (!esw_attr->out_count ||
|
||||
esw_attr->out_count - esw_attr->split_count > 1)
|
||||
return 0;
|
||||
|
||||
err = mlx5_eswitch_restore_ipsec_rule(esw, flow->rule[0], esw_attr,
|
||||
|
||||
@ -1072,10 +1072,11 @@ static void mlx5_eswitch_event_handler_register(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))
|
||||
if (esw->mode == MLX5_ESWITCH_OFFLOADS &&
|
||||
mlx5_eswitch_is_funcs_handler(esw->dev)) {
|
||||
mlx5_eq_notifier_unregister(esw->dev, &esw->esw_funcs.nb);
|
||||
|
||||
flush_workqueue(esw->work_queue);
|
||||
atomic_inc(&esw->esw_funcs.generation);
|
||||
}
|
||||
}
|
||||
|
||||
static void mlx5_eswitch_clear_vf_vports_info(struct mlx5_eswitch *esw)
|
||||
|
||||
@ -334,10 +334,12 @@ struct esw_mc_addr { /* SRIOV only */
|
||||
struct mlx5_host_work {
|
||||
struct work_struct work;
|
||||
struct mlx5_eswitch *esw;
|
||||
int work_gen;
|
||||
};
|
||||
|
||||
struct mlx5_esw_functions {
|
||||
struct mlx5_nb nb;
|
||||
atomic_t generation;
|
||||
bool host_funcs_disabled;
|
||||
u16 num_vfs;
|
||||
u16 num_ec_vfs;
|
||||
|
||||
@ -3578,22 +3578,28 @@ static void esw_offloads_steering_cleanup(struct mlx5_eswitch *esw)
|
||||
}
|
||||
|
||||
static void
|
||||
esw_vfs_changed_event_handler(struct mlx5_eswitch *esw, const u32 *out)
|
||||
esw_vfs_changed_event_handler(struct mlx5_eswitch *esw, int work_gen,
|
||||
const u32 *out)
|
||||
{
|
||||
struct devlink *devlink;
|
||||
bool host_pf_disabled;
|
||||
u16 new_num_vfs;
|
||||
|
||||
devlink = priv_to_devlink(esw->dev);
|
||||
devl_lock(devlink);
|
||||
|
||||
/* Stale work from one or more mode changes ago. Bail out. */
|
||||
if (work_gen != atomic_read(&esw->esw_funcs.generation))
|
||||
goto unlock;
|
||||
|
||||
new_num_vfs = MLX5_GET(query_esw_functions_out, out,
|
||||
host_params_context.host_num_of_vfs);
|
||||
host_pf_disabled = MLX5_GET(query_esw_functions_out, out,
|
||||
host_params_context.host_pf_disabled);
|
||||
|
||||
if (new_num_vfs == esw->esw_funcs.num_vfs || host_pf_disabled)
|
||||
return;
|
||||
goto unlock;
|
||||
|
||||
devlink = priv_to_devlink(esw->dev);
|
||||
devl_lock(devlink);
|
||||
/* Number of VFs can only change from "0 to x" or "x to 0". */
|
||||
if (esw->esw_funcs.num_vfs > 0) {
|
||||
mlx5_eswitch_unload_vf_vports(esw, esw->esw_funcs.num_vfs);
|
||||
@ -3608,6 +3614,7 @@ esw_vfs_changed_event_handler(struct mlx5_eswitch *esw, const u32 *out)
|
||||
}
|
||||
}
|
||||
esw->esw_funcs.num_vfs = new_num_vfs;
|
||||
unlock:
|
||||
devl_unlock(devlink);
|
||||
}
|
||||
|
||||
@ -3624,7 +3631,7 @@ static void esw_functions_changed_event_handler(struct work_struct *work)
|
||||
if (IS_ERR(out))
|
||||
goto out;
|
||||
|
||||
esw_vfs_changed_event_handler(esw, out);
|
||||
esw_vfs_changed_event_handler(esw, host_work->work_gen, out);
|
||||
kvfree(out);
|
||||
out:
|
||||
kfree(host_work);
|
||||
@ -3644,6 +3651,7 @@ int mlx5_esw_funcs_changed_handler(struct notifier_block *nb, unsigned long type
|
||||
esw = container_of(esw_funcs, struct mlx5_eswitch, esw_funcs);
|
||||
|
||||
host_work->esw = esw;
|
||||
host_work->work_gen = atomic_read(&esw_funcs->generation);
|
||||
|
||||
INIT_WORK(&host_work->work, esw_functions_changed_event_handler);
|
||||
queue_work(esw->work_queue, &host_work->work);
|
||||
@ -3752,6 +3760,8 @@ int esw_offloads_enable(struct mlx5_eswitch *esw)
|
||||
return 0;
|
||||
|
||||
err_vports:
|
||||
/* rollback to legacy, indicates don't unregister the uplink netdev */
|
||||
esw->dev->priv.flags |= MLX5_PRIV_FLAGS_SWITCH_LEGACY;
|
||||
mlx5_esw_offloads_rep_unload(esw, MLX5_VPORT_UPLINK);
|
||||
err_uplink:
|
||||
esw_offloads_steering_cleanup(esw);
|
||||
@ -4064,6 +4074,8 @@ int mlx5_devlink_eswitch_mode_set(struct devlink *devlink, u16 mode,
|
||||
|
||||
if (mlx5_mode == MLX5_ESWITCH_LEGACY)
|
||||
esw->dev->priv.flags |= MLX5_PRIV_FLAGS_SWITCH_LEGACY;
|
||||
if (mlx5_mode == MLX5_ESWITCH_OFFLOADS)
|
||||
esw->dev->priv.flags &= ~MLX5_PRIV_FLAGS_SWITCH_LEGACY;
|
||||
mlx5_eswitch_disable_locked(esw);
|
||||
if (mlx5_mode == MLX5_ESWITCH_OFFLOADS) {
|
||||
if (mlx5_devlink_trap_get_num_active(esw->dev)) {
|
||||
|
||||
@ -822,48 +822,63 @@ mlx5_fw_image_pending(struct mlx5_core_dev *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mlx5_fw_version_query(struct mlx5_core_dev *dev,
|
||||
u32 *running_ver, u32 *pending_ver)
|
||||
void mlx5_fw_version_query(struct mlx5_core_dev *dev,
|
||||
u32 *running_ver, u32 *pending_ver)
|
||||
{
|
||||
u32 reg_mcqi_version[MLX5_ST_SZ_DW(mcqi_version)] = {};
|
||||
bool pending_version_exists;
|
||||
int component_index;
|
||||
int err;
|
||||
|
||||
*running_ver = 0;
|
||||
*pending_ver = 0;
|
||||
|
||||
if (!MLX5_CAP_GEN(dev, mcam_reg) || !MLX5_CAP_MCAM_REG(dev, mcqi) ||
|
||||
!MLX5_CAP_MCAM_REG(dev, mcqs)) {
|
||||
mlx5_core_warn(dev, "fw query isn't supported by the FW\n");
|
||||
return -EOPNOTSUPP;
|
||||
return;
|
||||
}
|
||||
|
||||
component_index = mlx5_get_boot_img_component_index(dev);
|
||||
if (component_index < 0)
|
||||
return component_index;
|
||||
if (component_index < 0) {
|
||||
mlx5_core_warn(dev, "fw query failed to find boot img component index, err %d\n",
|
||||
component_index);
|
||||
return;
|
||||
}
|
||||
|
||||
*running_ver = U32_MAX; /* indicate failure */
|
||||
err = mlx5_reg_mcqi_version_query(dev, component_index,
|
||||
MCQI_FW_RUNNING_VERSION,
|
||||
reg_mcqi_version);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
*running_ver = MLX5_GET(mcqi_version, reg_mcqi_version, version);
|
||||
if (!err)
|
||||
*running_ver = MLX5_GET(mcqi_version, reg_mcqi_version,
|
||||
version);
|
||||
else
|
||||
mlx5_core_warn(dev, "failed to query running version, err %d\n",
|
||||
err);
|
||||
|
||||
*pending_ver = U32_MAX; /* indicate failure */
|
||||
err = mlx5_fw_image_pending(dev, component_index, &pending_version_exists);
|
||||
if (err)
|
||||
return err;
|
||||
if (err) {
|
||||
mlx5_core_warn(dev, "failed to query pending image, err %d\n",
|
||||
err);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!pending_version_exists) {
|
||||
*pending_ver = 0;
|
||||
return 0;
|
||||
return;
|
||||
}
|
||||
|
||||
err = mlx5_reg_mcqi_version_query(dev, component_index,
|
||||
MCQI_FW_STORED_VERSION,
|
||||
reg_mcqi_version);
|
||||
if (err)
|
||||
return err;
|
||||
if (!err)
|
||||
*pending_ver = MLX5_GET(mcqi_version, reg_mcqi_version,
|
||||
version);
|
||||
else
|
||||
mlx5_core_warn(dev, "failed to query pending version, err %d\n",
|
||||
err);
|
||||
|
||||
*pending_ver = MLX5_GET(mcqi_version, reg_mcqi_version, version);
|
||||
|
||||
return 0;
|
||||
return;
|
||||
}
|
||||
|
||||
@ -160,8 +160,11 @@ DEFINE_SHOW_ATTRIBUTE(members);
|
||||
|
||||
void mlx5_ldev_add_debugfs(struct mlx5_core_dev *dev)
|
||||
{
|
||||
struct mlx5_lag *ldev = mlx5_lag_dev(dev);
|
||||
struct dentry *dbg;
|
||||
|
||||
if (!ldev)
|
||||
return;
|
||||
dbg = debugfs_create_dir("lag", mlx5_debugfs_get_dev_root(dev));
|
||||
dev->priv.dbg.lag_debugfs = dbg;
|
||||
|
||||
|
||||
@ -1654,8 +1654,12 @@ void mlx5_lag_disable_change(struct mlx5_core_dev *dev)
|
||||
mutex_lock(&ldev->lock);
|
||||
|
||||
ldev->mode_changes_in_progress++;
|
||||
if (__mlx5_lag_is_active(ldev))
|
||||
mlx5_disable_lag(ldev);
|
||||
if (__mlx5_lag_is_active(ldev)) {
|
||||
if (ldev->mode == MLX5_LAG_MODE_MPESW)
|
||||
mlx5_lag_disable_mpesw(ldev);
|
||||
else
|
||||
mlx5_disable_lag(ldev);
|
||||
}
|
||||
|
||||
mutex_unlock(&ldev->lock);
|
||||
mlx5_devcom_comp_unlock(dev->priv.hca_devcom_comp);
|
||||
|
||||
@ -65,7 +65,7 @@ err_metadata:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int enable_mpesw(struct mlx5_lag *ldev)
|
||||
static int mlx5_lag_enable_mpesw(struct mlx5_lag *ldev)
|
||||
{
|
||||
struct mlx5_core_dev *dev0;
|
||||
int err;
|
||||
@ -124,7 +124,7 @@ err_add_devices:
|
||||
return err;
|
||||
}
|
||||
|
||||
static void disable_mpesw(struct mlx5_lag *ldev)
|
||||
void mlx5_lag_disable_mpesw(struct mlx5_lag *ldev)
|
||||
{
|
||||
if (ldev->mode == MLX5_LAG_MODE_MPESW) {
|
||||
mlx5_mpesw_metadata_cleanup(ldev);
|
||||
@ -150,9 +150,9 @@ static void mlx5_mpesw_work(struct work_struct *work)
|
||||
}
|
||||
|
||||
if (mpesww->op == MLX5_MPESW_OP_ENABLE)
|
||||
mpesww->result = enable_mpesw(ldev);
|
||||
mpesww->result = mlx5_lag_enable_mpesw(ldev);
|
||||
else if (mpesww->op == MLX5_MPESW_OP_DISABLE)
|
||||
disable_mpesw(ldev);
|
||||
mlx5_lag_disable_mpesw(ldev);
|
||||
unlock:
|
||||
mutex_unlock(&ldev->lock);
|
||||
mlx5_devcom_comp_unlock(devcom);
|
||||
|
||||
@ -31,5 +31,10 @@ int mlx5_lag_mpesw_do_mirred(struct mlx5_core_dev *mdev,
|
||||
bool mlx5_lag_is_mpesw(struct mlx5_core_dev *dev);
|
||||
void mlx5_lag_mpesw_disable(struct mlx5_core_dev *dev);
|
||||
int mlx5_lag_mpesw_enable(struct mlx5_core_dev *dev);
|
||||
#ifdef CONFIG_MLX5_ESWITCH
|
||||
void mlx5_lag_disable_mpesw(struct mlx5_lag *ldev);
|
||||
#else
|
||||
static inline void mlx5_lag_disable_mpesw(struct mlx5_lag *ldev) {}
|
||||
#endif /* CONFIG_MLX5_ESWITCH */
|
||||
|
||||
#endif /* __MLX5_LAG_MPESW_H__ */
|
||||
|
||||
@ -18,6 +18,7 @@ struct mlx5_sd {
|
||||
u8 host_buses;
|
||||
struct mlx5_devcom_comp_dev *devcom;
|
||||
struct dentry *dfs;
|
||||
u8 state;
|
||||
bool primary;
|
||||
union {
|
||||
struct { /* primary */
|
||||
@ -31,6 +32,11 @@ struct mlx5_sd {
|
||||
};
|
||||
};
|
||||
|
||||
enum mlx5_sd_state {
|
||||
MLX5_SD_STATE_DOWN = 0,
|
||||
MLX5_SD_STATE_UP,
|
||||
};
|
||||
|
||||
static int mlx5_sd_get_host_buses(struct mlx5_core_dev *dev)
|
||||
{
|
||||
struct mlx5_sd *sd = mlx5_get_sd(dev);
|
||||
@ -270,9 +276,6 @@ static void sd_unregister(struct mlx5_core_dev *dev)
|
||||
{
|
||||
struct mlx5_sd *sd = mlx5_get_sd(dev);
|
||||
|
||||
mlx5_devcom_comp_lock(sd->devcom);
|
||||
mlx5_devcom_comp_set_ready(sd->devcom, false);
|
||||
mlx5_devcom_comp_unlock(sd->devcom);
|
||||
mlx5_devcom_unregister_component(sd->devcom);
|
||||
}
|
||||
|
||||
@ -426,6 +429,7 @@ int mlx5_sd_init(struct mlx5_core_dev *dev)
|
||||
struct mlx5_core_dev *primary, *pos, *to;
|
||||
struct mlx5_sd *sd = mlx5_get_sd(dev);
|
||||
u8 alias_key[ACCESS_KEY_LEN];
|
||||
struct mlx5_sd *primary_sd;
|
||||
int err, i;
|
||||
|
||||
err = sd_init(dev);
|
||||
@ -440,10 +444,17 @@ int mlx5_sd_init(struct mlx5_core_dev *dev)
|
||||
if (err)
|
||||
goto err_sd_cleanup;
|
||||
|
||||
mlx5_devcom_comp_lock(sd->devcom);
|
||||
if (!mlx5_devcom_comp_is_ready(sd->devcom))
|
||||
return 0;
|
||||
goto out;
|
||||
|
||||
primary = mlx5_sd_get_primary(dev);
|
||||
if (!primary)
|
||||
goto out;
|
||||
|
||||
primary_sd = mlx5_get_sd(primary);
|
||||
if (primary_sd->state != MLX5_SD_STATE_DOWN)
|
||||
goto out;
|
||||
|
||||
for (i = 0; i < ACCESS_KEY_LEN; i++)
|
||||
alias_key[i] = get_random_u8();
|
||||
@ -452,9 +463,13 @@ int mlx5_sd_init(struct mlx5_core_dev *dev)
|
||||
if (err)
|
||||
goto err_sd_unregister;
|
||||
|
||||
sd->dfs = debugfs_create_dir("multi-pf", mlx5_debugfs_get_dev_root(primary));
|
||||
debugfs_create_x32("group_id", 0400, sd->dfs, &sd->group_id);
|
||||
debugfs_create_file("primary", 0400, sd->dfs, primary, &dev_fops);
|
||||
primary_sd->dfs =
|
||||
debugfs_create_dir("multi-pf",
|
||||
mlx5_debugfs_get_dev_root(primary));
|
||||
debugfs_create_x32("group_id", 0400, primary_sd->dfs,
|
||||
&primary_sd->group_id);
|
||||
debugfs_create_file("primary", 0400, primary_sd->dfs, primary,
|
||||
&dev_fops);
|
||||
|
||||
mlx5_sd_for_each_secondary(i, primary, pos) {
|
||||
char name[32];
|
||||
@ -464,7 +479,8 @@ int mlx5_sd_init(struct mlx5_core_dev *dev)
|
||||
goto err_unset_secondaries;
|
||||
|
||||
snprintf(name, sizeof(name), "secondary_%d", i - 1);
|
||||
debugfs_create_file(name, 0400, sd->dfs, pos, &dev_fops);
|
||||
debugfs_create_file(name, 0400, primary_sd->dfs, pos,
|
||||
&dev_fops);
|
||||
|
||||
}
|
||||
|
||||
@ -472,6 +488,9 @@ int mlx5_sd_init(struct mlx5_core_dev *dev)
|
||||
sd->group_id, mlx5_devcom_comp_get_size(sd->devcom));
|
||||
sd_print_group(primary);
|
||||
|
||||
primary_sd->state = MLX5_SD_STATE_UP;
|
||||
out:
|
||||
mlx5_devcom_comp_unlock(sd->devcom);
|
||||
return 0;
|
||||
|
||||
err_unset_secondaries:
|
||||
@ -479,8 +498,18 @@ err_unset_secondaries:
|
||||
mlx5_sd_for_each_secondary_to(i, primary, to, pos)
|
||||
sd_cmd_unset_secondary(pos);
|
||||
sd_cmd_unset_primary(primary);
|
||||
debugfs_remove_recursive(sd->dfs);
|
||||
debugfs_remove_recursive(primary_sd->dfs);
|
||||
primary_sd->dfs = NULL;
|
||||
err_sd_unregister:
|
||||
mlx5_sd_for_each_secondary(i, primary, pos) {
|
||||
struct mlx5_sd *peer_sd = mlx5_get_sd(pos);
|
||||
|
||||
primary_sd->secondaries[i - 1] = NULL;
|
||||
peer_sd->primary_dev = NULL;
|
||||
}
|
||||
primary_sd->primary = false;
|
||||
mlx5_devcom_comp_set_ready(sd->devcom, false);
|
||||
mlx5_devcom_comp_unlock(sd->devcom);
|
||||
sd_unregister(dev);
|
||||
err_sd_cleanup:
|
||||
sd_cleanup(dev);
|
||||
@ -491,42 +520,97 @@ void mlx5_sd_cleanup(struct mlx5_core_dev *dev)
|
||||
{
|
||||
struct mlx5_sd *sd = mlx5_get_sd(dev);
|
||||
struct mlx5_core_dev *primary, *pos;
|
||||
struct mlx5_sd *primary_sd;
|
||||
int i;
|
||||
|
||||
if (!sd)
|
||||
return;
|
||||
|
||||
mlx5_devcom_comp_lock(sd->devcom);
|
||||
if (!mlx5_devcom_comp_is_ready(sd->devcom))
|
||||
goto out;
|
||||
goto out_unlock;
|
||||
|
||||
primary = mlx5_sd_get_primary(dev);
|
||||
if (!primary)
|
||||
goto out_ready_false;
|
||||
|
||||
primary_sd = mlx5_get_sd(primary);
|
||||
if (primary_sd->state != MLX5_SD_STATE_UP)
|
||||
goto out_clear_peers;
|
||||
|
||||
mlx5_sd_for_each_secondary(i, primary, pos)
|
||||
sd_cmd_unset_secondary(pos);
|
||||
sd_cmd_unset_primary(primary);
|
||||
debugfs_remove_recursive(sd->dfs);
|
||||
debugfs_remove_recursive(primary_sd->dfs);
|
||||
primary_sd->dfs = NULL;
|
||||
|
||||
sd_info(primary, "group id %#x, uncombined\n", sd->group_id);
|
||||
out:
|
||||
primary_sd->state = MLX5_SD_STATE_DOWN;
|
||||
out_clear_peers:
|
||||
mlx5_sd_for_each_secondary(i, primary, pos) {
|
||||
struct mlx5_sd *peer_sd = mlx5_get_sd(pos);
|
||||
|
||||
primary_sd->secondaries[i - 1] = NULL;
|
||||
peer_sd->primary_dev = NULL;
|
||||
}
|
||||
primary_sd->primary = false;
|
||||
out_ready_false:
|
||||
mlx5_devcom_comp_set_ready(sd->devcom, false);
|
||||
out_unlock:
|
||||
mlx5_devcom_comp_unlock(sd->devcom);
|
||||
sd_unregister(dev);
|
||||
sd_cleanup(dev);
|
||||
}
|
||||
|
||||
/* Lock order:
|
||||
* primary: actual_adev_lock -> SD devcom comp lock
|
||||
* secondary: SD devcom comp lock -> (drop) -> actual_adev_lock
|
||||
* The two locks are never held together, so no ABBA.
|
||||
*/
|
||||
struct auxiliary_device *mlx5_sd_get_adev(struct mlx5_core_dev *dev,
|
||||
struct auxiliary_device *adev,
|
||||
int idx)
|
||||
{
|
||||
struct mlx5_sd *sd = mlx5_get_sd(dev);
|
||||
struct mlx5_core_dev *primary;
|
||||
struct mlx5_adev *primary_adev;
|
||||
|
||||
if (!sd)
|
||||
return adev;
|
||||
|
||||
if (!mlx5_devcom_comp_is_ready(sd->devcom))
|
||||
mlx5_devcom_comp_lock(sd->devcom);
|
||||
if (!mlx5_devcom_comp_is_ready(sd->devcom)) {
|
||||
mlx5_devcom_comp_unlock(sd->devcom);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
primary = mlx5_sd_get_primary(dev);
|
||||
if (dev == primary)
|
||||
if (!primary || dev == primary) {
|
||||
mlx5_devcom_comp_unlock(sd->devcom);
|
||||
return adev;
|
||||
}
|
||||
|
||||
return &primary->priv.adev[idx]->adev;
|
||||
primary_adev = primary->priv.adev[idx];
|
||||
get_device(&primary_adev->adev.dev);
|
||||
mlx5_devcom_comp_unlock(sd->devcom);
|
||||
|
||||
device_lock(&primary_adev->adev.dev);
|
||||
/* Primary may have completed remove between dropping devcom and
|
||||
* acquiring device_lock; recheck.
|
||||
*/
|
||||
if (!mlx5_devcom_comp_is_ready(sd->devcom)) {
|
||||
device_unlock(&primary_adev->adev.dev);
|
||||
put_device(&primary_adev->adev.dev);
|
||||
return NULL;
|
||||
}
|
||||
return &primary_adev->adev;
|
||||
}
|
||||
|
||||
void mlx5_sd_put_adev(struct auxiliary_device *actual_adev,
|
||||
struct auxiliary_device *adev)
|
||||
{
|
||||
if (actual_adev != adev) {
|
||||
device_unlock(&actual_adev->dev);
|
||||
put_device(&actual_adev->dev);
|
||||
}
|
||||
}
|
||||
|
||||
@ -15,6 +15,8 @@ struct mlx5_core_dev *mlx5_sd_ch_ix_get_dev(struct mlx5_core_dev *primary, int c
|
||||
struct auxiliary_device *mlx5_sd_get_adev(struct mlx5_core_dev *dev,
|
||||
struct auxiliary_device *adev,
|
||||
int idx);
|
||||
void mlx5_sd_put_adev(struct auxiliary_device *actual_adev,
|
||||
struct auxiliary_device *adev);
|
||||
|
||||
int mlx5_sd_init(struct mlx5_core_dev *dev);
|
||||
void mlx5_sd_cleanup(struct mlx5_core_dev *dev);
|
||||
|
||||
@ -392,8 +392,8 @@ int mlx5_port_max_linkspeed(struct mlx5_core_dev *mdev, u32 *speed);
|
||||
|
||||
int mlx5_firmware_flash(struct mlx5_core_dev *dev, const struct firmware *fw,
|
||||
struct netlink_ext_ack *extack);
|
||||
int mlx5_fw_version_query(struct mlx5_core_dev *dev,
|
||||
u32 *running_ver, u32 *stored_ver);
|
||||
void mlx5_fw_version_query(struct mlx5_core_dev *dev, u32 *running_ver,
|
||||
u32 *stored_ver);
|
||||
|
||||
#ifdef CONFIG_MLX5_CORE_EN
|
||||
int mlx5e_init(void);
|
||||
|
||||
@ -193,7 +193,9 @@ static int mlx5_sriov_enable(struct pci_dev *pdev, int num_vfs)
|
||||
err = pci_enable_sriov(pdev, num_vfs);
|
||||
if (err) {
|
||||
mlx5_core_warn(dev, "pci_enable_sriov failed : %d\n", err);
|
||||
devl_lock(devlink);
|
||||
mlx5_device_disable_sriov(dev, num_vfs, true, true);
|
||||
devl_unlock(devlink);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -1323,8 +1323,10 @@ mlx5_cmd_hws_packet_reformat_alloc(struct mlx5_flow_root_namespace *ns,
|
||||
break;
|
||||
case MLX5_REFORMAT_TYPE_REMOVE_HDR:
|
||||
hws_action = mlx5_fs_get_action_remove_header_vlan(fs_ctx, params);
|
||||
if (!hws_action)
|
||||
if (!hws_action) {
|
||||
mlx5_core_err(dev, "Only vlan remove header supported\n");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
mlx5_core_err(ns->dev, "Packet-reformat not supported(%d)\n",
|
||||
|
||||
@ -1050,8 +1050,8 @@ static int dr_dump_domain_all(struct seq_file *file, struct mlx5dr_domain *dmn)
|
||||
struct mlx5dr_table *tbl;
|
||||
int ret;
|
||||
|
||||
mutex_lock(&dmn->dump_info.dbg_mutex);
|
||||
mlx5dr_domain_lock(dmn);
|
||||
mutex_lock(&dmn->dump_info.dbg_mutex);
|
||||
|
||||
ret = dr_dump_domain(file, dmn);
|
||||
if (ret < 0)
|
||||
@ -1064,8 +1064,8 @@ static int dr_dump_domain_all(struct seq_file *file, struct mlx5dr_domain *dmn)
|
||||
}
|
||||
|
||||
unlock_mutex:
|
||||
mlx5dr_domain_unlock(dmn);
|
||||
mutex_unlock(&dmn->dump_info.dbg_mutex);
|
||||
mlx5dr_domain_unlock(dmn);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@ -2,6 +2,7 @@
|
||||
// Copyright (c) 2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
|
||||
#include <linux/io.h>
|
||||
#include <linux/iopoll.h>
|
||||
#include <linux/mlx5/transobj.h>
|
||||
#include "lib/clock.h"
|
||||
#include "mlx5_core.h"
|
||||
@ -14,7 +15,7 @@
|
||||
#define TEST_WC_NUM_WQES 255
|
||||
#define TEST_WC_LOG_CQ_SZ (order_base_2(TEST_WC_NUM_WQES))
|
||||
#define TEST_WC_SQ_LOG_WQ_SZ TEST_WC_LOG_CQ_SZ
|
||||
#define TEST_WC_POLLING_MAX_TIME_JIFFIES msecs_to_jiffies(100)
|
||||
#define TEST_WC_POLLING_MAX_TIME_USEC (100 * USEC_PER_MSEC)
|
||||
|
||||
struct mlx5_wc_cq {
|
||||
/* data path - accessed per cqe */
|
||||
@ -358,7 +359,6 @@ static int mlx5_wc_poll_cq(struct mlx5_wc_sq *sq)
|
||||
static void mlx5_core_test_wc(struct mlx5_core_dev *mdev)
|
||||
{
|
||||
unsigned int offset = 0;
|
||||
unsigned long expires;
|
||||
struct mlx5_wc_sq *sq;
|
||||
int i, err;
|
||||
|
||||
@ -388,13 +388,9 @@ static void mlx5_core_test_wc(struct mlx5_core_dev *mdev)
|
||||
|
||||
mlx5_wc_post_nop(sq, &offset, true);
|
||||
|
||||
expires = jiffies + TEST_WC_POLLING_MAX_TIME_JIFFIES;
|
||||
do {
|
||||
err = mlx5_wc_poll_cq(sq);
|
||||
if (err)
|
||||
usleep_range(2, 10);
|
||||
} while (mdev->wc_state == MLX5_WC_STATE_UNINITIALIZED &&
|
||||
time_is_after_jiffies(expires));
|
||||
poll_timeout_us(mlx5_wc_poll_cq(sq),
|
||||
mdev->wc_state != MLX5_WC_STATE_UNINITIALIZED, 10,
|
||||
TEST_WC_POLLING_MAX_TIME_USEC, false);
|
||||
|
||||
mlx5_wc_destroy_sq(sq);
|
||||
|
||||
|
||||
@ -282,11 +282,20 @@ static void scsi_eh_inc_host_failed(struct rcu_head *head)
|
||||
{
|
||||
struct scsi_cmnd *scmd = container_of(head, typeof(*scmd), rcu);
|
||||
struct Scsi_Host *shost = scmd->device->host;
|
||||
unsigned int busy = scsi_host_busy(shost);
|
||||
unsigned int busy;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(shost->host_lock, flags);
|
||||
shost->host_failed++;
|
||||
spin_unlock_irqrestore(shost->host_lock, flags);
|
||||
/*
|
||||
* The counting of busy requests needs to occur after adding to
|
||||
* host_failed or after the lock acquire for adding to host_failed
|
||||
* to prevent a race with host unbusy and missing an eh wakeup.
|
||||
*/
|
||||
busy = scsi_host_busy(shost);
|
||||
|
||||
spin_lock_irqsave(shost->host_lock, flags);
|
||||
scsi_eh_wakeup(shost, busy);
|
||||
spin_unlock_irqrestore(shost->host_lock, flags);
|
||||
}
|
||||
|
||||
@ -378,6 +378,14 @@ static void scsi_dec_host_busy(struct Scsi_Host *shost, struct scsi_cmnd *cmd)
|
||||
rcu_read_lock();
|
||||
__clear_bit(SCMD_STATE_INFLIGHT, &cmd->state);
|
||||
if (unlikely(scsi_host_in_recovery(shost))) {
|
||||
/*
|
||||
* Ensure the clear of SCMD_STATE_INFLIGHT is visible to
|
||||
* other CPUs before counting busy requests. Otherwise,
|
||||
* reordering can cause CPUs to race and miss an eh wakeup
|
||||
* when no CPU sees all busy requests as done or timed out.
|
||||
*/
|
||||
smp_mb();
|
||||
|
||||
unsigned int busy = scsi_host_busy(shost);
|
||||
|
||||
spin_lock_irqsave(shost->host_lock, flags);
|
||||
|
||||
@ -391,7 +391,7 @@ static struct fsnotify_mark *fsnotify_first_mark(struct fsnotify_mark_connector
|
||||
return hlist_entry_safe(node, struct fsnotify_mark, obj_list);
|
||||
}
|
||||
|
||||
static struct fsnotify_mark *fsnotify_next_mark(struct fsnotify_mark *mark)
|
||||
struct fsnotify_mark *fsnotify_next_mark(struct fsnotify_mark *mark)
|
||||
{
|
||||
struct hlist_node *node = NULL;
|
||||
|
||||
|
||||
@ -380,9 +380,6 @@ EXPORT_SYMBOL_GPL(fsnotify_put_mark);
|
||||
*/
|
||||
static bool fsnotify_get_mark_safe(struct fsnotify_mark *mark)
|
||||
{
|
||||
if (!mark)
|
||||
return true;
|
||||
|
||||
if (refcount_inc_not_zero(&mark->refcnt)) {
|
||||
spin_lock(&mark->lock);
|
||||
if (mark->flags & FSNOTIFY_MARK_FLAG_ATTACHED) {
|
||||
@ -423,15 +420,22 @@ bool fsnotify_prepare_user_wait(struct fsnotify_iter_info *iter_info)
|
||||
int type;
|
||||
|
||||
fsnotify_foreach_iter_type(type) {
|
||||
struct fsnotify_mark *mark = iter_info->marks[type];
|
||||
|
||||
/* This can fail if mark is being removed */
|
||||
if (!fsnotify_get_mark_safe(iter_info->marks[type])) {
|
||||
__release(&fsnotify_mark_srcu);
|
||||
goto fail;
|
||||
while (mark && !fsnotify_get_mark_safe(mark)) {
|
||||
if (mark->group == iter_info->current_group) {
|
||||
__release(&fsnotify_mark_srcu);
|
||||
goto fail;
|
||||
}
|
||||
/* This is a mark in an unrelated group, skip */
|
||||
mark = fsnotify_next_mark(mark);
|
||||
iter_info->marks[type] = mark;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Now that both marks are pinned by refcount in the inode / vfsmount
|
||||
* Now that all marks are pinned by refcount in the inode / vfsmount / etc
|
||||
* lists, we can drop SRCU lock, and safely resume the list iteration
|
||||
* once userspace returns.
|
||||
*/
|
||||
|
||||
@ -138,6 +138,7 @@ struct af_alg_async_req {
|
||||
* recvmsg is invoked.
|
||||
* @init: True if metadata has been sent.
|
||||
* @len: Length of memory allocated for this data structure.
|
||||
* @inflight: Non-zero when AIO requests are in flight.
|
||||
*/
|
||||
struct af_alg_ctx {
|
||||
struct list_head tsgl_list;
|
||||
@ -156,6 +157,8 @@ struct af_alg_ctx {
|
||||
bool init;
|
||||
|
||||
unsigned int len;
|
||||
|
||||
unsigned int inflight;
|
||||
};
|
||||
|
||||
int af_alg_register_type(const struct af_alg_type *type);
|
||||
|
||||
@ -819,6 +819,7 @@ static inline void fsnotify_clear_sb_marks_by_group(struct fsnotify_group *group
|
||||
}
|
||||
extern void fsnotify_get_mark(struct fsnotify_mark *mark);
|
||||
extern void fsnotify_put_mark(struct fsnotify_mark *mark);
|
||||
struct fsnotify_mark *fsnotify_next_mark(struct fsnotify_mark *mark);
|
||||
extern void fsnotify_finish_user_wait(struct fsnotify_iter_info *iter_info);
|
||||
extern bool fsnotify_prepare_user_wait(struct fsnotify_iter_info *iter_info);
|
||||
|
||||
|
||||
@ -1281,12 +1281,12 @@ static inline bool mlx5_rl_is_supported(struct mlx5_core_dev *dev)
|
||||
static inline int mlx5_core_is_mp_slave(struct mlx5_core_dev *dev)
|
||||
{
|
||||
return MLX5_CAP_GEN(dev, affiliate_nic_vport_criteria) &&
|
||||
MLX5_CAP_GEN(dev, num_vhca_ports) <= 1;
|
||||
MLX5_CAP_GEN_MAX(dev, num_vhca_ports) <= 1;
|
||||
}
|
||||
|
||||
static inline int mlx5_core_is_mp_master(struct mlx5_core_dev *dev)
|
||||
{
|
||||
return MLX5_CAP_GEN(dev, num_vhca_ports) > 1;
|
||||
return MLX5_CAP_GEN_MAX(dev, num_vhca_ports) > 1;
|
||||
}
|
||||
|
||||
static inline int mlx5_core_mp_enabled(struct mlx5_core_dev *dev)
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
sbat,1,SBAT Version,sbat,1,https://github.com/rhboot/shim/blob/main/SBAT.md
|
||||
kernel.rhel,1,Red Hat,kernel-core,5.14.0-687.26.1.el9.x86_64,mailto:secalert@redhat.com
|
||||
kernel.almalinux,1,AlmaLinux,kernel-core,5.14.0-687.26.1.el9.x86_64,mailto:security@almalinux.org
|
||||
kernel.rhel,1,Red Hat,kernel-core,5.14.0-687.29.1.el9.x86_64,mailto:secalert@redhat.com
|
||||
kernel.almalinux,1,AlmaLinux,kernel-core,5.14.0-687.29.1.el9.x86_64,mailto:security@almalinux.org
|
||||
|
||||
@ -5345,7 +5345,13 @@ static inline int l2cap_ecred_reconf_rsp(struct l2cap_conn *conn,
|
||||
if (chan->ident != cmd->ident)
|
||||
continue;
|
||||
|
||||
l2cap_chan_hold(chan);
|
||||
l2cap_chan_lock(chan);
|
||||
|
||||
l2cap_chan_del(chan, ECONNRESET);
|
||||
|
||||
l2cap_chan_unlock(chan);
|
||||
l2cap_chan_put(chan);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@ -58,6 +58,7 @@
|
||||
#include <linux/can/skb.h>
|
||||
#include <linux/can/bcm.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <net/sock.h>
|
||||
#include <net/net_namespace.h>
|
||||
|
||||
@ -90,6 +91,8 @@ MODULE_ALIAS("can-proto-2");
|
||||
|
||||
#define BCM_MIN_NAMELEN CAN_REQUIRED_SIZE(struct sockaddr_can, can_ifindex)
|
||||
|
||||
static struct workqueue_struct *bcm_wq;
|
||||
|
||||
/*
|
||||
* easy access to the first 64 bit of can(fd)_frame payload. cp->data is
|
||||
* 64 bit aligned so the offset has to be multiples of 8 which is ensured
|
||||
@ -103,6 +106,7 @@ static inline u64 get_u64(const struct canfd_frame *cp, int offset)
|
||||
struct bcm_op {
|
||||
struct list_head list;
|
||||
struct rcu_head rcu;
|
||||
struct work_struct work;
|
||||
int ifindex;
|
||||
canid_t can_id;
|
||||
u32 flags;
|
||||
@ -768,9 +772,12 @@ static struct bcm_op *bcm_find_op(struct list_head *ops,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void bcm_free_op_rcu(struct rcu_head *rcu_head)
|
||||
static void bcm_free_op_work(struct work_struct *work)
|
||||
{
|
||||
struct bcm_op *op = container_of(rcu_head, struct bcm_op, rcu);
|
||||
struct bcm_op *op = container_of(work, struct bcm_op, work);
|
||||
|
||||
hrtimer_cancel(&op->timer);
|
||||
hrtimer_cancel(&op->thrtimer);
|
||||
|
||||
if ((op->frames) && (op->frames != &op->sframe))
|
||||
kfree(op->frames);
|
||||
@ -778,9 +785,23 @@ static void bcm_free_op_rcu(struct rcu_head *rcu_head)
|
||||
if ((op->last_frames) && (op->last_frames != &op->last_sframe))
|
||||
kfree(op->last_frames);
|
||||
|
||||
/* the last possible access to op->timer/op->thrtimer has now
|
||||
* happened above via hrtimer_cancel() - op->sk is no longer
|
||||
* needed by any pending timer callback, so drop our reference
|
||||
*/
|
||||
sock_put(op->sk);
|
||||
|
||||
kfree(op);
|
||||
}
|
||||
|
||||
static void bcm_free_op_rcu(struct rcu_head *rcu_head)
|
||||
{
|
||||
struct bcm_op *op = container_of(rcu_head, struct bcm_op, rcu);
|
||||
|
||||
INIT_WORK(&op->work, bcm_free_op_work);
|
||||
queue_work(bcm_wq, &op->work);
|
||||
}
|
||||
|
||||
static void bcm_remove_op(struct bcm_op *op)
|
||||
{
|
||||
hrtimer_cancel(&op->timer);
|
||||
@ -1009,6 +1030,7 @@ static int bcm_tx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg,
|
||||
|
||||
/* bcm_can_tx / bcm_tx_timeout_handler needs this */
|
||||
op->sk = sk;
|
||||
sock_hold(sk);
|
||||
op->ifindex = ifindex;
|
||||
|
||||
/* initialize uninitialized (kzalloc) structure */
|
||||
@ -1187,6 +1209,7 @@ static int bcm_rx_setup(struct bcm_msg_head *msg_head, struct msghdr *msg,
|
||||
|
||||
/* bcm_can_tx / bcm_tx_timeout_handler needs this */
|
||||
op->sk = sk;
|
||||
sock_hold(sk);
|
||||
op->ifindex = ifindex;
|
||||
|
||||
/* ifindex for timeout events w/o previous frame reception */
|
||||
@ -1798,11 +1821,15 @@ static int __init bcm_module_init(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
bcm_wq = alloc_workqueue("can-bcm-wq", WQ_UNBOUND, 0);
|
||||
if (!bcm_wq)
|
||||
return -ENOMEM;
|
||||
|
||||
pr_info("can: broadcast manager protocol\n");
|
||||
|
||||
err = register_pernet_subsys(&canbcm_pernet_ops);
|
||||
if (err)
|
||||
return err;
|
||||
goto register_pernet_failed;
|
||||
|
||||
err = register_netdevice_notifier(&canbcm_notifier);
|
||||
if (err)
|
||||
@ -1820,6 +1847,8 @@ register_proto_failed:
|
||||
unregister_netdevice_notifier(&canbcm_notifier);
|
||||
register_notifier_failed:
|
||||
unregister_pernet_subsys(&canbcm_pernet_ops);
|
||||
register_pernet_failed:
|
||||
destroy_workqueue(bcm_wq);
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -1828,6 +1857,8 @@ static void __exit bcm_module_exit(void)
|
||||
can_proto_unregister(&bcm_can_proto);
|
||||
unregister_netdevice_notifier(&canbcm_notifier);
|
||||
unregister_pernet_subsys(&canbcm_pernet_ops);
|
||||
rcu_barrier();
|
||||
destroy_workqueue(bcm_wq);
|
||||
}
|
||||
|
||||
module_init(bcm_module_init);
|
||||
|
||||
@ -419,8 +419,8 @@ int esp_output_head(struct xfrm_state *x, struct sk_buff *skb, struct esp_info *
|
||||
return err;
|
||||
}
|
||||
|
||||
if (ALIGN(tailen, L1_CACHE_BYTES) > PAGE_SIZE ||
|
||||
ALIGN(skb->data_len, L1_CACHE_BYTES) > PAGE_SIZE)
|
||||
if (ALIGN(skb->data_len + tailen, L1_CACHE_BYTES) >
|
||||
PAGE_SIZE)
|
||||
goto cow;
|
||||
|
||||
if (!skb_cloned(skb)) {
|
||||
|
||||
@ -453,8 +453,8 @@ int esp6_output_head(struct xfrm_state *x, struct sk_buff *skb, struct esp_info
|
||||
return err;
|
||||
}
|
||||
|
||||
if (ALIGN(tailen, L1_CACHE_BYTES) > PAGE_SIZE ||
|
||||
ALIGN(skb->data_len, L1_CACHE_BYTES) > PAGE_SIZE)
|
||||
if (ALIGN(skb->data_len + tailen, L1_CACHE_BYTES) >
|
||||
PAGE_SIZE)
|
||||
goto cow;
|
||||
|
||||
if (!skb_cloned(skb)) {
|
||||
|
||||
@ -276,7 +276,17 @@ static int rpl_input(struct sk_buff *skb)
|
||||
|
||||
if (!dst) {
|
||||
ip6_route_input(skb);
|
||||
|
||||
/* ip6_route_input() sets a NOREF dst; force a refcount on it
|
||||
* before caching or further use.
|
||||
*/
|
||||
skb_dst_force(skb);
|
||||
dst = skb_dst(skb);
|
||||
if (unlikely(!dst)) {
|
||||
err = -ENETUNREACH;
|
||||
goto drop;
|
||||
}
|
||||
|
||||
if (!dst->error) {
|
||||
preempt_disable();
|
||||
dst_cache_set_ip6(&rlwt->cache, dst,
|
||||
|
||||
@ -477,7 +477,16 @@ static int seg6_input_core(struct net *net, struct sock *sk,
|
||||
|
||||
if (!dst) {
|
||||
ip6_route_input(skb);
|
||||
|
||||
/* ip6_route_input() sets a NOREF dst; force a refcount on it
|
||||
* before caching or further use.
|
||||
*/
|
||||
skb_dst_force(skb);
|
||||
dst = skb_dst(skb);
|
||||
if (unlikely(!dst)) {
|
||||
err = -ENETUNREACH;
|
||||
goto drop;
|
||||
}
|
||||
|
||||
/* cache only if we don't create a dst reference loop */
|
||||
if (!dst->error && lwtst != dst->lwtstate) {
|
||||
|
||||
@ -0,0 +1 @@
|
||||
CONFIG_ARM64_ERRATUM_4118414=y
|
||||
@ -5,11 +5,9 @@ decision_context: osci_compose_gate
|
||||
rules:
|
||||
- !PassingTestCaseRule {test_case_name: kernel-qe.kernel-ci.kernel-64k-aarch64.tier1.functional}
|
||||
- !PassingTestCaseRule {test_case_name: kernel-qe.kernel-ci.kernel-aarch64.tier1.functional}
|
||||
- !PassingTestCaseRule {test_case_name: kernel-qe.kernel-ci.kernel-debug-x86_64.tier1.functional}
|
||||
- !PassingTestCaseRule {test_case_name: kernel-qe.kernel-ci.kernel-ppc64le.tier1.functional}
|
||||
- !PassingTestCaseRule {test_case_name: kernel-qe.kernel-ci.kernel-rt-64k-aarch64.tier1.functional}
|
||||
- !PassingTestCaseRule {test_case_name: kernel-qe.kernel-ci.kernel-rt-aarch64.tier1.functional}
|
||||
- !PassingTestCaseRule {test_case_name: kernel-qe.kernel-ci.kernel-rt-debug-x86_64.tier1.functional}
|
||||
- !PassingTestCaseRule {test_case_name: kernel-qe.kernel-ci.kernel-rt-x86_64.tier1.functional}
|
||||
- !PassingTestCaseRule {test_case_name: kernel-qe.kernel-ci.kernel-s390x.tier1.functional}
|
||||
- !PassingTestCaseRule {test_case_name: kernel-qe.kernel-ci.kernel-x86_64.tier1.functional}
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0xa16fd523 mlx5_add_flow_rules drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x81e2699b mlx5_alloc_bfreg drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x7672da8f mlx5_blocking_notifier_register drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x0fd736a7 mlx5_blocking_notifier_unregister drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x23255f46 mlx5_cmd_add_privileged_uid drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x6dda02b6 mlx5_cmd_check drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x1ef778b2 mlx5_cmd_cleanup_async_ctx drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x522b4431 mlx5_cmd_create_vport_lag drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x1cd98a74 mlx5_cmd_destroy_vport_lag drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0xbd37c692 mlx5_cmd_do drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x282800df mlx5_cmd_exec drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x562bab7a mlx5_cmd_exec_cb drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0xc3dc5280 mlx5_cmd_init_async_ctx drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x961af1f0 mlx5_cmd_out_err drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x1fa9852f mlx5_cmd_remove_privileged_uid drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x0a4002db mlx5_comp_eqn_get drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0xca05ca8b mlx5_comp_vectors_max drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0xd07e7d0c mlx5_core_access_reg drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL_GPL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0xdc853cec mlx5_core_alloc_pd drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0xb388ccea mlx5_core_create_cq drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x3441e413 mlx5_core_create_mkey drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0xeb09b7b8 mlx5_core_create_psv drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x62560925 mlx5_core_create_rq drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x7ef86a93 mlx5_core_create_rqt drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0xe22b8924 mlx5_core_create_tis drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x748773e7 mlx5_core_dealloc_pd drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x5a52c89e mlx5_core_destroy_cq drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0xb77ec2da mlx5_core_destroy_mkey drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0xebbd3531 mlx5_core_destroy_psv drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x20d8360e mlx5_core_modify_cq drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x19e1c3d4 mlx5_core_modify_cq_moderation drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x2c376041 mlx5_core_modify_hca_vport_context drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL_GPL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x99ec65f6 mlx5_core_modify_rq drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x94ddba25 mlx5_core_modify_sq drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0xfd027378 mlx5_core_modify_tis drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0xe6cedc25 mlx5_core_mp_event_replay drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x69bf2cdc mlx5_core_query_mkey drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x04c04d8f mlx5_core_query_rq drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x347873bb mlx5_core_query_sq_state drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL_GPL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x2dc2915e mlx5_core_query_vendor_id drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x4ed22479 mlx5_core_query_vport_counter drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL_GPL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x51776b7b mlx5_core_reserved_gids_count drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL_GPL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x343a7e55 mlx5_core_roce_gid_set drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
@ -1,3 +0,0 @@
|
||||
#8-
|
||||
0x7cb23851 mlx5_core_uplink_netdev_event_replay drivers/net/ethernet/mellanox/mlx5/core/mlx5_core EXPORT_SYMBOL
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user