pci-stub: enable SR-IOV configuration through sysfs
diff mbox

Message ID 1513170333-19102-1-git-send-email-mheyne@amazon.de
State New
Headers show

Commit Message

Maximilian Heyne Dec. 13, 2017, 1:05 p.m. UTC
Currently, SR-IOV VFs can only be configured through sysfs, if a driver
is loaded for the device. Sometimes we don't care about the PF, but only
want to assign VFs to guests, which is now possible with this patch.

Signed-off-by: Maximilian Heyne <mheyne@amazon.de>
---
 drivers/pci/pci-stub.c | 23 ++++++++++++++++++++---
 1 file changed, 20 insertions(+), 3 deletions(-)

Comments

Bjorn Helgaas Jan. 10, 2018, 11:35 p.m. UTC | #1
[+cc Alex, Alex, Jeff, Liang-Min, kvm, LKML]

Anybody else have any thoughts on this?

On Wed, Dec 13, 2017 at 02:05:33PM +0100, Maximilian Heyne wrote:
> Currently, SR-IOV VFs can only be configured through sysfs, if a driver
> is loaded for the device. Sometimes we don't care about the PF, but only
> want to assign VFs to guests, which is now possible with this patch.
> 
> Signed-off-by: Maximilian Heyne <mheyne@amazon.de>
> ---
>  drivers/pci/pci-stub.c | 23 ++++++++++++++++++++---
>  1 file changed, 20 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/pci/pci-stub.c b/drivers/pci/pci-stub.c
> index 886fb35..aa007c3 100644
> --- a/drivers/pci/pci-stub.c
> +++ b/drivers/pci/pci-stub.c
> @@ -32,10 +32,27 @@ static int pci_stub_probe(struct pci_dev *dev, const struct pci_device_id *id)
>  	return 0;
>  }
>  
> +static void pci_stub_remove(struct pci_dev *dev)
> +{
> +	pci_disable_sriov(dev);
> +}
> +
> +static int pci_stub_sriov_configure(struct pci_dev *dev, int num_vfs)
> +{
> +	if (!num_vfs) {
> +		pci_disable_sriov(dev);
> +		return 0;
> +	}
> +
> +	return pci_enable_sriov(dev, num_vfs);
> +}
> +
>  static struct pci_driver stub_driver = {
> -	.name		= "pci-stub",
> -	.id_table	= NULL,	/* only dynamic id's */
> -	.probe		= pci_stub_probe,
> +	.name			= "pci-stub",
> +	.id_table		= NULL,	/* only dynamic IDs */
> +	.probe			= pci_stub_probe,
> +	.remove			= pci_stub_remove,
> +	.sriov_configure	= pci_stub_sriov_configure,
>  };
>  
>  static int __init pci_stub_init(void)
> -- 
> 2.7.4
>
Alexander Duyck Jan. 11, 2018, 12:05 a.m. UTC | #2
Sorry for top-posting but I am just going to throw a recap of the
discussions as I recall them on top of this since the code itself
isn't so much the subject of review.

I would imagine this has the same issues that we were talking about
for the VFIO or UIO solutions for this. Basically the discussion all
came down to the fact that doing this potentially exposes the kernel
to a possible security issue since the PF might be managed by an
untrusted source. I believe the last discussion we had about the VFIO
based solution ended in us needing to have a way to make it so that
the auto-probe value could be changed and be restored after the
user-space managed PF driver was unloaded and/or SR-IOV was disabled.
Basically we can't risk tainting the kernel by auto-loading the VF
drivers on the kernel when the PF is managed by an unknown entity or
user space.

- Alexander

On Wed, Jan 10, 2018 at 3:35 PM, Bjorn Helgaas <helgaas@kernel.org> wrote:
> [+cc Alex, Alex, Jeff, Liang-Min, kvm, LKML]
>
> Anybody else have any thoughts on this?
>
> On Wed, Dec 13, 2017 at 02:05:33PM +0100, Maximilian Heyne wrote:
>> Currently, SR-IOV VFs can only be configured through sysfs, if a driver
>> is loaded for the device. Sometimes we don't care about the PF, but only
>> want to assign VFs to guests, which is now possible with this patch.
>>
>> Signed-off-by: Maximilian Heyne <mheyne@amazon.de>

Patch
diff mbox

diff --git a/drivers/pci/pci-stub.c b/drivers/pci/pci-stub.c
index 886fb35..aa007c3 100644
--- a/drivers/pci/pci-stub.c
+++ b/drivers/pci/pci-stub.c
@@ -32,10 +32,27 @@  static int pci_stub_probe(struct pci_dev *dev, const struct pci_device_id *id)
 	return 0;
 }
 
+static void pci_stub_remove(struct pci_dev *dev)
+{
+	pci_disable_sriov(dev);
+}
+
+static int pci_stub_sriov_configure(struct pci_dev *dev, int num_vfs)
+{
+	if (!num_vfs) {
+		pci_disable_sriov(dev);
+		return 0;
+	}
+
+	return pci_enable_sriov(dev, num_vfs);
+}
+
 static struct pci_driver stub_driver = {
-	.name		= "pci-stub",
-	.id_table	= NULL,	/* only dynamic id's */
-	.probe		= pci_stub_probe,
+	.name			= "pci-stub",
+	.id_table		= NULL,	/* only dynamic IDs */
+	.probe			= pci_stub_probe,
+	.remove			= pci_stub_remove,
+	.sriov_configure	= pci_stub_sriov_configure,
 };
 
 static int __init pci_stub_init(void)