Virtio is really a DMA engine. One of the nice things about it's design is
that you can do things like transparent bounce buffering if needed. Adding
a mechanism like this breaks this abstract and turns virtio into something
that's more than I think it should be.
For guest shared memory, what makes sense to me is to make use of uio_pci
within a guest to map bars in userspace. The device can have the first bar
map a small MMIO region that is tied to a ioeventfd with KVM. With just
qemu, it can be tied to a normal eventfd. You can use irqfd with KVM to tie
an eventfd to the PCI irq. Likewise, you can use a normal eventfd to
emulate that. I'd suggest using a /dev/shm file to act as the shared memory
segment. You'll need a little magic within qemu_ram_alloc() to use this
(maybe qemu_ram_alloc() should take a context parameter so this can be
setup).