[PATCH -qemu] nvme: support Google vendor extension
Paolo Bonzini
pbonzini at redhat.com
Thu Nov 19 02:37:54 PST 2015
On 18/11/2015 06:47, Ming Lin wrote:
> @@ -726,7 +798,11 @@ static void nvme_process_db(NvmeCtrl *n, hwaddr addr, int val)
> }
>
> start_sqs = nvme_cq_full(cq) ? 1 : 0;
> - cq->head = new_head;
> + /* When the mapped pointer memory area is setup, we don't rely on
> + * the MMIO written values to update the head pointer. */
> + if (!cq->db_addr) {
> + cq->head = new_head;
> + }
You are still checking
if (new_head >= cq->size) {
return;
}
above. I think this is incorrect when the extension is present, and
furthermore it's the only case where val is being used.
If you're not using val, you could use ioeventfd for the MMIO. An
ioeventfd cuts the MMIO cost by at least 55% and up to 70%. Here are
quick and dirty measurements from kvm-unit-tests's vmexit.flat
benchmark, on two very different machines:
Haswell-EP Ivy Bridge i7
MMIO memory write 5100 -> 2250 (55%) 7000 -> 3000 (58%)
I/O port write 3800 -> 1150 (70%) 4100 -> 1800 (57%)
You would need to allocate two eventfds for each qid, one for the sq and
one for the cq. Also, processing the queues is now bounced to the QEMU
iothread, so you can probably get rid of sq->timer and cq->timer.
Paolo
More information about the Linux-nvme
mailing list