[libvirt] [PATCH v2 2/3] qemu: vfio-ap device support

Boris Fiuczynski posted 3 patches 6 years, 1 month ago
[libvirt] [PATCH v2 2/3] qemu: vfio-ap device support
Posted by Boris Fiuczynski 6 years, 1 month ago
Adjusting domain format documentation, adding device address
support and adding command line generation for vfio-ap.
Since only one mediated hostdev with model vfio-ap is supported a check
disallows to define domains with more than one such hostdev device.

Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
Reviewed-by: Bjoern Walk <bwalk@linux.ibm.com>
---
 docs/formatdomain.html.in      |  3 ++-
 docs/schemas/domaincommon.rng  |  1 +
 src/conf/domain_conf.c         | 28 ++++++++++++++++++++++++++++
 src/qemu/qemu_command.c        |  8 ++++++++
 src/qemu/qemu_domain_address.c |  4 ++++
 src/util/virmdev.c             |  3 ++-
 src/util/virmdev.h             |  1 +
 7 files changed, 46 insertions(+), 2 deletions(-)

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 8189959773..269741a690 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -4616,8 +4616,9 @@
           <dd>For mediated devices (<span class="since">Since 3.2.0</span>)
           the <code>model</code> attribute specifies the device API which
           determines how the host's vfio driver will expose the device to the
-          guest. Currently, <code>model='vfio-pci'</code> and
+          guest. Currently, <code>model='vfio-pci'</code>,
           <code>model='vfio-ccw'</code> (<span class="since">Since 4.4.0</span>)
+          and <code>model='vfio-ap'</code> (<span class="since">Since 4.9.0</span>)
           is supported. <a href="drvnodedev.html#MDEV">MDEV</a> section
           provides more information about mediated devices as well as how to
           create mediated devices on the host.
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 099a949cf8..b9ac5df479 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -4618,6 +4618,7 @@
       <choice>
         <value>vfio-pci</value>
         <value>vfio-ccw</value>
+        <value>vfio-ap</value>
       </choice>
     </attribute>
     <optional>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index e8e0adc819..1f8797f997 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -4275,6 +4275,31 @@ virDomainDefPostParseGraphics(virDomainDef *def)
 }
 
 
+static int
+virDomainDefPostParseHostdev(virDomainDefPtr def)
+{
+    size_t i;
+    bool vfioap_found = false;
+
+    /* verify settings of hostdevs vfio-ap */
+    for (i = 0; i < def->nhostdevs; i++) {
+        virDomainHostdevDefPtr hostdev = def->hostdevs[i];
+
+        if (virHostdevIsMdevDevice(hostdev) &&
+            hostdev->source.subsys.u.mdev.model == VIR_MDEV_MODEL_TYPE_VFIO_AP) {
+            if (vfioap_found) {
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                               _("Only one hostdev of model vfio-ap is "
+                                 "support"));
+                return -1;
+            }
+            vfioap_found = true;
+        }
+    }
+    return 0;
+}
+
+
 /**
  * virDomainDriveAddressIsUsedByDisk:
  * @def: domain definition containing the disks to check
@@ -5185,6 +5210,9 @@ virDomainDefPostParseCommon(virDomainDefPtr def,
 
     virDomainDefPostParseGraphics(def);
 
+    if (virDomainDefPostParseHostdev(def) < 0)
+        return -1;
+
     if (virDomainDefPostParseCPU(def) < 0)
         return -1;
 
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 1ff593c657..6e3ff67660 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -5476,6 +5476,14 @@ qemuBuildHostdevCommandLine(virCommandPtr cmd,
                     return -1;
                 }
                 break;
+            case VIR_MDEV_MODEL_TYPE_VFIO_AP:
+                if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_AP)) {
+                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                                   _("VFIO AP device assignment is not "
+                                     "supported by this version of QEMU"));
+                    return -1;
+                }
+                break;
             case VIR_MDEV_MODEL_TYPE_LAST:
             default:
                 virReportEnumRangeError(virMediatedDeviceModelType,
diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
index 8a8764cff5..24dd7c1a58 100644
--- a/src/qemu/qemu_domain_address.c
+++ b/src/qemu/qemu_domain_address.c
@@ -294,6 +294,10 @@ qemuDomainPrimeVfioDeviceAddresses(virDomainDefPtr def,
             subsys->u.mdev.model == VIR_MDEV_MODEL_TYPE_VFIO_CCW &&
             def->hostdevs[i]->info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
             def->hostdevs[i]->info->type = type;
+
+        if (virHostdevIsMdevDevice(def->hostdevs[i]) &&
+            subsys->u.mdev.model == VIR_MDEV_MODEL_TYPE_VFIO_AP)
+            def->hostdevs[i]->info->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE;
     }
 }
 
diff --git a/src/util/virmdev.c b/src/util/virmdev.c
index 10a2b08337..3e11e38802 100644
--- a/src/util/virmdev.c
+++ b/src/util/virmdev.c
@@ -48,7 +48,8 @@ struct _virMediatedDeviceList {
 
 VIR_ENUM_IMPL(virMediatedDeviceModel, VIR_MDEV_MODEL_TYPE_LAST,
               "vfio-pci",
-              "vfio-ccw")
+              "vfio-ccw",
+              "vfio-ap")
 
 static virClassPtr virMediatedDeviceListClass;
 
diff --git a/src/util/virmdev.h b/src/util/virmdev.h
index 7c93c4d390..c856ff5bdb 100644
--- a/src/util/virmdev.h
+++ b/src/util/virmdev.h
@@ -27,6 +27,7 @@
 typedef enum {
     VIR_MDEV_MODEL_TYPE_VFIO_PCI = 0,
     VIR_MDEV_MODEL_TYPE_VFIO_CCW = 1,
+    VIR_MDEV_MODEL_TYPE_VFIO_AP  = 2,
 
     VIR_MDEV_MODEL_TYPE_LAST
 } virMediatedDeviceModelType;
-- 
2.17.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v2 2/3] qemu: vfio-ap device support
Posted by Thomas Huth 6 years, 1 month ago
On 2018-10-18 16:54, Boris Fiuczynski wrote:
> Adjusting domain format documentation, adding device address
> support and adding command line generation for vfio-ap.
> Since only one mediated hostdev with model vfio-ap is supported a check
> disallows to define domains with more than one such hostdev device.
> 
> Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
> Reviewed-by: Bjoern Walk <bwalk@linux.ibm.com>
[...]
> +static int
> +virDomainDefPostParseHostdev(virDomainDefPtr def)
> +{
> +    size_t i;
> +    bool vfioap_found = false;
> +
> +    /* verify settings of hostdevs vfio-ap */
> +    for (i = 0; i < def->nhostdevs; i++) {
> +        virDomainHostdevDefPtr hostdev = def->hostdevs[i];
> +
> +        if (virHostdevIsMdevDevice(hostdev) &&
> +            hostdev->source.subsys.u.mdev.model == VIR_MDEV_MODEL_TYPE_VFIO_AP) {
> +            if (vfioap_found) {
> +                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                               _("Only one hostdev of model vfio-ap is "
> +                                 "support"));

s/support/supported/ ?

 Thomas

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v2 2/3] qemu: vfio-ap device support
Posted by Boris Fiuczynski 6 years, 1 month ago
On 10/19/18 1:56 PM, Thomas Huth wrote:
> On 2018-10-18 16:54, Boris Fiuczynski wrote:
>> Adjusting domain format documentation, adding device address
>> support and adding command line generation for vfio-ap.
>> Since only one mediated hostdev with model vfio-ap is supported a check
>> disallows to define domains with more than one such hostdev device.
>>
>> Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
>> Reviewed-by: Bjoern Walk <bwalk@linux.ibm.com>
> [...]
>> +static int
>> +virDomainDefPostParseHostdev(virDomainDefPtr def)
>> +{
>> +    size_t i;
>> +    bool vfioap_found = false;
>> +
>> +    /* verify settings of hostdevs vfio-ap */
>> +    for (i = 0; i < def->nhostdevs; i++) {
>> +        virDomainHostdevDefPtr hostdev = def->hostdevs[i];
>> +
>> +        if (virHostdevIsMdevDevice(hostdev) &&
>> +            hostdev->source.subsys.u.mdev.model == VIR_MDEV_MODEL_TYPE_VFIO_AP) {
>> +            if (vfioap_found) {
>> +                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>> +                               _("Only one hostdev of model vfio-ap is "
>> +                                 "support"));
> 
> s/support/supported/ ?
It should be "supported"... :-)

I hope whoever is going to push this series can fix it before pushing. 
If not please let me know and I am going to send a v3.

Thomas, thanks for your review.

> 
>   Thomas
> 
> --
> libvir-list mailing list
> libvir-list@redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
> 


-- 
Mit freundlichen Grüßen/Kind regards
    Boris Fiuczynski

IBM Deutschland Research & Development GmbH
Vorsitzender des Aufsichtsrats: Martina Köderitz
Geschäftsführung: Dirk Wittkopp
Sitz der Gesellschaft: Böblingen
Registergericht: Amtsgericht Stuttgart, HRB 243294

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v2 2/3] qemu: vfio-ap device support
Posted by Erik Skultety 6 years, 1 month ago
On Mon, Oct 22, 2018 at 10:10:39AM +0200, Boris Fiuczynski wrote:
> On 10/19/18 1:56 PM, Thomas Huth wrote:
> > On 2018-10-18 16:54, Boris Fiuczynski wrote:
> > > Adjusting domain format documentation, adding device address
> > > support and adding command line generation for vfio-ap.
> > > Since only one mediated hostdev with model vfio-ap is supported a check
> > > disallows to define domains with more than one such hostdev device.
> > >
> > > Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
> > > Reviewed-by: Bjoern Walk <bwalk@linux.ibm.com>
> > [...]
> > > +static int
> > > +virDomainDefPostParseHostdev(virDomainDefPtr def)
> > > +{
> > > +    size_t i;
> > > +    bool vfioap_found = false;
> > > +
> > > +    /* verify settings of hostdevs vfio-ap */
> > > +    for (i = 0; i < def->nhostdevs; i++) {
> > > +        virDomainHostdevDefPtr hostdev = def->hostdevs[i];
> > > +
> > > +        if (virHostdevIsMdevDevice(hostdev) &&
> > > +            hostdev->source.subsys.u.mdev.model == VIR_MDEV_MODEL_TYPE_VFIO_AP) {
> > > +            if (vfioap_found) {
> > > +                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> > > +                               _("Only one hostdev of model vfio-ap is "
> > > +                                 "support"));
> >
> > s/support/supported/ ?
> It should be "supported"... :-)
>
> I hope whoever is going to push this series can fix it before pushing. If
> not please let me know and I am going to send a v3.

Hi Boris, I'm planning on having a look at the series too (sorry for not taking
a look earlier, I was on PTO and the whole team is now attending KVM forum).
Anyhow, if it turns out the typo is the only issue, that will be fixed before
merging, no brainer :).

Erik

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v2 2/3] qemu: vfio-ap device support
Posted by Boris Fiuczynski 6 years ago
Hi Erik,
do you think it is possible that this series gets into v4.9.0?

Cheers,
  Boris

On 10/24/18 12:18 AM, Erik Skultety wrote:
> On Mon, Oct 22, 2018 at 10:10:39AM +0200, Boris Fiuczynski wrote:
>> On 10/19/18 1:56 PM, Thomas Huth wrote:
>>> On 2018-10-18 16:54, Boris Fiuczynski wrote:
>>>> Adjusting domain format documentation, adding device address
>>>> support and adding command line generation for vfio-ap.
>>>> Since only one mediated hostdev with model vfio-ap is supported a check
>>>> disallows to define domains with more than one such hostdev device.
>>>>
>>>> Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
>>>> Reviewed-by: Bjoern Walk <bwalk@linux.ibm.com>
>>> [...]
>>>> +static int
>>>> +virDomainDefPostParseHostdev(virDomainDefPtr def)
>>>> +{
>>>> +    size_t i;
>>>> +    bool vfioap_found = false;
>>>> +
>>>> +    /* verify settings of hostdevs vfio-ap */
>>>> +    for (i = 0; i < def->nhostdevs; i++) {
>>>> +        virDomainHostdevDefPtr hostdev = def->hostdevs[i];
>>>> +
>>>> +        if (virHostdevIsMdevDevice(hostdev) &&
>>>> +            hostdev->source.subsys.u.mdev.model == VIR_MDEV_MODEL_TYPE_VFIO_AP) {
>>>> +            if (vfioap_found) {
>>>> +                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>>>> +                               _("Only one hostdev of model vfio-ap is "
>>>> +                                 "support"));
>>>
>>> s/support/supported/ ?
>> It should be "supported"... :-)
>>
>> I hope whoever is going to push this series can fix it before pushing. If
>> not please let me know and I am going to send a v3.
> 
> Hi Boris, I'm planning on having a look at the series too (sorry for not taking
> a look earlier, I was on PTO and the whole team is now attending KVM forum).
> Anyhow, if it turns out the typo is the only issue, that will be fixed before
> merging, no brainer :).
> 
> Erik
> 
> --
> libvir-list mailing list
> libvir-list@redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
> 


-- 
Mit freundlichen Grüßen/Kind regards
    Boris Fiuczynski

IBM Deutschland Research & Development GmbH
Vorsitzender des Aufsichtsrats: Martina Köderitz
Geschäftsführung: Dirk Wittkopp
Sitz der Gesellschaft: Böblingen
Registergericht: Amtsgericht Stuttgart, HRB 243294

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v2 2/3] qemu: vfio-ap device support
Posted by John Ferlan 6 years ago

On 10/29/18 11:54 AM, Boris Fiuczynski wrote:
> Hi Erik,
> do you think it is possible that this series gets into v4.9.0?
> 
> Cheers,
>  Boris
> 

Not sure if Erik is "online" today... The Red Hat portion of the team
has just returned from KVM Forum and today we have some well larger news
to digest too ;-)

In any case, I had it on my radar too... When I last looked patch2
didn't have Thomas' explicit R-By, but it has others so that's fine.
Just have to go through the "motions" and will push before release...

John

> On 10/24/18 12:18 AM, Erik Skultety wrote:
>> On Mon, Oct 22, 2018 at 10:10:39AM +0200, Boris Fiuczynski wrote:
>>> On 10/19/18 1:56 PM, Thomas Huth wrote:
>>>> On 2018-10-18 16:54, Boris Fiuczynski wrote:
>>>>> Adjusting domain format documentation, adding device address
>>>>> support and adding command line generation for vfio-ap.
>>>>> Since only one mediated hostdev with model vfio-ap is supported a
>>>>> check
>>>>> disallows to define domains with more than one such hostdev device.
>>>>>
>>>>> Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
>>>>> Reviewed-by: Bjoern Walk <bwalk@linux.ibm.com>
>>>> [...]
>>>>> +static int
>>>>> +virDomainDefPostParseHostdev(virDomainDefPtr def)
>>>>> +{
>>>>> +    size_t i;
>>>>> +    bool vfioap_found = false;
>>>>> +
>>>>> +    /* verify settings of hostdevs vfio-ap */
>>>>> +    for (i = 0; i < def->nhostdevs; i++) {
>>>>> +        virDomainHostdevDefPtr hostdev = def->hostdevs[i];
>>>>> +
>>>>> +        if (virHostdevIsMdevDevice(hostdev) &&
>>>>> +            hostdev->source.subsys.u.mdev.model ==
>>>>> VIR_MDEV_MODEL_TYPE_VFIO_AP) {
>>>>> +            if (vfioap_found) {
>>>>> +                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>>>>> +                               _("Only one hostdev of model
>>>>> vfio-ap is "
>>>>> +                                 "support"));
>>>>
>>>> s/support/supported/ ?
>>> It should be "supported"... :-)
>>>
>>> I hope whoever is going to push this series can fix it before
>>> pushing. If
>>> not please let me know and I am going to send a v3.
>>
>> Hi Boris, I'm planning on having a look at the series too (sorry for
>> not taking
>> a look earlier, I was on PTO and the whole team is now attending KVM
>> forum).
>> Anyhow, if it turns out the typo is the only issue, that will be fixed
>> before
>> merging, no brainer :).
>>
>> Erik
>>
>> -- 
>> libvir-list mailing list
>> libvir-list@redhat.com
>> https://www.redhat.com/mailman/listinfo/libvir-list
>>
> 
> 

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v2 2/3] qemu: vfio-ap device support
Posted by Chris Venteicher 6 years, 1 month ago
Quoting Boris Fiuczynski (2018-10-18 09:54:07)
> Adjusting domain format documentation, adding device address
> support and adding command line generation for vfio-ap.
> Since only one mediated hostdev with model vfio-ap is supported a check
> disallows to define domains with more than one such hostdev device.
> 
> Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
> Reviewed-by: Bjoern Walk <bwalk@linux.ibm.com>
Reviewed-by: Chris Venteicher <cventeic@redhat.com>
> ---
>  docs/formatdomain.html.in      |  3 ++-
>  docs/schemas/domaincommon.rng  |  1 +
>  src/conf/domain_conf.c         | 28 ++++++++++++++++++++++++++++
>  src/qemu/qemu_command.c        |  8 ++++++++
>  src/qemu/qemu_domain_address.c |  4 ++++
>  src/util/virmdev.c             |  3 ++-
>  src/util/virmdev.h             |  1 +
>  7 files changed, 46 insertions(+), 2 deletions(-)
> 
> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
> index 8189959773..269741a690 100644
> --- a/docs/formatdomain.html.in
> +++ b/docs/formatdomain.html.in
> @@ -4616,8 +4616,9 @@
>            <dd>For mediated devices (<span class="since">Since 3.2.0</span>)
>            the <code>model</code> attribute specifies the device API which
>            determines how the host's vfio driver will expose the device to the
> -          guest. Currently, <code>model='vfio-pci'</code> and
> +          guest. Currently, <code>model='vfio-pci'</code>,
>            <code>model='vfio-ccw'</code> (<span class="since">Since 4.4.0</span>)
> +          and <code>model='vfio-ap'</code> (<span class="since">Since 4.9.0</span>)
>            is supported. <a href="drvnodedev.html#MDEV">MDEV</a> section
>            provides more information about mediated devices as well as how to
>            create mediated devices on the host.
> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> index 099a949cf8..b9ac5df479 100644
> --- a/docs/schemas/domaincommon.rng
> +++ b/docs/schemas/domaincommon.rng
> @@ -4618,6 +4618,7 @@
>        <choice>
>          <value>vfio-pci</value>
>          <value>vfio-ccw</value>
> +        <value>vfio-ap</value>
>        </choice>
>      </attribute>
>      <optional>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index e8e0adc819..1f8797f997 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -4275,6 +4275,31 @@ virDomainDefPostParseGraphics(virDomainDef *def)
>  }
>  
>  
> +static int
> +virDomainDefPostParseHostdev(virDomainDefPtr def)
> +{
> +    size_t i;
> +    bool vfioap_found = false;
> +
> +    /* verify settings of hostdevs vfio-ap */
> +    for (i = 0; i < def->nhostdevs; i++) {
> +        virDomainHostdevDefPtr hostdev = def->hostdevs[i];
> +
> +        if (virHostdevIsMdevDevice(hostdev) &&
> +            hostdev->source.subsys.u.mdev.model == VIR_MDEV_MODEL_TYPE_VFIO_AP) {
> +            if (vfioap_found) {
> +                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                               _("Only one hostdev of model vfio-ap is "
> +                                 "support"));
> +                return -1;
> +            }
> +            vfioap_found = true;
> +        }
> +    }
> +    return 0;
> +}
> +
> +
>  /**
>   * virDomainDriveAddressIsUsedByDisk:
>   * @def: domain definition containing the disks to check
> @@ -5185,6 +5210,9 @@ virDomainDefPostParseCommon(virDomainDefPtr def,
>  
>      virDomainDefPostParseGraphics(def);
>  
> +    if (virDomainDefPostParseHostdev(def) < 0)
> +        return -1;
> +
>      if (virDomainDefPostParseCPU(def) < 0)
>          return -1;
>  
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 1ff593c657..6e3ff67660 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -5476,6 +5476,14 @@ qemuBuildHostdevCommandLine(virCommandPtr cmd,
>                      return -1;
>                  }
>                  break;
> +            case VIR_MDEV_MODEL_TYPE_VFIO_AP:
> +                if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_AP)) {
> +                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
> +                                   _("VFIO AP device assignment is not "
> +                                     "supported by this version of QEMU"));
> +                    return -1;
> +                }
> +                break;
>              case VIR_MDEV_MODEL_TYPE_LAST:
>              default:
>                  virReportEnumRangeError(virMediatedDeviceModelType,
> diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
> index 8a8764cff5..24dd7c1a58 100644
> --- a/src/qemu/qemu_domain_address.c
> +++ b/src/qemu/qemu_domain_address.c
> @@ -294,6 +294,10 @@ qemuDomainPrimeVfioDeviceAddresses(virDomainDefPtr def,
>              subsys->u.mdev.model == VIR_MDEV_MODEL_TYPE_VFIO_CCW &&
>              def->hostdevs[i]->info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
>              def->hostdevs[i]->info->type = type;
> +
> +        if (virHostdevIsMdevDevice(def->hostdevs[i]) &&
> +            subsys->u.mdev.model == VIR_MDEV_MODEL_TYPE_VFIO_AP)
> +            def->hostdevs[i]->info->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE;

Is there a case where a VFIO_AP hostdev is of a type other than the
default type (value 0) VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE such that
this code actually changes the type?

Don't think it's an error but not sure it's actually needed.

>      }
>  }
>  
> diff --git a/src/util/virmdev.c b/src/util/virmdev.c
> index 10a2b08337..3e11e38802 100644
> --- a/src/util/virmdev.c
> +++ b/src/util/virmdev.c
> @@ -48,7 +48,8 @@ struct _virMediatedDeviceList {
>  
>  VIR_ENUM_IMPL(virMediatedDeviceModel, VIR_MDEV_MODEL_TYPE_LAST,
>                "vfio-pci",
> -              "vfio-ccw")
> +              "vfio-ccw",
> +              "vfio-ap")
>  
>  static virClassPtr virMediatedDeviceListClass;
>  
> diff --git a/src/util/virmdev.h b/src/util/virmdev.h
> index 7c93c4d390..c856ff5bdb 100644
> --- a/src/util/virmdev.h
> +++ b/src/util/virmdev.h
> @@ -27,6 +27,7 @@
>  typedef enum {
>      VIR_MDEV_MODEL_TYPE_VFIO_PCI = 0,
>      VIR_MDEV_MODEL_TYPE_VFIO_CCW = 1,
> +    VIR_MDEV_MODEL_TYPE_VFIO_AP  = 2,
>  
>      VIR_MDEV_MODEL_TYPE_LAST
>  } virMediatedDeviceModelType;
> -- 
> 2.17.0
> 
> --
> libvir-list mailing list
> libvir-list@redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v2 2/3] qemu: vfio-ap device support
Posted by Boris Fiuczynski 6 years, 1 month ago
On 10/26/18 3:00 AM, Chris Venteicher wrote:
> Quoting Boris Fiuczynski (2018-10-18 09:54:07)
>> Adjusting domain format documentation, adding device address
>> support and adding command line generation for vfio-ap.
>> Since only one mediated hostdev with model vfio-ap is supported a check
>> disallows to define domains with more than one such hostdev device.
>>
>> Signed-off-by: Boris Fiuczynski <fiuczy@linux.ibm.com>
>> Reviewed-by: Bjoern Walk <bwalk@linux.ibm.com>
> Reviewed-by: Chris Venteicher <cventeic@redhat.com>
>> ---
>>   docs/formatdomain.html.in      |  3 ++-
>>   docs/schemas/domaincommon.rng  |  1 +
>>   src/conf/domain_conf.c         | 28 ++++++++++++++++++++++++++++
>>   src/qemu/qemu_command.c        |  8 ++++++++
>>   src/qemu/qemu_domain_address.c |  4 ++++
>>   src/util/virmdev.c             |  3 ++-
>>   src/util/virmdev.h             |  1 +
>>   7 files changed, 46 insertions(+), 2 deletions(-)
>>
>> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
>> index 8189959773..269741a690 100644
>> --- a/docs/formatdomain.html.in
>> +++ b/docs/formatdomain.html.in
>> @@ -4616,8 +4616,9 @@
>>             <dd>For mediated devices (<span class="since">Since 3.2.0</span>)
>>             the <code>model</code> attribute specifies the device API which
>>             determines how the host's vfio driver will expose the device to the
>> -          guest. Currently, <code>model='vfio-pci'</code> and
>> +          guest. Currently, <code>model='vfio-pci'</code>,
>>             <code>model='vfio-ccw'</code> (<span class="since">Since 4.4.0</span>)
>> +          and <code>model='vfio-ap'</code> (<span class="since">Since 4.9.0</span>)
>>             is supported. <a href="drvnodedev.html#MDEV">MDEV</a> section
>>             provides more information about mediated devices as well as how to
>>             create mediated devices on the host.
>> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
>> index 099a949cf8..b9ac5df479 100644
>> --- a/docs/schemas/domaincommon.rng
>> +++ b/docs/schemas/domaincommon.rng
>> @@ -4618,6 +4618,7 @@
>>         <choice>
>>           <value>vfio-pci</value>
>>           <value>vfio-ccw</value>
>> +        <value>vfio-ap</value>
>>         </choice>
>>       </attribute>
>>       <optional>
>> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>> index e8e0adc819..1f8797f997 100644
>> --- a/src/conf/domain_conf.c
>> +++ b/src/conf/domain_conf.c
>> @@ -4275,6 +4275,31 @@ virDomainDefPostParseGraphics(virDomainDef *def)
>>   }
>>   
>>   
>> +static int
>> +virDomainDefPostParseHostdev(virDomainDefPtr def)
>> +{
>> +    size_t i;
>> +    bool vfioap_found = false;
>> +
>> +    /* verify settings of hostdevs vfio-ap */
>> +    for (i = 0; i < def->nhostdevs; i++) {
>> +        virDomainHostdevDefPtr hostdev = def->hostdevs[i];
>> +
>> +        if (virHostdevIsMdevDevice(hostdev) &&
>> +            hostdev->source.subsys.u.mdev.model == VIR_MDEV_MODEL_TYPE_VFIO_AP) {
>> +            if (vfioap_found) {
>> +                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>> +                               _("Only one hostdev of model vfio-ap is "
>> +                                 "support"));
>> +                return -1;
>> +            }
>> +            vfioap_found = true;
>> +        }
>> +    }
>> +    return 0;
>> +}
>> +
>> +
>>   /**
>>    * virDomainDriveAddressIsUsedByDisk:
>>    * @def: domain definition containing the disks to check
>> @@ -5185,6 +5210,9 @@ virDomainDefPostParseCommon(virDomainDefPtr def,
>>   
>>       virDomainDefPostParseGraphics(def);
>>   
>> +    if (virDomainDefPostParseHostdev(def) < 0)
>> +        return -1;
>> +
>>       if (virDomainDefPostParseCPU(def) < 0)
>>           return -1;
>>   
>> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
>> index 1ff593c657..6e3ff67660 100644
>> --- a/src/qemu/qemu_command.c
>> +++ b/src/qemu/qemu_command.c
>> @@ -5476,6 +5476,14 @@ qemuBuildHostdevCommandLine(virCommandPtr cmd,
>>                       return -1;
>>                   }
>>                   break;
>> +            case VIR_MDEV_MODEL_TYPE_VFIO_AP:
>> +                if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_AP)) {
>> +                    virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
>> +                                   _("VFIO AP device assignment is not "
>> +                                     "supported by this version of QEMU"));
>> +                    return -1;
>> +                }
>> +                break;
>>               case VIR_MDEV_MODEL_TYPE_LAST:
>>               default:
>>                   virReportEnumRangeError(virMediatedDeviceModelType,
>> diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
>> index 8a8764cff5..24dd7c1a58 100644
>> --- a/src/qemu/qemu_domain_address.c
>> +++ b/src/qemu/qemu_domain_address.c
>> @@ -294,6 +294,10 @@ qemuDomainPrimeVfioDeviceAddresses(virDomainDefPtr def,
>>               subsys->u.mdev.model == VIR_MDEV_MODEL_TYPE_VFIO_CCW &&
>>               def->hostdevs[i]->info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE)
>>               def->hostdevs[i]->info->type = type;
>> +
>> +        if (virHostdevIsMdevDevice(def->hostdevs[i]) &&
>> +            subsys->u.mdev.model == VIR_MDEV_MODEL_TYPE_VFIO_AP)
>> +            def->hostdevs[i]->info->type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE;
> 
> Is there a case where a VFIO_AP hostdev is of a type other than the
> default type (value 0) VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE such that
> this code actually changes the type?
> 
> Don't think it's an error but not sure it's actually needed.
The code eliminates any address specified in a hostdev of type mdev with 
model vfio-ap. Since the vfio-ap mdev essentially represents the 
complete ap bus including all cards, usage domains and control domains 
there is no useful address.

> 
>>       }
>>   }
>>   
>> diff --git a/src/util/virmdev.c b/src/util/virmdev.c
>> index 10a2b08337..3e11e38802 100644
>> --- a/src/util/virmdev.c
>> +++ b/src/util/virmdev.c
>> @@ -48,7 +48,8 @@ struct _virMediatedDeviceList {
>>   
>>   VIR_ENUM_IMPL(virMediatedDeviceModel, VIR_MDEV_MODEL_TYPE_LAST,
>>                 "vfio-pci",
>> -              "vfio-ccw")
>> +              "vfio-ccw",
>> +              "vfio-ap")
>>   
>>   static virClassPtr virMediatedDeviceListClass;
>>   
>> diff --git a/src/util/virmdev.h b/src/util/virmdev.h
>> index 7c93c4d390..c856ff5bdb 100644
>> --- a/src/util/virmdev.h
>> +++ b/src/util/virmdev.h
>> @@ -27,6 +27,7 @@
>>   typedef enum {
>>       VIR_MDEV_MODEL_TYPE_VFIO_PCI = 0,
>>       VIR_MDEV_MODEL_TYPE_VFIO_CCW = 1,
>> +    VIR_MDEV_MODEL_TYPE_VFIO_AP  = 2,
>>   
>>       VIR_MDEV_MODEL_TYPE_LAST
>>   } virMediatedDeviceModelType;
>> -- 
>> 2.17.0
>>
>> --
>> libvir-list mailing list
>> libvir-list@redhat.com
>> https://www.redhat.com/mailman/listinfo/libvir-list
> 
> --
> libvir-list mailing list
> libvir-list@redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
> 


-- 
Mit freundlichen Grüßen/Kind regards
    Boris Fiuczynski

IBM Deutschland Research & Development GmbH
Vorsitzender des Aufsichtsrats: Martina Köderitz
Geschäftsführung: Dirk Wittkopp
Sitz der Gesellschaft: Böblingen
Registergericht: Amtsgericht Stuttgart, HRB 243294

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list