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: Kirti Wankhede
Subject: Re: [Qemu-devel] [RFC v2] libvirt vGPU QEMU integration
Date: Tue, 20 Sep 2016 21:53:16 +0530


On 9/20/2016 8:13 PM, Alex Williamson wrote:
> On Tue, 20 Sep 2016 19:51:58 +0530
> Kirti Wankhede <address@hidden> wrote:
> 
>> On 9/20/2016 3:06 AM, Alex Williamson wrote:
>>> On Tue, 20 Sep 2016 02:05:52 +0530
>>> Kirti Wankhede <address@hidden> wrote:
>>>   
>>>> Hi libvirt experts,
>>>>
>>>>
>>>> 'create':
>>>>     Write-only file. Mandatory.
>>>>     Accepts string to create mediated device.
>>>>
>>>> 'name':
>>>>     Read-Only file. Mandatory.
>>>>     Returns string, the name of that type id.
>>>>
>>>> 'fb_length':
>>>>     Read-only file. Mandatory.
>>>>     Returns <number>{K,M,G}, size of framebuffer.  
>>>
>>> This can't be mandatory, it's only relevant to vGPU devices, vGPUs are
>>> just one user of mediated devices.
>>>   
>>
>> As per our discussion in BOF, we would define class and its attributes.
>> As I mentioned above these are attributes of "display" class.
> 
> Just as I didn't know here, how does libvirt know the class of a given
> type id?
>  

Yes, we need some way to identify the class as Daniel mentioned in his
suggestion. Add a file 'class' in mdev_supported_types that would return
the class.


>>>  Can all parameters be changed dynamically?  
>>
>> Parameters here would be extra parameters which are not listed above in
>> mandatory list. If such parameters are required to set, these parameters
>> should be set per mdev device before VM is booted.
>>
>>>  Do parameter changes apply to existing devices or only future devices?  
>>
>> No, it should be applied at the time when mdev device is created or
>> after mdev device is created but before VM is booted. It will not be
>> applicable to existing devices.
>>
>>>  This is a poorly specified
>>> interface.  I'd prefer this be done via module options on the vendor
>>> driver.
>>>   
>>
>> Module option is not suitable here, in that case such parameters would
>> be applied to all mdev device created for vendor driver and that is not
>> what we want to.
> 
> Then use attributes on the mdev device itself, this is not an
> acceptable interface.
> 
>>>>
>>>> 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>
>>>>      </capability>
>>>>    </device>
>>>>
>>>> 'type id' is mandatory.  
>>>
>>> I was under the impression that the vendor supplied "name" was the one
>>> unique identifier.  We're certainly not going to create a registrar to
>>> hand out type ids to each vendor, so what makes type id unique?  
>>
>> Type id is unique, 'name' is the name (string) of device that would be
>> displayed in guest OS for that type of mdev device.
> 
> We were told at the BoF that name was the unique string which would be
> consistent and you again indicate below that "GRID-M60-0B" has a fixed
> set of attributes, so why do we care what type id is associated with
> that name?
>  
>>>  I have
>>> a hard time believing that a given vendor can even allocate unique type
>>> ids for their own devices.  Unique type id across vendors is not
>>> practical.  So which attribute are we actually using to identify which
>>> type of mdev device we need and why would we ever specify additional
>>> attributes like fb_length?  Doesn't the vendor guarantee that "GRID
>>> M60-0B" has a fixed setup of those attributes?
>>>   
>>
>> Specifying attributes here is not our requirement. Yes we have fixed set
>> of attributes for "GRID-M60-0B" and on.
>> We are defining the attributed here for "display" class for all other
>> vendor of gpu can use.
>>
>>
>>>> '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.  
>>>
>>> We never finished our discussion of how this gets implemented or
>>> whether a group applies only to devices from the same vendor, same
>>> device, how heterogeneous groups are handled, etc.
>>>   
>>
>> We agreed on above points that I mentioned here and we wish to know what
>> libvirt folks think, right?
>> Since there were no inputs on that thread I thought I should summarize
>> what had been discussed and get libvirt experts thoughts on this.
> 
> No, that was just an idea that was never full defined.  We had that
> idea, the IOMMU group idea, the invalid container idea...  This is
> still an open question in the design.
> 

We do want to close down on the design as soon as possible.
I had tried to address open questions in earlier discussion also. Let me
address your concerns you have:

> whether a group applies only to devices from the same vendor,

Yes.

> same device,

Group can be of mdev devices from different supported types and from
different physical device but should be from same vendor.

>how heterogeneous groups are handled,

'heterogeneous' does that mean device grouped together with different
vendors?

>>>> '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.  
>>>
>>> ie. magic black hole.  nope.
>>>   
>>>> 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
>>>>
>>>> * 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.  
>>>
>>> Is it an integer, a UUID, a string?  How is the group for an mdev
>>> device discovered?  Can it be changed later?
>>>   
>>
>> Group number could be integer, that's where we need input from libvirt
>> folks. It should be provided at the time of mdev device creation. It
>> can't be changed after that. If user want to change group number
>> destroy/remove mdev device and create it again with proper group number.
> 
> My concern is that a type id seems arbitrary but we're specifying that
> it be unique.  We already have something unique, the name.  So why try
> to make the type id unique as well?  A vendor can accidentally create
> their vendor driver so that a given name means something very
> specific.  On the other hand they need to be extremely deliberate to
> coordinate that a type id means a unique thing across all their product
> lines.
> 

Let me clarify, type id should be unique in the list of
mdev_supported_types. You can't have 2 directories in with same name.

I think here 'name' is the problem and it is not used in xml file.
Lets not make it mandatory. But vendor driver can have it which 3rd
party can use to read.
Lets remove 'id' from type id in XML if that is the concern. Supported
types is going to be defined by vendor driver, so let vendor driver
decide what to use for directory name and same should be used in device
xml file, it could be '11' or "GRID M60-0B":

    <device>
      <name>my-vgpu</name>
      <parent>pci_0000_86_00_0</parent>
      <capability type='mdev'>
        <type='11'/>
        ...
      </capability>
    </device>


>>>>
>>>> 7. Hot-plug
>>>>
>>>> It is same syntax to create a virtual device for hot-plug.  
>>>
>>> How do groups work with hotplug?  Can a device be creating into an
>>> existing, running group?  Can a device be removed from an existing,
>>> running group?  Thanks,
>>>   
>>
>> Group is for vendor driver to decide when to commit resources for a
>> group of devices to support multiple devices in a domain. It will be
>> upto vendor driver how it manage it.
> 
> Then it's not sufficiently specified for libvirt to use.  Thanks,
> 

Can you clarify what if required for libvirt to use?

Kirti.




reply via email to

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