On Fri, Aug 16, 2024 at 6:29 PM Michael S. Tsirkin <m...@redhat.com> wrote: > > On Mon, Aug 12, 2024 at 08:20:27PM +0800, Gao Shiyuan wrote: > > When vhost-user backend register memory region based host notifiers, > > we should return RAM device MR of notify region MR's subregion in > > virtio_address_space_lookup. > > > > In seabios, it will use virtio PCI Configration Access Capability > > access notify region when assign notify region above 4GB. This will > > exit to QEMU and invoke virtio_address_space_write. When vhost-user > > backend register memory region based host notifiers, return RAM device > > MR instead of notify region MR is suitable. > > > I can't really parse this. > > > Co-developed-by: Zuo Boqun <zuobo...@baidu.com> > > Signed-off-by: Gao Shiyuan <gaoshiy...@baidu.com> > > Signed-off-by: Zuo Boqun <zuobo...@baidu.com> > > CC Jason > > > --- > > hw/virtio/virtio-pci.c | 11 ++++++++++- > > 1 file changed, 10 insertions(+), 1 deletion(-) > > > > diff --git a/hw/virtio/virtio-pci.c b/hw/virtio/virtio-pci.c > > index 9534730bba..167ac9718a 100644 > > --- a/hw/virtio/virtio-pci.c > > +++ b/hw/virtio/virtio-pci.c > > @@ -610,13 +610,22 @@ static MemoryRegion > > *virtio_address_space_lookup(VirtIOPCIProxy *proxy, > > { > > int i; > > VirtIOPCIRegion *reg; > > + MemoryRegion *mr, *submr; > > > > for (i = 0; i < ARRAY_SIZE(proxy->regs); ++i) { > > reg = &proxy->regs[i]; > > if (*off >= reg->offset && > > *off + len <= reg->offset + reg->size) { > > *off -= reg->offset; > > - return ®->mr; > > + mr = ®->mr; > > + QTAILQ_FOREACH(submr, &mr->subregions, subregions_link) { > > + if (*off >= submr->addr && > > + *off + len < submr->addr + submr->size) { > > + *off -= submr->addr; > > + return submr; > > + } > > + } > > + return mr; > > } > > } > > Poking at internals of MR like this is not nice. > Doesn't memory_region_find work for this?
Or I wonder if this is a side effect of: commit a93c8d828af186d9a6a1c915a1be8ba22fb89849 Author: Alexey Kardashevskiy <a...@ozlabs.ru> Date: Mon Oct 9 14:19:41 2017 +1100 virtio-pci: Replace modern_as with direct access to modern_bar The modern bar is accessed now via yet another address space created just for that purpose and it does not really need FlatView and dispatch tree as it has a single memory region so it is just a waste of memory. Things get even worse when there are dozens or hundreds of virtio-pci devices - since these address spaces are global, changing any of them triggers rebuilding all address spaces. This replaces indirect accesses to the modern BAR with a simple lookup and direct calls to memory_region_dispatch_read/write. This is expected to save lots of memory at boot time after applying: [Qemu-devel] [PULL 00/32] Misc changes for 2017-09-22 Signed-off-by: Alexey Kardashevskiy <a...@ozlabs.ru> Reviewed-by: Michael S. Tsirkin <m...@redhat.com> Signed-off-by: Michael S. Tsirkin <m...@redhat.com> Thanks