[libvirt] [PATCH] qemu: Allow spaces in disk serial
There's been a bug report appearing on the qemu-devel list, that libvirt is unable to pass spaces in disk serial number [1]. Not only our RNG schema forbids that, the code is not prepared either. However, with a bit of escaping (if needed) we can allow spaces there. 1: https://lists.gnu.org/archive/html/qemu-devel/2015-02/msg04041.html Signed-off-by: Michal Privoznik mpriv...@redhat.com --- docs/schemas/domaincommon.rng | 2 +- src/qemu/qemu_command.c| 5 ++-- .../qemuxml2argvdata/qemuxml2argv-disk-serial.args | 6 + .../qemuxml2argvdata/qemuxml2argv-disk-serial.xml | 27 ++ tests/qemuxml2argvtest.c | 5 5 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-serial.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-serial.xml diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index f41ca43..09bd921 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -5067,7 +5067,7 @@ /define define name=diskSerial data type=string - param name=pattern[A-Za-z0-9_\.\+\-]+/param + param name=pattern[A-Za-z0-9_\.\+\- ]+/param /data /define define name=bridgeMode diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 7853125..b9adef6 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -2633,7 +2633,7 @@ qemuBuildIoEventFdStr(virBufferPtr buf, } #define QEMU_SERIAL_PARAM_ACCEPTED_CHARS \ - abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_ + abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_ static int qemuSafeSerialParamValue(const char *value) @@ -3616,7 +3616,8 @@ qemuBuildDriveStr(virConnectPtr conn, virQEMUCapsGet(qemuCaps, QEMU_CAPS_DRIVE_SERIAL)) { if (qemuSafeSerialParamValue(disk-serial) 0) goto error; -virBufferAsprintf(opt, ,serial=%s, disk-serial); +virBufferAddLit(opt, ,serial=); +virBufferEscapeShell(opt, disk-serial); } if (disk-cachemode) { diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-serial.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-serial.args new file mode 100644 index 000..8b08cfb --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-serial.args @@ -0,0 +1,6 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \ +/usr/libexec/qemu-kvm -S -M pc -cpu qemu32 -m 214 -smp 1 -nographic -nodefaults \ +-monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -usb \ +-drive 'file=/dev/HostVG/QEMUGuest1,if=none,id=drive-ide0-0-1,serial='\'' WD-WMAP9A966149'\''' \ +-device ide-drive,bus=ide.0,unit=1,drive=drive-ide0-0-1,id=ide0-0-1 \ +-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-serial.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-serial.xml new file mode 100644 index 000..0fe75f3 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-serial.xml @@ -0,0 +1,27 @@ +domain type='kvm' + nameQEMUGuest1/name + uuidc7a5fdbd-edaf-9455-926a-d65c16db1809/uuid + memory unit='KiB'219136/memory + currentMemory unit='KiB'219136/currentMemory + vcpu placement='static'1/vcpu + os +type arch='i686' machine='pc'hvm/type +boot dev='hd'/ + /os + clock offset='utc'/ + on_poweroffdestroy/on_poweroff + on_rebootrestart/on_reboot + on_crashdestroy/on_crash + devices +emulator/usr/libexec/qemu-kvm/emulator +disk type='block' device='disk' + source dev='/dev/HostVG/QEMUGuest1'/ + target dev='hda' bus='ide'/ + serial WD-WMAP9A966149/serial + address type='drive' controller='0' bus='0' target='0' unit='1'/ +/disk +controller type='usb' index='0'/ +controller type='ide' index='0'/ +memballoon model='virtio'/ + /devices +/domain diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 16f325e..3032d1b 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -904,6 +904,11 @@ mymain(void) QEMU_CAPS_DEVICE, QEMU_CAPS_SCSI_BLOCK, QEMU_CAPS_VIRTIO_BLK_SG_IO, QEMU_CAPS_SCSI_LSI, QEMU_CAPS_VIRTIO_SCSI); +DO_TEST(disk-serial, +QEMU_CAPS_KVM, +QEMU_CAPS_DEVICE, +QEMU_CAPS_DRIVE, +QEMU_CAPS_DRIVE_SERIAL); DO_TEST(graphics-vnc, QEMU_CAPS_VNC); DO_TEST(graphics-vnc-socket, QEMU_CAPS_VNC); -- 2.0.5 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH] qemu: fix ifindex array reported to systemd
On Fri, Feb 20, 2015 at 04:05:22PM -0500, Laine Stump wrote: Commit f7afeddc added code to report to systemd an array of interface indexes for all tap devices used by a guest. Unfortunately it not only didn't add code to report the ifindexes for macvtap interfaces (interface type='direct') or the tap devices used by type='ethernet', it ended up sending -1 as the ifindex for each macvtap or hostdev interface. This resulted in a failure to start any domain that had a macvtap or hostdev interface (or actually any type other than network or bridge). This patch modifies qemuBuildInterfaceCommandLine() to only add an entry to the array of ifindexes for appropriate types, and to do so for all appropriate types (network, bridge, and direct). --- src/qemu/qemu_command.c | 59 ++--- src/qemu/qemu_command.h | 5 ++--- src/qemu/qemu_hotplug.c | 6 ++--- 3 files changed, 50 insertions(+), 20 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 7853125..81f6982 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -289,8 +289,7 @@ qemuNetworkIfaceConnect(virDomainDefPtr def, virDomainNetDefPtr net, virQEMUCapsPtr qemuCaps, int *tapfd, -size_t *tapfdSize, -int *nicindex) +size_t *tapfdSize) { const char *brname; int ret = -1; @@ -337,8 +336,6 @@ qemuNetworkIfaceConnect(virDomainDefPtr def, virDomainAuditNetDevice(def, net, tunpath, false); goto cleanup; } -if (virNetDevGetIndex(net-ifname, nicindex) 0) -goto cleanup; if (virDomainNetGetActualBridgeMACTableManager(net) == VIR_NETWORK_BRIDGE_MAC_TABLE_MANAGER_LIBVIRT) { /* libvirt is managing the FDB of the bridge this device @@ -7756,7 +7753,8 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd, int bootindex, virNetDevVPortProfileOp vmop, bool standalone, - int *nicindex) + size_t *nnicindexes, + int **nicindexes) { int ret = -1; char *nic = NULL, *host = NULL; @@ -7770,8 +7768,6 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd, virNetDevBandwidthPtr actualBandwidth; size_t i; -*nicindex = -1; - if (actualType == VIR_DOMAIN_NET_TYPE_VHOSTUSER) return qemuBuildVhostuserCommandLine(cmd, def, net, qemuCaps); @@ -7818,7 +7814,7 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd, if (qemuNetworkIfaceConnect(def, driver, net, qemuCaps, tapfd, -tapfdSize, nicindex) 0) +tapfdSize) 0) goto cleanup; } else if (actualType == VIR_DOMAIN_NET_TYPE_DIRECT) { if (VIR_ALLOC(tapfd) 0 || VIR_ALLOC(tapfdName) 0) @@ -7830,6 +7826,47 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd, goto cleanup; } +/* For types whose implementions use a netdev on the host, add an + * entry to nicifindexes for passing on to systemd. +*/ +switch ((virDomainNetType)actualType) { +case VIR_DOMAIN_NET_TYPE_ETHERNET: +case VIR_DOMAIN_NET_TYPE_NETWORK: +case VIR_DOMAIN_NET_TYPE_BRIDGE: +case VIR_DOMAIN_NET_TYPE_DIRECT: +{ +int nicindex; + +/* network and bridge use a tap device, and direct uses a + * macvtap device + */ + if (virNetDevGetIndex(net-ifname, nicindex) 0 || + VIR_APPEND_ELEMENT(*nicindexes, *nnicindexes, nicindex) 0) + goto cleanup; + break; +} + +case VIR_DOMAIN_NET_TYPE_USER: +case VIR_DOMAIN_NET_TYPE_VHOSTUSER: +case VIR_DOMAIN_NET_TYPE_SERVER: +case VIR_DOMAIN_NET_TYPE_CLIENT: +case VIR_DOMAIN_NET_TYPE_MCAST: +case VIR_DOMAIN_NET_TYPE_INTERNAL: +case VIR_DOMAIN_NET_TYPE_HOSTDEV: +case VIR_DOMAIN_NET_TYPE_LAST: + /* These types don't use a network device on the host, but +* instead use some other type of connection to the emulated +* device in the qemu process. +* +* (Note that hostdev can't be considered as using a network +* device, because by the time it is being used, it has been +* detached from the hostside network driver so it doesn't show +* up in the list of interfaces on the host - it's just some +* PCI device.) +*/ + break; +} + /* Set bandwidth or warn if requested and not supported. */ actualBandwidth = virDomainNetGetActualBandwidth(net); if (actualBandwidth) { @@ -9279,13 +9316,9 @@
[libvirt] Plan for next release
Oops, Feb is really short and I got caught, I think if we want a release by beginning of March, i.e. next week we need to enter freeze ASAP. So I'm suggesting to start the freeze tomorrow, for a release on Monday if everything goes well ! Hope this suits everybody, thanks, Daniel -- Daniel Veillard | Open Source and Standards, Red Hat veill...@redhat.com | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ http://veillard.com/ | virtualization library http://libvirt.org/ -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 1/2] Support virDomainGetIOThreadsInfo and virDomainIOThreadsInfoFree
Add support for the libvirt_virDomainGetIOThreadsInfo method. This code mostly follows the libvirt_virDomainGetVcpuPinInfo method, but also takes some from the libvirt_virNodeGetCPUMap method with respect to building the cpumap into the returned tuple rather than two separate tuples which vcpu pinning generates Assuming two domains, one with IOThreads defined (eg, 'iothr-gst') and one without ('noiothr-gst'), execute the following in an 'iothr.py' file: import libvirt con=libvirt.open(qemu:///system) dom=con.lookupByName('iothr-gst') print dom.ioThreadsInfo() dom2=con.lookupByName('noiothr-gst') print dom2.ioThreadsInfo() $ python iothr.py [(1, [False, False, True, False], ['/home/vm-images/iothr-vol1']), (2, [False, False, False, True], ['/home/vm-images/iothr-vol2']), (3, [True, False, False, False], [])] [] $ Signed-off-by: John Ferlan jfer...@redhat.com --- generator.py | 5 +++ libvirt-override-api.xml | 6 +++ libvirt-override.c | 114 +++ sanitytest.py| 5 +++ 4 files changed, 130 insertions(+) diff --git a/generator.py b/generator.py index 0d48980..8165a18 100755 --- a/generator.py +++ b/generator.py @@ -435,6 +435,7 @@ skip_impl = ( 'virDomainGetVcpuPinInfo', 'virDomainGetEmulatorPinInfo', 'virDomainPinEmulator', +'virDomainGetIOThreadsInfo', 'virSecretGetValue', 'virSecretSetValue', 'virSecretGetUUID', @@ -592,6 +593,7 @@ skip_function = ( 'virNetworkDHCPLeaseFree', # only useful in C, python code uses list 'virDomainStatsRecordListFree', # only useful in C, python uses dict 'virDomainFSInfoFree', # only useful in C, python code uses list +'virDomainIOThreadsInfoFree', # only useful in C, python code uses list ) lxc_skip_function = ( @@ -1144,6 +1146,9 @@ def nameFixup(name, classe, type, file): elif name[0:20] == virDomainGetCPUStats: func = name[9:] func = func[0:1].lower() + func[1:] +elif name[0:25] == virDomainGetIOThreadsInfo: +func = name[12:] +func = func[0:2].lower() + func[2:] elif name[0:18] == virDomainGetFSInfo: func = name[12:] func = func[0:2].lower() + func[2:] diff --git a/libvirt-override-api.xml b/libvirt-override-api.xml index 439cb40..e512311 100644 --- a/libvirt-override-api.xml +++ b/libvirt-override-api.xml @@ -278,6 +278,12 @@ arg name='cpumap' type='unsigned char *' info='pointer to a bit map of real CPUs (in 8-bit bytes) (IN) Each bit set to 1 means that corresponding CPU is usable. Bytes are stored in little-endian order: CPU0-7, 8-15... In each byte, lowest CPU number is least significant bit.'/ arg name='flags' type='int' info='flags to specify'/ /function +function name='virDomainGetIOThreadsInfo' file='python' + infoQuery the CPU affinity setting of the IOThreads of the domain/info + arg name='domain' type='virDomainPtr' info='pointer to domain object, or NULL for Domain0'/ + arg name='flags' type='int' info='an ORapos;ed set of virDomainModificationImpact'/ + return type='char *' info=list of IOThreads information including the iothread_id, the cpumap, the cpumap length, number of associated resources, and a list of each resource assigned to the iothread_id./ +/function function name='virDomainSetSchedulerParameters' file='python' infoChange the scheduler parameters/info return type='int' info='-1 in case of error, 0 in case of success.'/ diff --git a/libvirt-override.c b/libvirt-override.c index 88cb527..580a1b2 100644 --- a/libvirt-override.c +++ b/libvirt-override.c @@ -1990,6 +1990,117 @@ libvirt_virDomainGetEmulatorPinInfo(PyObject *self ATTRIBUTE_UNUSED, } #endif /* LIBVIR_CHECK_VERSION(0, 10, 0) */ +#if LIBVIR_CHECK_VERSION(1, 2, 13) +static PyObject * +libvirt_virDomainGetIOThreadsInfo(PyObject *self ATTRIBUTE_UNUSED, + PyObject *args) { +virDomainPtr domain; +PyObject *pyobj_domain; +PyObject *py_retval = NULL; +PyObject *error = NULL; +virDomainIOThreadsInfoPtr *iothrinfo = NULL; +unsigned int flags; +size_t pcpu, i, j; +int niothreads, cpunum; + +if (!PyArg_ParseTuple(args, (char *)OI:virDomainGetIOThreadsInfo, + pyobj_domain, flags)) +return NULL; +domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); + +if ((cpunum = getPyNodeCPUCount(virDomainGetConnect(domain))) 0) +return VIR_PY_NONE; + +LIBVIRT_BEGIN_ALLOW_THREADS; +niothreads = virDomainGetIOThreadsInfo(domain, iothrinfo, flags); +LIBVIRT_END_ALLOW_THREADS; + +if (niothreads 0) { +error = VIR_PY_NONE; +goto cleanup; +} + +/* convert to a Python list */ +if ((py_retval = PyList_New(niothreads)) == NULL) +goto cleanup; + +/* NOTE: If there are zero IOThreads we will return an empty list */ +for (i = 0; i niothreads; i++) { +
[libvirt] [PATCH v2 2/2] Support virDomainSetIOThreads
Support the libvirt_virDomainSetIOThreads method using code that mimics the existing libvirt_virDomainPinVcpuFlags method The following is a sample session assuming guest 'iothr-gst' has IOThreads configured (it's currently running, too) import libvirt con=libvirt.open(qemu:///system) dom=con.lookupByName('iothr-gst') dom.ioThreadsInfo() [(1, [False, False, True, False], ['/home/vm-images/iothr-vol1']), (2, [False, False, False, True], ['/home/vm-images/iothr-vol2']), (3, [False, False, False, True], [])] cpumap=(True,True,True,False) dom.setIOThreads(3,cpumap) 0 print dom.ioThreadsInfo() [(1, [False, False, True, False], ['/home/vm-images/iothr-vol1']), (2, [False, False, False, True], ['/home/vm-images/iothr-vol2']), (3, [True, True, True, False], [])] Signed-off-by: John Ferlan jfer...@redhat.com --- generator.py | 1 + libvirt-override-api.xml | 8 ++ libvirt-override.c | 66 3 files changed, 75 insertions(+) diff --git a/generator.py b/generator.py index 8165a18..aa140ed 100755 --- a/generator.py +++ b/generator.py @@ -436,6 +436,7 @@ skip_impl = ( 'virDomainGetEmulatorPinInfo', 'virDomainPinEmulator', 'virDomainGetIOThreadsInfo', +'virDomainSetIOThreads', 'virSecretGetValue', 'virSecretSetValue', 'virSecretGetUUID', diff --git a/libvirt-override-api.xml b/libvirt-override-api.xml index e512311..19667b6 100644 --- a/libvirt-override-api.xml +++ b/libvirt-override-api.xml @@ -284,6 +284,14 @@ arg name='flags' type='int' info='an ORapos;ed set of virDomainModificationImpact'/ return type='char *' info=list of IOThreads information including the iothread_id, the cpumap, the cpumap length, number of associated resources, and a list of each resource assigned to the iothread_id./ /function +function name='virDomainSetIOThreads' file='python' + infoDynamically change the real CPUs which can be allocated to an IOThread. This function requires privileged access to the hypervisor./info + return type='int' info='0 in case of success, -1 in case of failure.'/ + arg name='domain' type='virDomainPtr' info='pointer to domain object'/ + arg name='iothread_val' type='unsigned int' info='iothread_id number'/ + arg name='cpumap' type='unsigned char *' info='pointer to a bit map of real CPUs (in 8-bit bytes) (IN) Each bit set to 1 means that corresponding CPU is usable. Bytes are stored in little-endian order: CPU0-7, 8-15... In each byte, lowest CPU number is least significant bit.'/ + arg name='flags' type='int' info='an ORapos;ed set of virDomainIOThreadsFlags'/ +/function function name='virDomainSetSchedulerParameters' file='python' infoChange the scheduler parameters/info return type='int' info='-1 in case of error, 0 in case of success.'/ diff --git a/libvirt-override.c b/libvirt-override.c index 580a1b2..8823a39 100644 --- a/libvirt-override.c +++ b/libvirt-override.c @@ -2100,6 +2100,71 @@ cleanup: return error; } +static PyObject * +libvirt_virDomainSetIOThreads(PyObject *self ATTRIBUTE_UNUSED, + PyObject *args) +{ +virDomainPtr domain; +PyObject *pyobj_domain, *pycpumap; +PyObject *ret = NULL; +unsigned char *cpumap; +int cpumaplen, iothread_val, tuple_size, cpunum; +size_t i; +unsigned int flags; +int i_retval; + +if (!PyArg_ParseTuple(args, (char *)OiOI:virDomainSetIOThread, + pyobj_domain, iothread_val, pycpumap, flags)) +return NULL; +domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); + +if ((cpunum = getPyNodeCPUCount(virDomainGetConnect(domain))) 0) +return VIR_PY_INT_FAIL; + +if (PyTuple_Check(pycpumap)) { +if ((tuple_size = PyTuple_Size(pycpumap)) == -1) +return ret; +} else { + PyErr_SetString(PyExc_TypeError, Unexpected type, tuple is required); + return ret; +} + +cpumaplen = VIR_CPU_MAPLEN(cpunum); +if (VIR_ALLOC_N(cpumap, cpumaplen) 0) +return PyErr_NoMemory(); + +for (i = 0; i tuple_size; i++) { +PyObject *flag = PyTuple_GetItem(pycpumap, i); +bool b; + +if (!flag || libvirt_boolUnwrap(flag, b) 0) +goto cleanup; + +if (b) +VIR_USE_CPU(cpumap, i); +else +VIR_UNUSE_CPU(cpumap, i); +} + +for (; i cpunum; i++) +VIR_UNUSE_CPU(cpumap, i); + +flags |= VIR_DOMAIN_IOTHREADS_PIN; +LIBVIRT_BEGIN_ALLOW_THREADS; +i_retval = virDomainSetIOThreads(domain, iothread_val, + cpumap, cpumaplen, flags); +LIBVIRT_END_ALLOW_THREADS; +if (i_retval 0) { +ret = VIR_PY_INT_FAIL; +goto cleanup; +} +ret = VIR_PY_INT_SUCCESS; + +cleanup: +VIR_FREE(cpumap); +return ret; +} + #endif /* LIBVIR_CHECK_VERSION(1, 2, 13) */
[libvirt] [PATCH 3/3] qemu: Pass file descriptor when using TPM passthrough
Pass the TPM file descriptor to QEMU via command line. Instead of passing /dev/tpm0 we now pass /dev/fdset/10 and the additional parameters -add-fd set=10,fd=20. This addresses the use case when QEMU is started with non-root privileges and QEMU cannot open /dev/tpm0 for example. Signed-off-by: Stefan Berger stef...@linux.vnet.ibm.com --- src/qemu/qemu_command.c | 121 ++-- 1 file changed, 117 insertions(+), 4 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 539c956..12e2e2f 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -161,6 +161,58 @@ VIR_ENUM_IMPL(qemuNumaPolicy, VIR_DOMAIN_NUMATUNE_MEM_LAST, interleave); /** + * qemuVirCommandGetFDSet: + * @cmd: the command to modify + * @fd: fd to reassign to the child + * + * Get the parameters for the QEMU -add-fd command line option + * for the given file descriptor. The file descriptor must previously + * have been 'transferred' in a virCommandPassFD() call. + * This function for example returns set=10,fd=20. + */ +static char * +qemuVirCommandGetFDSet(virCommandPtr cmd, int fd) +{ +char *result = NULL; +int idx = virCommandPassFDGetFDIndex(cmd, fd); + +if (idx = 0) { +ignore_value(virAsprintf(result, set=%d,fd=%d, idx, fd) 0); +} else { +virReportError(VIR_ERR_INTERNAL_ERROR, + _(file descriptor %d has not been transferred), fd); +} + +return result; +} + +/** + * qemuVirCommandGetDevSet: + * @cmd: the command to modify + * @fd: fd to reassign to the child + * + * Get the parameters for the QEMU path= parameter where a file + * descriptor is accessed via a file descriptor set, for example + * /dev/fdset/10. The file descriptor must previously have been + * 'transferred' in a virCommandPassFD() call. + */ +static char * +qemuVirCommandGetDevSet(virCommandPtr cmd, int fd) +{ +char *result = NULL; +int idx = virCommandPassFDGetFDIndex(cmd, fd); + +if (idx = 0) { +ignore_value(virAsprintf(result, /dev/fdset/%d, idx) 0); +} else { +virReportError(VIR_ERR_INTERNAL_ERROR, + _(file descriptor %d has not been transferred), fd); +} +return result; +} + + +/** * qemuPhysIfaceConnect: * @def: the definition of the VM (needed by 802.1Qbh and audit) * @driver: pointer to the driver instance @@ -6320,15 +6372,20 @@ qemuBuildRNGDevStr(virDomainDefPtr def, static char *qemuBuildTPMBackendStr(const virDomainDef *def, +virCommandPtr cmd, virQEMUCapsPtr qemuCaps, -const char *emulator) +const char *emulator, +int *tpmfd, int *cancelfd) { const virDomainTPMDef *tpm = def-tpm; virBuffer buf = VIR_BUFFER_INITIALIZER; const char *type = virDomainTPMBackendTypeToString(tpm-type); -char *cancel_path; +char *cancel_path = NULL, *devset = NULL; const char *tpmdev; +*tpmfd = -1; +*cancelfd = -1; + virBufferAsprintf(buf, %s,id=tpm-%s, type, tpm-info.alias); switch (tpm-type) { @@ -6340,11 +6397,42 @@ static char *qemuBuildTPMBackendStr(const virDomainDef *def, if (!(cancel_path = virTPMCreateCancelPath(tpmdev))) goto error; +if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_ADD_FD)) { +*tpmfd = open(tpmdev, O_RDWR); +if (*tpmfd 0) { +virReportSystemError(errno, _(Could not open TPM device %s), + tpmdev); +goto error; +} + +virCommandPassFD(cmd, *tpmfd, + VIR_COMMAND_PASS_FD_CLOSE_PARENT); +devset = qemuVirCommandGetDevSet(cmd, *tpmfd); +if (devset == NULL) +goto error; + +*cancelfd = open(cancel_path, O_WRONLY); +if (*cancelfd 0) { +virReportSystemError(errno, + _(Could not open TPM device's cancel + path %s), cancel_path); +goto error; +} +VIR_FREE(cancel_path); + +virCommandPassFD(cmd, *cancelfd, + VIR_COMMAND_PASS_FD_CLOSE_PARENT); +cancel_path = qemuVirCommandGetDevSet(cmd, *cancelfd); +if (cancel_path == NULL) +goto error; +} virBufferAddLit(buf, ,path=); -virBufferEscape(buf, ',', ,, %s, tpmdev); +virBufferEscape(buf, ',', ,, %s, devset ? devset : tpmdev); virBufferAddLit(buf, ,cancel-path=); virBufferEscape(buf, ',', ,, %s, cancel_path); + +VIR_FREE(devset); VIR_FREE(cancel_path); break; @@ -6364,6 +6452,9 @@ static char *qemuBuildTPMBackendStr(const virDomainDef *def,
[libvirt] [PATCH 1/3] utils: Implement virCommandPassFDGetFDIndex
Implement virCommandPassFDGetFDIndex to determine the index a given file descriptor will have when passed to the child process. When this function is called, a flag is set to prevent the reordering of the file descriptors. Signed-off-by: Stefan Berger stef...@linux.vnet.ibm.com --- src/libvirt_private.syms | 1 + src/util/vircommand.c| 33 + src/util/vircommand.h| 3 +++ 3 files changed, 37 insertions(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index c156b40..aadb833 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1213,6 +1213,7 @@ virCommandNewArgList; virCommandNewArgs; virCommandNonblockingFDs; virCommandPassFD; +virCommandPassFDGetFDIndex; virCommandPassListenFDs; virCommandRawStatus; virCommandRequireHandshake; diff --git a/src/util/vircommand.c b/src/util/vircommand.c index 6527d85..2616446 100644 --- a/src/util/vircommand.c +++ b/src/util/vircommand.c @@ -67,6 +67,7 @@ enum { VIR_EXEC_RUN_SYNC = (1 3), VIR_EXEC_ASYNC_IO = (1 4), VIR_EXEC_LISTEN_FDS = (1 5), +VIR_EXEC_FIXED_FDS = (1 6), }; typedef struct _virCommandFD virCommandFD; @@ -214,6 +215,12 @@ virCommandReorderFDs(virCommandPtr cmd) if (!cmd || cmd-has_error || !cmd-npassfd) return; +if ((cmd-flags VIR_EXEC_FIXED_FDS)) { +virReportError(VIR_ERR_INTERNAL_ERROR, %s, + _(The fds are fixed and cannot be reordered)); +goto error; +} + for (i = 0; i cmd-npassfd; i++) maxfd = MAX(cmd-passfd[i].fd, maxfd); @@ -1019,6 +1026,32 @@ virCommandPassListenFDs(virCommandPtr cmd) cmd-flags |= VIR_EXEC_LISTEN_FDS; } +/* + * virCommandPassFDGetFDIndex: + * @cmd: pointer to virCommand + * @fd: FD to get index of + * + * Determine the index of the FD in the transfer set. + * + * Returns index = 0 if @set contains @fd, + * -1 otherwise. + */ +int +virCommandPassFDGetFDIndex(virCommandPtr cmd, int fd) +{ +size_t i = 0; + +while (i cmd-npassfd) { +if (cmd-passfd[i].fd == fd) { +cmd-flags |= VIR_EXEC_FIXED_FDS; +return i; +} +i++; +} + +return -1; +} + /** * virCommandSetPidFile: * @cmd: the command to modify diff --git a/src/util/vircommand.h b/src/util/vircommand.h index bf65de4..198da2f 100644 --- a/src/util/vircommand.h +++ b/src/util/vircommand.h @@ -62,6 +62,9 @@ void virCommandPassFD(virCommandPtr cmd, void virCommandPassListenFDs(virCommandPtr cmd); +int virCommandPassFDGetFDIndex(virCommandPtr cmd, + int fd); + void virCommandSetPidFile(virCommandPtr cmd, const char *pidfile) ATTRIBUTE_NONNULL(2); -- 1.9.3 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 2/3] qemu: Move TPM command line build code into own function
Move the TPM command line build code into its own function. Signed-off-by: Stefan Berger stef...@linux.vnet.ibm.com --- src/qemu/qemu_command.c | 37 + 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 7853125..539c956 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -8148,6 +8148,30 @@ qemuBuildDomainLoaderCommandLine(virCommandPtr cmd, return ret; } +static int +qemuBuildTPMCommandLine(virDomainDefPtr def, +virCommandPtr cmd, +virQEMUCapsPtr qemuCaps, +const char *emulator) +{ +char *optstr; + +if (!(optstr = qemuBuildTPMBackendStr(def, qemuCaps, emulator))) +return -1; + +virCommandAddArgList(cmd, -tpmdev, optstr, NULL); +VIR_FREE(optstr); + +if (!(optstr = qemuBuildTPMDevStr(def, qemuCaps, emulator))) +return -1; + +virCommandAddArgList(cmd, -device, optstr, NULL); +VIR_FREE(optstr); + +return 0; +} + + qemuBuildCommandLineCallbacks buildCommandLineCallbacks = { .qemuGetSCSIDeviceSgName = virSCSIDeviceGetSgName, }; @@ -9579,19 +9603,8 @@ qemuBuildCommandLine(virConnectPtr conn, } if (def-tpm) { -char *optstr; - -if (!(optstr = qemuBuildTPMBackendStr(def, qemuCaps, emulator))) +if (qemuBuildTPMCommandLine(def, cmd, qemuCaps, emulator) 0) goto error; - -virCommandAddArgList(cmd, -tpmdev, optstr, NULL); -VIR_FREE(optstr); - -if (!(optstr = qemuBuildTPMDevStr(def, qemuCaps, emulator))) -goto error; - -virCommandAddArgList(cmd, -device, optstr, NULL); -VIR_FREE(optstr); } for (i = 0; i def-ninputs; i++) { -- 1.9.3 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH] network_conf: Forbid commas in DNS TXT
https://bugzilla.redhat.com/show_bug.cgi?id=1151942 While the restriction doesn't have origin in any RFC, it matters to us while constructing the dnsmasq config file (or command line previously). For better picture, this is how the corresponding part of network XML look like: dns forwarder addr='8.8.4.4'/ txt name='example' value='example value'/ /dns And this is how the config file looks like then: server=8.8.4.4 txt-record=example,example value Now we can see why there can't be any commas in the TXT name. They are used by dnsmasq to separate @name and @value. Funny, we have it in the documentation, but the code (which was pushed back in 2011) didn't reflect that. Signed-off-by: Michal Privoznik mpriv...@redhat.com --- src/conf/network_conf.c | 6 -- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c index dce3360..3d8bf05 100644 --- a/src/conf/network_conf.c +++ b/src/conf/network_conf.c @@ -1057,15 +1057,17 @@ virNetworkDNSTxtDefParseXML(const char *networkName, virNetworkDNSTxtDefPtr def, bool partialOkay) { +const char *bad = ,; + if (!(def-name = virXMLPropString(node, name))) { virReportError(VIR_ERR_XML_DETAIL, _(missing required name attribute in DNS TXT record of network %s), networkName); goto error; } -if (strchr(def-name, ' ') != NULL) { +if (strcspn(def-name, bad) != strlen(def-name)) { virReportError(VIR_ERR_XML_DETAIL, - _(prohibited space character in DNS TXT record + _(prohibited character in DNS TXT record name '%s' of network %s), def-name, networkName); goto error; } -- 2.0.5 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH v2 0/2] Python bindings for IOThreads
v1 here: http://www.redhat.com/archives/libvir-list/2015-February/msg00684.html Changes in v2: * Return an empty list when there are no IOThreads found * Fix alloc/cleanup logic to match review comments * Used PyObject *error = NULL like the GetCPUStats code in order to return either NULL for Py*_New() and PyTuple_SetItem() method errors or VIR_PY_NONE for other exceptions * Only make the Py_XDECREF calls on objects which don't get consumed by PyTuple_SetItem * Change name of method from getIOThreadsInfo to ioThreadsInfo John Ferlan (2): Support virDomainGetIOThreadsInfo and virDomainIOThreadsInfoFree Support virDomainSetIOThreads generator.py | 6 ++ libvirt-override-api.xml | 14 libvirt-override.c | 180 +++ sanitytest.py| 5 ++ 4 files changed, 205 insertions(+) -- 2.1.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v3 0/9] qemu: Add quorum support to libvirt
On Tue, Feb 10, 2015 at 4:43 PM, Matthias Gatto matthias.ga...@outscale.com wrote: The purpose of these patches is to introduce quorum for libvirt I've try to follow this proposal: http://www.redhat.com/archives/libvir-list/2014-May/msg00533.html This feature ask for 6 task: 1) Allow a _virStorageSource to contain more than one backing store. Because all the actual libvirt code use the backingStore field as a pointer and we needs want to change that, I've decide to encapsulate the backingStore field to simplifie the array manipulation. 2) Add the missing field a quorum need in _virStorageSource and the VIR_STORAGE_TYPE_QUORUM and VIR_STORAGE_FILE_QUORUM in their respectives enums. 3) Parse and format the xml Because a quorum allows to have more than one backing store at the same level we need to change virDomainDiskDefFormat and virDomainDiskDefParseXML to call virDomainDiskBackingStoreFormat and virDomainDiskBackingStoreParse in a loop. virDomainDiskBackingStoreFormat and virDomainDiskBackingStoreParse can call themself recursively in a loop because a quorum can contain another quorum 4) Add nodename We need to add nodename support in _virStorageSource because qemu use them for their child. 5) Build qemu string As for the xml, we have to call the function which create quorum recursively. But this task have the problem explained here: http://www.redhat.com/archives/libvir-list/2014-October/msg00529.html The _virStorageSource missing some informations that can be passed to a child, and therefore this version of quorum is incomplet. 6) Allow to hotplug/change a disk in a quorum This part is not present in these patches because for this task we have to use blockdev-add, and currently libvirt use device_add for hotpluging that doesn't allow to hotplug quorum childs. There is 3 way to handle this problem: 1) create a virDomainBlockDevAdd function in libvirt witch call blockdev-add. 2) use blockdev-add instead of device_add in qemuMonitorJSONAddDevice 3) write a hack which uses blockdev-add when only attaching quorum (but i'm pretty sure this solution is not the good one) V2: -Rebase on master -Add Documentation V3: -Transforme the backingStore field in virStorageSource into an array of pointer instead of a pointer -Modify virStorageSourceSetBackingStore to allow it to expand the backingStore size. Matthias Gatto (9): virstoragefile: Add virStorageSourceGetBackingStore virstoragefile: Always use virStorageSourceGetBackingStore to get backing store virstoragefile: Add virStorageSourceSetBackingStore virstoragefile: Always use virStorageSourceSetBackingStore to set backing store virstoragefile: change backingStore to backingStores. virstoragefile: Add quorum in virstoragefile domain_conf: Read and Write quorum config qemu: Add quorum support in qemuBuildDriveDevStr virstoragefile: Add node-name docs/formatdomain.html.in | 27 - docs/schemas/domaincommon.rng | 96 +++-- docs/schemas/storagecommon.rng| 1 + docs/schemas/storagevol.rng | 1 + src/conf/domain_conf.c| 195 ++ src/conf/storage_conf.c | 23 ++-- src/libvirt_private.syms | 2 + src/qemu/qemu_cgroup.c| 4 +- src/qemu/qemu_command.c | 114 src/qemu/qemu_domain.c| 2 +- src/qemu/qemu_driver.c| 30 +++--- src/qemu/qemu_migration.c | 1 + src/security/security_dac.c | 2 +- src/security/security_selinux.c | 4 +- src/security/virt-aa-helper.c | 2 +- src/storage/storage_backend.c | 33 +++--- src/storage/storage_backend_fs.c | 36 --- src/storage/storage_backend_gluster.c | 10 +- src/storage/storage_backend_logical.c | 15 ++- src/storage/storage_driver.c | 2 +- src/util/virstoragefile.c | 116 +--- src/util/virstoragefile.h | 12 ++- tests/virstoragetest.c| 18 ++-- 23 files changed, 573 insertions(+), 173 deletions(-) -- 1.8.3.1 ping -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH] SRIOV NIC offload feature discovery
Adding functionality to libvirt that will allow it query the ethtool interface for the availability of certain NIC HW offload features Here is an example of the feature XML definition: device namenet_eth4_90_e2_ba_5e_a5_45/name path/sys/devices/pci:00/:00:03.0/:08:00.1/net/eth4/path parentpci__08_00_1/parent capability type='net' interfaceeth4/interface address90:e2:ba:5e:a5:45/address link speed='1' state='up'/ feature name='rx'/ feature name='tx'/ feature name='sg'/ feature name='tso'/ feature name='gso'/ feature name='gro'/ feature name='rxvlan'/ feature name='txvlan'/ feature name='rxhash'/ capability type='80203'/ /capability /device --- docs/formatnode.html.in | 18 +++ docs/schemas/nodedev.rng | 14 +++ src/conf/device_conf.h| 6 + src/conf/node_device_conf.c | 45 ++- src/conf/node_device_conf.h | 2 + src/libvirt_private.syms | 1 + src/node_device/node_device_udev.c| 4 + src/util/virnetdev.c | 143 ++ src/util/virnetdev.h | 7 ++ tests/nodedevschemadata/net_00_13_02_b9_f9_d3.xml | 9 ++ tests/nodedevschemadata/net_00_15_58_2f_e9_55.xml | 9 ++ 11 files changed, 257 insertions(+), 1 deletion(-) diff --git a/docs/formatnode.html.in b/docs/formatnode.html.in index b820a34..ba9a0f8 100644 --- a/docs/formatnode.html.in +++ b/docs/formatnode.html.in @@ -183,6 +183,24 @@ link. So far, the whole element is just for output, not setting. /dd + dtcodefeature/code/dt + ddIf present, the hw offloads supported by this network +interface. Possible features are: +dl +dtcoderx/code/dtddrx-checksumming/dd +dtcodetx/code/dtddtx-checksumming/dd +dtcodesg/code/dtddscatter-gather/dd +dtcodetso/code/dtddtcp-segmentation-offload/dd +dtcodeufo/code/dtddudp-fragmentation-offload/dd + dtcodegso/code/dtddgeneric-segmentation-offload/dd +dtcodegro/code/dtddgeneric-receive-offload/dd +dtcodelro/code/dtddlarge-receive-offload/dd +dtcoderxvlan/code/dtddrx-vlan-offload/dd +dtcodetxvlan/code/dtddtx-vlan-offload/dd +dtcodentuple/code/dtddntuple-filters/dd +dtcoderxhash/code/dtddreceive-hashing/dd +/dl + /dd dtcodecapability/code/dt ddA network protocol exposed by the device, where the attribute codetype/code can be 80203 for IEEE diff --git a/docs/schemas/nodedev.rng b/docs/schemas/nodedev.rng index 13c5402..744dccd 100644 --- a/docs/schemas/nodedev.rng +++ b/docs/schemas/nodedev.rng @@ -275,10 +275,24 @@ ref name=link-speed-state/ zeroOrMore + element name='feature' +attribute name='name' + ref name='netfeaturename'/ +/attribute + /element +/zeroOrMore + +zeroOrMore ref name='subcapnet'/ /zeroOrMore /define + define name='netfeaturename' +data type='string' + param name='pattern'[a-zA-Z\-_]+/param +/data + /define + define name='subcapnet' element name='capability' choice diff --git a/src/conf/device_conf.h b/src/conf/device_conf.h index 7256cdc..091f2f0 100644 --- a/src/conf/device_conf.h +++ b/src/conf/device_conf.h @@ -62,6 +62,12 @@ struct _virInterfaceLink { unsigned int speed; /* link speed in Mbits per second */ }; +typedef struct _virDevFeature virDevFeature; +typedef virDevFeature *virDevFeaturePtr; +struct _virDevFeature { + char *name; /* device feature */ +}; + int virDevicePCIAddressIsValid(virDevicePCIAddressPtr addr); int virDevicePCIAddressParseXML(xmlNodePtr node, diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c index a728a00..76b53f0 100644 --- a/src/conf/node_device_conf.c +++ b/src/conf/node_device_conf.c @@ -437,6 +437,12 @@ char *virNodeDeviceDefFormat(const virNodeDeviceDef *def) virBufferEscapeString(buf, address%s/address\n, data-net.address); virInterfaceLinkFormat(buf, data-net.lnk); +if (data-net.features) { +for (i = 0; i data-net.nfeatures; i++) { +virBufferAsprintf(buf, feature name='%s'/\n, +data-net.features[i].name); +} +} if (data-net.subtype != VIR_NODE_DEV_CAP_NET_LAST) { const char *subtyp = virNodeDevNetCapTypeToString(data-net.subtype); @@ -927,8 +933,10 @@
Re: [libvirt] [PATCH] SRIOV NIC offload feature discovery
Thanks for your feedback folks, v2 to follow. Thanks James -Original Message- From: Daniel P. Berrange [mailto:berra...@redhat.com] Sent: Monday, February 16, 2015 11:47 AM To: Chapman, James P Cc: libvir-list@redhat.com Subject: Re: [libvirt] [PATCH] SRIOV NIC offload feature discovery On Mon, Feb 16, 2015 at 10:18:32AM +, James Chapman wrote: Adding functionality to libvirt that will allow it query the ethtool interface for the availability of certain NIC HW offload features --- src/conf/device_conf.h | 6 ++ src/conf/node_device_conf.c| 7 ++ src/conf/node_device_conf.h| 2 + src/libvirt_private.syms | 1 + src/node_device/node_device_udev.c | 4 ++ src/util/virnetdev.c | 134 + src/util/virnetdev.h | 12 +++- 7 files changed, 165 insertions(+), 1 deletion(-) If you're modifying the XML parser then you need to also change the XML schema (docs/schemas/nodedev.rng), add example XML for testing the schema (tests/nodedevschemadata) and finally extend the docs (docs/formatnodedev.html.in). Also it is good to include the proposed XML change in the commit message for reviewers. 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 :| -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCHv2] SRIOV NIC offload feature discovery
Adding functionality to libvirt that will allow it query the ethtool interface for the availability of certain NIC HW offload features Here is an example of the feature XML definition: device namenet_eth4_90_e2_ba_5e_a5_45/name path/sys/devices/pci:00/:00:03.0/:08:00.1/net/eth4/path parentpci__08_00_1/parent capability type='net' interfaceeth4/interface address90:e2:ba:5e:a5:45/address link speed='1' state='up'/ feature name='rx'/ feature name='tx'/ feature name='sg'/ feature name='tso'/ feature name='gso'/ feature name='gro'/ feature name='rxvlan'/ feature name='txvlan'/ feature name='rxhash'/ capability type='80203'/ /capability /device --- docs/formatnode.html.in | 18 +++ docs/schemas/nodedev.rng | 14 +++ src/conf/device_conf.h| 6 + src/conf/node_device_conf.c | 45 ++- src/conf/node_device_conf.h | 2 + src/libvirt_private.syms | 1 + src/node_device/node_device_udev.c| 4 + src/util/virnetdev.c | 143 ++ src/util/virnetdev.h | 7 ++ tests/nodedevschemadata/net_00_13_02_b9_f9_d3.xml | 9 ++ tests/nodedevschemadata/net_00_15_58_2f_e9_55.xml | 9 ++ 11 files changed, 257 insertions(+), 1 deletion(-) diff --git a/docs/formatnode.html.in b/docs/formatnode.html.in index b820a34..ba9a0f8 100644 --- a/docs/formatnode.html.in +++ b/docs/formatnode.html.in @@ -183,6 +183,24 @@ link. So far, the whole element is just for output, not setting. /dd + dtcodefeature/code/dt + ddIf present, the hw offloads supported by this network +interface. Possible features are: +dl +dtcoderx/code/dtddrx-checksumming/dd +dtcodetx/code/dtddtx-checksumming/dd +dtcodesg/code/dtddscatter-gather/dd +dtcodetso/code/dtddtcp-segmentation-offload/dd +dtcodeufo/code/dtddudp-fragmentation-offload/dd + dtcodegso/code/dtddgeneric-segmentation-offload/dd +dtcodegro/code/dtddgeneric-receive-offload/dd +dtcodelro/code/dtddlarge-receive-offload/dd +dtcoderxvlan/code/dtddrx-vlan-offload/dd +dtcodetxvlan/code/dtddtx-vlan-offload/dd +dtcodentuple/code/dtddntuple-filters/dd +dtcoderxhash/code/dtddreceive-hashing/dd +/dl + /dd dtcodecapability/code/dt ddA network protocol exposed by the device, where the attribute codetype/code can be 80203 for IEEE diff --git a/docs/schemas/nodedev.rng b/docs/schemas/nodedev.rng index 13c5402..744dccd 100644 --- a/docs/schemas/nodedev.rng +++ b/docs/schemas/nodedev.rng @@ -275,10 +275,24 @@ ref name=link-speed-state/ zeroOrMore + element name='feature' +attribute name='name' + ref name='netfeaturename'/ +/attribute + /element +/zeroOrMore + +zeroOrMore ref name='subcapnet'/ /zeroOrMore /define + define name='netfeaturename' +data type='string' + param name='pattern'[a-zA-Z\-_]+/param +/data + /define + define name='subcapnet' element name='capability' choice diff --git a/src/conf/device_conf.h b/src/conf/device_conf.h index 7256cdc..091f2f0 100644 --- a/src/conf/device_conf.h +++ b/src/conf/device_conf.h @@ -62,6 +62,12 @@ struct _virInterfaceLink { unsigned int speed; /* link speed in Mbits per second */ }; +typedef struct _virDevFeature virDevFeature; +typedef virDevFeature *virDevFeaturePtr; +struct _virDevFeature { + char *name; /* device feature */ +}; + int virDevicePCIAddressIsValid(virDevicePCIAddressPtr addr); int virDevicePCIAddressParseXML(xmlNodePtr node, diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c index a728a00..76b53f0 100644 --- a/src/conf/node_device_conf.c +++ b/src/conf/node_device_conf.c @@ -437,6 +437,12 @@ char *virNodeDeviceDefFormat(const virNodeDeviceDef *def) virBufferEscapeString(buf, address%s/address\n, data-net.address); virInterfaceLinkFormat(buf, data-net.lnk); +if (data-net.features) { +for (i = 0; i data-net.nfeatures; i++) { +virBufferAsprintf(buf, feature name='%s'/\n, +data-net.features[i].name); +} +} if (data-net.subtype != VIR_NODE_DEV_CAP_NET_LAST) { const char *subtyp = virNodeDevNetCapTypeToString(data-net.subtype); @@ -927,8 +933,10 @@
Re: [libvirt] [PATCH 1/5] Remove bootloader option from QEMU
On 02/18/2015 11:39 AM, Ján Tomko wrote: It was only supported by xenner, for which we removed support in commit de9be0a. Remove the code generating this command line option, refuse to parse it and delete the outdated tests. https://bugzilla.redhat.com/show_bug.cgi?id=1176050 --- src/qemu/qemu_command.c| 233 ++--- src/qemu/qemu_domain.c | 6 + .../qemuxml2argvdata/qemuxml2argv-bootloader.args | 5 - tests/qemuxml2argvdata/qemuxml2argv-bootloader.xml | 27 --- tests/qemuxml2argvdata/qemuxml2argv-input-xen.args | 5 - tests/qemuxml2argvdata/qemuxml2argv-input-xen.xml | 34 --- tests/qemuxml2argvtest.c | 2 - tests/qemuxml2xmltest.c| 2 - 8 files changed, 120 insertions(+), 194 deletions(-) delete mode 100644 tests/qemuxml2argvdata/qemuxml2argv-bootloader.args delete mode 100644 tests/qemuxml2argvdata/qemuxml2argv-bootloader.xml delete mode 100644 tests/qemuxml2argvdata/qemuxml2argv-input-xen.args delete mode 100644 tests/qemuxml2argvdata/qemuxml2argv-input-xen.xml ACK John FWIW: Just for completeness... Originally added by commit id '763a59d8' diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 743d6f0..b522bdc 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -8207,6 +8207,8 @@ qemuBuildCommandLine(virConnectPtr conn, }; virArch hostarch = virArchFromHost(); virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); +virBuffer boot_buf = VIR_BUFFER_INITIALIZER; +int boot_nparams = 0; VIR_DEBUG(conn=%p driver=%p def=%p mon=%p json=%d qemuCaps=%p migrateFrom=%s migrateFD=%d @@ -8728,148 +8730,140 @@ qemuBuildCommandLine(virConnectPtr conn, def-pm.s4 == VIR_TRISTATE_BOOL_NO); } -if (!def-os.bootloader) { -int boot_nparams = 0; -virBuffer boot_buf = VIR_BUFFER_INITIALIZER; -/* - * We prefer using explicit bootindex=N parameters for predictable - * results even though domain XML doesn't use per device boot elements. - * However, we can't use bootindex if boot menu was requested. +/* + * We prefer using explicit bootindex=N parameters for predictable + * results even though domain XML doesn't use per device boot elements. + * However, we can't use bootindex if boot menu was requested. + */ +if (!def-os.nBootDevs) { +/* def-os.nBootDevs is guaranteed to be 0 unless per-device boot + * configuration is used */ -if (!def-os.nBootDevs) { -/* def-os.nBootDevs is guaranteed to be 0 unless per-device boot - * configuration is used - */ -if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_BOOTINDEX)) { -virReportError(VIR_ERR_CONFIG_UNSUPPORTED, %s, - _(hypervisor lacks deviceboot feature)); -goto error; -} -emitBootindex = true; -} else if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_BOOTINDEX) - (def-os.bootmenu != VIR_TRISTATE_BOOL_YES || -!virQEMUCapsGet(qemuCaps, QEMU_CAPS_BOOT_MENU))) { -emitBootindex = true; -} - -if (!emitBootindex) { -char boot[VIR_DOMAIN_BOOT_LAST+1]; - -for (i = 0; i def-os.nBootDevs; i++) { -switch (def-os.bootDevs[i]) { -case VIR_DOMAIN_BOOT_CDROM: -boot[i] = 'd'; -break; -case VIR_DOMAIN_BOOT_FLOPPY: -boot[i] = 'a'; -break; -case VIR_DOMAIN_BOOT_DISK: -boot[i] = 'c'; -break; -case VIR_DOMAIN_BOOT_NET: -boot[i] = 'n'; -break; -default: -boot[i] = 'c'; -break; -} -} -boot[def-os.nBootDevs] = '\0'; - -virBufferAsprintf(boot_buf, %s, boot); -boot_nparams++; +if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_BOOTINDEX)) { +virReportError(VIR_ERR_CONFIG_UNSUPPORTED, %s, + _(hypervisor lacks deviceboot feature)); +goto error; } +emitBootindex = true; +} else if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_BOOTINDEX) + (def-os.bootmenu != VIR_TRISTATE_BOOL_YES || +!virQEMUCapsGet(qemuCaps, QEMU_CAPS_BOOT_MENU))) { +emitBootindex = true; +} -if (def-os.bootmenu) { -if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_BOOT_MENU)) { -if (boot_nparams++) -virBufferAddChar(boot_buf, ','); +
Re: [libvirt] [PATCH 2/5] Remove code handling the QEMU_CAPS_DOMID capability
On 02/18/2015 11:39 AM, Ján Tomko wrote: This option is xenner-only, and we dropped support for xenner in commit de9be0a. --- src/qemu/qemu_command.c | 5 + tests/qemuxml2argvtest.c | 5 + tests/qemuxmlnstest.c| 5 + 3 files changed, 3 insertions(+), 12 deletions(-) ACK, John FWIW: Originally added by 'b81a7ece' -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 3/3 v3] Add midonet virtual port type support to qemu
Use the utilities introduced in the previous patches so the qemu driver is able to create tap devices that are bound (and unbound on domain destroyal) to Midonet virtual ports. Signed-off-by: Antoni Segura Puimedon toni+libv...@midokura.com --- src/conf/domain_conf.h | 1 + src/qemu/qemu_hotplug.c | 25 ++--- src/qemu/qemu_process.c | 13 + src/util/virnetdevtap.c | 11 --- 4 files changed, 36 insertions(+), 14 deletions(-) diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 325afa8..cafe50f 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -42,6 +42,7 @@ # include virnetdevmacvlan.h # include virsysinfo.h # include virnetdevvportprofile.h +# include virnetdevmidonet.h # include virnetdevopenvswitch.h # include virnetdevbandwidth.h # include virnetdevvlan.h diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 8691c7e..34d7988 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1141,9 +1141,15 @@ int qemuDomainAttachNetDevice(virConnectPtr conn, } vport = virDomainNetGetActualVirtPortProfile(net); -if (vport vport-virtPortType == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH) - ignore_value(virNetDevOpenvswitchRemovePort( - virDomainNetGetActualBridgeName(net), net-ifname)); +if (vport) { +if (vport-virtPortType == VIR_NETDEV_VPORT_PROFILE_MIDONET) { +ignore_value(virNetDevMidonetUnbindPort(vport)); +} else if (vport-virtPortType == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH) { +ignore_value(virNetDevOpenvswitchRemovePort( + virDomainNetGetActualBridgeName(net), + net-ifname)); +} +} } virDomainNetRemoveHostdev(vm-def, net); @@ -2934,10 +2940,15 @@ qemuDomainRemoveNetDevice(virQEMUDriverPtr driver, } vport = virDomainNetGetActualVirtPortProfile(net); -if (vport vport-virtPortType == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH) -ignore_value(virNetDevOpenvswitchRemovePort( -virDomainNetGetActualBridgeName(net), -net-ifname)); +if (vport) { +if (vport-virtPortType == VIR_NETDEV_VPORT_PROFILE_MIDONET) { +ignore_value(virNetDevMidonetUnbindPort(vport)); +} else if (vport-virtPortType == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH) { +ignore_value(virNetDevOpenvswitchRemovePort( + virDomainNetGetActualBridgeName(net), + net-ifname)); +} +} networkReleaseActualDevice(vm-def, net); virDomainNetDefFree(net); diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index 1d4e957..982f802 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -5291,10 +5291,15 @@ void qemuProcessStop(virQEMUDriverPtr driver, /* release the physical device (or any other resources used by * this interface in the network driver */ -if (vport vport-virtPortType == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH) -ignore_value(virNetDevOpenvswitchRemovePort( - virDomainNetGetActualBridgeName(net), - net-ifname)); +if (vport) { +if (vport-virtPortType == VIR_NETDEV_VPORT_PROFILE_MIDONET) { +ignore_value(virNetDevMidonetUnbindPort(vport)); +} else if (vport-virtPortType == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH) { +ignore_value(virNetDevOpenvswitchRemovePort( + virDomainNetGetActualBridgeName(net), + net-ifname)); +} +} /* kick the device out of the hostdev list too */ virDomainNetRemoveHostdev(def, net); diff --git a/src/util/virnetdevtap.c b/src/util/virnetdevtap.c index 83b4131..f6152e9 100644 --- a/src/util/virnetdevtap.c +++ b/src/util/virnetdevtap.c @@ -26,6 +26,7 @@ #include virnetdevtap.h #include virnetdev.h #include virnetdevbridge.h +#include virnetdevmidonet.h #include virnetdevopenvswitch.h #include virerror.h #include virfile.h @@ -580,9 +581,13 @@ int virNetDevTapCreateInBridgePort(const char *brname, goto error; if (virtPortProfile) { -if (virNetDevOpenvswitchAddPort(brname, *ifname, macaddr, vmuuid, -virtPortProfile, virtVlan) 0) { -goto error; +if (virtPortProfile-virtPortType == VIR_NETDEV_VPORT_PROFILE_MIDONET) { +if (virNetDevMidonetBindPort(*ifname, virtPortProfile) 0) +goto error; +} else { +if (virNetDevOpenvswitchAddPort(brname, *ifname, macaddr, vmuuid, +
[libvirt] [PATCH 1/3 v3] utilities for supporting midonet virtualports
Adds the port type definitions and methods that will be used to bind interfaces to the Midonet virtual ports. virtnetdevmidonet.c adds the way to bind and unbind the ports by calling into the Midonet Host Agent control command line (installed with the midolman package). Signed-off-by: Antoni Segura Puimedon toni+libv...@midokura.com --- configure.ac | 4 ++ po/POTFILES.in | 1 + src/Makefile.am | 1 + src/libvirt_private.syms | 5 +++ src/util/virnetdevmidonet.c | 97 src/util/virnetdevmidonet.h | 37 +++ src/util/virnetdevvportprofile.c | 3 +- src/util/virnetdevvportprofile.h | 3 +- 8 files changed, 149 insertions(+), 2 deletions(-) create mode 100644 src/util/virnetdevmidonet.c create mode 100644 src/util/virnetdevmidonet.h diff --git a/configure.ac b/configure.ac index b3e99e7..ddffbb2 100644 --- a/configure.ac +++ b/configure.ac @@ -425,6 +425,8 @@ AC_PATH_PROG([MODPROBE], [modprobe], [modprobe], [/sbin:/usr/sbin:/usr/local/sbin:$PATH]) AC_PATH_PROG([RMMOD], [rmmod], [rmmod], [/sbin:/usr/sbin:/usr/local/sbin:$PATH]) +AC_PATH_PROG([MMCTL], [mm-ctl], [mm-ctl], + [/sbin:/usr/sbin:/usr/local/sbin:$PATH]) AC_PATH_PROG([OVSVSCTL], [ovs-vsctl], [ovs-vsctl], [/sbin:/usr/sbin:/usr/local/sbin:$PATH]) AC_PATH_PROG([SCRUB], [scrub], [scrub], @@ -440,6 +442,8 @@ AC_DEFINE_UNQUOTED([RADVD],[$RADVD], [Location or name of the radvd program]) AC_DEFINE_UNQUOTED([TC],[$TC], [Location or name of the tc program (see iproute2)]) +AC_DEFINE_UNQUOTED([MMCTL],[$MMCTL], +[Location or name of the mm-ctl program]) AC_DEFINE_UNQUOTED([OVSVSCTL],[$OVSVSCTL], [Location or name of the ovs-vsctl program]) diff --git a/po/POTFILES.in b/po/POTFILES.in index 3064037..cdfc839 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -195,6 +195,7 @@ src/util/virnetdev.c src/util/virnetdevbandwidth.c src/util/virnetdevbridge.c src/util/virnetdevmacvlan.c +src/util/virnetdevmidonet.c src/util/virnetdevopenvswitch.c src/util/virnetdevtap.c src/util/virnetdevveth.c diff --git a/src/Makefile.am b/src/Makefile.am index b41c6d4..23d3f93 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -129,6 +129,7 @@ UTIL_SOURCES = \ util/virnetdevbandwidth.h util/virnetdevbandwidth.c \ util/virnetdevbridge.h util/virnetdevbridge.c \ util/virnetdevmacvlan.c util/virnetdevmacvlan.h \ + util/virnetdevmidonet.h util/virnetdevmidonet.c \ util/virnetdevopenvswitch.h util/virnetdevopenvswitch.c \ util/virnetdevtap.h util/virnetdevtap.c \ util/virnetdevveth.h util/virnetdevveth.c \ diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 46a1613..0938cdc 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1738,6 +1738,11 @@ virNetDevMacVLanRestartWithVPortProfile; virNetDevMacVLanVPortProfileRegisterCallback; +# util/virnetdevmidonet.h +virNetDevMidonetBindPort; +virNetDevMidonetUnbindPort; + + # util/virnetdevopenvswitch.h virNetDevOpenvswitchAddPort; virNetDevOpenvswitchGetMigrateData; diff --git a/src/util/virnetdevmidonet.c b/src/util/virnetdevmidonet.c new file mode 100644 index 000..57fb636 --- /dev/null +++ b/src/util/virnetdevmidonet.c @@ -0,0 +1,97 @@ +/* + * Copyright (C) 2015 Midokura, Sarl. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see + * http://www.gnu.org/licenses/. + * + * Authors: + * Antoni Segura Puimedon t...@midokura.com + */ + +#include config.h + +#include virnetdevmidonet.h +#include vircommand.h +#include viralloc.h +#include virerror.h +#include viruuid.h + +#define VIR_FROM_THIS VIR_FROM_NONE + +/** + * virNetDevMidonetBindPort: + * @ifname: the network interface name + * @virtualport: the midonet specific fields + * + * Bind an interface to a Midonet virtual port + * + * Returns 0 in case of success or -1 in case of failure. + */ +int virNetDevMidonetBindPort(const char *ifname, +virNetDevVPortProfilePtr virtualport) +{ +int ret = -1; +virCommandPtr cmd = NULL; +char virtportuuid[VIR_UUID_STRING_BUFLEN]; + +virUUIDFormat(virtualport-interfaceID,
[libvirt] [PATCH v3] Add support for Midonet virtual ports
Up until now, to plug VMs into the Midonet virtual networks it was necessary to use the 'last resort' 'ethernet' type. That implied having the domain tainted and having to deal witht the tap lifecycle outside of libvirt/VM lifecycle. With the patches I submit, a new virtualport type will be accepted by libvirt that will always require an interfaceid (as it is essential for binding a tap device to a virtual port that the virtual port itself exists and has a UUID). With that interfaceid, libvirt will delegate the binding on the Midonet userspace tools. Antoni Segura Puimedon (1): Add support for the midonet virtualport type configure.ac | 4 ++ docs/schemas/networkcommon.rng | 12 + src/Makefile.am | 1 + src/conf/domain_conf.h | 1 + src/conf/netdev_vport_profile_conf.c | 3 +- src/libvirt_private.syms | 5 ++ src/qemu/qemu_hotplug.c | 25 +++--- src/qemu/qemu_process.c | 13 +++-- src/util/virnetdevmidonet.c | 97 src/util/virnetdevmidonet.h | 37 ++ src/util/virnetdevtap.c | 11 ++-- src/util/virnetdevvportprofile.c | 1 + src/util/virnetdevvportprofile.h | 5 +- 13 files changed, 197 insertions(+), 18 deletions(-) create mode 100644 src/util/virnetdevmidonet.c create mode 100644 src/util/virnetdevmidonet.h -- 2.3.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH 2/3 v3] Schema and docs for the midonet virtualport type
Midonet is an opensource virtual networking that over lays the IP network between hypervisors. Currently, such networks can be made with the openvswitch virtualport type. This patch, defines the schema and documentation that will serve as basis for the follow up patches that will add support to libvirt for using Midonet virtual ports for its interfaces. The schema definition requires that the port profile expresses its interfaceid as part of the port profile. For that reason, this is part of the patch too. Signed-off-by: Antoni Segura Puimedon toni+libv...@midokura.com --- docs/formatdomain.html.in | 34 + docs/schemas/networkcommon.rng | 12 src/conf/netdev_vport_profile_conf.c | 3 +- .../qemuxml2argvdata/qemuxml2argv-net-midonet.xml | 35 ++ tests/qemuxml2xmltest.c| 1 + 5 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-net-midonet.xml diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index f6477c2..1c2bb45 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -3652,6 +3652,40 @@ lt;/devicesgt; .../pre +p + On hosts that support Open vSwitch on the kernel side and that have the + Midonet Host Agent configured, it is also possible to connect to the + 'midonet' bridge device by adding a + codelt;virtualport type='midonet'/gt;/code to the + interface definition. (span class=sinceSince + 1.2.13/span). The Midonet virtualport type requires an + codeinterfaceid/code attribute to its + codelt;parametersgt;/code element. This interface id is the UUID + that specifies which port in the virtual network topology will be bound + to the interface. +/p +pre + ... + lt;devicesgt; +... +lt;interface type='bridge'gt; + lt;source bridge='br0'/gt; +lt;/interfacegt; +lt;interface type='bridge'gt; + lt;source bridge='br1'/gt; + lt;target dev='vnet7'/gt; + lt;mac address=00:11:22:33:44:55/gt; +lt;/interfacegt; +lt;interface type='bridge'gt; + lt;source bridge='midonet'/gt; + lt;virtualport type='midonet'gt; +lt;parameters interfaceid='0b2d64da-3d0e-431e-afdd-804415d6ebbb'/gt; + lt;/virtualportgt; +lt;/interfacegt; +... + lt;/devicesgt; + .../pre + h5a name=elementsNICSSlirpUserspace SLIRP stack/a/h5 p diff --git a/docs/schemas/networkcommon.rng b/docs/schemas/networkcommon.rng index 162ea3d..cc8b1dc 100644 --- a/docs/schemas/networkcommon.rng +++ b/docs/schemas/networkcommon.rng @@ -79,6 +79,18 @@ /element /group group +element name=virtualport + attribute name=type +valuemidonet/value + /attribute + element name=parameters +attribute name=interfaceid + ref name=UUID/ +/attribute + /element +/element + /group + group !-- use this when no type attribute is present -- element name=virtualport optional diff --git a/src/conf/netdev_vport_profile_conf.c b/src/conf/netdev_vport_profile_conf.c index 8da0838..1641a3e 100644 --- a/src/conf/netdev_vport_profile_conf.c +++ b/src/conf/netdev_vport_profile_conf.c @@ -260,7 +260,8 @@ virNetDevVPortProfileFormat(virNetDevVPortProfilePtr virtPort, virBufferAsprintf(buf, instanceid='%s', uuidstr); } if (virtPort-interfaceID_specified -(type == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH || +(type == VIR_NETDEV_VPORT_PROFILE_MIDONET || + type == VIR_NETDEV_VPORT_PROFILE_OPENVSWITCH || type == VIR_NETDEV_VPORT_PROFILE_NONE)) { char uuidstr[VIR_UUID_STRING_BUFLEN]; diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-midonet.xml b/tests/qemuxml2argvdata/qemuxml2argv-net-midonet.xml new file mode 100644 index 000..ae5a174 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-net-midonet.xml @@ -0,0 +1,35 @@ +domain type='qemu' + nameQEMUGuest1/name + uuidc7a5fdbd-edaf-9455-926a-d65c16db1809/uuid + memory unit='KiB'219136/memory + currentMemory unit='KiB'219136/currentMemory + vcpu placement='static'1/vcpu + os +type arch='i686' machine='pc'hvm/type +boot dev='hd'/ + /os + clock offset='utc'/ + on_poweroffdestroy/on_poweroff + on_rebootrestart/on_reboot + on_crashdestroy/on_crash + devices +emulator/usr/bin/qemu/emulator +disk type='block' device='disk' + source dev='/dev/HostVG/QEMUGuest1'/ + target dev='hda' bus='ide'/ + address type='drive' controller='0' bus='0' target='0' unit='0'/ +/disk +controller type='usb' index='0'/ +controller type='ide' index='0'/ +controller type='pci' index='0' model='pci-root'/ +interface type='bridge' + mac address='00:11:22:33:44:55'/ + source bridge='midonet'/ +
Re: [libvirt] [PATCH] Add ability to set rlimits at container boot
Ryan, Am 23.02.2015 um 18:37 schrieb Ryan Cleere: Richard, I have to disagree that it should require idmap. It is true that without idmap the container can freely set it's own rlimits, but I believe this functionality could be useful to containers that don't run /sbin/init. What I mean by that is application specific containers could have their limits set without the application having to set them, or even having to write a shim to set them. Sorry, I don't understand. What has running a non /sbin/init do to with that? Without user namespaces root within the container can bypass these limits. Thanks, //richard -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH] qemu: bulk stats: implement (cpu) tune group.
On 02/11/2015 09:22 AM, Francesco Romani wrote: Management applications, like oVirt, may need to setup cpu quota limits to enforce QoS for VMs. For this purpose, management applications also need to check how VMs are behaving with respect to CPU quota. This data is avaialble using the virDomainGetSchedulerParameters API. This patch adds a new group to bulk stats API to obtain the same information. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1191428 --- include/libvirt/libvirt-domain.h | 1 + src/libvirt-domain.c | 16 src/qemu/qemu_driver.c | 84 tools/virsh-domain-monitor.c | 7 4 files changed, 108 insertions(+) In general looks good... There's a few spelling and spacing nits below which I could fix up before pushing for you... You are missing 'virsh.pod' - something easily added as well. The one question I have is around the switch name (looking for any other thoughts...) Should the option be cpu-tune instead of tune-cpu, especially since the name of the function has *CpuTune? Or even 'sched-info' to match the 'virsh schedinfo $dom' command? I suppose some day there'd be 'numa-tune' data desired as well, but that's a different issue... John diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h index 4dbd7f5..3d8c6af 100644 --- a/include/libvirt/libvirt-domain.h +++ b/include/libvirt/libvirt-domain.h @@ -1700,6 +1700,7 @@ typedef enum { VIR_DOMAIN_STATS_VCPU = (1 3), /* return domain virtual CPU info */ VIR_DOMAIN_STATS_INTERFACE = (1 4), /* return domain interfaces info */ VIR_DOMAIN_STATS_BLOCK = (1 5), /* return domain block info */ +VIR_DOMAIN_STATS_TUNE_CPU = (1 6), /* return domain CPU tuning info */ } virDomainStatsTypes; typedef enum { diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c index 492e90a..a4effa3 100644 --- a/src/libvirt-domain.c +++ b/src/libvirt-domain.c @@ -10990,6 +10990,22 @@ virConnectGetDomainCapabilities(virConnectPtr conn, * block.num.physical - physical size in bytes of the container of the * backing image as unsigned long long. * + * VIR_DOMAIN_STATS_TUNE_CPU: Return CPU tuning statistics + * and usage information. + * The typed parameter keys are in this format: + * tune.vcpu.quota - max allowed bandwith, in microseconds, as s/bandwith/bandwidth + * long long integer. -1 means 'infinite'. + * tune.vcpu.period - timeframe on which the virtual cpu quota is + * enforced, in microseconds, as unsigned long long. + * tune.emu.quota - max allowd bandwith for emulator threads, s/bandwith/bandwidth s/allowd/allowed + *in microseconds, as long long integer. + *-1 means 'infinite'. + * tune.emu.period - timeframe on which the emulator quota is + * enforced, in microseconds, as unsigned long long. + * tune.cpu.shares - weight of this VM. This value is meaningful + * only if compared with the other values of + * the running vms. Expressed as unsigned long long. s/vms/domains FWIW: I guess I find it hard to read 'vms' without thinking about the VMS (or OpenVMS) operating system ;-) [guess where I started my career]. + * * Note that entire stats groups or individual stat fields may be missing from * the output in case they are not supported by the given hypervisor, are not * applicable for the current state of the guest domain, or their retrieval diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 26fc6a2..5548626 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -18797,6 +18797,89 @@ qemuDomainGetStatsBlock(virQEMUDriverPtr driver, #undef QEMU_ADD_COUNT_PARAM + +#define QEMU_ADD_PARAM_LL(record, maxparams, name, value) \ +do { \ +if (virTypedParamsAddLLong((record)-params, \ + (record)-nparams, \ + maxparams, \ + name, \ + value) 0) \ +goto cleanup; \ +} while (0) + +#define QEMU_ADD_PARAM_ULL(record, maxparams, name, value) \ +do { \ +if (virTypedParamsAddULLong((record)-params, \ +(record)-nparams, \ +maxparams, \ +name, \ +value) 0) \ +goto cleanup; \ +} while (0) + +static int +qemuDomainGetStatsCpuTune(virQEMUDriverPtr driver, + virDomainObjPtr dom, + virDomainStatsRecordPtr record, + int *maxparams, + unsigned int privflags ATTRIBUTE_UNUSED) +{ +int ret = -1; +unsigned long long shares = 0; +qemuDomainObjPrivatePtr
Re: [libvirt] [PATCH 0/3] s390: rework and prevent default usb controller
On 02/18/2015 10:44 AM, Stefan Zimmermann wrote: Stefan Zimmermann (3): Prevent default creation of usb controller on s390 and s390x Adjust s390 test cases by removing usb device instances Rework s390 architecture checking src/qemu/qemu_command.c | 4 +++- src/qemu/qemu_domain.c | 13 + tests/qemuxml2argvdata/qemuxml2argv-minimal-s390.args | 2 +- .../qemuxml2argv-s390-piix-controllers.args | 2 +- .../qemuxml2xmlout-s390-defaultconsole.xml | 1 - 5 files changed, 14 insertions(+), 8 deletions(-) ACK - series and pushed, although I combined patch 1 2 since we don't want to break git bisect and patch 2 essentially fixes the tests that patch 1 will change. John -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
[libvirt] [PATCH] qemu: don't fill in nicindexes if unneeded
The patch I posted failed to pass make check for two reasons: 1) There are valid use cases when the interface object is type='ethernet' but has no ifname. Apparently if you provide an ifup script name for -netdev but don't specify a tap device name, qemu will create a tap device for you, and in that case of course libvirt would be unable to provide the name to systemd. 2) Even if we avoid the code to look for the ifindex when ifname is NULL (see (1), make check will *still* fail because there are tests in the suite that have type='ethernet' and still have an ifname specified, but that device of course doesn't actually exist on the test system, so attempts to call virNetDevGetIndex() will fail. The solution here is to change qemuBuildInterfaceCommandline() so that it won't even try to add anything to the nicindexes array if NULL is sent in the args, and modify the calls from test programs to do exactly that. I intend to squash this patch into the original, already acked by danpb. --- src/qemu/qemu_command.c | 13 ++--- src/qemu/qemu_driver.c | 6 +- tests/qemuxml2argvtest.c | 5 + tests/qemuxmlnstest.c| 5 + 4 files changed, 9 insertions(+), 20 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 81f6982..1e63905 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -7840,10 +7840,12 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd, /* network and bridge use a tap device, and direct uses a * macvtap device */ - if (virNetDevGetIndex(net-ifname, nicindex) 0 || - VIR_APPEND_ELEMENT(*nicindexes, *nnicindexes, nicindex) 0) - goto cleanup; - break; +if (nicindexes nnicindexes net-ifname) { +if (virNetDevGetIndex(net-ifname, nicindex) 0 || +VIR_APPEND_ELEMENT(*nicindexes, *nnicindexes, nicindex) 0) +goto cleanup; +} +break; } case VIR_DOMAIN_NET_TYPE_USER: @@ -8257,9 +8259,6 @@ qemuBuildCommandLine(virConnectPtr conn, virUUIDFormat(def-uuid, uuid); -*nnicindexes = 0; -*nicindexes = NULL; - emulator = def-emulator; if (!cfg-privileged) { diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index bec05d4..04fa8fa 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -6447,8 +6447,6 @@ static char *qemuConnectDomainXMLToNative(virConnectPtr conn, size_t i; virQEMUDriverConfigPtr cfg; virCapsPtr caps = NULL; -size_t nnicindexes = 0; -int *nicindexes = NULL; virCheckFlags(0, NULL); @@ -6634,14 +6632,12 @@ static char *qemuConnectDomainXMLToNative(virConnectPtr conn, buildCommandLineCallbacks, true, qemuCheckFips(), - NULL, - nnicindexes, nicindexes))) + NULL, NULL, NULL))) goto cleanup; ret = virCommandToString(cmd); cleanup: -VIR_FREE(nicindexes); virObjectUnref(qemuCaps); virCommandFree(cmd); virDomainDefFree(def); diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 16f325e..7eba5c9 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -263,8 +263,6 @@ static int testCompareXMLToArgvFiles(const char *xml, char *log = NULL; virCommandPtr cmd = NULL; size_t i; -size_t nnicindexes = 0; -int *nicindexes = NULL; virBitmapPtr nodeset = NULL; if (!(conn = virGetConnect())) @@ -355,7 +353,7 @@ static int testCompareXMLToArgvFiles(const char *xml, VIR_NETDEV_VPORT_PROFILE_OP_NO_OP, testCallbacks, false, (flags FLAG_FIPS), - nodeset, nnicindexes, nicindexes))) { + nodeset, NULL, NULL))) { if (!virtTestOOMActive() (flags FLAG_EXPECT_FAILURE)) { ret = 0; @@ -402,7 +400,6 @@ static int testCompareXMLToArgvFiles(const char *xml, ret = 0; out: -VIR_FREE(nicindexes); VIR_FREE(log); VIR_FREE(expectargv); VIR_FREE(actualargv); diff --git a/tests/qemuxmlnstest.c b/tests/qemuxmlnstest.c index a068135..4220737 100644 --- a/tests/qemuxmlnstest.c +++ b/tests/qemuxmlnstest.c @@ -44,8 +44,6 @@ static int testCompareXMLToArgvFiles(const char *xml, char *log = NULL; char *emulator = NULL; virCommandPtr cmd = NULL; -size_t nnicindexes = 0; -int *nicindexes = NULL; if (!(conn = virGetConnect())) goto fail; @@ -122,7 +120,7 @@ static int testCompareXMLToArgvFiles(const char *xml, migrateFrom, migrateFd, NULL, VIR_NETDEV_VPORT_PROFILE_OP_NO_OP,
Re: [libvirt] [PATCHv4 02/10] conf: support backend domain name in disk and network devices
On 02/19/2015 08:22 PM, Marek Marczykowski-Górecki wrote: From: Marek Marczykowski marma...@invisiblethingslab.com At least Xen supports backend drivers in another domain (aka driver domain). This patch introduces XML config option for such setting as 'domain' attribute of 'source' element. Verification its content is left for the driver. In the future same option will be needed for USB devices (hostdev objects), but for now libxl doesn't have support for PVUSB. Signed-off-by: Marek Marczykowski-Górecki marma...@invisiblethingslab.com --- Changes in v2: - describe in docs/formatdomain.html.in - enforce empty domain tag (only 'name' attribute allowed) Changes in v3: - change domain name='xx'/ element to domain='' attribute of source element - this is more logical place - grammar of docs Changes in v4: - revert back to separate element, named backenddomain name='xx'/ Meta-note (don't feel bad about it this time, but food for thought for future submissions): It's a little bit easier on reviewers to send a patch series revision (in this case, v4) as a new top-level thread rather than buried in-reply-to an existing thread. For now, that just seems to be an unwritten convention on libvirt (the qemu project has actually documented it: http://wiki.qemu.org/Contribute/SubmitAPatch - but their policies are sometimes stricter than what we require here, so read that page with a grain of salt). Of course, a patch to libvirt's HACKING to make it an explicit convention might not hurt :) -- Eric Blake eblake redhat com+1-919-301-3266 Libvirt virtualization library http://libvirt.org signature.asc Description: OpenPGP digital signature -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] SR-IOV with libvirt
On 02/20/2015 05:33 PM, Florin Stingaciu wrote: Hello, For the last little while I've been trying to configure a VM with a passthrough interface using SR-IOV. I've managed to configure SR-IOV on the hypervisor correctly. I'm working with a Mellanox ConnectX3 card with two infiniband ports and hypervisors running Centos 7. I can see the PCI devices (ie. virtual functions) using the `virsh nodedev-list` command. The majority of tutorials online (including the tutorials on the libvirt site), suggest one configures an SR-IOV passthrough interface in the following manner in the VM definition file: interface type='hostdev' managed='yes' mac address='52:54:00:d7:cd:aa'/ source address type='pci' domain='0x' bus='0x01' slot='0x00' function='0x2'/ /source address type='pci' domain='0x' bus='0x00' slot='0x03' function='0x0'/ /interface For example the above configuration should configure the second VF as a passthrough interface for this VM. When I try to launch the VM, I get the following error: error: Failed to start domain test error: internal error: missing IFLA_VF_INFO in netlink response I've done research on this error quite extensively. This used to be a very popular error a while back for scenarios where the total number of VFs is 64. This is not the case here as I only have 8. I've was never able to overcome this error but I did manage to get this working another way. The VM will boot just fine and detect a new interface if you define one of the VFs as a PCI in the following manner within the VM definition file: hostdev mode='subsystem' type='pci' managed='yes' source address domain='0x' bus='0x01' slot='0x00' function='0x2'/ /source address type='pci' domain='0x' bus='0x00' slot='0x06' function='0x0'/ /hostdev As you can see the from the source bus and function, it's the same VF I was trying with the definition above. I'm wondering if there is any particular reason for this or how could I get around this error. Normally, I would just use the second configuration, however I'm about to begin work within an openstack environment where the sriovnicswitch ml2 plugin will be used for networking. This plugin, when configuring passthrough interfaces uses the first definition that does not work and spits out that error. Considering even the official libvirt tutorials suggest the first way, I feel like I must be missing something, or something broke and noone noticed in one of the latest updates. Any help would be greatly appreciated. No, the problem is with the drivers for the particular cards you are using. To my understanding, the Mellanox cards have a bit of a different architecture, and were not initially designed to be SRIOV-compliant (or maybe they 'comply differently', I'm not sure of the exact details). I would recommend looking to Mellanox for updated drivers for the card for CentOS7. Alternately, you could test it with the RHEL7.1 beta, which will have newer Mellanox bits than whatever CentOS7 you're currently working with. -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] Exact meaning of nativeMode attribute in vlan tags
To clarify the behaviour of open vswitch: With either of the native modes selected, a packet that comes in to the switch without a vlan header will be placed in the native vlan and the header added before the packet is forwarded. With nativeMode='tagged', a packet in the native vlan will be sent out of the switch with its vlan header intact. With nativeMode='untagged' a packet in the native vlan will be sent out of the switch with the vlan header removed. In case it helps, here is the open vswitch doc for the vlan settings: Bridge ports support the following types of VLAN configuration: trunk A trunk port carries packets on one or more specified VLANs specified in the trunks column (often, on every VLAN). A packet that ingresses on a trunk port is in the VLAN specified in its 802.1Q header, or VLAN 0 if the packet has no 802.1Q header. A packet that egresses through a trunk port will have an 802.1Q header if it has a nonzero VLAN ID. Any packet that ingresses on a trunk port tagged with a VLAN that the port does not trunk is dropped. access An access port carries packets on exactly one VLAN specified in the tag column. Packets egressing on an access port have no 802.1Q header. Any packet with an 802.1Q header with a nonzero VLAN ID that ingresses on an access port is dropped, regardless of whether the VLAN ID in the header is the access port’s VLAN ID. native-tagged A native-tagged port resembles a trunk port, with the exception that a packet without an 802.1Q header that ingresses on a native-tagged port is in the ‘‘native VLAN’’ (specified in the tag column). native-untagged A native-untagged port resembles a native-tagged port, with the exception that a packet that egresses on a native- untagged port in the native VLAN will not have an 802.1Q header. From: sendmail [justsendmailnothinge...@gmail.com] on behalf of Laine Stump [la...@laine.org] Sent: 22 February 2015 19:31 To: Libvirt Cc: Robson, James Subject: Exact meaning of nativeMode attribute in vlan tags You'd think that I would know this, since I'm the person who reviewed jrobson's patch adding support for the nativeMode attribute to the vlan tag element. But you'd be wrong. Here is what the config looks like: vlan trunk='yes' tag id='42' nativeMode='untagged'/ tag id='47'/ /vlan I understand that trunk='yes' means that packets with any of the tags listed in a tag subelement can be sent out this port (and the tag will *not* be removed), and likewise packets arriving into the bridge from the port are allowed to have any of the listed tags (and, again, no tag will be removed). But what exactly do nativeMode='untagged' and nativeMode='tagged' mean? As I understand it, (nativeMode='untagged'|nativeMode='tagged') means that packets (arriving from|sent to) the port (without a tag/with that tag) will be (tagged|untagged). Can someone who fully understands this please select A or B for each of the 4 parenthesized items (in as many permutations as make sense). I guess that in one of the modes, untagged packets going in one direction or the other will be tagged, and vice versa, I just don't know which direction does which, and for which mode, and don't want to guess. (I'm asking this because I want to implement identical functionality for standard Linux host bridges - I want to make sure there are no surprises for people switching between OVS and Linux host bridge implementations). To report this email as SPAM, please forward it to s...@websense.com -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH] qemu: Allow spaces in disk serial
On 02/23/2015 04:39 AM, Michal Privoznik wrote: There's been a bug report appearing on the qemu-devel list, that libvirt is unable to pass spaces in disk serial number [1]. Not only our RNG schema forbids that, the code is not prepared either. However, with a bit of escaping (if needed) we can allow spaces there. 1: https://lists.gnu.org/archive/html/qemu-devel/2015-02/msg04041.html Signed-off-by: Michal Privoznik mpriv...@redhat.com --- docs/schemas/domaincommon.rng | 2 +- src/qemu/qemu_command.c| 5 ++-- .../qemuxml2argvdata/qemuxml2argv-disk-serial.args | 6 + .../qemuxml2argvdata/qemuxml2argv-disk-serial.xml | 27 ++ tests/qemuxml2argvtest.c | 5 5 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-serial.args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-disk-serial.xml @@ -3616,7 +3616,8 @@ qemuBuildDriveStr(virConnectPtr conn, virQEMUCapsGet(qemuCaps, QEMU_CAPS_DRIVE_SERIAL)) { if (qemuSafeSerialParamValue(disk-serial) 0) goto error; -virBufferAsprintf(opt, ,serial=%s, disk-serial); +virBufferAddLit(opt, ,serial=); +virBufferEscapeShell(opt, disk-serial); NACK to this hunk. We do NOT want shell escaping, because we are NOT invoking the shell directly. As proof: } if (disk-cachemode) { diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-serial.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-serial.args new file mode 100644 index 000..8b08cfb --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-serial.args @@ -0,0 +1,6 @@ +LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=none \ +/usr/libexec/qemu-kvm -S -M pc -cpu qemu32 -m 214 -smp 1 -nographic -nodefaults \ +-monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -usb \ +-drive 'file=/dev/HostVG/QEMUGuest1,if=none,id=drive-ide0-0-1,serial='\'' WD-WMAP9A966149'\''' \ your patch is passing the equivalent of serial=' WD-WMAP9a966149' (including the single quotes, which were not present in your XML). The log file output will need shell escaping, but we already do that. Needs a v2. -- Eric Blake eblake redhat com+1-919-301-3266 Libvirt virtualization library http://libvirt.org signature.asc Description: OpenPGP digital signature -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [libvirt-python PATCH 1/2] Support virDomainGetIOThreadsInfo and virDomainIOThreadsInfoFree
On 02/20/2015 12:15 PM, John Ferlan wrote: ... Obviously it wasn't very clear to me how the PyList* interactions work exactly w/r/t Py_XDECREF - I was trying to copy other uses, but didn't do a great job at that. I was just happy that I got results that worked Don't feel too bad; we have LOTS of bad examples that could use someone doing a full-blown audit and cleanup. It's just that it would be mind-numbing work, that no one seems to want to volunteer for. -- Eric Blake eblake redhat com+1-919-301-3266 Libvirt virtualization library http://libvirt.org signature.asc Description: OpenPGP digital signature -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCHv2] Clarify behavior or virDomainDetachDevice
On 02/20/2015 07:56 AM, Ján Tomko wrote: Document that a complete device definition should be used and a partial match can lead to the device being detached. https://bugzilla.redhat.com/show_bug.cgi?id=872028 --- src/libvirt-domain.c | 14 ++ tools/virsh.pod | 9 ++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c index 492e90a..fb85a28 100644 --- a/src/libvirt-domain.c +++ b/src/libvirt-domain.c @@ -8266,6 +8266,13 @@ virDomainAttachDeviceFlags(virDomainPtr domain, * into S4 state (also known as hibernation) unless you also modify the * persistent domain definition. * + * The supplied XML description of the device should be as specific + * as its definition in the domain XML. The set of attributes used + * to match the device are internal to the drivers. Using a partial definition, + * or attempting to detach a device that is not present in the domain XML, + * but shares some specific attributes with one that is present s/present/present,/ + * may lead to unexpected results. + * * Returns 0 in case of success, -1 in case of failure. */ int @@ -8341,6 +8348,13 @@ virDomainDetachDevice(virDomainPtr domain, const char *xml) * into S4 state (also known as hibernation) unless you also modify the * persistent domain definition. * + * The supplied XML description of the device should be as specific + * as its definition in the domain XML. The set of attributes used + * to match the device are internal to the drivers. Using a partial definition, + * or attempting to detach a device that is not present in the domain XML, + * but shares some specific attributes with one that is present + * may lead to unexpected results. Here too. + * * Returns 0 in case of success, -1 in case of failure. */ int diff --git a/tools/virsh.pod b/tools/virsh.pod index 50de32c..09663f5 100644 --- a/tools/virsh.pod +++ b/tools/virsh.pod @@ -2439,9 +2439,12 @@ as command Battach-device. For passthrough host devices, see also Bnodedev-reattach, needed if the device does not use managed mode. -BNote: using of partial device definition XML files may lead to unexpected -results as some fields may be autogenerated and thus match devices other than -expected. +BNote: The supplied XML description of the device should be as specific +as its definition in the domain XML. The set of attributes used +to match the device are internal to the drivers. Using a partial definition, +or attempting to detach a device that is not present in the domain XML, +but shares some specific attributes with one that is present +may lead to unexpected results. and here. ACK with that tweaked. -- Eric Blake eblake redhat com+1-919-301-3266 Libvirt virtualization library http://libvirt.org signature.asc Description: OpenPGP digital signature -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH] Clarify behavior or virDomainDetachDevice
On 02/20/2015 04:39 AM, Ján Tomko wrote: Doucment that not all attributes are used for matching. s/Doucment/Document/ https://bugzilla.redhat.com/show_bug.cgi?id=872028 --- src/libvirt-domain.c | 5 + tools/virsh.pod | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) +++ b/tools/virsh.pod @@ -2441,7 +2441,9 @@ the device does not use managed mode. BNote: using of partial device definition XML files may lead to unexpected results as some fields may be autogenerated and thus match devices other than -expected. +expected. Not every device attribute is checked when matching the device. +For example a network interface can be detatched if the mac and PCI addresses +match, even if the type does not. s/detatched/detached/ (of course, now that I've read the rest of this thread, I see that you aren't using this wording after all...) -- Eric Blake eblake redhat com+1-919-301-3266 Libvirt virtualization library http://libvirt.org signature.asc Description: OpenPGP digital signature -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH 1/3 v3] utilities for supporting midonet virtualports
On Tue, Feb 24, 2015 at 2:20 AM, YAMAMOTO Takashi yamam...@valinux.co.jp wrote: Adds the port type definitions and methods that will be used to bind interfaces to the Midonet virtual ports. virtnetdevmidonet.c adds the way to bind and unbind the ports by calling into the Midonet Host Agent control command line (installed with the midolman package). Signed-off-by: Antoni Segura Puimedon toni+libv...@midokura.com have you considered a script-based solution which would be able to cover openvswitch case as well? Can you elaborate? For script I can only think about having an xml node that can be specified for the port type that says what should be run for attachment (like with the ethernet mode). But I'm not sure how it would fit right now. YAMAMOTO Takashi -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH 1/3 v3] utilities for supporting midonet virtualports
On 02/23/2015 08:48 PM, YAMAMOTO Takashi wrote: On Tue, Feb 24, 2015 at 2:20 AM, YAMAMOTO Takashi yamam...@valinux.co.jp wrote: Adds the port type definitions and methods that will be used to bind interfaces to the Midonet virtual ports. virtnetdevmidonet.c adds the way to bind and unbind the ports by calling into the Midonet Host Agent control command line (installed with the midolman package). Signed-off-by: Antoni Segura Puimedon toni+libv...@midokura.com have you considered a script-based solution which would be able to cover openvswitch case as well? Can you elaborate? For script I can only think about having an xml node that can be specified for the port type that says what should be run for attachment (like with the ethernet mode). But I'm not sure how it would fit right now. i meant to have a run a script port type. the script runs ovs-vsctl, mm-ctl, or whatever internally. We actively avoid calling free-form scripts as much as possible. It is too difficult to support, and opens the possibility of security problems. For that matter, we even prefer to not call external binaries if we can avoid it, and eliminate existing executions of external binaries whenever we get the change. The only reason we agreed to executing ovs-vsctl is because there is no defined public API for Open vSwitch that uses a library, netlink message, ioctl, etc. (at least there wasn't at the time that code was added). -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH] qemu: don't fill in nicindexes if unneeded
On 02/23/2015 03:12 PM, Laine Stump wrote: The patch I posted failed to pass make check for two reasons: 1) There are valid use cases when the interface object is type='ethernet' but has no ifname. Apparently if you provide an ifup script name for -netdev but don't specify a tap device name, qemu will create a tap device for you, and in that case of course libvirt would be unable to provide the name to systemd. 2) Even if we avoid the code to look for the ifindex when ifname is NULL (see (1), make check will *still* fail because there are tests in the suite that have type='ethernet' and still have an ifname specified, but that device of course doesn't actually exist on the test system, so attempts to call virNetDevGetIndex() will fail. The solution here is to change qemuBuildInterfaceCommandline() so that it won't even try to add anything to the nicindexes array if NULL is sent in the args, and modify the calls from test programs to do exactly that. I intend to squash this patch into the original, already acked by danpb. --- src/qemu/qemu_command.c | 13 ++--- src/qemu/qemu_driver.c | 6 +- tests/qemuxml2argvtest.c | 5 + tests/qemuxmlnstest.c| 5 + 4 files changed, 9 insertions(+), 20 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 81f6982..1e63905 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -7840,10 +7840,12 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd, Since you're merging anyway... The comment to the switch needs some adjustment: +/* For types whose implementions use a netdev on the host, add an + * entry to nicifindexes for passing on to systemd. +*/ - s/implementions/implementations - s/nicifindexes/nicindexes - s/'*/'/' */'/, e.g. needs one extra space to be properly aligned /* network and bridge use a tap device, and direct uses a * macvtap device */ - if (virNetDevGetIndex(net-ifname, nicindex) 0 || - VIR_APPEND_ELEMENT(*nicindexes, *nnicindexes, nicindex) 0) - goto cleanup; - break; +if (nicindexes nnicindexes net-ifname) { ^^ Adding the net-ifname check sets off the Coverity FORWARD_NULL check later on in the following code 7874if (actualBandwidth) { 7875if (virNetDevSupportBandwidth(actualType)) { 7876if (virNetDevBandwidthSet(net-ifname, actualBandwidth, false) 0) It doesn't seem from some quick testing that we could run into a situation where net-ifname could be NULL in that second call - one would have to set bandwidth options... in any case to keep Coverity happy and perhaps be extra paranoid a if (net-ifname actualBandwidth) would avoid the situation. Beyond that it seems things are fine... So consider it an ACK as long as you address the Coverity error John +if (virNetDevGetIndex(net-ifname, nicindex) 0 || +VIR_APPEND_ELEMENT(*nicindexes, *nnicindexes, nicindex) 0) +goto cleanup; +} +break; } case VIR_DOMAIN_NET_TYPE_USER: @@ -8257,9 +8259,6 @@ qemuBuildCommandLine(virConnectPtr conn, virUUIDFormat(def-uuid, uuid); -*nnicindexes = 0; -*nicindexes = NULL; - emulator = def-emulator; if (!cfg-privileged) { diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index bec05d4..04fa8fa 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -6447,8 +6447,6 @@ static char *qemuConnectDomainXMLToNative(virConnectPtr conn, size_t i; virQEMUDriverConfigPtr cfg; virCapsPtr caps = NULL; -size_t nnicindexes = 0; -int *nicindexes = NULL; virCheckFlags(0, NULL); @@ -6634,14 +6632,12 @@ static char *qemuConnectDomainXMLToNative(virConnectPtr conn, buildCommandLineCallbacks, true, qemuCheckFips(), - NULL, - nnicindexes, nicindexes))) + NULL, NULL, NULL))) goto cleanup; ret = virCommandToString(cmd); cleanup: -VIR_FREE(nicindexes); virObjectUnref(qemuCaps); virCommandFree(cmd); virDomainDefFree(def); diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 16f325e..7eba5c9 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -263,8 +263,6 @@ static int testCompareXMLToArgvFiles(const char *xml, char *log = NULL; virCommandPtr cmd = NULL; size_t i; -size_t nnicindexes = 0; -int *nicindexes = NULL; virBitmapPtr nodeset = NULL; if (!(conn = virGetConnect())) @@ -355,7 +353,7 @@ static int testCompareXMLToArgvFiles(const char *xml,
Re: [libvirt] [PATCH 1/3 v3] utilities for supporting midonet virtualports
On Tue, Feb 24, 2015 at 2:20 AM, YAMAMOTO Takashi yamam...@valinux.co.jp wrote: Adds the port type definitions and methods that will be used to bind interfaces to the Midonet virtual ports. virtnetdevmidonet.c adds the way to bind and unbind the ports by calling into the Midonet Host Agent control command line (installed with the midolman package). Signed-off-by: Antoni Segura Puimedon toni+libv...@midokura.com have you considered a script-based solution which would be able to cover openvswitch case as well? Can you elaborate? For script I can only think about having an xml node that can be specified for the port type that says what should be run for attachment (like with the ethernet mode). But I'm not sure how it would fit right now. i meant to have a run a script port type. the script runs ovs-vsctl, mm-ctl, or whatever internally. YAMAMOTO Takashi YAMAMOTO Takashi -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH 1/3 v3] utilities for supporting midonet virtualports
Adds the port type definitions and methods that will be used to bind interfaces to the Midonet virtual ports. virtnetdevmidonet.c adds the way to bind and unbind the ports by calling into the Midonet Host Agent control command line (installed with the midolman package). Signed-off-by: Antoni Segura Puimedon toni+libv...@midokura.com have you considered a script-based solution which would be able to cover openvswitch case as well? YAMAMOTO Takashi -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH 3/5] Make -boot arg generation more readable
On 02/18/2015 11:39 AM, Ján Tomko wrote: If we combine the boot order on the command line with other boot options, we prepend order= in front of it. Instead of checking if the number of added arguments is between 0 and 2, separate the buffers for boot order and options and prepend boot order only if both buffers are not empty. --- src/qemu/qemu_command.c | 37 ++--- 1 file changed, 22 insertions(+), 15 deletions(-) ACK - there's a note below which could be implemented or not. John diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 3658d5f..f13dbda 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -8208,6 +8208,8 @@ qemuBuildCommandLine(virConnectPtr conn, virArch hostarch = virArchFromHost(); virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virBuffer boot_buf = VIR_BUFFER_INITIALIZER; +virBuffer boot_order = VIR_BUFFER_INITIALIZER; +char *boot_order_str = NULL, *boot_opts_str = NULL; int boot_nparams = 0; VIR_DEBUG(conn=%p driver=%p def=%p mon=%p json=%d @@ -8772,10 +8774,12 @@ qemuBuildCommandLine(virConnectPtr conn, } boot[def-os.nBootDevs] = '\0'; -virBufferAsprintf(boot_buf, %s, boot); -boot_nparams++; +virBufferAsprintf(boot_order, %s, boot); } +if (virBufferCheckError(boot_order) 0) +goto error; + ^^^ Since the only place to add items is inside the if (!emitBootindex), then this check can move inside the if statement. Probably could move the other boot_order stuff inside here too including setting the boot_order_str... You could then go back to just one boot_buf, but I see in patch 4 5 you rename boot_buf... this is fine, just was typing and thinking as usual... if (def-os.bootmenu) { if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_BOOT_MENU)) { if (boot_nparams++) ^^ This one cannot happen... Although I see in patch 5 it gets removed anyway... @@ -8829,23 +8833,25 @@ qemuBuildCommandLine(virConnectPtr conn, virBufferAddLit(boot_buf, strict=on); } -if (boot_nparams 0) { -virCommandAddArg(cmd, -boot); +if (virBufferCheckError(boot_buf) 0) +goto error; -if (virBufferCheckError(boot_buf) 0) -goto error; +boot_order_str = virBufferContentAndReset(boot_order); +boot_opts_str = virBufferContentAndReset(boot_buf); +if (boot_order_str || boot_opts_str) { +virCommandAddArg(cmd, -boot); -if (boot_nparams 2 || emitBootindex) { -virCommandAddArgBuffer(cmd, boot_buf); -virBufferFreeAndReset(boot_buf); -} else { -char *str = virBufferContentAndReset(boot_buf); -virCommandAddArgFormat(cmd, - order=%s, - str); -VIR_FREE(str); +if (boot_order_str boot_opts_str) { +virCommandAddArgFormat(cmd, order=%s,%s, + boot_order_str, boot_opts_str); +} else if (boot_order_str) { +virCommandAddArg(cmd, boot_order_str); +} else if (boot_opts_str) { +virCommandAddArg(cmd, boot_opts_str); } } +VIR_FREE(boot_order_str); +VIR_FREE(boot_opts_str); if (def-os.kernel) virCommandAddArgList(cmd, -kernel, def-os.kernel, NULL); @@ -10335,6 +10341,7 @@ qemuBuildCommandLine(virConnectPtr conn, return cmd; error: +virBufferFreeAndReset(boot_order); virBufferFreeAndReset(boot_buf); virObjectUnref(cfg); /* free up any resources in the network driver -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH 5/5] Use virBufferTrim when generating boot options
On 02/18/2015 11:39 AM, Ján Tomko wrote: Instead of tracking the number of added parameters, add a comma at the end of each one unconditionally and trim the trailing one at the end. --- src/qemu/qemu_command.c | 27 --- 1 file changed, 8 insertions(+), 19 deletions(-) ACK John -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH 4/5] Rename boot_buf to boot_opts
On 02/18/2015 11:39 AM, Ján Tomko wrote: --- src/qemu/qemu_command.c | 26 +- 1 file changed, 13 insertions(+), 13 deletions(-) ACK John -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v3] Add support for Midonet virtual ports
On 02/23/2015 03:54 PM, Antoni Segura Puimedon wrote: Up until now, to plug VMs into the Midonet virtual networks it was necessary to use the 'last resort' 'ethernet' type. That implied having the domain tainted and having to deal witht the tap lifecycle outside of libvirt/VM lifecycle. With the patches I submit, a new virtualport type will be accepted by libvirt that will always require an interfaceid (as it is essential for binding a tap device to a virtual port that the virtual port itself exists and has a UUID). With that interfaceid, libvirt will delegate the binding on the Midonet userspace tools. Antoni Segura Puimedon (1): Add support for the midonet virtualport type configure.ac | 4 ++ docs/schemas/networkcommon.rng | 12 + src/Makefile.am | 1 + src/conf/domain_conf.h | 1 + src/conf/netdev_vport_profile_conf.c | 3 +- src/libvirt_private.syms | 5 ++ src/qemu/qemu_hotplug.c | 25 +++--- src/qemu/qemu_process.c | 13 +++-- src/util/virnetdevmidonet.c | 97 src/util/virnetdevmidonet.h | 37 ++ src/util/virnetdevtap.c | 11 ++-- src/util/virnetdevvportprofile.c | 1 + src/util/virnetdevvportprofile.h | 5 +- 13 files changed, 197 insertions(+), 18 deletions(-) create mode 100644 src/util/virnetdevmidonet.c create mode 100644 src/util/virnetdevmidonet.h You really should resend this as a top level email rather than embedded as a reply to what was a single patch inside which there already is a v2. John -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list