From: Tang Chen <tangchen(a)cn.fujitsu.com>
Introduce 2 APIs to support hypervisor threads pin.
1) virDomainHypervisorPinAdd: setup hypervisor threads pin with a given cpumap
string.
2) virDomainHypervisorPinDel: remove all hypervisor threads pin.
Signed-off-by: Tang Chen <tangchen(a)cn.fujitsu.com>
Signed-off-by: Hu Tao <hutao(a)cn.fujitsu.com>
---
src/conf/domain_conf.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++
src/conf/domain_conf.h | 6 ++++
src/libvirt_private.syms | 2 ++
3 files changed, 80 insertions(+)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index bedbf79..cec158d 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -10957,6 +10957,78 @@ virDomainVcpuPinDel(virDomainDefPtr def, int vcpu)
return 0;
}
+int
+virDomainHypervisorPinAdd(virDomainDefPtr def,
+ unsigned char *cpumap,
+ int maplen)
+{
+ virDomainVcpuPinDefPtr hypervisorpin = NULL;
+ char *cpumask = NULL;
+ int i;
+
+ if (VIR_ALLOC_N(cpumask, VIR_DOMAIN_CPUMASK_LEN) < 0) {
+ virReportOOMError();
+ goto cleanup;
+ }
+
+ /* Convert bitmap (cpumap) to cpumask, which is byte map. */
+ for (i = 0; i < maplen; i++) {
+ int cur;
+
+ for (cur = 0; cur < 8; cur++) {
+ if (cpumap[i] & (1 << cur))
+ cpumask[i * 8 + cur] = 1;
+ }
+ }
+
+ if (!def->cputune.hypervisorpin) {
+ /* No hypervisorpin exists yet. */
+ if (VIR_ALLOC(hypervisorpin) < 0) {
+ virReportOOMError();
+ goto cleanup;
+ }
+
+ hypervisorpin->vcpuid = -1;
+ hypervisorpin->cpumask = cpumask;
+ def->cputune.hypervisorpin = hypervisorpin;
+ } else {
+ /* Since there is only 1 hypervisorpin for each vm,
+ * juest replace the old one.
+ */
+ VIR_FREE(def->cputune.hypervisorpin->cpumask);
+ def->cputune.hypervisorpin->cpumask = cpumask;
+ }
+
+ return 0;
+
+cleanup:
+ if (cpumask)
+ VIR_FREE(cpumask);
+ return -1;
+}
+
+int
+virDomainHypervisorPinDel(virDomainDefPtr def)
+{
+ virDomainVcpuPinDefPtr hypervisorpin = NULL;
+
+ /* No hypervisorpin exists yet */
+ if (!def->cputune.hypervisorpin) {
+ return 0;
+ }
+
+ hypervisorpin = def->cputune.hypervisorpin;
+
+ VIR_FREE(hypervisorpin->cpumask);
+ VIR_FREE(hypervisorpin);
+ def->cputune.hypervisorpin = NULL;
+
+ if (def->cputune.hypervisorpin)
+ return -1;
+
+ return 0;
+}
+
static int
virDomainLifecycleDefFormat(virBufferPtr buf,
int type,
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 11f0eb0..64096d5 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1985,6 +1985,12 @@ int virDomainVcpuPinAdd(virDomainDefPtr def,
int virDomainVcpuPinDel(virDomainDefPtr def, int vcpu);
+int virDomainHypervisorPinAdd(virDomainDefPtr def,
+ unsigned char *cpumap,
+ int maplen);
+
+int virDomainHypervisorPinDel(virDomainDefPtr def);
+
int virDomainDiskIndexByName(virDomainDefPtr def, const char *name,
bool allow_ambiguous);
const char *virDomainDiskPathByName(virDomainDefPtr, const char *name);
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 867c2e7..a57486a 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -491,6 +491,8 @@ virDomainTimerTrackTypeFromString;
virDomainTimerTrackTypeToString;
virDomainVcpuPinAdd;
virDomainVcpuPinDel;
+virDomainHypervisorPinAdd;
+virDomainHypervisorPinDel;
virDomainVcpuPinFindByVcpu;
virDomainVcpuPinIsDuplicate;
virDomainVideoDefFree;
--
1.7.10.2