Message ID | 20170927004317.9671-1-andrew.donnellan@au1.ibm.com (mailing list archive) |
---|---|
State | Not Applicable |
Headers | show |
Series | [4.4] cxl: Fix driver use count | expand |
On Wed, Sep 27, 2017 at 10:43:17AM +1000, Andrew Donnellan wrote: > From: Frederic Barrat <fbarrat@linux.vnet.ibm.com> > > commit 197267d0356004a31c4d6b6336598f5dff3301e1 upstream. > > 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@linux.vnet.ibm.com> > Cc: stable@vger.kernel.org # v4.2+ > Fixes: 7bb5d91a4dda ("cxl: Rework context lifetimes") > Acked-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com> > Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> > [ajd: backport to stable v4.4 tree] > Signed-off-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com> Thanks for this and the 4.9 backport. greg k-h
diff --git a/drivers/misc/cxl/api.c b/drivers/misc/cxl/api.c index ea3eeb7011e1..690eb1a18caf 100644 --- a/drivers/misc/cxl/api.c +++ b/drivers/misc/cxl/api.c @@ -176,6 +176,10 @@ int cxl_start_context(struct cxl_context *ctx, u64 wed, kernel = false; } + /* + * Increment driver use count. Enables global TLBIs for hash + * and callbacks to handle the segment table + */ cxl_ctx_get(); if ((rc = cxl_attach_process(ctx, kernel, wed , 0))) { diff --git a/drivers/misc/cxl/file.c b/drivers/misc/cxl/file.c index 10a02934bfc0..013558f4da4f 100644 --- a/drivers/misc/cxl/file.c +++ b/drivers/misc/cxl/file.c @@ -94,7 +94,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; @@ -205,11 +204,18 @@ static long afu_ioctl_start_work(struct cxl_context *ctx, ctx->pid = get_task_pid(current, PIDTYPE_PID); ctx->glpid = get_task_pid(current->group_leader, PIDTYPE_PID); + /* + * Increment driver use count. Enables global TLBIs for hash + * and callbacks to handle the segment table + */ + cxl_ctx_get(); + trace_cxl_attach(ctx, work.work_element_descriptor, work.num_interrupts, amr); if ((rc = cxl_attach_process(ctx, false, work.work_element_descriptor, amr))) { afu_release_irqs(ctx, ctx); + cxl_ctx_put(); goto out; }