Re: [PATCH v7 4/6] PCI/IOV: Check that VF BAR fits within the reservation

From: Ilpo Järvinen
Date: Thu Apr 03 2025 - 05:55:07 EST


On Wed, 2 Apr 2025, Michał Winiarski wrote:

> When the resource representing VF MMIO BAR reservation is created, its
> size is always large enough to accommodate the BAR of all SR-IOV Virtual
> Functions that can potentially be created (total VFs). If for whatever
> reason it's not possible to accommodate all VFs - the resource is not
> assigned and no VFs can be created.
>
> An upcoming change will allow VF BAR size to be modified by drivers at
> a later point in time, which means that the check for resource
> assignment is no longer sufficient.
>
> 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 | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/drivers/pci/iov.c b/drivers/pci/iov.c
> index fee99e15a943f..2fafbd6a998f0 100644
> --- a/drivers/pci/iov.c
> +++ b/drivers/pci/iov.c
> @@ -668,9 +668,12 @@ static int sriov_enable(struct pci_dev *dev, int nr_virtfn)
> nres = 0;
> for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) {
> int idx = pci_resource_num_from_vf_bar(i);
> + resource_size_t vf_bar_sz = pci_iov_resource_size(dev, idx);
>
> bars |= (1 << idx);
> res = &dev->resource[idx];
> + if (vf_bar_sz * nr_virtfn > resource_size(res))
> + continue;
> if (res->parent)
> nres++;
> }
>

Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@xxxxxxxxxxxxxxx>

--
i.