Commit 2ec3b7ed authored by Alastair D'Silva's avatar Alastair D'Silva Committed by Michael Ellerman

ocxl: afu_irq only deals with IRQ IDs, not offsets

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: default avatarAlastair D'Silva <alastair@d-silva.org>
Acked-by: default avatarFrederic Barrat <fbarrat@linux.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent b9721d27
...@@ -14,14 +14,14 @@ struct afu_irq { ...@@ -14,14 +14,14 @@ struct afu_irq {
struct eventfd_ctx *ev_ctx; 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; 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) static irqreturn_t afu_irq_handler(int virq, void *data)
...@@ -69,7 +69,7 @@ static void release_afu_irq(struct afu_irq *irq) ...@@ -69,7 +69,7 @@ static void release_afu_irq(struct afu_irq *irq)
kfree(irq->name); 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; struct afu_irq *irq;
int rc; int rc;
...@@ -101,11 +101,11 @@ int ocxl_afu_irq_alloc(struct ocxl_context *ctx, u64 *irq_offset) ...@@ -101,11 +101,11 @@ int ocxl_afu_irq_alloc(struct ocxl_context *ctx, u64 *irq_offset)
if (rc) if (rc)
goto err_alloc; goto err_alloc;
*irq_offset = irq_id_to_offset(ctx, irq->id); trace_ocxl_afu_irq_alloc(ctx->pasid, irq->id, irq->virq, irq->hw_irq);
trace_ocxl_afu_irq_alloc(ctx->pasid, irq->id, irq->virq, irq->hw_irq,
*irq_offset);
mutex_unlock(&ctx->irq_lock); mutex_unlock(&ctx->irq_lock);
*irq_id = irq->id;
return 0; return 0;
err_alloc: err_alloc:
...@@ -123,7 +123,7 @@ static void afu_irq_free(struct afu_irq *irq, struct ocxl_context *ctx) ...@@ -123,7 +123,7 @@ static void afu_irq_free(struct afu_irq *irq, struct ocxl_context *ctx)
trace_ocxl_afu_irq_free(ctx->pasid, irq->id); trace_ocxl_afu_irq_free(ctx->pasid, irq->id);
if (ctx->mapping) if (ctx->mapping)
unmap_mapping_range(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); 1 << PAGE_SHIFT, 1);
release_afu_irq(irq); release_afu_irq(irq);
if (irq->ev_ctx) if (irq->ev_ctx)
...@@ -132,14 +132,13 @@ static void afu_irq_free(struct afu_irq *irq, struct ocxl_context *ctx) ...@@ -132,14 +132,13 @@ static void afu_irq_free(struct afu_irq *irq, struct ocxl_context *ctx)
kfree(irq); 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; struct afu_irq *irq;
int id = irq_offset_to_id(ctx, irq_offset);
mutex_lock(&ctx->irq_lock); mutex_lock(&ctx->irq_lock);
irq = idr_find(&ctx->irq_idr, id); irq = idr_find(&ctx->irq_idr, irq_id);
if (!irq) { if (!irq) {
mutex_unlock(&ctx->irq_lock); mutex_unlock(&ctx->irq_lock);
return -EINVAL; return -EINVAL;
...@@ -161,14 +160,14 @@ void ocxl_afu_irq_free_all(struct ocxl_context *ctx) ...@@ -161,14 +160,14 @@ void ocxl_afu_irq_free_all(struct ocxl_context *ctx)
mutex_unlock(&ctx->irq_lock); 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 afu_irq *irq;
struct eventfd_ctx *ev_ctx; struct eventfd_ctx *ev_ctx;
int rc = 0, id = irq_offset_to_id(ctx, irq_offset); int rc = 0;
mutex_lock(&ctx->irq_lock); mutex_lock(&ctx->irq_lock);
irq = idr_find(&ctx->irq_idr, id); irq = idr_find(&ctx->irq_idr, irq_id);
if (!irq) { if (!irq) {
rc = -EINVAL; rc = -EINVAL;
goto unlock; goto unlock;
...@@ -186,14 +185,13 @@ int ocxl_afu_irq_set_fd(struct ocxl_context *ctx, u64 irq_offset, int eventfd) ...@@ -186,14 +185,13 @@ int ocxl_afu_irq_set_fd(struct ocxl_context *ctx, u64 irq_offset, int eventfd)
return rc; 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; struct afu_irq *irq;
int id = irq_offset_to_id(ctx, irq_offset);
u64 addr = 0; u64 addr = 0;
mutex_lock(&ctx->irq_lock); mutex_lock(&ctx->irq_lock);
irq = idr_find(&ctx->irq_idr, id); irq = idr_find(&ctx->irq_idr, irq_id);
if (irq) if (irq)
addr = irq->trigger_page; addr = irq->trigger_page;
mutex_unlock(&ctx->irq_lock); mutex_unlock(&ctx->irq_lock);
......
...@@ -94,8 +94,9 @@ static vm_fault_t map_afu_irq(struct vm_area_struct *vma, unsigned long address, ...@@ -94,8 +94,9 @@ static vm_fault_t map_afu_irq(struct vm_area_struct *vma, unsigned long address,
u64 offset, struct ocxl_context *ctx) u64 offset, struct ocxl_context *ctx)
{ {
u64 trigger_addr; 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) if (!trigger_addr)
return VM_FAULT_SIGBUS; return VM_FAULT_SIGBUS;
...@@ -155,12 +156,14 @@ static const struct vm_operations_struct ocxl_vmops = { ...@@ -155,12 +156,14 @@ static const struct vm_operations_struct ocxl_vmops = {
static int check_mmap_afu_irq(struct ocxl_context *ctx, static int check_mmap_afu_irq(struct ocxl_context *ctx,
struct vm_area_struct *vma) struct vm_area_struct *vma)
{ {
int irq_id = ocxl_irq_offset_to_id(ctx, vma->vm_pgoff << PAGE_SHIFT);
/* only one page */ /* only one page */
if (vma_pages(vma) != 1) if (vma_pages(vma) != 1)
return -EINVAL; return -EINVAL;
/* check offset validty */ /* 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; return -EINVAL;
/* /*
......
...@@ -188,6 +188,7 @@ static long afu_ioctl(struct file *file, unsigned int cmd, ...@@ -188,6 +188,7 @@ static long afu_ioctl(struct file *file, unsigned int cmd,
{ {
struct ocxl_context *ctx = file->private_data; struct ocxl_context *ctx = file->private_data;
struct ocxl_ioctl_irq_fd irq_fd; struct ocxl_ioctl_irq_fd irq_fd;
int irq_id;
u64 irq_offset; u64 irq_offset;
long rc; long rc;
bool closed; bool closed;
...@@ -209,12 +210,13 @@ static long afu_ioctl(struct file *file, unsigned int cmd, ...@@ -209,12 +210,13 @@ static long afu_ioctl(struct file *file, unsigned int cmd,
break; break;
case OCXL_IOCTL_IRQ_ALLOC: case OCXL_IOCTL_IRQ_ALLOC:
rc = ocxl_afu_irq_alloc(ctx, &irq_offset); rc = ocxl_afu_irq_alloc(ctx, &irq_id);
if (!rc) { if (!rc) {
irq_offset = ocxl_irq_id_to_offset(ctx, irq_id);
rc = copy_to_user((u64 __user *) args, &irq_offset, rc = copy_to_user((u64 __user *) args, &irq_offset,
sizeof(irq_offset)); sizeof(irq_offset));
if (rc) { if (rc) {
ocxl_afu_irq_free(ctx, irq_offset); ocxl_afu_irq_free(ctx, irq_id);
return -EFAULT; return -EFAULT;
} }
} }
...@@ -225,7 +227,8 @@ static long afu_ioctl(struct file *file, unsigned int cmd, ...@@ -225,7 +227,8 @@ static long afu_ioctl(struct file *file, unsigned int cmd,
sizeof(irq_offset)); sizeof(irq_offset));
if (rc) if (rc)
return -EFAULT; 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; break;
case OCXL_IOCTL_IRQ_SET_FD: case OCXL_IOCTL_IRQ_SET_FD:
...@@ -235,8 +238,8 @@ static long afu_ioctl(struct file *file, unsigned int cmd, ...@@ -235,8 +238,8 @@ static long afu_ioctl(struct file *file, unsigned int cmd,
return -EFAULT; return -EFAULT;
if (irq_fd.reserved) if (irq_fd.reserved)
return -EINVAL; return -EINVAL;
rc = ocxl_afu_irq_set_fd(ctx, irq_fd.irq_offset, irq_id = ocxl_irq_offset_to_id(ctx, irq_fd.irq_offset);
irq_fd.eventfd); rc = ocxl_afu_irq_set_fd(ctx, irq_id, irq_fd.eventfd);
break; break;
case OCXL_IOCTL_GET_METADATA: case OCXL_IOCTL_GET_METADATA:
......
...@@ -137,11 +137,13 @@ void ocxl_context_detach_all(struct ocxl_afu *afu); ...@@ -137,11 +137,13 @@ void ocxl_context_detach_all(struct ocxl_afu *afu);
int ocxl_sysfs_register_afu(struct ocxl_file_info *info); int ocxl_sysfs_register_afu(struct ocxl_file_info *info);
void ocxl_sysfs_unregister_afu(struct ocxl_file_info *info); void ocxl_sysfs_unregister_afu(struct ocxl_file_info *info);
int ocxl_afu_irq_alloc(struct ocxl_context *ctx, u64 *irq_offset); int ocxl_irq_offset_to_id(struct ocxl_context *ctx, u64 offset);
int ocxl_afu_irq_free(struct ocxl_context *ctx, u64 irq_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); 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); 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);
#endif /* _OCXL_INTERNAL_H_ */ #endif /* _OCXL_INTERNAL_H_ */
...@@ -107,16 +107,14 @@ DEFINE_EVENT(ocxl_fault_handler, ocxl_fault_ack, ...@@ -107,16 +107,14 @@ DEFINE_EVENT(ocxl_fault_handler, ocxl_fault_ack,
); );
TRACE_EVENT(ocxl_afu_irq_alloc, TRACE_EVENT(ocxl_afu_irq_alloc,
TP_PROTO(int pasid, int irq_id, unsigned int virq, int hw_irq, TP_PROTO(int pasid, int irq_id, unsigned int virq, int hw_irq),
u64 irq_offset), TP_ARGS(pasid, irq_id, virq, hw_irq),
TP_ARGS(pasid, irq_id, virq, hw_irq, irq_offset),
TP_STRUCT__entry( TP_STRUCT__entry(
__field(int, pasid) __field(int, pasid)
__field(int, irq_id) __field(int, irq_id)
__field(unsigned int, virq) __field(unsigned int, virq)
__field(int, hw_irq) __field(int, hw_irq)
__field(u64, irq_offset)
), ),
TP_fast_assign( TP_fast_assign(
...@@ -124,15 +122,13 @@ TRACE_EVENT(ocxl_afu_irq_alloc, ...@@ -124,15 +122,13 @@ TRACE_EVENT(ocxl_afu_irq_alloc,
__entry->irq_id = irq_id; __entry->irq_id = irq_id;
__entry->virq = virq; __entry->virq = virq;
__entry->hw_irq = hw_irq; __entry->hw_irq = hw_irq;
__entry->irq_offset = irq_offset;
), ),
TP_printk("pasid=0x%x irq_id=%d virq=%u hw_irq=%d irq_offset=0x%llx", TP_printk("pasid=0x%x irq_id=%d virq=%u hw_irq=%d",
__entry->pasid, __entry->pasid,
__entry->irq_id, __entry->irq_id,
__entry->virq, __entry->virq,
__entry->hw_irq, __entry->hw_irq
__entry->irq_offset
) )
); );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment