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 Sun, Mar 10, 2019 at 08:10:35AM +0000, Haggai Eran wrote:
> 
> 
> 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 for looking, can I consider this a Reviewed-by?
Ira

> 
> 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