From: "Christian König" <christian.koenig@amd.com>
To: "Michał Winiarski" <michal.winiarski@intel.com>
Cc: linux-pci@vger.kernel.org, intel-xe@lists.freedesktop.org,
dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
"Bjorn Helgaas" <bhelgaas@google.com>,
"Krzysztof Wilczyński" <kw@linux.com>,
"Rodrigo Vivi" <rodrigo.vivi@intel.com>,
"Michal Wajdeczko" <michal.wajdeczko@intel.com>,
"Lucas De Marchi" <lucas.demarchi@intel.com>,
"Thomas Hellström" <thomas.hellstrom@linux.intel.com>,
"Maarten Lankhorst" <maarten.lankhorst@linux.intel.com>,
"Maxime Ripard" <mripard@kernel.org>,
"Thomas Zimmermann" <tzimmermann@suse.de>,
"David Airlie" <airlied@gmail.com>,
"Simona Vetter" <simona@ffwll.ch>,
"Matt Roper" <matthew.d.roper@intel.com>
Subject: Re: [PATCH v2 2/3] PCI: Allow extending VF BAR within original resource boundary
Date: Fri, 11 Oct 2024 10:57:48 +0200 [thread overview]
Message-ID: <8fa25483-d6e2-4614-aa2a-c41af0529e5c@amd.com> (raw)
In-Reply-To: <47iala6cl7tks7tw3wcrxm43y4xl4w24u6gfw5tekdcuabhndx@t37nyrqysrb5>
[-- Attachment #1: Type: text/plain, Size: 5202 bytes --]
Am 10.10.24 um 10:59 schrieb Michał Winiarski:
> On Fri, Sep 20, 2024 at 12:07:34PM +0200, Christian König wrote:
>> Am 20.09.24 um 00:35 schrieb Michał Winiarski:
>>> [SNIP]
>>> @@ -487,6 +567,11 @@ static ssize_t sriov_numvfs_store(struct device *dev,
>>> goto exit;
>>> }
>>> + for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) {
>>> + if (pdev->sriov->rebar_extend[i])
>>> + pci_iov_resource_do_extend(pdev, i + PCI_IOV_RESOURCES, num_vfs);
>>> + }
>>> +
>> That sounds like a really bad idea to me.
>>
>> Basically the suggestion is here that the PCI subsystem should silently
>> extend and shrink the VF BARs when the number of VFs change?
> Why do you think it's a bad idea? Everything is under PCI subsystem
> control and the driver in charge has to explicitly opt-in to this
> behavior on a per-BAR basis.
And exactly that's a bad idea. The PCI subsystem shouldn't control this,
the driver should.
At least for some devices we have tons of interactions with ACPI and
EFI. Only the driver does know for example when platform drivers which
might be in the way for a resize have been unloaded.
From the past experience BAR resize should only be triggered by the
driver and never from the PCI subsystem while scanning the bus or
probing devices.
>> Bjorn has the last word on that but I would say that instead the driver
>> owning the PCIe device as hypervisor should resize the VF BARs to a desired
>> size and that in turn restricts the number of VFs you can enable.
> Then the PCI subsystem would silently change the driver_max_VFs (or new
> variable, as driver_max_VFs is under PF control, so it's either new var
> or checking VF BAR size in pci_sriov_set_totalvfs).
Nope, the PCI subsystem should not magically adjust anything.
What should happen instead is that the driver would call
pci_enable_sriov() with the number of virtual functions to enable and
the PCI subsystem then validates that number and return -EINVAL or
-ENOSPC if it won't work.
> It also means that we have to do the maths to calculate the new VF limit
> in both PCI subsystem and the caller.
Well the point is that those calculations are different.
What the subsystem does is to validate if with the number of requested
virtual functions the necessary resources will fit into the allocate space.
What the driver does previously is to either change the allocate space
or calculate the other way around and determine the maximum virtual
functions from the space available.
> We can go this route as well - I just think it's cleaner to keep this
> all under PCI subsystem control.
I think that would be much cleaner, especially the PCI subsystem
shouldn't adjust any values given from the driver or even more general
overrule decisions the driver made.
Instead proper error codes should be returned if some values don't make
sense or the subsystem isn't able to move around BARs currently in use
etc...
Regards,
Christian.
>
> I'll keep the current behavior in v3, but I'm open to changing it.
>
> Thanks,
> -Michał
>
>> Regards,
>> Christian.
>>
>>> ret = pdev->driver->sriov_configure(pdev, num_vfs);
>>> if (ret < 0)
>>> goto exit;
>>> @@ -881,8 +966,13 @@ static int sriov_init(struct pci_dev *dev, int pos)
>>> static void sriov_release(struct pci_dev *dev)
>>> {
>>> + int i;
>>> +
>>> BUG_ON(dev->sriov->num_VFs);
>>> + for (i = 0; i < PCI_SRIOV_NUM_BARS; i++)
>>> + pci_iov_resource_do_restore(dev, i + PCI_IOV_RESOURCES);
>>> +
>>> if (dev != dev->sriov->dev)
>>> pci_dev_put(dev->sriov->dev);
>>> diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
>>> index e763b3fd4c7a2..47ed2633232aa 100644
>>> --- a/drivers/pci/pci.h
>>> +++ b/drivers/pci/pci.h
>>> @@ -385,6 +385,7 @@ struct pci_sriov {
>>> u16 subsystem_vendor; /* VF subsystem vendor */
>>> u16 subsystem_device; /* VF subsystem device */
>>> resource_size_t barsz[PCI_SRIOV_NUM_BARS]; /* VF BAR size */
>>> + bool rebar_extend[PCI_SRIOV_NUM_BARS]; /* Resize VF BAR */
>>> bool drivers_autoprobe; /* Auto probing of VFs by driver */
>>> };
>>> diff --git a/include/linux/pci.h b/include/linux/pci.h
>>> index 4cf89a4b4cbcf..c007119da7b3d 100644
>>> --- a/include/linux/pci.h
>>> +++ b/include/linux/pci.h
>>> @@ -2364,6 +2364,7 @@ int pci_sriov_set_totalvfs(struct pci_dev *dev, u16 numvfs);
>>> int pci_sriov_get_totalvfs(struct pci_dev *dev);
>>> int pci_sriov_configure_simple(struct pci_dev *dev, int nr_virtfn);
>>> resource_size_t pci_iov_resource_size(struct pci_dev *dev, int resno);
>>> +int pci_iov_resource_extend(struct pci_dev *dev, int resno, bool enable);
>>> void pci_vf_drivers_autoprobe(struct pci_dev *dev, bool probe);
>>> /* Arch may override these (weak) */
>>> @@ -2416,6 +2417,8 @@ static inline int pci_sriov_get_totalvfs(struct pci_dev *dev)
>>> #define pci_sriov_configure_simple NULL
>>> static inline resource_size_t pci_iov_resource_size(struct pci_dev *dev, int resno)
>>> { return 0; }
>>> +static inline void pci_iov_resource_extend(struct pci_dev *dev, int resno, bool enable)
>>> +{ return -ENODEV; }
>>> static inline void pci_vf_drivers_autoprobe(struct pci_dev *dev, bool probe) { }
>>> #endif
[-- Attachment #2: Type: text/html, Size: 6922 bytes --]
next prev parent reply other threads:[~2024-10-11 8:58 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-19 22:35 [PATCH v2 0/3] PCI: VF resizable BAR Michał Winiarski
2024-09-19 22:35 ` [PATCH v2 1/3] PCI: Add support for VF Resizable Bar extended cap Michał Winiarski
2024-09-20 8:36 ` kernel test robot
2024-09-20 9:57 ` Christian König
2024-10-10 8:46 ` Michał Winiarski
2024-09-19 22:35 ` [PATCH v2 2/3] PCI: Allow extending VF BAR within original resource boundary Michał Winiarski
2024-09-20 10:07 ` Christian König
2024-10-10 8:59 ` Michał Winiarski
2024-10-11 8:57 ` Christian König [this message]
2024-10-11 9:23 ` Christian König
2024-09-20 11:09 ` kernel test robot
2024-09-20 11:19 ` kernel test robot
2024-09-20 11:30 ` Ilpo Järvinen
2024-10-10 8:43 ` Michał Winiarski
2024-09-19 22:35 ` [PATCH v2 3/3] drm/xe/pf: Extend the VF LMEM BAR Michał Winiarski
2024-09-19 22:47 ` ✓ CI.Patch_applied: success for PCI: VF resizable BAR Patchwork
2024-09-19 22:47 ` ✗ CI.checkpatch: warning " Patchwork
2024-09-19 22:49 ` ✗ CI.KUnit: failure " Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=8fa25483-d6e2-4614-aa2a-c41af0529e5c@amd.com \
--to=christian.koenig@amd.com \
--cc=airlied@gmail.com \
--cc=bhelgaas@google.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=intel-xe@lists.freedesktop.org \
--cc=kw@linux.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=lucas.demarchi@intel.com \
--cc=maarten.lankhorst@linux.intel.com \
--cc=matthew.d.roper@intel.com \
--cc=michal.wajdeczko@intel.com \
--cc=michal.winiarski@intel.com \
--cc=mripard@kernel.org \
--cc=rodrigo.vivi@intel.com \
--cc=simona@ffwll.ch \
--cc=thomas.hellstrom@linux.intel.com \
--cc=tzimmermann@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox