On 10.08.26 00:38, Michael S. Tsirkin wrote: > On Sun, Aug 09, 2026 at 06:20:04PM +0000, Alexander Graf wrote: >> In preparation to support VIRTIO_F_DMB, create a mechanism to allocate >> and map memory from the Device Memory Buffer (DMB). The DMB is a shared >> memory region a device exposes and owns. A device that negotiates the >> feature expects its virtqueues and all the buffers we hand it to live in >> that region, and every address we publish to it is a byte offset into >> the region. >> >> Add virtio_dmb_init(), which locates the region by the shared memory id >> the device reports and builds a page-granular allocator over it, and >> virtio_dmb_destroy() to tear that down. Add virtio_dmb_map_ops, a struct >> virtio_map_ops implementation that hands out allocations from that >> allocator as region offsets: alloc() places a virtqueue area in the >> region, map_page() copies a buffer that lives elsewhere into it and >> copies it back on unmap. The map operations reach that allocator through >> a new dmb member of union virtio_map. >> >> The shared memory id is transport specific, so add a get_dmb_shm_id() >> callback to struct virtio_config_ops for a transport to report it. A >> transport that does not implement it must not accept VIRTIO_F_DMB. Add >> CONFIG_VIRTIO_DMB to enable this support. It defaults to y, and a kernel >> that will never meet such a device can turn it off to leave the >> allocator and its bookkeeping out. >> >> Link: >> https://lore.kernel.org/virtio-comment/[email protected]/ >> Assisted-by: Kiro:claude-opus-5 checkpatch sparse >> Signed-off-by: Alexander Graf <[email protected]> > > > >> --- >> drivers/virtio/Kconfig | 15 + >> drivers/virtio/Makefile | 3 +- >> drivers/virtio/virtio_dmb.c | 1317 +++++++++++++++++++++++++++++++++ >> drivers/virtio/virtio_dmb.h | 28 + >> include/linux/virtio.h | 3 + >> include/linux/virtio_config.h | 8 + > > Really >1000 lines to implement a virtio specific allocator? > > Can't we start e.g. with gen alloc and maybe xarray if you > need some metadata? > > > I guess virtio sync is annoying, it gets handle + offset is that the > issue? We can fix them though. Or let's just not support them. There > were there for premapped originally but now it uses page pool. > > Maybe I will send a patch to drop sync completely.
I started off with gen_alloc. And then over time it slowly morphed into what you're seeing here when I ran into issues with multi-queue allocations (split the buffer by VQ pair so that we don't run into lock contention) and zero-copy vsock transfers (by keeping DMB buffers statically allocated). I agree that it's a bit much for the initial post. How about I revert back to the gen_alloc variant and we look at the optimizations as follow-up? Since everything is guest driven, we can play with them as much as we like in future improvements. Alex

