[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <2i4733f7fc7qa3qrseq4pb2u32k4ckh3ns4cmsj4czbucpd7mw@i7e674csuedb>
Date: Mon, 28 Oct 2024 12:20:21 +0100
From: Michał Winiarski <michal.winiarski@...el.com>
To: <linux-pci@...r.kernel.org>, <intel-xe@...ts.freedesktop.org>,
<dri-devel@...ts.freedesktop.org>, <linux-kernel@...r.kernel.org>, "Bjorn
Helgaas" <bhelgaas@...gle.com>, Christian König
<christian.koenig@....com>, Krzysztof Wilczyński
<kw@...ux.com>, Ilpo Järvinen <ilpo.jarvinen@...ux.intel.com>
CC: Rodrigo Vivi <rodrigo.vivi@...el.com>, Michal Wajdeczko
<michal.wajdeczko@...el.com>, Lucas De Marchi <lucas.demarchi@...el.com>,
Thomas Hellström <thomas.hellstrom@...ux.intel.com>,
"Maarten Lankhorst" <maarten.lankhorst@...ux.intel.com>, Maxime Ripard
<mripard@...nel.org>, Thomas Zimmermann <tzimmermann@...e.de>, David Airlie
<airlied@...il.com>, Simona Vetter <simona@...ll.ch>, Matt Roper
<matthew.d.roper@...el.com>
Subject: Re: [PATCH v4 5/7] PCI/IOV: Check that VF BAR fits within the
reservation
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@...el.com>
> ---
> 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
>
Powered by blists - more mailing lists