Messages in this thread | | | Subject | Re: [PATCH] ocxl: Allow contexts to be attached with a NULL mm | From | Andrew Donnellan <> | Date | Tue, 18 Jun 2019 11:50:59 +1000 |
| |
On 17/6/19 2:41 pm, Alastair D'Silva wrote: > From: Alastair D'Silva <alastair@d-silva.org> > > If an OpenCAPI context is to be used directly by a kernel driver, there > may not be a suitable mm to use. > > The patch makes the mm parameter to ocxl_context_attach optional. > > Signed-off-by: Alastair D'Silva <alastair@d-silva.org>
The one issue I can see here is that using mm == NULL bypasses our method of enabling/disabling global TLBIs in mm_context_add_copro().
Discussing this privately with Alastair and Fred - this should be fine, but perhaps we should document that.
> --- > drivers/misc/ocxl/context.c | 9 ++++++--- > drivers/misc/ocxl/link.c | 12 ++++++++---- > 2 files changed, 14 insertions(+), 7 deletions(-) > > diff --git a/drivers/misc/ocxl/context.c b/drivers/misc/ocxl/context.c > index bab9c9364184..994563a078eb 100644 > --- a/drivers/misc/ocxl/context.c > +++ b/drivers/misc/ocxl/context.c > @@ -69,6 +69,7 @@ static void xsl_fault_error(void *data, u64 addr, u64 dsisr) > int ocxl_context_attach(struct ocxl_context *ctx, u64 amr, struct mm_struct *mm) > { > int rc; > + unsigned long pidr = 0; > > // Locks both status & tidr > mutex_lock(&ctx->status_mutex); > @@ -77,9 +78,11 @@ int ocxl_context_attach(struct ocxl_context *ctx, u64 amr, struct mm_struct *mm) > goto out; > } > > - rc = ocxl_link_add_pe(ctx->afu->fn->link, ctx->pasid, > - mm->context.id, ctx->tidr, amr, mm, > - xsl_fault_error, ctx); > + if (mm) > + pidr = mm->context.id; > + > + rc = ocxl_link_add_pe(ctx->afu->fn->link, ctx->pasid, pidr, ctx->tidr, > + amr, mm, xsl_fault_error, ctx); > if (rc) > goto out; > > diff --git a/drivers/misc/ocxl/link.c b/drivers/misc/ocxl/link.c > index cce5b0d64505..43542f124807 100644 > --- a/drivers/misc/ocxl/link.c > +++ b/drivers/misc/ocxl/link.c > @@ -523,7 +523,8 @@ int ocxl_link_add_pe(void *link_handle, int pasid, u32 pidr, u32 tidr, > pe->amr = cpu_to_be64(amr); > pe->software_state = cpu_to_be32(SPA_PE_VALID); > > - mm_context_add_copro(mm); > + if (mm) > + mm_context_add_copro(mm); > /* > * Barrier is to make sure PE is visible in the SPA before it > * is used by the device. It also helps with the global TLBI > @@ -546,7 +547,8 @@ int ocxl_link_add_pe(void *link_handle, int pasid, u32 pidr, u32 tidr, > * have a reference on mm_users. Incrementing mm_count solves > * the problem. > */ > - mmgrab(mm); > + if (mm) > + mmgrab(mm); > trace_ocxl_context_add(current->pid, spa->spa_mem, pasid, pidr, tidr); > unlock: > mutex_unlock(&spa->spa_lock); > @@ -652,8 +654,10 @@ int ocxl_link_remove_pe(void *link_handle, int pasid) > if (!pe_data) { > WARN(1, "Couldn't find pe data when removing PE\n"); > } else { > - mm_context_remove_copro(pe_data->mm); > - mmdrop(pe_data->mm); > + if (pe_data->mm) { > + mm_context_remove_copro(pe_data->mm); > + mmdrop(pe_data->mm); > + } > kfree_rcu(pe_data, rcu); > } > unlock: >
-- Andrew Donnellan OzLabs, ADL Canberra ajd@linux.ibm.com IBM Australia Limited
| |