Re: [RFC PATCH V2] IB/core: Ensure an invalidate_range callback on ODP MR

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

 




On 3/6/2019 10:46 PM, John Hubbard wrote:
> On 3/6/19 3:24 AM, ira.weiny@xxxxxxxxx wrote:
>> From: Ira Weiny <ira.weiny@xxxxxxxxx>
>>
>> No device supports ODP MR without an invalidate_range callback.
>>
>> Warn on any any device which attempts to support ODP without
>> supplying this callback.
>>
>> Then we can remove the checks for the callback within the code.
>>
>> This stems from the discussion
>>
>> https://www.spinics.net/lists/linux-rdma/msg76460.html
>>
>> ...which concluded this code was no longer necessary.
>>
>> Compile tested only
>>
>> CC: Haggai Eran <haggaie@xxxxxxxxxxxx>
>> CC: Artemy Kovalyov <artemyko@xxxxxxxxxxxx>
>> CC: John Hubbard <jhubbard@xxxxxxxxxx>
>> Signed-off-by: Ira Weiny <ira.weiny@xxxxxxxxx>
>>
>> ---
>> Changes from V1:
>> 	remove stored_page logic which was also unnecessary
>> 	remove unnecessary put_page
>>
>>   drivers/infiniband/core/umem.c     |  5 +++++
>>   drivers/infiniband/core/umem_odp.c | 13 +++----------
>>   2 files changed, 8 insertions(+), 10 deletions(-)
>>
>> diff --git a/drivers/infiniband/core/umem.c b/drivers/infiniband/core/umem.c
>> index fe5551562dbc..89a7d57f9fa5 100644
>> --- a/drivers/infiniband/core/umem.c
>> +++ b/drivers/infiniband/core/umem.c
>> @@ -138,6 +138,11 @@ struct ib_umem *ib_umem_get(struct ib_udata *udata, unsigned long addr,
>>   	mmgrab(mm);
>>   
>>   	if (access & IB_ACCESS_ON_DEMAND) {
>> +		if (WARN_ON_ONCE(!context->invalidate_range)) {
>> +			ret = -EINVAL;
>> +			goto umem_kfree;
>> +		}
>> +
>>   		ret = ib_umem_odp_get(to_ib_umem_odp(umem), access);
>>   		if (ret)
>>   			goto umem_kfree;
>> diff --git a/drivers/infiniband/core/umem_odp.c b/drivers/infiniband/core/umem_odp.c
>> index 577f1b12bff4..ec0ed9190ab6 100644
>> --- a/drivers/infiniband/core/umem_odp.c
>> +++ b/drivers/infiniband/core/umem_odp.c
>> @@ -241,7 +241,7 @@ static struct ib_ucontext_per_mm *alloc_per_mm(struct ib_ucontext *ctx,
>>   	per_mm->mm = mm;
>>   	per_mm->umem_tree = RB_ROOT_CACHED;
>>   	init_rwsem(&per_mm->umem_rwsem);
>> -	per_mm->active = ctx->invalidate_range;
>> +	per_mm->active = true;
>>   
>>   	rcu_read_lock();
>>   	per_mm->tgid = get_task_pid(current->group_leader, PIDTYPE_PID);
>> @@ -503,7 +503,6 @@ static int ib_umem_odp_map_dma_single_page(
>>   	struct ib_umem *umem = &umem_odp->umem;
>>   	struct ib_device *dev = umem->context->device;
>>   	dma_addr_t dma_addr;
>> -	int stored_page = 0;
>>   	int remove_existing_mapping = 0;
>>   	int ret = 0;
>>   
>> @@ -528,7 +527,6 @@ static int ib_umem_odp_map_dma_single_page(
>>   		umem_odp->dma_list[page_index] = dma_addr | access_mask;
>>   		umem_odp->page_list[page_index] = page;
>>   		umem->npages++;
>> -		stored_page = 1;
>>   	} else if (umem_odp->page_list[page_index] == page) {
>>   		umem_odp->dma_list[page_index] |= access_mask;
>>   	} else {
>> @@ -540,11 +538,9 @@ static int ib_umem_odp_map_dma_single_page(
>>   	}
>>   
>>   out:
>> -	/* On Demand Paging - avoid pinning the page */
>> -	if (umem->context->invalidate_range || !stored_page)
>> -		put_page(page);
>> +	put_page(page);
>>   
>> -	if (remove_existing_mapping && umem->context->invalidate_range) {
>> +	if (remove_existing_mapping) {
>>   		ib_umem_notifier_start_account(umem_odp);
>>   		umem->context->invalidate_range(
>>   			umem_odp,
>> @@ -751,9 +747,6 @@ void ib_umem_odp_unmap_dma_pages(struct ib_umem_odp *umem_odp, u64 virt,
>>   				 */
>>   				set_page_dirty(head_page);
>>   			}
>> -			/* on demand pinning support */
>> -			if (!umem->context->invalidate_range)
>> -				put_page(page);
>>   			umem_odp->page_list[idx] = NULL;
>>   			umem_odp->dma_list[idx] = 0;
>>   			umem->npages--;
>>
> 
> Hi Ira,
> 
> This all looks logically correct and consistent, and it is also what the
> discussion ended up recommending. Although I'm not a qualified reviewer of
> the larger code base, I think this patch is correct, FWIW.

Looks good to me as well.

Thanks,
Haggai




[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