}
 
 unsigned int cxl_map_irq(struct cxl *adapter, irq_hw_number_t hwirq,
-                        irq_handler_t handler, void *cookie)
+                        irq_handler_t handler, void *cookie, const char *name)
 {
        unsigned int virq;
        int result;
 
        pr_devel("hwirq %#lx mapped to virq %u\n", hwirq, virq);
 
-       result = request_irq(virq, handler, 0, "cxl", cookie);
+       result = request_irq(virq, handler, 0, name, cookie);
        if (result) {
                dev_warn(&adapter->dev, "cxl_map_irq: request_irq failed: %i\n", result);
                return 0;
                                irq_handler_t handler,
                                void *cookie,
                                irq_hw_number_t *dest_hwirq,
-                               unsigned int *dest_virq)
+                               unsigned int *dest_virq,
+                               const char *name)
 {
        int hwirq, virq;
 
        if ((hwirq = cxl_alloc_one_irq(adapter)) < 0)
                return hwirq;
 
-       if (!(virq = cxl_map_irq(adapter, hwirq, handler, cookie)))
+       if (!(virq = cxl_map_irq(adapter, hwirq, handler, cookie, name)))
                goto err;
 
        *dest_hwirq = hwirq;
 {
        int rc;
 
+       adapter->irq_name = kasprintf(GFP_KERNEL, "cxl-%s-err",
+                                     dev_name(&adapter->dev));
+       if (!adapter->irq_name)
+               return -ENOMEM;
+
        if ((rc = cxl_register_one_irq(adapter, cxl_irq_err, adapter,
                                       &adapter->err_hwirq,
-                                      &adapter->err_virq)))
+                                      &adapter->err_virq,
+                                      adapter->irq_name))) {
+               kfree(adapter->irq_name);
+               adapter->irq_name = NULL;
                return rc;
+       }
 
        cxl_p1_write(adapter, CXL_PSL_ErrIVTE, adapter->err_hwirq & 0xffff);
 
        cxl_p1_write(adapter, CXL_PSL_ErrIVTE, 0x0000000000000000);
        cxl_unmap_irq(adapter->err_virq, adapter);
        cxl_release_one_irq(adapter, adapter->err_hwirq);
+       kfree(adapter->irq_name);
 }
 
 int cxl_register_serr_irq(struct cxl_afu *afu)
        u64 serr;
        int rc;
 
+       afu->err_irq_name = kasprintf(GFP_KERNEL, "cxl-%s-err",
+                                     dev_name(&afu->dev));
+       if (!afu->err_irq_name)
+               return -ENOMEM;
+
        if ((rc = cxl_register_one_irq(afu->adapter, cxl_slice_irq_err, afu,
                                       &afu->serr_hwirq,
-                                      &afu->serr_virq)))
+                                      &afu->serr_virq, afu->err_irq_name))) {
+               kfree(afu->err_irq_name);
+               afu->err_irq_name = NULL;
                return rc;
+       }
 
        serr = cxl_p1n_read(afu, CXL_PSL_SERR_An);
        serr = (serr & 0x00ffffffffff0000ULL) | (afu->serr_hwirq & 0xffff);
        cxl_p1n_write(afu, CXL_PSL_SERR_An, 0x0000000000000000);
        cxl_unmap_irq(afu->serr_virq, afu);
        cxl_release_one_irq(afu->adapter, afu->serr_hwirq);
+       kfree(afu->err_irq_name);
 }
 
 int cxl_register_psl_irq(struct cxl_afu *afu)
 {
-       return cxl_register_one_irq(afu->adapter, cxl_irq_multiplexed, afu,
-                       &afu->psl_hwirq, &afu->psl_virq);
+       int rc;
+
+       afu->psl_irq_name = kasprintf(GFP_KERNEL, "cxl-%s",
+                                     dev_name(&afu->dev));
+       if (!afu->psl_irq_name)
+               return -ENOMEM;
+
+       if ((rc = cxl_register_one_irq(afu->adapter, cxl_irq_multiplexed, afu,
+                                   &afu->psl_hwirq, &afu->psl_virq,
+                                   afu->psl_irq_name))) {
+               kfree(afu->psl_irq_name);
+               afu->psl_irq_name = NULL;
+       }
+       return rc;
 }
 
 void cxl_release_psl_irq(struct cxl_afu *afu)
 {
        cxl_unmap_irq(afu->psl_virq, afu);
        cxl_release_one_irq(afu->adapter, afu->psl_hwirq);
+       kfree(afu->psl_irq_name);
+}
+
+void afu_irq_name_free(struct cxl_context *ctx)
+{
+       struct cxl_irq_name *irq_name, *tmp;
+
+       list_for_each_entry_safe(irq_name, tmp, &ctx->irq_names, list) {
+               kfree(irq_name->name);
+               list_del(&irq_name->list);
+               kfree(irq_name);
+       }
 }
 
 int afu_register_irqs(struct cxl_context *ctx, u32 count)
 {
        irq_hw_number_t hwirq;
-       int rc, r, i;
+       int rc, r, i, j = 1;
+       struct cxl_irq_name *irq_name;
 
        if ((rc = cxl_alloc_irq_ranges(&ctx->irqs, ctx->afu->adapter, count)))
                return rc;
                                  sizeof(*ctx->irq_bitmap), GFP_KERNEL);
        if (!ctx->irq_bitmap)
                return -ENOMEM;
+
+       /*
+        * Allocate names first.  If any fail, bail out before allocating
+        * actual hardware IRQs.
+        */
+       INIT_LIST_HEAD(&ctx->irq_names);
+       for (r = 1; r < CXL_IRQ_RANGES; r++) {
+               for (i = 0; i < ctx->irqs.range[r]; hwirq++, i++) {
+                       irq_name = kmalloc(sizeof(struct cxl_irq_name),
+                                          GFP_KERNEL);
+                       if (!irq_name)
+                               goto out;
+                       irq_name->name = kasprintf(GFP_KERNEL, "cxl-%s-pe%i-%i",
+                                                  dev_name(&ctx->afu->dev),
+                                                  ctx->pe, j);
+                       if (!irq_name->name) {
+                               kfree(irq_name);
+                               goto out;
+                       }
+                       /* Add to tail so next look get the correct order */
+                       list_add_tail(&irq_name->list, &ctx->irq_names);
+                       j++;
+               }
+       }
+
+       /* We've allocated all memory now, so let's do the irq allocations */
+       irq_name = list_first_entry(&ctx->irq_names, struct cxl_irq_name, list);
        for (r = 1; r < CXL_IRQ_RANGES; r++) {
                hwirq = ctx->irqs.offset[r];
                for (i = 0; i < ctx->irqs.range[r]; hwirq++, i++) {
                        cxl_map_irq(ctx->afu->adapter, hwirq,
-                                    cxl_irq_afu, ctx);
+                                   cxl_irq_afu, ctx, irq_name->name);
+                       irq_name = list_next_entry(irq_name, list);
                }
        }
 
        return 0;
+
+out:
+       afu_irq_name_free(ctx);
+       return -ENOMEM;
 }
 
 void afu_release_irqs(struct cxl_context *ctx)
                }
        }
 
+       afu_irq_name_free(ctx);
        cxl_release_irq_ranges(&ctx->irqs, ctx->afu->adapter);
 }