On Wed, 2017-09-20 at 15:05 +0200, Cédric Le Goater wrote: > > > +/* > > > + * XIVE Interrupt Source MMIOs > > > + */ > > > +static uint64_t spapr_xive_esb_read(void *opaque, hwaddr addr, unsigned > > > size) > > > +{ > > > + sPAPRXive *xive = SPAPR_XIVE(opaque); > > > + uint32_t offset = addr & 0xF00; > > > + uint32_t srcno = addr >> xive->esb_shift; > > > + XiveIVE *ive; > > > + uint64_t ret = -1; > > > + > > > + ive = spapr_xive_get_ive(xive, srcno); > > > + if (!ive || !(ive->w & IVE_VALID)) { > > > + qemu_log_mask(LOG_GUEST_ERROR, "XIVE: invalid LISN %d\n", srcno); > > > + goto out; > > > > Since there's a whole (4k) page for each source, I wonder if we should > > actually map each one as a separate MMIO region to allow us to tweak > > the mappings more flexibly > > yes we could have a subregion for each source. In that case, > we should also handle IVE_VALID properly. That will require > a specific XIVE allocator which was difficult to do while > keeping the compatibility with XICS for migration and CAS.
That will be a serious bloat with lots of interrupts. We also cannot possibly have a KVM mm region per interrupt or even a vma. I'm thinking of some kind of /dev/xive (or some other KVM or irqfd orignated fd) that allows you to mmap a single big region whose content is demand-faulted and invalidated by the kernel to map the various interrupts. So that it looks like a single VMA (and KVM memory block). Ben. > C. > >