From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 709F9C43381 for ; Fri, 15 Mar 2019 14:02:20 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 3CFDA217F5 for ; Fri, 15 Mar 2019 14:02:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729223AbfCOOCS (ORCPT ); Fri, 15 Mar 2019 10:02:18 -0400 Received: from 15.mo7.mail-out.ovh.net ([87.98.180.21]:47591 "EHLO 15.mo7.mail-out.ovh.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729001AbfCOOCS (ORCPT ); Fri, 15 Mar 2019 10:02:18 -0400 X-Greylist: delayed 325 seconds by postgrey-1.27 at vger.kernel.org; Fri, 15 Mar 2019 10:02:14 EDT Received: from player793.ha.ovh.net (unknown [10.109.146.20]) by mo7.mail-out.ovh.net (Postfix) with ESMTP id 88DCB109DE9 for ; Fri, 15 Mar 2019 14:56:48 +0100 (CET) Received: from kaod.org (lns-bzn-46-82-253-208-248.adsl.proxad.net [82.253.208.248]) (Authenticated sender: groug@kaod.org) by player793.ha.ovh.net (Postfix) with ESMTPSA id 600B43CE633C; Fri, 15 Mar 2019 13:56:40 +0000 (UTC) Date: Fri, 15 Mar 2019 14:56:39 +0100 From: Greg Kurz To: "Alastair D'Silva" Cc: Arnd Bergmann , Greg Kroah-Hartman , linux-kernel@vger.kernel.org, Andrew Donnellan , Alastair D'Silva , Frederic Barrat , linuxppc-dev@lists.ozlabs.org Subject: Re: [PATCH 6/7] ocxl: afu_irq only deals with IRQ IDs, not offsets Message-ID: <20190315145639.4ae9e257@bahia.lab.toulouse-stg.fr.ibm.com> In-Reply-To: <20190313041524.14644-7-alastair@au1.ibm.com> References: <20190313041524.14644-1-alastair@au1.ibm.com> <20190313041524.14644-7-alastair@au1.ibm.com> X-Mailer: Claws Mail 3.16.0 (GTK+ 2.24.32; x86_64-redhat-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Ovh-Tracer-Id: 12619086156981049675 X-VR-SPAMSTATE: OK X-VR-SPAMSCORE: -100 X-VR-SPAMCAUSE: gggruggvucftvghtrhhoucdtuddrgedutddrheehgdehlecutefuodetggdotefrodftvfcurfhrohhfihhlvgemucfqggfjpdevjffgvefmvefgnecuuegrihhlohhuthemucehtddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmd Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, 13 Mar 2019 15:15:21 +1100 "Alastair D'Silva" wrote: > From: Alastair D'Silva > > The use of offsets is required only in the frontend, so alter > the IRQ API to only work with IRQ IDs in the backend. > > Signed-off-by: Alastair D'Silva > --- > drivers/misc/ocxl/afu_irq.c | 31 +++++++++++++------------------ > drivers/misc/ocxl/context.c | 7 +++++-- > drivers/misc/ocxl/file.c | 13 ++++++++----- > drivers/misc/ocxl/ocxl_internal.h | 10 ++++++---- > drivers/misc/ocxl/trace.h | 12 ++++-------- > 5 files changed, 36 insertions(+), 37 deletions(-) > > diff --git a/drivers/misc/ocxl/afu_irq.c b/drivers/misc/ocxl/afu_irq.c > index 11ab996657a2..1885c472df58 100644 > --- a/drivers/misc/ocxl/afu_irq.c > +++ b/drivers/misc/ocxl/afu_irq.c > @@ -14,14 +14,14 @@ struct afu_irq { > struct eventfd_ctx *ev_ctx; > }; > > -static int irq_offset_to_id(struct ocxl_context *ctx, u64 offset) > +int ocxl_irq_offset_to_id(struct ocxl_context *ctx, u64 offset) > { > return (offset - ctx->afu->irq_base_offset) >> PAGE_SHIFT; > } > > -static u64 irq_id_to_offset(struct ocxl_context *ctx, int id) > +u64 ocxl_irq_id_to_offset(struct ocxl_context *ctx, int irq_id) > { > - return ctx->afu->irq_base_offset + (id << PAGE_SHIFT); > + return ctx->afu->irq_base_offset + (irq_id << PAGE_SHIFT); > } > > static irqreturn_t afu_irq_handler(int virq, void *data) > @@ -69,7 +69,7 @@ static void release_afu_irq(struct afu_irq *irq) > kfree(irq->name); > } > > -int ocxl_afu_irq_alloc(struct ocxl_context *ctx, u64 *irq_offset) > +int ocxl_afu_irq_alloc(struct ocxl_context *ctx, int *irq_id) > { > struct afu_irq *irq; > int rc; > @@ -101,10 +101,7 @@ int ocxl_afu_irq_alloc(struct ocxl_context *ctx, u64 *irq_offset) > if (rc) > goto err_alloc; > > - *irq_offset = irq_id_to_offset(ctx, irq->id); This should be replaced by: *irq_id = irq->id; > - > - trace_ocxl_afu_irq_alloc(ctx->pasid, irq->id, irq->virq, irq->hw_irq, > - *irq_offset); > + trace_ocxl_afu_irq_alloc(ctx->pasid, irq->id, irq->virq, irq->hw_irq); > mutex_unlock(&ctx->irq_lock); > return 0; > > @@ -123,7 +120,7 @@ static void afu_irq_free(struct afu_irq *irq, struct ocxl_context *ctx) > trace_ocxl_afu_irq_free(ctx->pasid, irq->id); > if (ctx->mapping) > unmap_mapping_range(ctx->mapping, > - irq_id_to_offset(ctx, irq->id), > + ocxl_irq_id_to_offset(ctx, irq->id), > 1 << PAGE_SHIFT, 1); > release_afu_irq(irq); > if (irq->ev_ctx) > @@ -132,14 +129,13 @@ static void afu_irq_free(struct afu_irq *irq, struct ocxl_context *ctx) > kfree(irq); > } > > -int ocxl_afu_irq_free(struct ocxl_context *ctx, u64 irq_offset) > +int ocxl_afu_irq_free(struct ocxl_context *ctx, int irq_id) > { > struct afu_irq *irq; > - int id = irq_offset_to_id(ctx, irq_offset); > > mutex_lock(&ctx->irq_lock); > > - irq = idr_find(&ctx->irq_idr, id); > + irq = idr_find(&ctx->irq_idr, irq_id); > if (!irq) { > mutex_unlock(&ctx->irq_lock); > return -EINVAL; > @@ -161,14 +157,14 @@ void ocxl_afu_irq_free_all(struct ocxl_context *ctx) > mutex_unlock(&ctx->irq_lock); > } > > -int ocxl_afu_irq_set_fd(struct ocxl_context *ctx, u64 irq_offset, int eventfd) > +int ocxl_afu_irq_set_fd(struct ocxl_context *ctx, int irq_id, int eventfd) > { > struct afu_irq *irq; > struct eventfd_ctx *ev_ctx; > - int rc = 0, id = irq_offset_to_id(ctx, irq_offset); > + int rc = 0; > > mutex_lock(&ctx->irq_lock); > - irq = idr_find(&ctx->irq_idr, id); > + irq = idr_find(&ctx->irq_idr, irq_id); > if (!irq) { > rc = -EINVAL; > goto unlock; > @@ -186,14 +182,13 @@ int ocxl_afu_irq_set_fd(struct ocxl_context *ctx, u64 irq_offset, int eventfd) > return rc; > } > > -u64 ocxl_afu_irq_get_addr(struct ocxl_context *ctx, u64 irq_offset) > +u64 ocxl_afu_irq_get_addr(struct ocxl_context *ctx, int irq_id) > { > struct afu_irq *irq; > - int id = irq_offset_to_id(ctx, irq_offset); > u64 addr = 0; > > mutex_lock(&ctx->irq_lock); > - irq = idr_find(&ctx->irq_idr, id); > + irq = idr_find(&ctx->irq_idr, irq_id); > if (irq) > addr = irq->trigger_page; > mutex_unlock(&ctx->irq_lock); > diff --git a/drivers/misc/ocxl/context.c b/drivers/misc/ocxl/context.c > index 9a37e9632cd9..c04887591837 100644 > --- a/drivers/misc/ocxl/context.c > +++ b/drivers/misc/ocxl/context.c > @@ -93,8 +93,9 @@ static vm_fault_t map_afu_irq(struct vm_area_struct *vma, unsigned long address, > u64 offset, struct ocxl_context *ctx) > { > u64 trigger_addr; > + int irq_id = ocxl_irq_offset_to_id(ctx, offset); > > - trigger_addr = ocxl_afu_irq_get_addr(ctx, offset); > + trigger_addr = ocxl_afu_irq_get_addr(ctx, irq_id); > if (!trigger_addr) > return VM_FAULT_SIGBUS; > > @@ -154,12 +155,14 @@ static const struct vm_operations_struct ocxl_vmops = { > static int check_mmap_afu_irq(struct ocxl_context *ctx, > struct vm_area_struct *vma) > { > + int irq_id = ocxl_irq_offset_to_id(ctx, vma->vm_pgoff << PAGE_SHIFT); > + > /* only one page */ > if (vma_pages(vma) != 1) > return -EINVAL; > > /* check offset validty */ > - if (!ocxl_afu_irq_get_addr(ctx, vma->vm_pgoff << PAGE_SHIFT)) > + if (!ocxl_afu_irq_get_addr(ctx, irq_id)) > return -EINVAL; > > /* > diff --git a/drivers/misc/ocxl/file.c b/drivers/misc/ocxl/file.c > index 424bb0b40afb..d28618c161de 100644 > --- a/drivers/misc/ocxl/file.c > +++ b/drivers/misc/ocxl/file.c > @@ -197,6 +197,7 @@ static long afu_ioctl(struct file *file, unsigned int cmd, > { > struct ocxl_context *ctx = file->private_data; > struct ocxl_ioctl_irq_fd irq_fd; > + int irq_id; > u64 irq_offset; > long rc; > bool closed; > @@ -218,12 +219,13 @@ static long afu_ioctl(struct file *file, unsigned int cmd, > break; > > case OCXL_IOCTL_IRQ_ALLOC: > - rc = ocxl_afu_irq_alloc(ctx, &irq_offset); > + rc = ocxl_afu_irq_alloc(ctx, &irq_id); > if (!rc) { > + irq_offset = ocxl_irq_id_to_offset(ctx, irq_id); > rc = copy_to_user((u64 __user *) args, &irq_offset, > sizeof(irq_offset)); > if (rc) { > - ocxl_afu_irq_free(ctx, irq_offset); > + ocxl_afu_irq_free(ctx, irq_id); > return -EFAULT; > } > } > @@ -234,7 +236,8 @@ static long afu_ioctl(struct file *file, unsigned int cmd, > sizeof(irq_offset)); > if (rc) > return -EFAULT; > - rc = ocxl_afu_irq_free(ctx, irq_offset); > + irq_id = ocxl_irq_offset_to_id(ctx, irq_offset); > + rc = ocxl_afu_irq_free(ctx, irq_id); > break; > > case OCXL_IOCTL_IRQ_SET_FD: > @@ -244,8 +247,8 @@ static long afu_ioctl(struct file *file, unsigned int cmd, > return -EFAULT; > if (irq_fd.reserved) > return -EINVAL; > - rc = ocxl_afu_irq_set_fd(ctx, irq_fd.irq_offset, > - irq_fd.eventfd); > + irq_id = ocxl_irq_offset_to_id(ctx, irq_fd.irq_offset); > + rc = ocxl_afu_irq_set_fd(ctx, irq_id, irq_fd.eventfd); > break; > > case OCXL_IOCTL_GET_METADATA: > diff --git a/drivers/misc/ocxl/ocxl_internal.h b/drivers/misc/ocxl/ocxl_internal.h > index 4fc7e9597ede..871155b464da 100644 > --- a/drivers/misc/ocxl/ocxl_internal.h > +++ b/drivers/misc/ocxl/ocxl_internal.h > @@ -140,12 +140,14 @@ void ocxl_context_detach_all(struct ocxl_afu *afu); > int ocxl_sysfs_register_afu(struct ocxl_afu *afu); > void ocxl_sysfs_unregister_afu(struct ocxl_afu *afu); > > -int ocxl_afu_irq_alloc(struct ocxl_context *ctx, u64 *irq_offset); > -int ocxl_afu_irq_free(struct ocxl_context *ctx, u64 irq_offset); > +int ocxl_irq_offset_to_id(struct ocxl_context *ctx, u64 offset); > +u64 ocxl_irq_id_to_offset(struct ocxl_context *ctx, int irq_id); > +int ocxl_afu_irq_alloc(struct ocxl_context *ctx, int *irq_id); > +int ocxl_afu_irq_free(struct ocxl_context *ctx, int irq_id); > void ocxl_afu_irq_free_all(struct ocxl_context *ctx); > -int ocxl_afu_irq_set_fd(struct ocxl_context *ctx, u64 irq_offset, > +int ocxl_afu_irq_set_fd(struct ocxl_context *ctx, int irq_id, > int eventfd); > -u64 ocxl_afu_irq_get_addr(struct ocxl_context *ctx, u64 irq_offset); > +u64 ocxl_afu_irq_get_addr(struct ocxl_context *ctx, int irq_id); > > /** > * Free an AFU > diff --git a/drivers/misc/ocxl/trace.h b/drivers/misc/ocxl/trace.h > index 68bf2f173a1a..a081e644f5f3 100644 > --- a/drivers/misc/ocxl/trace.h > +++ b/drivers/misc/ocxl/trace.h > @@ -107,16 +107,14 @@ DEFINE_EVENT(ocxl_fault_handler, ocxl_fault_ack, > ); > > TRACE_EVENT(ocxl_afu_irq_alloc, > - TP_PROTO(int pasid, int irq_id, unsigned int virq, int hw_irq, > - u64 irq_offset), > - TP_ARGS(pasid, irq_id, virq, hw_irq, irq_offset), > + TP_PROTO(int pasid, int irq_id, unsigned int virq, int hw_irq), > + TP_ARGS(pasid, irq_id, virq, hw_irq), > > TP_STRUCT__entry( > __field(int, pasid) > __field(int, irq_id) > __field(unsigned int, virq) > __field(int, hw_irq) > - __field(u64, irq_offset) > ), > > TP_fast_assign( > @@ -124,15 +122,13 @@ TRACE_EVENT(ocxl_afu_irq_alloc, > __entry->irq_id = irq_id; > __entry->virq = virq; > __entry->hw_irq = hw_irq; > - __entry->irq_offset = irq_offset; > ), > > - TP_printk("pasid=%#x irq_id=%d virq=%u hw_irq=%d irq_offset=%#llx", > + TP_printk("pasid=%#x irq_id=%d virq=%u hw_irq=%d", > __entry->pasid, > __entry->irq_id, > __entry->virq, > - __entry->hw_irq, > - __entry->irq_offset > + __entry->hw_irq > ) > ); >