Re: [PATCH v1] vfio/pci: Avoid mapping BARs for devices with non-mappable BARs
Farhan Ali <[email protected]> Mon, 3 Aug 2026 13:44:58 -0700
| Newsgroups | org.kernel.vger.kvm,org.kernel.vger.linux-kernel,org.kernel.vger.linux-s390 |
|---|---|
| Message-ID | <[email protected]> |
On 8/3/2026 12:54 PM, Alex Williamson wrote: > On Mon, 3 Aug 2026 09:39:19 -0700 > Farhan Ali <[email protected]> wrote: > >> On 7/29/2026 2:50 PM, Alex Williamson wrote: >>> On Wed, 29 Jul 2026 14:32:45 -0700 >>> Farhan Ali <[email protected]> wrote: >>> >>>> On 7/29/2026 1:36 PM, Alex Williamson wrote: >>>>> On Wed, 29 Jul 2026 13:28:46 -0700 >>>>> Farhan Ali <[email protected]> wrote: >>>>> >>>>>> On 7/29/2026 12:41 PM, Matthew Rosato wrote: >>>>>>> On 7/29/26 2:11 PM, Farhan Ali wrote: >>>>>>>> vfio_pci_core_map_bars() calls pci_iomap() to set up BAR resources, but not >>>>>>>> all devices support having their BARs mapped by the CPU. The >>>>>>>> non_mappable_bars flag indicates that a PCI device's BARs cannot be >>>>>>>> accessed by the CPU. The ISM device on s390 is one such device. The BAR >>>>>>>> size for an ISM device is 256 TiB, and attempting to map the BAR will lead >>>>>>>> to warnings: >>>>>>>> >>>>>>>> vmalloc_node_range for size 281474976714752 failed: Address range >>>>>>>> restricted to 0x2110bab00000 - 0x21903ab00000 >>>>>>>> >>>>>>>> Use pdev->non_mappable_bars to skip pci_iomap() for such devices. This flag >>>>>>>> is set by the PCI core at enumeration time and already serves the same >>>>>>>> purpose in vfio_pci_probe_mmaps(). >>>>>>>> >>>>>>>> Fixes: 05f2a68b407a ("vfio/pci: Set up BAR resources and maps in vfio_pci_core_enable()") >>>>>>>> Reported-by: Christian Borntraeger <[email protected]> >>>>>>>> Signed-off-by: Farhan Ali <[email protected]> >>>>>>>> --- >>>>>>>> drivers/vfio/pci/vfio_pci_core.c | 3 +++ >>>>>>>> 1 file changed, 3 insertions(+) >>>>>>>> >>>>>>>> diff --git a/drivers/vfio/pci/vfio_pci_core.c b/drivers/vfio/pci/vfio_pci_core.c >>>>>>>> index 3f11a9624b9c..6a184588ff23 100644 >>>>>>>> --- a/drivers/vfio/pci/vfio_pci_core.c >>>>>>>> +++ b/drivers/vfio/pci/vfio_pci_core.c >>>>>>>> @@ -554,6 +554,9 @@ static void vfio_pci_core_map_bars(struct vfio_pci_core_device *vdev) >>>>>>>> >>>>>>>> vdev->barmap[bar] = IOMEM_ERR_PTR(-ENODEV); >>>>>>>> >>>>>>>> + if (pdev->non_mappable_bars) >>>>>>>> + continue; >>>>>>>> + >>>>>>> This would work for the ISM case at least, but I wonder: should we check >>>>>>> vdev->bar_mmap_supported[bar] instead? >>>>>>> >>>>>>> My question boils down to: do we still want messages for some of the >>>>>>> cases where we set vdev->bar_mmap_supported[bar] = false in >>>>>>> vfio_pci_probe_mmaps()? >>>>>> AFAIU vfio_pci_probe_mmaps() is only called in >>>>>> vfio_pci_core_finish_enable(). Since vfio_pci_core_map_bars() is called >>>>>> in vfio_pci_core_enable(), and before vfio_pci_core_finish_enable(), >>>>>> bar_mmap_supported would be false here for all devices. So I don't think >>>>>> it would work here, unless I missed something? >>>>> Also IO Port and sub-page MMIO BARs are things that do exist. Thanks, >>>> Just to clarify, are you suggesting we expand this check to also avoid >>>> mapping IO port and sub-page MMIO BARs? >>> Sorry, no, I'm not. I think we're conflating that the barmap is >>> related to mmap access. The barmap itself is holding the iomap of the >>> BAR, used for read/write. The only real relation to the mmap is that >>> we request the resource via this path as well. >>> >>> Therefore not only is the ordering of setting up bar_mmap_supported >>> wrong, it's flagging entirely the wrong thing here and keying on it >>> would entirely break IO port and sub-page MMIO BAR access. Thanks, >>> >>> Alex >> Hi Alex, >> >> I wanted some guidance on how we should proceed with this patch? The >> warning messages are a regression on s390 for ISM devices, so we would >> like to fix it. > I think the original proposal is probably the correct one. The > non_mmapable_bars flag doesn't restrict its application to specific BAR > types or access, at least not beyond "can't be mapped to CPU or peers." > > If we can't map the BAR to the CPU, then we don't need to request the > region or perform the pci_iomap(), which is what I understand explodes > here. Therefore we really only need to establish the errno in the > barmap here. Yes, its the call to pci_iomap() that leads to the warning. > > The bar_mmap_supported flag describes something else, whether the BAR > can be mapped into the user address space. My intention was only to > point out that there are BARs that cannot be mapped to the user address > space because either they're not MMIO or we can't safely map the full > page, therefore bar_mmap_supported is an invalid test for whether we > should request the region or iomap the BAR. > > Is there still a gap with the original proposal that I'm missing? AFAICT this fix should be sufficient. I think Matt's question was to see if there were other cases for which bar_mmap_supported were set to false, that we need to consider here. But I will let him clarify to see if he has any concerns. Thanks Farhan