- This commit improves PCI passthrough performance by re-using the
device(s) model instead of creating new instances, which was
the source cause of a huge overhead.
Signed-off-by: Jose Ricardo Ziviani <joserz(a)linux.vnet.ibm.com>
---
model/vmhostdevs.py | 34 ++++++++++++++++------------------
1 file changed, 16 insertions(+), 18 deletions(-)
diff --git a/model/vmhostdevs.py b/model/vmhostdevs.py
index 70f0b17..15b5bec 100644
--- a/model/vmhostdevs.py
+++ b/model/vmhostdevs.py
@@ -51,6 +51,8 @@ class VMHostDevsModel(object):
self.objstore = kargs['objstore']
self.events = kargs['eventsloop']
self.caps = CapabilitiesModel(**kargs)
+ self.devs_model = DevicesModel(**kargs)
+ self.dev_model = DeviceModel(**kargs)
self.task = TaskModel(**kargs)
self._cb = None
self.events.registerAttachDevicesEvent(
@@ -70,8 +72,7 @@ class VMHostDevsModel(object):
return [DeviceModel.deduce_dev_name(e, self.conn) for e in hostdev]
def _passthrough_device_validate(self, dev_name):
- eligible_dev_names = \
- DevicesModel(conn=self.conn).get_list(_passthrough='true')
+ eligible_dev_names = self.devs_model.get_list(_passthrough='true')
if dev_name not in eligible_dev_names:
raise InvalidParameter('KCHVMHDEV0002E', {'dev_name':
dev_name})
@@ -89,7 +90,7 @@ class VMHostDevsModel(object):
def create(self, vmid, params):
dev_name = params['name']
self._passthrough_device_validate(dev_name)
- dev_info = DeviceModel(conn=self.conn).lookup(dev_name)
+ dev_info = self.dev_model.lookup(dev_name)
if dev_info['device_type'] == 'pci':
taskid = add_task(u'/plugins/kimchi/vms/%s/hostdevs/' %
@@ -192,7 +193,7 @@ class VMHostDevsModel(object):
slots = []
try:
devices = root.devices
- slots = [DeviceModel._toint(dev.attrib['slot'])
+ slots = [self.dev_model._toint(dev.attrib['slot'])
for dev in devices.findall('.//address')
if 'slot' in dev.attrib]
@@ -235,14 +236,12 @@ class VMHostDevsModel(object):
driver = 'vfio'
# Attach all PCI devices in the same IOMMU group
- dev_model = DeviceModel(conn=self.conn)
- devs_model = DevicesModel(conn=self.conn)
- affected_names = devs_model.get_list(
+ affected_names = self.devs_model.get_list(
_passthrough_affected_by=dev_info['name'])
- passthrough_names = devs_model.get_list(
+ passthrough_names = self.devs_model.get_list(
_cap='pci', _passthrough='true')
group_names = list(set(affected_names) & set(passthrough_names))
- pci_infos = [dev_model.lookup(dev_name) for dev_name in
+ pci_infos = [self.dev_model.lookup(dev_name) for dev_name in
group_names]
pci_infos.append(dev_info)
@@ -250,7 +249,7 @@ class VMHostDevsModel(object):
pci_infos = sorted(pci_infos, key=itemgetter('name'))
# does not allow hot-plug of 3D graphic cards
- is_3D_device = dev_model.is_device_3D_controller(dev_info)
+ is_3D_device = self.dev_model.is_device_3D_controller(dev_info)
if is_3D_device and DOM_STATE_MAP[dom.info()[0]] != "shutoff":
msg = WokMessage('KCHVMHDEV0006E', {'name':
dev_info['name']})
cb(msg.get_text(), False)
@@ -359,7 +358,7 @@ class VMHostDevsModel(object):
continue
name = DeviceModel.deduce_dev_name(device, self.conn)
- info = DeviceModel(conn=self.conn).lookup(name)
+ info = self.dev_model.lookup(name)
if 'vga3d' in info and info['vga3d']:
counter += 1
@@ -534,6 +533,8 @@ class VMHostDevModel(object):
self.objstore = kargs['objstore']
self.events = kargs['eventsloop']
self.task = TaskModel(**kargs)
+ self.devs_model = DevicesModel(**kargs)
+ self.dev_model = DeviceModel(**kargs)
self._cb = None
self.events.registerDetachDevicesEvent(
self.conn,
@@ -550,11 +551,10 @@ class VMHostDevModel(object):
raise NotFoundError('KCHVMHDEV0001E',
{'vmid': vmid, 'dev_name': dev_name})
- dev_model = DeviceModel(conn=self.conn)
for e in hostdev:
deduced_name = DeviceModel.deduce_dev_name(e, self.conn)
if deduced_name == dev_name:
- dev_info = dev_model.lookup(dev_name)
+ dev_info = self.dev_model.lookup(dev_name)
return {'name': dev_name,
'type': e.attrib['type'],
'product': dev_info.get('product', None),
@@ -612,9 +612,8 @@ class VMHostDevModel(object):
pci_devs = [(DeviceModel.deduce_dev_name(e, self.conn), e)
for e in hostdev if e.attrib['type'] == 'pci']
- dev_model = DeviceModel(conn=self.conn)
- dev_info = dev_model.lookup(dev_name)
- is_3D_device = dev_model.is_device_3D_controller(dev_info)
+ dev_info = self.dev_model.lookup(dev_name)
+ is_3D_device = self.dev_model.is_device_3D_controller(dev_info)
if is_3D_device and DOM_STATE_MAP[dom.info()[0]] != "shutoff":
raise InvalidOperation('KCHVMHDEV0006E',
{'name': dev_info['name']})
@@ -685,9 +684,8 @@ class VMHostDevModel(object):
return True
def _delete_affected_pci_devices(self, dom, dev_name, pci_devs):
- dev_model = DeviceModel(conn=self.conn)
try:
- dev_model.lookup(dev_name)
+ self.dev_model.lookup(dev_name)
except NotFoundError:
return
--
2.7.4