[Kimchi-devel] [PATCH v2] [Kimchi 1/2] Add multi-function field in PCI information

Jose Ricardo Ziviani joserz at linux.vnet.ibm.com
Thu Dec 10 23:50:56 UTC 2015


Hi Aline,

This param will be removed as soon as live PCI multi-function attachment 
is fixed (in Libvirt or QEMU). This is something that I don't expect 
anybody else to use it.. Do you still think API.md should be updated 
with such param?

Thanks

On 10-12-2015 19:08, Aline Manera wrote:
>
> Hi Ziviani,
>
> You are changing the API with this patch by adding a new parameter
> 'multifunction', so, please, add docs/API.md and anything else needed.
>
>
> On 10/12/2015 15:03, Jose Ricardo Ziviani wrote:
>>   - This commit adds a new field in the PCI device data structure to
>>     notify the client that such PCI is a multi-function device. The
>>     goal is to make it easy to identify whether a given device is
>>     multi-function or not in the client side.
>>
>> Signed-off-by: Jose Ricardo Ziviani <joserz at linux.vnet.ibm.com>
>> ---
>>   model/host.py       | 33 ++++++++++++++++++++++++++++++++-
>>   model/vmhostdevs.py |  3 ++-
>>   2 files changed, 34 insertions(+), 2 deletions(-)
>>
>> diff --git a/model/host.py b/model/host.py
>> index 628ae71..583accd 100644
>> --- a/model/host.py
>> +++ b/model/host.py
>> @@ -18,6 +18,7 @@
>>   # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
>> 02110-1301 USA
>>
>>   import libvirt
>> +from collections import defaultdict
>>   from lxml import objectify
>>
>>   from wok.exception import InvalidParameter
>> @@ -144,6 +145,27 @@ class DevicesModel(object):
>>   class DeviceModel(object):
>>       def __init__(self, **kargs):
>>           self.conn = kargs['conn']
>> +        self.iommu_groups = self._get_iommu_groups()
>> +
>> +    def _get_iommu_groups(self):
>> +        iommu_groups = defaultdict(list)
>> +        conn = self.conn
>> +
>> +        try:
>> +            devices = DevicesModel(conn=conn).get_list()
>> +
>> +        except:
>> +            return iommu_groups
>> +
>> +        for device in devices:
>> +            info = hostdev.get_dev_info(
>> +                conn.get().nodeDeviceLookupByName(device))
>> +            if 'iommuGroup' not in info:
>> +                continue
>> +            iommu_group_nr = int(info['iommuGroup'])
>> +            iommu_groups[iommu_group_nr].append(device)
>> +
>> +        return iommu_groups
>>
>>       def lookup(self, nodedev_name):
>>           conn = self.conn.get()
>> @@ -151,7 +173,16 @@ class DeviceModel(object):
>>               dev = conn.nodeDeviceLookupByName(nodedev_name)
>>           except:
>>               raise NotFoundError('KCHHOST0003E', {'name': nodedev_name})
>> -        return hostdev.get_dev_info(dev)
>> +
>> +        info = hostdev.get_dev_info(dev)
>> +        info['multifunction'] = self.is_multifunction_pci(info)
>> +        return info
>> +
>> +    def is_multifunction_pci(self, info):
>> +        if 'iommuGroup' not in info:
>> +            return False
>> +        iommu_group_nr = int(info['iommuGroup'])
>> +        return len(self.iommu_groups[iommu_group_nr]) > 1
>>
>>       @staticmethod
>>       def _toint(num_str):
>> diff --git a/model/vmhostdevs.py b/model/vmhostdevs.py
>> index c4fb815..de52cd8 100644
>> --- a/model/vmhostdevs.py
>> +++ b/model/vmhostdevs.py
>> @@ -279,7 +279,8 @@ class VMHostDevModel(object):
>>                   return {'name': dev_name,
>>                           'type': e.attrib['type'],
>>                           'product': dev_info.get('product', None),
>> -                        'vendor': dev_info.get('vendor', None)}
>> +                        'vendor': dev_info.get('vendor', None),
>> +                        'multifunction':
>> dev_info.get('multifunction', None)}
>>
>>           raise NotFoundError('KCHVMHDEV0001E',
>>                               {'vmid': vmid, 'dev_name': dev_name})
>

-- 
Jose Ricardo Ziviani
-----------------------------
Software Engineer
Linux Technology Center - IBM




More information about the Kimchi-devel mailing list