[libvirt] [PATCH 1/4] Implement public API for virDomainGetIOThreadsInfo

John Ferlan jferlan at redhat.com
Thu Feb 12 13:03:44 UTC 2015


Add virDomainGetIOThreadsInfo in order to returned a list of
virDomainIOThreadsInfoPtr structures which list the IOThread ID,
the thread_id, and the CPU Affinity map for each IOThread for
the active domain.

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

For inactive domains or where IOThreads is not supported return
an error and an empty structure

Signed-off-by: John Ferlan <jferlan at redhat.com>
---
 include/libvirt/libvirt-domain.h | 22 +++++++++++++-
 src/driver-hypervisor.h          |  8 ++++-
 src/libvirt-domain.c             | 63 +++++++++++++++++++++++++++++++++++++++-
 src/libvirt_public.syms          |  6 ++++
 4 files changed, 96 insertions(+), 3 deletions(-)

diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index 4dbd7f5..54f8de4 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -4,7 +4,7 @@
  * Description: Provides APIs for the management of domains
  * Author: Daniel Veillard <veillard at 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
@@ -1568,6 +1568,26 @@ int                     virDomainGetEmulatorPinInfo (virDomainPtr domain,
                                                      unsigned int flags);
 
 /**
+ * virIOThreadsInfo:
+ *
+ * The data structure for information about IOThreads in a domain
+ */
+typedef struct _virDomainIOThreadsInfo virDomainIOThreadsInfo;
+typedef virDomainIOThreadsInfo *virDomainIOThreadsInfoPtr;
+struct _virDomainIOThreadsInfo {
+    unsigned int iothread_id;         /* IOThread ID */
+    unsigned int thread_id;            /* Thread ID associated with IOThread */
+    unsigned char *cpumap;             /* CPU map for thread */
+    int cpumaplen;                     /* cpumap size */
+};
+
+void                 virDomainIOThreadsInfoFree(virDomainIOThreadsInfoPtr info);
+
+int                  virDomainGetIOThreadsInfo(virDomainPtr domain,
+                                               virDomainIOThreadsInfoPtr **info,
+                                               unsigned int flags);
+
+/**
  * VIR_USE_CPU:
  * @cpumap: pointer to a bit map of real CPUs (in 8-bit bytes) (IN/OUT)
  * @cpu: the physical CPU number
diff --git a/src/driver-hypervisor.h b/src/driver-hypervisor.h
index a1198ad..2ce1a51 100644
--- a/src/driver-hypervisor.h
+++ b/src/driver-hypervisor.h
@@ -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
@@ -381,6 +381,11 @@ typedef int
 (*virDrvDomainGetMaxVcpus)(virDomainPtr domain);
 
 typedef int
+(*virDrvDomainGetIOThreadsInfo)(virDomainPtr domain,
+                                virDomainIOThreadsInfoPtr **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;
diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
index 492e90a..6834d38 100644
--- a/src/libvirt-domain.c
+++ b/src/libvirt-domain.c
@@ -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
@@ -7891,6 +7891,67 @@ virDomainGetMaxVcpus(virDomainPtr domain)
 
 
 /**
+ * virDomainGetIOThreadsInfo:
+ * @dom: a domain object
+ * @info: pointer to an array of virDomainIOThreadsInfo structures (OUT)
+ * @flags: extra flags; not used yet, so callers should always pass 0
+ *
+ * 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,
+                          virDomainIOThreadsInfoPtr **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;
+
+    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 virDomainIOThreadsInfo object
+ *
+ * Frees the memory used by @info.
+ */
+void
+virDomainIOThreadsInfoFree(virDomainIOThreadsInfoPtr info)
+{
+    if (!info)
+        return;
+
+    VIR_FREE(info->cpumap);
+    VIR_FREE(info);
+}
+
+
+/**
  * virDomainGetSecurityLabel:
  * @domain: a domain object
  * @seclabel: pointer to a virSecurityLabel structure
diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
index 4ea5cff..d3ddd24 100644
--- a/src/libvirt_public.syms
+++ b/src/libvirt_public.syms
@@ -695,4 +695,10 @@ LIBVIRT_1.2.12 {
         virDomainDefineXMLFlags;
 } LIBVIRT_1.2.11;
 
+LIBVIRT_1.2.13 {
+    global:
+        virDomainIOThreadsInfoFree;
+        virDomainGetIOThreadsInfo;
+} LIBVIRT_1.2.12;
+
 # .... define new API here using predicted next version number ....
-- 
2.1.0




More information about the libvir-list mailing list