qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [RFC v2] libvirt vGPU QEMU integration


From: Daniel P. Berrange
Subject: Re: [Qemu-devel] [RFC v2] libvirt vGPU QEMU integration
Date: Tue, 20 Sep 2016 10:47:53 +0100
User-agent: Mutt/1.7.0 (2016-08-17)

On Tue, Sep 20, 2016 at 02:05:52AM +0530, Kirti Wankhede wrote:
> 
> Hi libvirt experts,
> 
> Thanks for valuable input on v1 version of RFC.
> 
> Quick brief, VFIO based mediated device framework provides a way to
> virtualize their devices without SR-IOV, like NVIDIA vGPU, Intel KVMGT
> and IBM's channel IO. This framework reuses VFIO APIs for all the
> functionalities for mediated devices which are currently being used for
> pass through devices. This framework introduces a set of new sysfs files
> for device creation and its life cycle management.
> 
> Here is the summary of discussion on v1:
> 1. Discover mediated device:
> As part of physical device initialization process, vendor driver will
> register their physical devices, which will be used to create virtual
> device (mediated device, aka mdev) to the mediated framework.
> 
> Vendor driver should specify mdev_supported_types in directory format.
> This format is class based, for example, display class directory format
> should be as below. We need to define such set for each class of devices
> which would be supported by mediated device framework.
> 
>  --- mdev_destroy
>  --- mdev_supported_types
>      |-- 11
>      |   |-- create
>      |   |-- name
>      |   |-- fb_length
>      |   |-- resolution
>      |   |-- heads
>      |   |-- max_instances
>      |   |-- params
>      |   |-- requires_group
>      |-- 12
>      |   |-- create
>      |   |-- name
>      |   |-- fb_length
>      |   |-- resolution
>      |   |-- heads
>      |   |-- max_instances
>      |   |-- params
>      |   |-- requires_group
>      |-- 13
>          |-- create
>          |-- name
>          |-- fb_length
>          |-- resolution
>          |-- heads
>          |-- max_instances
>          |-- params
>          |-- requires_group
> 
> 
> In the above example directory '11' represents a type id of mdev device.
> 'name', 'fb_length', 'resolution', 'heads', 'max_instance' and
> 'requires_group' would be Read-Only files that vendor would provide to
> describe about that type.
> 
> 'create':
>     Write-only file. Mandatory.
>     Accepts string to create mediated device.
> 
> 'name':
>     Read-Only file. Mandatory.
>     Returns string, the name of that type id.

Presumably this is a human-targetted title/description of
the device.

> 
> 'fb_length':
>     Read-only file. Mandatory.
>     Returns <number>{K,M,G}, size of framebuffer.
> 
> 'resolution':
>     Read-Only file. Mandatory.
>     Returns 'hres x vres' format. Maximum supported resolution.
> 
> 'heads':
>     Read-Only file. Mandatory.
>     Returns integer. Number of maximum heads supported.

None of these should be mandatory as that makes the mdev
useless for non-GPU devices.

I'd expect to see a 'class' or 'type' attribute in the
directory whcih tells you what kind of mdev it is. A
valid 'class' value would be 'gpu'. The fb_length,
resolution, and heads parameters would only be mandatory
when class==gpu.

> 'max_instance':
>     Read-Only file. Mandatory.
>     Returns integer.  Returns maximum mdev device could be created
> at the moment when this file is read. This count would be updated by
> vendor driver. Before creating mdev device of this type, check if
> max_instance is > 0.
> 
> 'params'
>     Write-Only file. Optional.
>     String input. Libvirt would pass the string given in XML file to
> this file and then create mdev device. Set empty string to clear params.
> For example, set parameter 'frame_rate_limiter=0' to disable frame rate
> limiter for performance benchmarking, then create device of type 11. The
> device created would have that parameter set by vendor driver.

Nope, libvirt will explicitly *NEVER* allow arbitrary opaque
passthrough of vendor specific data in this way.

> The parent device would look like:
> 
>    <device>
>      <name>pci_0000_86_00_0</name>
>      <capability type='pci'>
>        <domain>0</domain>
>        <bus>134</bus>
>        <slot>0</slot>
>        <function>0</function>
>        <capability type='mdev'>
>          <!-- one type element per sysfs directory -->
>          <type id='11'>
>            <!-- one element per sysfs file roughly -->
>            <name>GRID M60-0B</name>
>            <attribute name='fb_length'>512M</attribute>
>            <attribute name='resolution'>2560x1600</attribute>
>            <attribute name='heads'>2</attribute>
>            <attribute name='max_instances'>16</attribute>
>            <attribute name='requires_group'>1</attribute>
>          </type>

There would need to be a <class> element, eg <class>gpu</class>

We would then have further elements based on the class. eg

          <type id='11'>
            <!-- one element per sysfs file roughly -->
            <name>GRID M60-0B</name>
            <fb_length>512M</fb_length>
            <resolution>2560x1600</resolution>
            <heads>2</heads>
            <max_instances>16</max_instances>
            <requires_group>1</requires_group>
          </type>



>        </capability>
>        <product id='...'>GRID M60</product>
>        <vendor id='0x10de'>NVIDIA</vendor>
>      </capability>
>    </device>
> 
> 2. Create/destroy mediated device
> 
> With above example, vGPU device XML would look like:
> 
>    <device>
>      <name>my-vgpu</name>
>      <parent>pci_0000_86_00_0</parent>
>      <capability type='mdev'>
>        <type id='11'/>
>        <group>1</group>
>        <params>'frame_rate_limiter=0'</params>

No, we will not support <params> in this manner in libvirt.

The entire purpose of libvirt is to represent data in a
vendor agnostic manner and not do abitrary passthrough
of vendor specific data. Simply saying this field is
optional does not get around that either.

>      </capability>
>    </device>
> 
> 'type id' is mandatory.
> 'group' is optional. It should be a unique number in the system among
> all the groups created for mdev devices. Its usage is:
>   - not needed if single vGPU device is being assigned to a domain.
>   - only need to be set if multiple vGPUs need to be assigned to a
> domain and vendor driver have 'requires_group' file in type id directory.
>   - if type id directory include 'requires_group' and user tries to
> assign multiple vGPUs to a domain without having <group> field in XML,
> it will create single vGPU.
> 
> 'params' is optional field. User should set this field if extra
> parameters need to be set for a particular vGPU device. Libvirt don't
> need to parse these params. These are meant for vendor driver.
> 
> Libvirt need to follow the sequence to create device:
> * Read /sys/../0000\:86\:00.0/11/max_instances. If it is greater than 0,
> then only proceed else fail.
> 
> * Set extra params if 'params' field exist in device XML and 'params'
> file exist in type id directory
> 
>     echo "frame_rate_limiter=0" > /sys/../0000\:86\:00.0/11/params

We cannot do that step.

> 
> * Autogenerate UUID
> * Create device:
> 
>     echo "$UUID:<group>" > /sys/../0000\:86\:00.0/11/create
> 
>     where <group> is optional. Group should be unique number among all
> the groups created for mdev devices.
> 
> * Clear params, if set earlier:
> 
>     echo "" > /sys/../0000\:86\:00.0/11/params
> 
> * To destroy device:
> 
>     echo $UUID > /sys/../0000\:86\:00.0/mdev_destroy
> 
> 
> 3. Start/stop mediated device
> 
> No change or requirement for libvirt as this will be handled by open()
> and close() callbacks to vendor driver. In case of multiple devices and
> 'requires_group' set, this will be handled in 'first open()' and 'last
> close()' on device in that group.
> 
> 4. Launch QEMU/VM
> 
>  Pass the mdev sysfs path to QEMU as vfio-pci device.
>  For above vGPU device example:
> 
>     -device vfio-pci,sysfsdev=/sys/bus/mdev/devices/$UUID
> 
> 5. QEMU/VM Shutdown sequence
> 
> No change or requirement for libvirt.
> 
> 6. VM Reset
> 
> No change or requirement for libvirt as this will be handled via VFIO
> reset API and QEMU process will keep running as before.
> 
> 7. Hot-plug
> 
> It is same syntax to create a virtual device for hot-plug.

Regards,
Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|



reply via email to

[Prev in Thread] Current Thread [Next in Thread]