On Wed, 13 Mar 2019 15:15:21 +1100 "Alastair D'Silva" <alast...@au1.ibm.com> wrote:
> From: Alastair D'Silva <alast...@d-silva.org> > > 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 <alast...@d-silva.org> > --- > 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 > ) > ); >