* [PATCH] xen-pciback: drop SR-IOV VFs when PF driver unloads
@ 2014-11-06 15:05 Jan Beulich
2014-11-21 22:03 ` Konrad Rzeszutek Wilk
0 siblings, 1 reply; 4+ messages in thread
From: Jan Beulich @ 2014-11-06 15:05 UTC (permalink / raw)
To: Konrad Rzeszutek Wilk; +Cc: xen-devel, linux-kernel
When a PF driver unloads, it may find it necessary to leave the VFs
around simply because of pciback having marked them as assigned to a
guest. Utilize a suitable notification to let go of the VFs, thus
allowing the PF to go back into the state it was before its driver
loaded (which in particular allows the driver to be loaded again with
it being able to create the VFs anew, but which also allows to then
pass through the PF instead of the VFs).
Don't do this however for any VFs currently in active use by a guest.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
---
drivers/xen/xen-pciback/pci_stub.c | 46 +++++++++++++++++++++++++++++++++++++
1 file changed, 46 insertions(+)
--- 3.18-rc3/drivers/xen/xen-pciback/pci_stub.c
+++ 3.18-rc3-pciback-release-VFs/drivers/xen/xen-pciback/pci_stub.c
@@ -1502,6 +1502,45 @@ parse_error:
fs_initcall(pcistub_init);
#endif
+#ifdef CONFIG_PCI_IOV
+static int pci_stub_notifier(struct notifier_block *nb,
+ unsigned long action, void *data)
+{
+ struct device *dev = data;
+ const struct pci_dev *pdev = to_pci_dev(dev);
+
+ switch (action) {
+ case BUS_NOTIFY_UNBIND_DRIVER:
+ if (!pdev->is_physfn)
+ break;
+ for (;;) {
+ struct pcistub_device *psdev;
+ unsigned long flags;
+ bool found = false;
+
+ spin_lock_irqsave(&pcistub_devices_lock, flags);
+ list_for_each_entry(psdev, &pcistub_devices, dev_list)
+ if (!psdev->pdev && psdev->dev != pdev
+ && pci_physfn(psdev->dev) == pdev) {
+ found = true;
+ break;
+ }
+ spin_unlock_irqrestore(&pcistub_devices_lock, flags);
+ if (!found)
+ break;
+ device_release_driver(&psdev->dev->dev);
+ }
+ break;
+ }
+
+ return NOTIFY_DONE;
+}
+
+static struct notifier_block pci_stub_nb = {
+ .notifier_call = pci_stub_notifier,
+};
+#endif
+
static int __init xen_pcibk_init(void)
{
int err;
@@ -1523,12 +1562,19 @@ static int __init xen_pcibk_init(void)
err = xen_pcibk_xenbus_register();
if (err)
pcistub_exit();
+#ifdef CONFIG_PCI_IOV
+ else
+ bus_register_notifier(&pci_bus_type, &pci_stub_nb);
+#endif
return err;
}
static void __exit xen_pcibk_cleanup(void)
{
+#ifdef CONFIG_PCI_IOV
+ bus_unregister_notifier(&pci_bus_type, &pci_stub_nb);
+#endif
xen_pcibk_xenbus_unregister();
pcistub_exit();
}
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] xen-pciback: drop SR-IOV VFs when PF driver unloads
2014-11-06 15:05 [PATCH] xen-pciback: drop SR-IOV VFs when PF driver unloads Jan Beulich
@ 2014-11-21 22:03 ` Konrad Rzeszutek Wilk
2014-11-24 7:54 ` Jan Beulich
0 siblings, 1 reply; 4+ messages in thread
From: Konrad Rzeszutek Wilk @ 2014-11-21 22:03 UTC (permalink / raw)
To: Jan Beulich, david.vrabel, boris.ostrovsky; +Cc: xen-devel, linux-kernel
On Thu, Nov 06, 2014 at 03:05:51PM +0000, Jan Beulich wrote:
> When a PF driver unloads, it may find it necessary to leave the VFs
> around simply because of pciback having marked them as assigned to a
> guest. Utilize a suitable notification to let go of the VFs, thus
> allowing the PF to go back into the state it was before its driver
> loaded (which in particular allows the driver to be loaded again with
> it being able to create the VFs anew, but which also allows to then
> pass through the PF instead of the VFs).
>
> Don't do this however for any VFs currently in active use by a guest.
I rewrote it a bit to be more in the style of pciback:
>From d364ca863f5d506750171ca014f6100080b029dc Mon Sep 17 00:00:00 2001
From: Jan Beulich <JBeulich@suse.com>
Date: Thu, 6 Nov 2014 15:05:51 +0000
Subject: [PATCH] xen-pciback: drop SR-IOV VFs when PF driver unloads
When a PF driver unloads, it may find it necessary to leave the VFs
around simply because of pciback having marked them as assigned to a
guest. Utilize a suitable notification to let go of the VFs, thus
allowing the PF to go back into the state it was before its driver
loaded (which in particular allows the driver to be loaded again with
it being able to create the VFs anew, but which also allows to then
pass through the PF instead of the VFs).
Don't do this however for any VFs currently in active use by a guest.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
[v2: Removed the switch statement, moved it about]
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
drivers/xen/xen-pciback/pci_stub.c | 43 ++++++++++++++++++++++++++++++++++++++
1 file changed, 43 insertions(+)
diff --git a/drivers/xen/xen-pciback/pci_stub.c b/drivers/xen/xen-pciback/pci_stub.c
index 017069a..0763e01 100644
--- a/drivers/xen/xen-pciback/pci_stub.c
+++ b/drivers/xen/xen-pciback/pci_stub.c
@@ -1502,6 +1502,42 @@ parse_error:
fs_initcall(pcistub_init);
#endif
+#ifdef CONFIG_PCI_IOV
+static int pci_stub_notifier(struct notifier_block *nb,
+ unsigned long action, void *data)
+{
+ struct device *dev = data;
+ const struct pci_dev *pdev = to_pci_dev(dev);
+ struct pcistub_device *psdev;
+ unsigned long flags;
+ bool found = false;
+
+ if (action != BUS_NOTIFY_UNBIND_DRIVER)
+ goto out;
+
+ if (!pdev->is_physfn)
+ goto out;
+
+ spin_lock_irqsave(&pcistub_devices_lock, flags);
+ list_for_each_entry(psdev, &pcistub_devices, dev_list) {
+ if (!psdev->pdev && psdev->dev != pdev
+ && pci_physfn(psdev->dev) == pdev) {
+ found = true;
+ break;
+ }
+ }
+ spin_unlock_irqrestore(&pcistub_devices_lock, flags);
+ if (found)
+ device_release_driver(&psdev->dev->dev);
+out:
+ return NOTIFY_DONE;
+}
+
+static struct notifier_block pci_stub_nb = {
+ .notifier_call = pci_stub_notifier,
+};
+#endif
+
static int __init xen_pcibk_init(void)
{
int err;
@@ -1523,12 +1559,19 @@ static int __init xen_pcibk_init(void)
err = xen_pcibk_xenbus_register();
if (err)
pcistub_exit();
+#ifdef CONFIG_PCI_IOV
+ else
+ bus_register_notifier(&pci_bus_type, &pci_stub_nb);
+#endif
return err;
}
static void __exit xen_pcibk_cleanup(void)
{
+#ifdef CONFIG_PCI_IOV
+ bus_unregister_notifier(&pci_bus_type, &pci_stub_nb);
+#endif
xen_pcibk_xenbus_unregister();
pcistub_exit();
}
--
1.9.3
Haven't yet tested it.
>
> Signed-off-by: Jan Beulich <jbeulich@suse.com>
> ---
> drivers/xen/xen-pciback/pci_stub.c | 46 +++++++++++++++++++++++++++++++++++++
> 1 file changed, 46 insertions(+)
>
> --- 3.18-rc3/drivers/xen/xen-pciback/pci_stub.c
> +++ 3.18-rc3-pciback-release-VFs/drivers/xen/xen-pciback/pci_stub.c
> @@ -1502,6 +1502,45 @@ parse_error:
> fs_initcall(pcistub_init);
> #endif
>
> +#ifdef CONFIG_PCI_IOV
> +static int pci_stub_notifier(struct notifier_block *nb,
> + unsigned long action, void *data)
> +{
> + struct device *dev = data;
> + const struct pci_dev *pdev = to_pci_dev(dev);
> +
> + switch (action) {
> + case BUS_NOTIFY_UNBIND_DRIVER:
> + if (!pdev->is_physfn)
> + break;
> + for (;;) {
> + struct pcistub_device *psdev;
> + unsigned long flags;
> + bool found = false;
> +
> + spin_lock_irqsave(&pcistub_devices_lock, flags);
> + list_for_each_entry(psdev, &pcistub_devices, dev_list)
> + if (!psdev->pdev && psdev->dev != pdev
> + && pci_physfn(psdev->dev) == pdev) {
> + found = true;
> + break;
> + }
> + spin_unlock_irqrestore(&pcistub_devices_lock, flags);
> + if (!found)
> + break;
> + device_release_driver(&psdev->dev->dev);
> + }
> + break;
> + }
> +
> + return NOTIFY_DONE;
> +}
> +
> +static struct notifier_block pci_stub_nb = {
> + .notifier_call = pci_stub_notifier,
> +};
> +#endif
> +
> static int __init xen_pcibk_init(void)
> {
> int err;
> @@ -1523,12 +1562,19 @@ static int __init xen_pcibk_init(void)
> err = xen_pcibk_xenbus_register();
> if (err)
> pcistub_exit();
> +#ifdef CONFIG_PCI_IOV
> + else
> + bus_register_notifier(&pci_bus_type, &pci_stub_nb);
> +#endif
>
> return err;
> }
>
> static void __exit xen_pcibk_cleanup(void)
> {
> +#ifdef CONFIG_PCI_IOV
> + bus_unregister_notifier(&pci_bus_type, &pci_stub_nb);
> +#endif
> xen_pcibk_xenbus_unregister();
> pcistub_exit();
> }
>
>
>
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH] xen-pciback: drop SR-IOV VFs when PF driver unloads
2014-11-21 22:03 ` Konrad Rzeszutek Wilk
@ 2014-11-24 7:54 ` Jan Beulich
2014-11-24 14:51 ` Konrad Rzeszutek Wilk
0 siblings, 1 reply; 4+ messages in thread
From: Jan Beulich @ 2014-11-24 7:54 UTC (permalink / raw)
To: Konrad Rzeszutek Wilk
Cc: david.vrabel, xen-devel, boris.ostrovsky, linux-kernel
>>> On 21.11.14 at 23:03, <konrad.wilk@oracle.com> wrote:
> I rewrote it a bit to be more in the style of pciback:
>[...]
> [v2: Removed the switch statement, moved it about]
What you don't mention here is that you also removed the outer
loop, yet that breaks functionality afaict: There can (and I suppose
normally will) be multiple VFs needing device_release_driver() called
when a single PF goes away.
Also I'm not really happy for a patch with my S-o-b underneath to
introduce goto-s without real need.
Jan
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH] xen-pciback: drop SR-IOV VFs when PF driver unloads
2014-11-24 7:54 ` Jan Beulich
@ 2014-11-24 14:51 ` Konrad Rzeszutek Wilk
0 siblings, 0 replies; 4+ messages in thread
From: Konrad Rzeszutek Wilk @ 2014-11-24 14:51 UTC (permalink / raw)
To: Jan Beulich; +Cc: david.vrabel, xen-devel, boris.ostrovsky, linux-kernel
On Mon, Nov 24, 2014 at 07:54:03AM +0000, Jan Beulich wrote:
> >>> On 21.11.14 at 23:03, <konrad.wilk@oracle.com> wrote:
> > I rewrote it a bit to be more in the style of pciback:
> >[...]
> > [v2: Removed the switch statement, moved it about]
>
> What you don't mention here is that you also removed the outer
> loop, yet that breaks functionality afaict: There can (and I suppose
> normally will) be multiple VFs needing device_release_driver() called
> when a single PF goes away.
Good point.
>
> Also I'm not really happy for a patch with my S-o-b underneath to
> introduce goto-s without real need.
Will ditch them.
>
> Jan
>
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2014-11-24 14:51 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-11-06 15:05 [PATCH] xen-pciback: drop SR-IOV VFs when PF driver unloads Jan Beulich
2014-11-21 22:03 ` Konrad Rzeszutek Wilk
2014-11-24 7:54 ` Jan Beulich
2014-11-24 14:51 ` Konrad Rzeszutek Wilk
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox