Re: [PATCH v3 1/5] IB/mlx5: device resources must be created from ib_core

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




On 10/31/2018 10:24 AM, Jason Gunthorpe wrote:
> On Wed, Oct 31, 2018 at 02:42:38PM +0200, Shamir Rabinovitch wrote:
>> Bypassing ib_core leave the restrack and other fields uninitialized.
>>
>> Signed-off-by: Shamir Rabinovitch <shamir.rabinovitch@xxxxxxxxxx>
>>  drivers/infiniband/hw/mlx5/main.c | 30 +++++++++++++++---------------
>>  1 file changed, 15 insertions(+), 15 deletions(-)
>>
>> diff --git a/drivers/infiniband/hw/mlx5/main.c b/drivers/infiniband/hw/mlx5/main.c
>> index be701d4..97b44e9 100644
>> +++ b/drivers/infiniband/hw/mlx5/main.c
>> @@ -4565,26 +4565,19 @@ static int create_dev_resources(struct mlx5_ib_resources *devr)
>>  
>>  	mutex_init(&devr->mutex);
>>  
>> -	devr->p0 = mlx5_ib_alloc_pd(&dev->ib_dev, NULL, NULL);
>> +	/* must call ib_core here to initialize restrack! */
>> +	devr->p0 = ib_alloc_pd(&dev->ib_dev, 0);
>>  	if (IS_ERR(devr->p0)) {
>>  		ret = PTR_ERR(devr->p0);
>>  		goto error0;
>>  	}
>> -	devr->p0->device  = &dev->ib_dev;
>> -	devr->p0->uobject = NULL;
>> -	atomic_set(&devr->p0->usecnt, 0);
>>  
>> -	devr->c0 = mlx5_ib_create_cq(&dev->ib_dev, &cq_attr, NULL, NULL);
>> +	/* must call ib_core here to initialize restrack! */
>> +	devr->c0 = ib_create_cq(&dev->ib_dev, NULL, NULL, NULL, &cq_attr);
>>  	if (IS_ERR(devr->c0)) {
>>  		ret = PTR_ERR(devr->c0);
>>  		goto error1;
>>  	}
> 
> I think the issue here is that the device is not yet registered at
> this point.
>   
>> @@ -4662,14 +4656,16 @@ static int create_dev_resources(struct mlx5_ib_resources *devr)
>>  
>>  error5:
>>  	mlx5_ib_destroy_srq(devr->s0);
>> +	atomic_dec(&devr->p0->usecnt);
>> +	atomic_dec(&devr->s0->ext.cq->usecnt);
>>  error4:
>>  	mlx5_ib_dealloc_xrcd(devr->x1);
>>  error3:
>>  	mlx5_ib_dealloc_xrcd(devr->x0);
>>  error2:
>> -	mlx5_ib_destroy_cq(devr->c0);
>> +	ib_destroy_cq(devr->c0);
>>  error1:
>> -	mlx5_ib_dealloc_pd(devr->p0);
>> +	ib_dealloc_pd(devr->p0);
>>  error0:
>>  	return ret;
>>  }
>> @@ -4681,11 +4677,15 @@ static void destroy_dev_resources(struct mlx5_ib_resources *devr)
>>  	int port;
>>  
>>  	mlx5_ib_destroy_srq(devr->s1);
>> +	atomic_dec(&devr->p0->usecnt);
>> +	atomic_dec(&devr->s1->ext.cq->usecnt);
>>  	mlx5_ib_destroy_srq(devr->s0);
>> +	atomic_dec(&devr->p0->usecnt);
>> +	atomic_dec(&devr->s0->ext.cq->usecnt);
>>  	mlx5_ib_dealloc_xrcd(devr->x0);
>>  	mlx5_ib_dealloc_xrcd(devr->x1);
>> -	mlx5_ib_destroy_cq(devr->c0);
>> -	mlx5_ib_dealloc_pd(devr->p0);
>> +	ib_destroy_cq(devr->c0);
>> +	ib_dealloc_pd(devr->p0);
> 
> and has been de-registered by this point.
> 
> Calling ib_* functions on an unregistered device is not a good idea.
> 
> Mark?

Yep, I don't like it, any change to the create/destroy functions
will now need to take into account that:"Don't play with struct ib_device too much
as mlx5 does some funky stuff before the device is registered"

Seems like a bad idea.
 
> 
> Jason
> 

Mark




[Index of Archives]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Photo]     [Yosemite News]     [Yosemite Photos]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux