diff options
Diffstat (limited to 'drivers/misc/cxl/context.c')
| -rw-r--r-- | drivers/misc/cxl/context.c | 22 | 
1 files changed, 14 insertions, 8 deletions
diff --git a/drivers/misc/cxl/context.c b/drivers/misc/cxl/context.c index 5e506c19108a..3907387b6d15 100644 --- a/drivers/misc/cxl/context.c +++ b/drivers/misc/cxl/context.c @@ -34,8 +34,7 @@ struct cxl_context *cxl_context_alloc(void)  /*   * Initialises a CXL context.   */ -int cxl_context_init(struct cxl_context *ctx, struct cxl_afu *afu, bool master, -		     struct address_space *mapping) +int cxl_context_init(struct cxl_context *ctx, struct cxl_afu *afu, bool master)  {  	int i; @@ -44,7 +43,7 @@ int cxl_context_init(struct cxl_context *ctx, struct cxl_afu *afu, bool master,  	ctx->master = master;  	ctx->pid = ctx->glpid = NULL; /* Set in start work ioctl */  	mutex_init(&ctx->mapping_lock); -	ctx->mapping = mapping; +	ctx->mapping = NULL;  	/*  	 * Allocate the segment table before we put it in the IDR so that we @@ -114,16 +113,23 @@ int cxl_context_init(struct cxl_context *ctx, struct cxl_afu *afu, bool master,  	return 0;  } +void cxl_context_set_mapping(struct cxl_context *ctx, +			struct address_space *mapping) +{ +	mutex_lock(&ctx->mapping_lock); +	ctx->mapping = mapping; +	mutex_unlock(&ctx->mapping_lock); +} +  static int cxl_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf)  {  	struct cxl_context *ctx = vma->vm_file->private_data; -	unsigned long address = (unsigned long)vmf->virtual_address;  	u64 area, offset;  	offset = vmf->pgoff << PAGE_SHIFT;  	pr_devel("%s: pe: %i address: 0x%lx offset: 0x%llx\n", -			__func__, ctx->pe, address, offset); +			__func__, ctx->pe, vmf->address, offset);  	if (ctx->afu->current_mode == CXL_MODE_DEDICATED) {  		area = ctx->afu->psn_phys; @@ -155,7 +161,7 @@ static int cxl_mmap_fault(struct vm_area_struct *vma, struct vm_fault *vmf)  		return VM_FAULT_SIGBUS;  	} -	vm_insert_pfn(vma, address, (area + offset) >> PAGE_SHIFT); +	vm_insert_pfn(vma, vmf->address, (area + offset) >> PAGE_SHIFT);  	mutex_unlock(&ctx->status_mutex); @@ -300,8 +306,6 @@ static void reclaim_ctx(struct rcu_head *rcu)  	if (ctx->ff_page)  		__free_page(ctx->ff_page);  	ctx->sstp = NULL; -	if (ctx->kernelapi) -		kfree(ctx->mapping);  	kfree(ctx->irq_bitmap); @@ -313,6 +317,8 @@ static void reclaim_ctx(struct rcu_head *rcu)  void cxl_context_free(struct cxl_context *ctx)  { +	if (ctx->kernelapi && ctx->mapping) +		cxl_release_mapping(ctx);  	mutex_lock(&ctx->afu->contexts_lock);  	idr_remove(&ctx->afu->contexts_idr, ctx->pe);  	mutex_unlock(&ctx->afu->contexts_lock);  |