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;
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)
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);
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;
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);
}
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);
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;
/*
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);
#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;
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
};