diff options
Diffstat (limited to 'drivers/infiniband/hw/mlx5/devx.c')
| -rw-r--r-- | drivers/infiniband/hw/mlx5/devx.c | 43 | 
1 files changed, 27 insertions, 16 deletions
diff --git a/drivers/infiniband/hw/mlx5/devx.c b/drivers/infiniband/hw/mlx5/devx.c index c7dffd799d16..e9cf294f8529 100644 --- a/drivers/infiniband/hw/mlx5/devx.c +++ b/drivers/infiniband/hw/mlx5/devx.c @@ -2362,17 +2362,24 @@ static int devx_event_notifier(struct notifier_block *nb,  	return NOTIFY_OK;  } -void mlx5_ib_devx_init_event_table(struct mlx5_ib_dev *dev) +int mlx5_ib_devx_init(struct mlx5_ib_dev *dev)  {  	struct mlx5_devx_event_table *table = &dev->devx_event_table; +	int uid; + +	uid = mlx5_ib_devx_create(dev, false); +	if (uid > 0) { +		dev->devx_whitelist_uid = uid; +		xa_init(&table->event_xa); +		mutex_init(&table->event_xa_lock); +		MLX5_NB_INIT(&table->devx_nb, devx_event_notifier, NOTIFY_ANY); +		mlx5_eq_notifier_register(dev->mdev, &table->devx_nb); +	} -	xa_init(&table->event_xa); -	mutex_init(&table->event_xa_lock); -	MLX5_NB_INIT(&table->devx_nb, devx_event_notifier, NOTIFY_ANY); -	mlx5_eq_notifier_register(dev->mdev, &table->devx_nb); +	return 0;  } -void mlx5_ib_devx_cleanup_event_table(struct mlx5_ib_dev *dev) +void mlx5_ib_devx_cleanup(struct mlx5_ib_dev *dev)  {  	struct mlx5_devx_event_table *table = &dev->devx_event_table;  	struct devx_event_subscription *sub, *tmp; @@ -2380,17 +2387,21 @@ void mlx5_ib_devx_cleanup_event_table(struct mlx5_ib_dev *dev)  	void *entry;  	unsigned long id; -	mlx5_eq_notifier_unregister(dev->mdev, &table->devx_nb); -	mutex_lock(&dev->devx_event_table.event_xa_lock); -	xa_for_each(&table->event_xa, id, entry) { -		event = entry; -		list_for_each_entry_safe(sub, tmp, &event->unaffiliated_list, -					 xa_list) -			devx_cleanup_subscription(dev, sub); -		kfree(entry); +	if (dev->devx_whitelist_uid) { +		mlx5_eq_notifier_unregister(dev->mdev, &table->devx_nb); +		mutex_lock(&dev->devx_event_table.event_xa_lock); +		xa_for_each(&table->event_xa, id, entry) { +			event = entry; +			list_for_each_entry_safe( +				sub, tmp, &event->unaffiliated_list, xa_list) +				devx_cleanup_subscription(dev, sub); +			kfree(entry); +		} +		mutex_unlock(&dev->devx_event_table.event_xa_lock); +		xa_destroy(&table->event_xa); + +		mlx5_ib_devx_destroy(dev, dev->devx_whitelist_uid);  	} -	mutex_unlock(&dev->devx_event_table.event_xa_lock); -	xa_destroy(&table->event_xa);  }  static ssize_t devx_async_cmd_event_read(struct file *filp, char __user *buf,  | 
