[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [RFC v2] libvirt vGPU QEMU integration
From: |
Neo Jia |
Subject: |
Re: [Qemu-devel] [RFC v2] libvirt vGPU QEMU integration |
Date: |
Wed, 28 Sep 2016 12:48:33 -0700 |
User-agent: |
Mutt/1.6.2 (2016-07-01) |
On Tue, Sep 20, 2016 at 10:47:53AM +0100, Daniel P. Berrange wrote:
> 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.
>
Hi Daniel,
Here you are proposing to add a class named "gpu", which will make all those gpu
related attributes mandatory, which libvirt can allow user to better
parse/present a particular mdev configuration?
I am just wondering if there is another option that we just make all those
attributes that a mdev device can have as optional but still meaningful to
libvirt, so libvirt can still parse / recognize them as an class "mdev".
In general, I am just trying to understand the requirement from libvirt and see
how we can fit in this requirement for both Intel and NVIDIA since Intel is also
moving to the type-based interface although they don't have "class" concept yet.
Thanks,
Neo
> > '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 :|
- Re: [Qemu-devel] [RFC v2] libvirt vGPU QEMU integration, (continued)
- Re: [Qemu-devel] [RFC v2] libvirt vGPU QEMU integration, Tian, Kevin, 2016/09/20
- Re: [Qemu-devel] [RFC v2] libvirt vGPU QEMU integration, Alex Williamson, 2016/09/21
- Re: [Qemu-devel] [RFC v2] libvirt vGPU QEMU integration, Tian, Kevin, 2016/09/21
- Re: [Qemu-devel] [RFC v2] libvirt vGPU QEMU integration, Alex Williamson, 2016/09/21
- Re: [Qemu-devel] [RFC v2] libvirt vGPU QEMU integration, Tian, Kevin, 2016/09/21
- Message not available
- Re: [Qemu-devel] [RFC v2] libvirt vGPU QEMU integration, Tian, Kevin, 2016/09/21
Re: [Qemu-devel] [RFC v2] libvirt vGPU QEMU integration, Tian, Kevin, 2016/09/19
Re: [Qemu-devel] [RFC v2] libvirt vGPU QEMU integration, Daniel P. Berrange, 2016/09/20
- Re: [Qemu-devel] [RFC v2] libvirt vGPU QEMU integration,
Neo Jia <=
- Re: [Qemu-devel] [RFC v2] libvirt vGPU QEMU integration, Daniel P. Berrange, 2016/09/29
- Re: [Qemu-devel] [RFC v2] libvirt vGPU QEMU integration, Tian, Kevin, 2016/09/29
- Re: [Qemu-devel] [RFC v2] libvirt vGPU QEMU integration, Daniel P. Berrange, 2016/09/29
- Re: [Qemu-devel] [RFC v2] libvirt vGPU QEMU integration, Tian, Kevin, 2016/09/29
- Re: [Qemu-devel] [RFC v2] libvirt vGPU QEMU integration, Kirti Wankhede, 2016/09/30