On 10/9/2026 9:00 PM, Keith Busch wrote:
On Fri, Oct 09, 2026 at 05:05:56AM +0000, Naman Jain wrote:
  static irqreturn_t nvme_irq(int irq, void *data)
  {
        struct nvme_queue *nvmeq = data;
        DEFINE_IO_COMP_BATCH(iob);
+ if (unlikely(test_and_clear_bit(NVMEQ_IRQ_POLL_HANDOFF,
+                                       &nvmeq->flags))) {
+               if (!nvme_cqe_pending(nvmeq))
+                       return IRQ_HANDLED;
+       }
+       if (unlikely(test_bit(NVMEQ_IRQ_POLL_PAUSED, &nvmeq->flags) &&
+                    (!test_bit(NVMEQ_IRQ_POLL_INIT, &nvmeq->flags) ||
+                     test_bit(NVMEQ_IRQ_POLL_MASKED, &nvmeq->flags) ||
+                     READ_ONCE(to_pci_dev(nvmeq->dev->dev)->error_state) !=
+                               pci_channel_io_normal)))
+               return IRQ_HANDLED;
+
+       if (unlikely(in_hardirq() &&
+                    test_bit(NVMEQ_IRQ_POLL_INIT, &nvmeq->flags) &&
+                    !test_bit(NVMEQ_IRQ_POLL_PAUSED, &nvmeq->flags) &&
+                    need_resched() && nvme_cqe_pending(nvmeq) &&
+                    !test_and_set_bit_lock(NVMEQ_IRQ_POLL, &nvmeq->flags))) {
+               set_bit(NVMEQ_IRQ_POLL_MASKED, &nvmeq->flags);
+               disable_irq_nosync(irq);
+               irq_poll_sched(&nvmeq->iopoll);
+               return IRQ_HANDLED;
+       }

The disable_irq_nosync still does non-posted transactions for msi and
msi-x. NVMe has a shortcut for msi, but there's currently nothing for
msi-x. For that case, I have a prep patch I consulted with Thomas, and
the result is below. I'm delayed sending it out while catching up from
travel, but I think this will be even more efficient.


Thanks for sharing. I'll give it a try. IIUC, after your patch goes in, I should be using disable_irq_nowait() in above and see better performance. Please correct me if I am wrong. I'll monitor your patch in LKML for future versions.

Regards,
Naman

Reply via email to