]> www.infradead.org Git - users/willy/xarray.git/commitdiff
ocxl: Convert irq_idr to XArray
authorMatthew Wilcox <willy@infradead.org>
Mon, 18 Feb 2019 20:05:53 +0000 (15:05 -0500)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Thu, 8 Aug 2019 18:01:05 +0000 (14:01 -0400)
Signed-off-by: Matthew Wilcox <willy@infradead.org>
drivers/misc/ocxl/afu_irq.c
drivers/misc/ocxl/context.c
drivers/misc/ocxl/ocxl_internal.h

index 70f8f1c3929dcadb2a9803e6ab2214479075a0be..4bb4d6cb6442e6bd2f1accd40e80dba1bd9c4465 100644 (file)
@@ -35,7 +35,7 @@ int ocxl_irq_set_handler(struct ocxl_context *ctx, int irq_id,
        int rc;
 
        mutex_lock(&ctx->irq_lock);
-       irq = idr_find(&ctx->irq_idr, irq_id);
+       irq = xa_load(&ctx->irqs, irq_id);
        if (!irq) {
                rc = -EINVAL;
                goto unlock;
@@ -117,17 +117,14 @@ int ocxl_afu_irq_alloc(struct ocxl_context *ctx, int *irq_id)
 
        mutex_lock(&ctx->irq_lock);
 
-       irq->id = idr_alloc(&ctx->irq_idr, irq, 0, MAX_IRQ_PER_CONTEXT,
-                       GFP_KERNEL);
-       if (irq->id < 0) {
-               rc = -ENOSPC;
+       rc = xa_alloc(&ctx->irqs, &irq->id, irq, OCXL_IRQ_LIMIT, GFP_KERNEL);
+       if (rc < 0)
                goto err_unlock;
-       }
 
        rc = ocxl_link_irq_alloc(ctx->afu->fn->link, &irq->hw_irq,
                                &irq->trigger_page);
        if (rc)
-               goto err_idr;
+               goto err_erase;
 
        rc = setup_afu_irq(ctx, irq);
        if (rc)
@@ -142,8 +139,8 @@ int ocxl_afu_irq_alloc(struct ocxl_context *ctx, int *irq_id)
 
 err_alloc:
        ocxl_link_free_irq(ctx->afu->fn->link, irq->hw_irq);
-err_idr:
-       idr_remove(&ctx->irq_idr, irq->id);
+err_erase:
+       xa_erase(&ctx->irqs, irq->id);
 err_unlock:
        mutex_unlock(&ctx->irq_lock);
        kfree(irq);
@@ -171,12 +168,11 @@ int ocxl_afu_irq_free(struct ocxl_context *ctx, int irq_id)
 
        mutex_lock(&ctx->irq_lock);
 
-       irq = idr_find(&ctx->irq_idr, irq_id);
+       irq = xa_erase(&ctx->irqs, irq_id);
        if (!irq) {
                mutex_unlock(&ctx->irq_lock);
                return -EINVAL;
        }
-       idr_remove(&ctx->irq_idr, irq->id);
        afu_irq_free(irq, ctx);
        mutex_unlock(&ctx->irq_lock);
        return 0;
@@ -186,10 +182,10 @@ EXPORT_SYMBOL_GPL(ocxl_afu_irq_free);
 void ocxl_afu_irq_free_all(struct ocxl_context *ctx)
 {
        struct afu_irq *irq;
-       int id;
+       unsigned long id;
 
        mutex_lock(&ctx->irq_lock);
-       idr_for_each_entry(&ctx->irq_idr, irq, id)
+       xa_for_each(&ctx->irqs, id, irq)
                afu_irq_free(irq, ctx);
        mutex_unlock(&ctx->irq_lock);
 }
@@ -200,7 +196,7 @@ u64 ocxl_afu_irq_get_addr(struct ocxl_context *ctx, int irq_id)
        u64 addr = 0;
 
        mutex_lock(&ctx->irq_lock);
-       irq = idr_find(&ctx->irq_idr, irq_id);
+       irq = xa_load(&ctx->irqs, irq_id);
        if (irq)
                addr = irq->trigger_page;
        mutex_unlock(&ctx->irq_lock);
index 994563a078eb9f249b8576ddb0ab69abaa4de434..227b63a0201088cb120bee26037cf5deb6178f77 100644 (file)
@@ -35,7 +35,7 @@ int ocxl_context_alloc(struct ocxl_context **context, struct ocxl_afu *afu,
        init_waitqueue_head(&ctx->events_wq);
        mutex_init(&ctx->xsl_error_lock);
        mutex_init(&ctx->irq_lock);
-       idr_init(&ctx->irq_idr);
+       xa_init_flags(&ctx->irqs, XA_FLAGS_ALLOC);
        ctx->tidr = 0;
 
        /*
@@ -286,7 +286,6 @@ void ocxl_context_free(struct ocxl_context *ctx)
        mutex_unlock(&ctx->afu->contexts_lock);
 
        ocxl_afu_irq_free_all(ctx);
-       idr_destroy(&ctx->irq_idr);
        /* reference to the AFU taken in ocxl_context_init */
        ocxl_afu_put(ctx->afu);
        kfree(ctx);
index 97415afd79f3b0e9ec251f2443b97dba37793a61..a8cdb4f1947bed90b924b7a0810658af82e87916 100644 (file)
@@ -9,7 +9,7 @@
 #include <misc/ocxl.h>
 
 #define MAX_IRQ_PER_LINK       2000
-#define MAX_IRQ_PER_CONTEXT    MAX_IRQ_PER_LINK
+#define OCXL_IRQ_LIMIT         XA_LIMIT(0, MAX_IRQ_PER_LINK)
 
 extern struct pci_driver ocxl_pci_driver;
 
@@ -78,7 +78,7 @@ struct ocxl_context {
        struct mutex xsl_error_lock;
        struct ocxl_xsl_error xsl_error;
        struct mutex irq_lock;
-       struct idr irq_idr;
+       struct xarray irqs;
        u16 tidr; // Thread ID used for P9 wait implementation
 };