On Tue, May 21, 2024 at 06:40:13PM +0200, Gerd Bayer wrote: > > > @@ -148,6 +155,15 @@ ssize_t vfio_pci_core_do_io_rw(struct > > > vfio_pci_core_device *vdev, bool test_mem, > > > else > > > fillable = 0; > > > > > > +#if defined(ioread64) && defined(iowrite64) > > > > Can we check for #ifdef CONFIG_64BIT instead? In x86, ioread64 and > > iowrite64 get declared as extern functions if CONFIG_GENERIC_IOMAP is > > defined and this check always fails. In include/asm-generic/io.h, > > asm-generic/iomap.h gets included which declares them as extern > > functions. > > I thinks that should be possible - since ioread64/iowrite64 depend on > CONFIG_64BIT themselves. > > > One more thing to consider io-64-nonatomic-hi-lo.h and > > io-64-nonatomic-lo-hi.h, if included would define it as a macro that > > calls a function that rw 32 bits back to back. This might be a better way to go than trying to have vfio provide its own emulation. > Even today, vfio_pci_core_do_io_rw() makes no guarantees to its users > that register accesses will be done in the granularity they've thought > to use. The vfs layer may coalesce the accesses and this code will then > read/write the largest naturally aligned chunks. I've witnessed in my > testing that one device driver was doing 8-byte writes through the 8- > byte capable vfio layer all of a sudden when run in a KVM guest. Sure, KVM has emulation for various byte sizes, and does invoke vfio with the raw size it got from guest, including larger than 8 sizes from things like SSE instructions. This has nothing to do with the VFS layer. > So higher-level code needs to consider how to split register accesses > appropriately to get the intended side-effects. Thus, I'd rather stay > away from splitting 64bit accesses into two 32bit accesses - and decide > if high or low order values should be written first. The VFIO API is a byte for byte memcpy. VFIO should try to do the largest single instruction accesses it knows how to do because some HW is sensitive to that. Otherwise it does a memcpy loop. Jason