hw/nvme: Use ioeventfd to handle doorbell updates
commit2e53b0b450246044efd27418c5d05ad6919deb87
authorJinhao Fan <fanjinhao21s@ict.ac.cn>
Tue, 5 Jul 2022 14:24:03 +0000 (5 22:24 +0800)
committerKlaus Jensen <k.jensen@samsung.com>
Fri, 15 Jul 2022 08:40:33 +0000 (15 10:40 +0200)
tree6f3af9fae825f294e1aa513fe9290175bc0c7de5
parent43f76aac49c439ea79c125d1befd9d5d7057dbb4
hw/nvme: Use ioeventfd to handle doorbell updates

Add property "ioeventfd" which is enabled by default. When this is
enabled, updates on the doorbell registers will cause KVM to signal
an event to the QEMU main loop to handle the doorbell updates.
Therefore, instead of letting the vcpu thread run both guest VM and
IO emulation, we now use the main loop thread to do IO emulation and
thus the vcpu thread has more cycles for the guest VM.

Since ioeventfd does not tell us the exact value that is written, it is
only useful when shadow doorbell buffer is enabled, where we check
for the value in the shadow doorbell buffer when we get the doorbell
update event.

IOPS comparison on Linux 5.19-rc2: (Unit: KIOPS)

qd           1   4  16  64
qemu        35 121 176 153
ioeventfd   41 133 258 313

Changes since v3:
 - Do not deregister ioeventfd when it was not enabled on a SQ/CQ

Signed-off-by: Jinhao Fan <fanjinhao21s@ict.ac.cn>
Reviewed-by: Klaus Jensen <k.jensen@samsung.com>
Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
hw/nvme/ctrl.c
hw/nvme/nvme.h