Antoni Segura Puimedon has uploaded a new change for review. Change subject: Make sr-iov hook use interface instead of hostdev ......................................................................
Make sr-iov hook use interface instead of hostdev According to libvirt documentation, for the sr-iov virtual function "nics" to have permanent and unique MAC addresses, the passthrough should be done using <interface type='hostdev'> instead of <hostdev>. This change modifies the hook to take advantage of this libvirt definition for stable sr-iovs and allows profiles to be defined for the virtualports when used in conjunction with 802.11Qgh. NOTE: There are stil a couple of TODO in this patch that I have to solve before the patch can be considered for merging. Change-Id: Ib2f88a8400fe4d230c0877428afef62df8e397db Signed-off-by: Antoni S. Puimedon <[email protected]> --- M vdsm_hooks/sriov/README M vdsm_hooks/sriov/after_vm_destroy.py M vdsm_hooks/sriov/before_vm_start.py 3 files changed, 47 insertions(+), 31 deletions(-) git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/41/13541/1 diff --git a/vdsm_hooks/sriov/README b/vdsm_hooks/sriov/README index 713aa6a..d8af84b 100644 --- a/vdsm_hooks/sriov/README +++ b/vdsm_hooks/sriov/README @@ -6,7 +6,7 @@ it to the guest xml syntax: -sr-iov: sriov=eth10,eth11 +sr-iov: sriov=eth10:profileA,eth11:profileB attach 2 sr-iov VF to vm notes at sr-iov/README diff --git a/vdsm_hooks/sriov/after_vm_destroy.py b/vdsm_hooks/sriov/after_vm_destroy.py index ab81e90..4b66cac 100755 --- a/vdsm_hooks/sriov/after_vm_destroy.py +++ b/vdsm_hooks/sriov/after_vm_destroy.py @@ -36,26 +36,21 @@ if 'sriov' in os.environ: try: lines = '' - nics = os.environ['sriov'] + nicsProfiles = os.environ['sriov'].split(',') path = VDSM_VAR_HOOKS_DIR + '/' + SRIOV_CACHE_FILENAME + nics = (nicProfile.split(':')[0] for nicProfile in nicsProfiles) if os.path.exists(path): - f = open(path, 'r') - while 1: - line = f.readline() - if not line: - break - pass # do something - nicAddr = line.split('=') - if nicAddr[0] in nics: - returnDeviceToHost(nicAddr[1], nicAddr[2].strip('\n')) - else: - lines += line - f.close() + with open(path, 'r') as f: + for line in f: + nicAddr = line.split('=') + if nicAddr[0] in nics: + returnDeviceToHost(nicAddr[1], nicAddr[2].strip('\n')) + else: + lines += line - f = open(path, 'w') - f.writelines(lines) - f.close() + with open(path, 'w') as f: + f.writelines(lines) else: sys.stderr.write('sriov after_vm_destroy: cannot find sriov cache ' 'file %s\n' % path) diff --git a/vdsm_hooks/sriov/before_vm_start.py b/vdsm_hooks/sriov/before_vm_start.py index fd9168f..e7281c4 100755 --- a/vdsm_hooks/sriov/before_vm_start.py +++ b/vdsm_hooks/sriov/before_vm_start.py @@ -60,31 +60,50 @@ sys.stderr.write('sriov: cannot detach device: %s\n' % addr) -def createSriovElement(domxml, bus, slot, function): +def createSriovElement(domxml, bus, slot, function, profile): ''' create host device element for libvirt domain xml: - <hostdev mode='subsystem' type='pci'> + <interface type='hostdev'> <source> - <address bus='0x1a' slot='0x10' function='0x06'/> + <address type='pci' domain='0x0' bus='0x1a' slot='0x10' slot='0x07' + function='0x06'/> </source> - </hostdev> + # TODO: Check if we omit the mac address to have libvirt auto-generate + # it + <mac address='4:54:00:6d:90:02'/> + # TODO: This should be set only if connected to this kind of switch. + <virtualport type='802.10bh'> + <parameters proileid='foobar'/> + </virtualport> + </interface> ''' - hostdev = domxml.createElement('hostdev') - hostdev.setAttribute('mode', 'subsystem') - hostdev.setAttribute('type', 'pci') + interface = domxml.createElement('interface') + interface.setAttribute('type', 'hostdev') + interface.setAttribute('managed', 'yes') source = domxml.createElement('source') - hostdev.appendChild(source) + interface.appendChild(source) address = domxml.createElement('address') + address.setAttribute('type', 'pci') + # The domain is not currently used by Qemu + #address.setAttribute('domain', '0') address.setAttribute('bus', bus) address.setAttribute('slot', slot) address.setAttribute('function', function) source.appendChild(address) - return hostdev + + virtualport = domxml.createElement('virtualport') + virtualport.setAttribute('type', '802.1Qbh') + interface.appendChild(virtualport) + + parameters = domxml.createElement('parameters') + parameters.setAttribute('profileid', profile) + virtualport.appendChild(parameters) + return interface def deviceExists(devName): @@ -133,12 +152,13 @@ if 'sriov' in os.environ: try: - nics = os.environ['sriov'] + nicsProfiles = os.environ['sriov'].split(',') domxml = hooking.read_domxml() devices = domxml.getElementsByTagName('devices')[0] - for nic in nics.split(','): + for nicProfile in nicsProfiles: + nic, profile = nicProfile.split(':') if deviceExists(nic): sys.stderr.write('sriov: adding VF %s\n' % nic) @@ -147,11 +167,12 @@ detachDevice(addr) bus, slot, function = getDeviceDetails(addr) - hostdev = createSriovElement(domxml, bus, slot, function) + interface = createSriovElement(domxml, bus, slot, function, + profile) sys.stderr.write('sriov: VF %s xml: %s\n' % - (nic, hostdev.toxml())) - devices.appendChild(hostdev) + (nic, interface.toxml())) + devices.appendChild(interface) chown(devpath) writeSriovCache(nic, addr, devpath) else: -- To view, visit http://gerrit.ovirt.org/13541 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ib2f88a8400fe4d230c0877428afef62df8e397db Gerrit-PatchSet: 1 Gerrit-Project: vdsm Gerrit-Branch: master Gerrit-Owner: Antoni Segura Puimedon <[email protected]> _______________________________________________ vdsm-patches mailing list [email protected] https://lists.fedorahosted.org/mailman/listinfo/vdsm-patches
