]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Implement public API for virDomainGetIOThreadsInfo
authorJohn Ferlan <jferlan@redhat.com>
Mon, 9 Feb 2015 21:16:55 +0000 (16:16 -0500)
committerJohn Ferlan <jferlan@redhat.com>
Fri, 6 Mar 2015 11:49:32 +0000 (06:49 -0500)
Add virDomainGetIOThreadInfo in order to return a list of
virDomainIOThreadInfoPtr structures which list the IOThread ID
and the CPU Affinity map for each IOThread for the domain.

For an active domain, the live data will be returned, while for
an inactive domain, the config data will be returned.

The API supports either the --live or --config flag, but not both.

Also added virDomainIOThreadsInfoFree in order to free the cpumap
and the IOThreadInfo structure.

Signed-off-by: John Ferlan <jferlan@redhat.com>
include/libvirt/libvirt-domain.h
src/driver-hypervisor.h
src/libvirt-domain.c
src/libvirt_public.syms

index a9d3efdd6a85c616b747e2bed842daea0a0d5933..9487b80f4c94b06d3d74ac8e1dede7af05c2e0fa 100644 (file)
@@ -4,7 +4,7 @@
  * Description: Provides APIs for the management of domains
  * Author: Daniel Veillard <veillard@redhat.com>
  *
- * Copyright (C) 2006-2014 Red Hat, Inc.
+ * Copyright (C) 2006-2015 Red Hat, Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -1590,6 +1590,26 @@ int                     virDomainGetEmulatorPinInfo (virDomainPtr domain,
                                                      int maplen,
                                                      unsigned int flags);
 
+/**
+ * virIOThreadInfo:
+ *
+ * The data structure for information about all IOThreads in a domain
+ */
+typedef struct _virDomainIOThreadInfo virDomainIOThreadInfo;
+typedef virDomainIOThreadInfo *virDomainIOThreadInfoPtr;
+struct _virDomainIOThreadInfo {
+    unsigned int iothread_id;          /* IOThread ID */
+    unsigned char *cpumap;             /* CPU map for thread. A pointer to an */
+                                       /* array of real CPUs (in 8-bit bytes) */
+    int cpumaplen;                     /* cpumap size */
+};
+
+void                 virDomainIOThreadsInfoFree(virDomainIOThreadInfoPtr info);
+
+int                  virDomainGetIOThreadsInfo(virDomainPtr domain,
+                                               virDomainIOThreadInfoPtr **info,
+                                               unsigned int flags);
+
 /**
  * VIR_USE_CPU:
  * @cpumap: pointer to a bit map of real CPUs (in 8-bit bytes) (IN/OUT)
index a1198adeecd9d22130407670ca1ffc20c53b2882..c2b4cd8d6f2f418691a72cc0b58bf88c90f6393b 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * driver-hypervisor.h: entry points for hypervisor drivers
  *
- * Copyright (C) 2006-2014 Red Hat, Inc.
+ * Copyright (C) 2006-2015 Red Hat, Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -380,6 +380,11 @@ typedef int
 typedef int
 (*virDrvDomainGetMaxVcpus)(virDomainPtr domain);
 
+typedef int
+(*virDrvDomainGetIOThreadsInfo)(virDomainPtr domain,
+                                virDomainIOThreadInfoPtr **info,
+                                unsigned int flags);
+
 typedef int
 (*virDrvDomainGetSecurityLabel)(virDomainPtr domain,
                                 virSecurityLabelPtr seclabel);
@@ -1254,6 +1259,7 @@ struct _virHypervisorDriver {
     virDrvDomainGetEmulatorPinInfo domainGetEmulatorPinInfo;
     virDrvDomainGetVcpus domainGetVcpus;
     virDrvDomainGetMaxVcpus domainGetMaxVcpus;
+    virDrvDomainGetIOThreadsInfo domainGetIOThreadsInfo;
     virDrvDomainGetSecurityLabel domainGetSecurityLabel;
     virDrvDomainGetSecurityLabelList domainGetSecurityLabelList;
     virDrvNodeGetSecurityModel nodeGetSecurityModel;
index 83453978df9aa5aabac347e1fdcea1c6dd9a37e1..c43c8f6d46261551d6e73340e73fa5df0a0e43aa 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * libvirt-domain.c: entry points for virDomainPtr APIs
  *
- * Copyright (C) 2006-2014 Red Hat, Inc.
+ * Copyright (C) 2006-2015 Red Hat, Inc.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -7893,6 +7893,79 @@ virDomainGetMaxVcpus(virDomainPtr domain)
 }
 
 
+/**
+ * virDomainGetIOThreadsInfo:
+ * @dom: a domain object
+ * @info: pointer to an array of virDomainIOThreadInfo structures (OUT)
+ * @flags: bitwise-OR of virDomainModificationImpact
+ *     Must not be VIR_DOMAIN_AFFECT_LIVE and
+ *     VIR_DOMAIN_AFFECT_CONFIG concurrently.
+ *
+ * Fetch IOThreads of an active domain including the cpumap information to
+ * determine on which CPU the IOThread has affinity to run.
+ *
+ * Returns the number of IOThreads or -1 in case of error.
+ * On success, the array of information is stored into @info. The caller is
+ * responsible for calling virDomainIOThreadsInfoFree() on each array element,
+ * then calling free() on @info. On error, @info is set to NULL.
+ */
+int
+virDomainGetIOThreadsInfo(virDomainPtr dom,
+                          virDomainIOThreadInfoPtr **info,
+                          unsigned int flags)
+{
+    VIR_DOMAIN_DEBUG(dom, "info=%p flags=%x", info, flags);
+
+    virResetLastError();
+
+    virCheckDomainReturn(dom, -1);
+    virCheckReadOnlyGoto(dom->conn->flags, error);
+    virCheckNonNullArgGoto(info, error);
+    *info = NULL;
+
+    /* At most one of these two flags should be set.  */
+    if ((flags & VIR_DOMAIN_AFFECT_LIVE) &&
+        (flags & VIR_DOMAIN_AFFECT_CONFIG)) {
+        virReportInvalidArg(flags,
+                            _("flags 'affect live' and 'affect config' in %s "
+                              "are mutually exclusive"),
+                            __FUNCTION__);
+        goto error;
+    }
+
+    if (dom->conn->driver->domainGetIOThreadsInfo) {
+        int ret;
+        ret = dom->conn->driver->domainGetIOThreadsInfo(dom, info, flags);
+        if (ret < 0)
+            goto error;
+        return ret;
+    }
+
+    virReportUnsupportedError();
+
+ error:
+    virDispatchError(dom->conn);
+    return -1;
+}
+
+
+/**
+ * virDomainIOThreadsInfoFree:
+ * @info: pointer to a virDomainIOThreadInfo object
+ *
+ * Frees the memory used by @info.
+ */
+void
+virDomainIOThreadsInfoFree(virDomainIOThreadInfoPtr info)
+{
+    if (!info)
+        return;
+
+    VIR_FREE(info->cpumap);
+    VIR_FREE(info);
+}
+
+
 /**
  * virDomainGetSecurityLabel:
  * @domain: a domain object
index 4ea5cff6558b43aff3c0ad7a2f2be8b35591a8d7..34852c1d5be79827fe03ef39da5c10e255148a12 100644 (file)
@@ -695,4 +695,10 @@ LIBVIRT_1.2.12 {
         virDomainDefineXMLFlags;
 } LIBVIRT_1.2.11;
 
+LIBVIRT_1.2.14 {
+    global:
+        virDomainIOThreadsInfoFree;
+        virDomainGetIOThreadsInfo;
+} LIBVIRT_1.2.12;
+
 # .... define new API here using predicted next version number ....