Skip to content
/ linux Public
forked from torvalds/linux

Commit

Permalink
dmaengine: idxd: remove MSIX masking for interrupt handlers
Browse files Browse the repository at this point in the history
Remove interrupt masking and just let the hard irq handler keep
firing for new events. This is less of a performance impact vs
the MMIO readback inside the pci_msi_{mask,unmas}_irq(). Especially
with a loaded system those flushes can be stuck behind large amounts
of MMIO writes to flush. When guest kernel is running on top of VFIO
mdev, mask/unmask causes a vmexit each time and is not desirable.

Suggested-by: Dan Williams <dan.j.williams@intel.com>
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
Reviewed-by: Dan Williams <dan.j.williams@intel.com>
Link: https://lore.kernel.org/r/161894523436.3210025.1834640110556139277.stgit@djiang5-desk3.ch.intel.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
  • Loading branch information
davejiang authored and vinodkoul committed Apr 23, 2021
1 parent 53b2ee7 commit a161046
Show file tree
Hide file tree
Showing 3 changed files with 2 additions and 15 deletions.
1 change: 0 additions & 1 deletion drivers/dma/idxd/idxd.h
Original file line number Diff line number Diff line change
Expand Up @@ -377,7 +377,6 @@ void idxd_wqs_quiesce(struct idxd_device *idxd);
/* device interrupt control */
void idxd_msix_perm_setup(struct idxd_device *idxd);
void idxd_msix_perm_clear(struct idxd_device *idxd);
irqreturn_t idxd_irq_handler(int vec, void *data);
irqreturn_t idxd_misc_thread(int vec, void *data);
irqreturn_t idxd_wq_thread(int irq, void *data);
void idxd_mask_error_interrupts(struct idxd_device *idxd);
Expand Down
4 changes: 2 additions & 2 deletions drivers/dma/idxd/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ static int idxd_setup_interrupts(struct idxd_device *idxd)
}

irq_entry = &idxd->irq_entries[0];
rc = request_threaded_irq(irq_entry->vector, idxd_irq_handler, idxd_misc_thread,
rc = request_threaded_irq(irq_entry->vector, NULL, idxd_misc_thread,
0, "idxd-misc", irq_entry);
if (rc < 0) {
dev_err(dev, "Failed to allocate misc interrupt.\n");
Expand All @@ -119,7 +119,7 @@ static int idxd_setup_interrupts(struct idxd_device *idxd)

init_llist_head(&idxd->irq_entries[i].pending_llist);
INIT_LIST_HEAD(&idxd->irq_entries[i].work_list);
rc = request_threaded_irq(irq_entry->vector, idxd_irq_handler,
rc = request_threaded_irq(irq_entry->vector, NULL,
idxd_wq_thread, 0, "idxd-portal", irq_entry);
if (rc < 0) {
dev_err(dev, "Failed to allocate irq %d.\n", irq_entry->vector);
Expand Down
12 changes: 0 additions & 12 deletions drivers/dma/idxd/irq.c
Original file line number Diff line number Diff line change
Expand Up @@ -102,15 +102,6 @@ static int idxd_device_schedule_fault_process(struct idxd_device *idxd,
return 0;
}

irqreturn_t idxd_irq_handler(int vec, void *data)
{
struct idxd_irq_entry *irq_entry = data;
struct idxd_device *idxd = irq_entry->idxd;

idxd_mask_msix_vector(idxd, irq_entry->id);
return IRQ_WAKE_THREAD;
}

static int process_misc_interrupts(struct idxd_device *idxd, u32 cause)
{
struct device *dev = &idxd->pdev->dev;
Expand Down Expand Up @@ -237,7 +228,6 @@ irqreturn_t idxd_misc_thread(int vec, void *data)
iowrite32(cause, idxd->reg_base + IDXD_INTCAUSE_OFFSET);
}

idxd_unmask_msix_vector(idxd, irq_entry->id);
return IRQ_HANDLED;
}

Expand Down Expand Up @@ -394,8 +384,6 @@ irqreturn_t idxd_wq_thread(int irq, void *data)
int processed;

processed = idxd_desc_process(irq_entry);
idxd_unmask_msix_vector(irq_entry->idxd, irq_entry->id);

if (processed == 0)
return IRQ_NONE;

Expand Down

0 comments on commit a161046

Please sign in to comment.