On Fri, Oct 25, 2024 at 11:50:36PM +0200, Michał Winiarski wrote: > VF MMIO resource reservation, either created by system firmware and > inherited by Linux PCI subsystem or created by the subsystem itself, > should contain enough space to fit the BAR of all SR-IOV Virtual > Functions that can potentially be created (total VFs supported by the > device). > > However, that assumption only holds in an environment where VF BAR size > can't be modified. > > Add an additional check that verifies that VF BAR for all enabled VFs > fits within the underlying reservation resource. > > Signed-off-by: Michał Winiarski <michal.winiarski@xxxxxxxxx> > --- > drivers/pci/iov.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c > index 79143c1bc7bb4..5de828e5a26ea 100644 > --- a/drivers/pci/iov.c > +++ b/drivers/pci/iov.c > @@ -645,10 +645,14 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn) > > nres = 0; > for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) { > + int vf_bar_sz = pci_iov_resource_size(dev, > + pci_resource_to_iov(i)); And that should be resource_size_t. Fortunately, CI caught it: https://lore.kernel.org/intel-xe/172990062085.1334319.8298861567163770193@2413ebb6fbb6/ I'll address that in the next rev. -Michał > bars |= (1 << pci_resource_to_iov(i)); > res = &dev->resource[pci_resource_to_iov(i)]; > - if (res->parent) > - nres++; > + if (!res->parent || vf_bar_sz * nr_virtfn > resource_size(res)) > + continue; > + > + nres++; > } > if (nres != iov->nres) { > pci_err(dev, "not enough MMIO resources for SR-IOV\n"); > -- > 2.47.0 >