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 :|