[PATCH 1/2] cxl: Fix driver use count

Andrew Donnellan andrew.donnellan at au1.ibm.com
Mon Aug 28 19:35:01 AEST 2017


On 28/08/17 18:47, Frederic Barrat wrote:
> cxl keeps a driver use count, which is used with the hash memory model
> on p8 to know when to upgrade local TLBIs to global and to trigger
> callbacks to manage the MMU for PSL8.
> 
> If a process opens a context and closes without attaching or fails the
> attachment, the driver use count is never decremented. As a
> consequence, TLB invalidations remain global, even if there are no
> active cxl contexts.
> 
> We should increment the driver use count when the process is attaching
> to the cxl adapter, and not on open. It's not needed before the
> adapter starts using the context and the use count is decremented on
> the detach path, so it makes more sense.
> 
> It affects only the user api. The kernel api is already doing The
> Right Thing.
> 
> Signed-off-by: Frederic Barrat <fbarrat at linux.vnet.ibm.com>
> Cc: stable at vger.kernel.org # v4.2+
> Fixes: 7bb5d91a4dda ("cxl: Rework context lifetimes")

A couple of comment typos.

Acked-by: Andrew Donnellan <andrew.donnellan at au1.ibm.com>

> ---
>   drivers/misc/cxl/api.c  | 4 ++++
>   drivers/misc/cxl/file.c | 8 +++++++-
>   2 files changed, 11 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/misc/cxl/api.c b/drivers/misc/cxl/api.c
> index 1a138c83f877..e0dfd1eadd70 100644
> --- a/drivers/misc/cxl/api.c
> +++ b/drivers/misc/cxl/api.c
> @@ -336,6 +336,10 @@ int cxl_start_context(struct cxl_context *ctx, u64 wed,
>   			mmput(ctx->mm);
>   	}
>   
> +	/*
> +	 * Increment driver use count. Enables global TLBIs for hash
> +	 * and callacks to handle the segment table

callbacks

> +	 */
>   	cxl_ctx_get();
>   
>   	if ((rc = cxl_ops->attach_process(ctx, kernel, wed, 0))) {
> diff --git a/drivers/misc/cxl/file.c b/drivers/misc/cxl/file.c
> index 0761271d68c5..b76a491a485d 100644
> --- a/drivers/misc/cxl/file.c
> +++ b/drivers/misc/cxl/file.c
> @@ -95,7 +95,6 @@ static int __afu_open(struct inode *inode, struct file *file, bool master)
>   
>   	pr_devel("afu_open pe: %i\n", ctx->pe);
>   	file->private_data = ctx;
> -	cxl_ctx_get();
>   
>   	/* indicate success */
>   	rc = 0;
> @@ -225,6 +224,12 @@ static long afu_ioctl_start_work(struct cxl_context *ctx,
>   	if (ctx->mm)
>   		mmput(ctx->mm);
>   
> +	/*
> +	 * Increment driver use count. Enables global TLBIs for hash
> +	 * and callacks to handle the segment table

callbacks

> +	 */
> +	cxl_ctx_get();
> +
>   	trace_cxl_attach(ctx, work.work_element_descriptor, work.num_interrupts, amr);
>   
>   	if ((rc = cxl_ops->attach_process(ctx, false, work.work_element_descriptor,
> @@ -233,6 +238,7 @@ static long afu_ioctl_start_work(struct cxl_context *ctx,
>   		cxl_adapter_context_put(ctx->afu->adapter);
>   		put_pid(ctx->pid);
>   		ctx->pid = NULL;
> +		cxl_ctx_put();
>   		cxl_context_mm_count_put(ctx);
>   		goto out;
>   	}
> 

-- 
Andrew Donnellan              OzLabs, ADL Canberra
andrew.donnellan at au1.ibm.com  IBM Australia Limited



More information about the Linuxppc-dev mailing list