Hi Jacob, I gave this a quick spin, using 4 gen2 optane drives. Basic test, just IOPS bound on the drive, and using 1 thread per drive for IO. Random reads, using io_uring. For reference, using polled IO: IOPS=20.36M, BW=9.94GiB/s, IOS/call=31/31 IOPS=20.36M, BW=9.94GiB/s, IOS/call=31/31 IOPS=20.37M, BW=9.95GiB/s, IOS/call=31/31 which is abount 5.1M/drive, which is what they can deliver. Before your patches, I see: IOPS=14.37M, BW=7.02GiB/s, IOS/call=32/32 IOPS=14.38M, BW=7.02GiB/s, IOS/call=32/31 IOPS=14.38M, BW=7.02GiB/s, IOS/call=32/31 IOPS=14.37M, BW=7.02GiB/s, IOS/call=32/32 at 2.82M ints/sec. With the patches, I see: IOPS=14.73M, BW=7.19GiB/s, IOS/call=32/31 IOPS=14.90M, BW=7.27GiB/s, IOS/call=32/31 IOPS=14.90M, BW=7.27GiB/s, IOS/call=31/32 at 2.34M ints/sec. So a nice reduction in interrupt rate, though not quite at the extent I expected. Booted with 'posted_msi' and I do see posted interrupts increasing in the PMN in /proc/interrupts, Probably want to fold this one in: diff --git a/arch/x86/kernel/irq.c b/arch/x86/kernel/irq.c index 8e09d40ea928..a289282f1cf9 100644 --- a/arch/x86/kernel/irq.c +++ b/arch/x86/kernel/irq.c @@ -393,7 +393,7 @@ void intel_posted_msi_init(void) * instead of: * read, xchg, read, xchg, read, xchg, read, xchg */ -static __always_inline inline bool handle_pending_pir(u64 *pir, struct pt_regs *regs) +static __always_inline bool handle_pending_pir(u64 *pir, struct pt_regs *regs) { int i, vec = FIRST_EXTERNAL_VECTOR; unsigned long pir_copy[4]; -- Jens Axboe