nvcpupin was declared as int, as were the nvcpupin args in several
functions. These were all changed to size_t.
virDomainVcpuPinAdd() was leaking a cpumask if VIR_REALLOC_N
failed. This is completely inconsequential (since the only reason for
failure was OOM, so we would already be dead at this time anyway), but
I fixed the omission just to be tidy.
---
src/conf/domain_conf.c | 47 ++++++++++++++---------------------------------
src/conf/domain_conf.h | 12 ++++++------
src/qemu/qemu_cgroup.c | 2 +-
src/qemu/qemu_cgroup.h | 2 +-
src/qemu/qemu_driver.c | 4 ++--
5 files changed, 24 insertions(+), 43 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index acb6cb7..dda37fd 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -1556,7 +1556,7 @@ virDomainClockDefClear(virDomainClockDefPtr def)
}
virDomainVcpuPinDefPtr *
-virDomainVcpuPinDefCopy(virDomainVcpuPinDefPtr *src, int nvcpupin)
+virDomainVcpuPinDefCopy(virDomainVcpuPinDefPtr *src, size_t nvcpupin)
{
int i = 0;
virDomainVcpuPinDefPtr *ret = NULL;
@@ -1601,9 +1601,9 @@ virDomainVcpuPinDefFree(virDomainVcpuPinDefPtr def)
void
virDomainVcpuPinDefArrayFree(virDomainVcpuPinDefPtr *def,
- int nvcpupin)
+ size_t nvcpupin)
{
- int i;
+ size_t i;
if (!def || !nvcpupin)
return;
@@ -11565,7 +11565,7 @@ int virDomainDefAddImplicitControllers(virDomainDefPtr def)
* Return 1 if exists, 0 if not. */
int
virDomainVcpuPinIsDuplicate(virDomainVcpuPinDefPtr *def,
- int nvcpupin,
+ size_t nvcpupin,
int vcpu)
{
int i;
@@ -11583,7 +11583,7 @@ virDomainVcpuPinIsDuplicate(virDomainVcpuPinDefPtr *def,
virDomainVcpuPinDefPtr
virDomainVcpuPinFindByVcpu(virDomainVcpuPinDefPtr *def,
- int nvcpupin,
+ size_t nvcpupin,
int vcpu)
{
int i;
@@ -11600,7 +11600,7 @@ virDomainVcpuPinFindByVcpu(virDomainVcpuPinDefPtr *def,
}
int virDomainVcpuPinAdd(virDomainVcpuPinDefPtr **vcpupin_list,
- int *nvcpupin,
+ size_t *nvcpupin,
unsigned char *cpumap,
int maplen,
int vcpu)
@@ -11638,14 +11638,13 @@ int virDomainVcpuPinAdd(virDomainVcpuPinDefPtr **vcpupin_list,
return -1;
}
- if (VIR_REALLOC_N(*vcpupin_list, *nvcpupin + 1) < 0) {
+ if (VIR_APPEND_ELEMENTS_N(*vcpupin_list, *nvcpupin, 1, &vcpupin) < 0) {
virReportOOMError();
+ VIR_FREE(vcpupin->cpumask);
VIR_FREE(vcpupin);
return -1;
}
- (*vcpupin_list)[(*nvcpupin)++] = vcpupin;
-
return 0;
}
@@ -11653,38 +11652,20 @@ int
virDomainVcpuPinDel(virDomainDefPtr def, int vcpu)
{
int n;
- bool deleted = false;
- virDomainVcpuPinDefPtr *vcpupin_list = def->cputune.vcpupin;
/* No vcpupin exists yet */
- if (!def->cputune.nvcpupin) {
+ if (!def->cputune.nvcpupin)
return 0;
- }
for (n = 0; n < def->cputune.nvcpupin; n++) {
- if (vcpupin_list[n]->vcpuid == vcpu) {
- VIR_FREE(vcpupin_list[n]->cpumask);
- VIR_FREE(vcpupin_list[n]);
- memmove(&vcpupin_list[n],
- &vcpupin_list[n+1],
- (def->cputune.nvcpupin - n - 1) * sizeof(virDomainVcpuPinDef *));
- deleted = true;
+ if (def->cputune.vcpupin[n]->vcpuid == vcpu) {
+ VIR_FREE(def->cputune.vcpupin[n]->cpumask);
+ VIR_FREE(def->cputune.vcpupin[n]);
+ ignore_value(VIR_DELETE_ELEMENTS_N(def->cputune.vcpupin, n,
+ def->cputune.nvcpupin, 1));
break;
}
}
-
- if (!deleted)
- return 0;
-
- if (--def->cputune.nvcpupin == 0) {
- VIR_FREE(def->cputune.vcpupin);
- } else {
- if (VIR_REALLOC_N(def->cputune.vcpupin, def->cputune.nvcpupin) < 0) {
- virReportOOMError();
- return -1;
- }
- }
-
return 0;
}
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index c6f6e68..2f341be 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1624,17 +1624,17 @@ struct _virDomainVcpuPinDef {
};
void virDomainVcpuPinDefFree(virDomainVcpuPinDefPtr def);
-void virDomainVcpuPinDefArrayFree(virDomainVcpuPinDefPtr *def, int nvcpupin);
+void virDomainVcpuPinDefArrayFree(virDomainVcpuPinDefPtr *def, size_t nvcpupin);
virDomainVcpuPinDefPtr *virDomainVcpuPinDefCopy(virDomainVcpuPinDefPtr *src,
- int nvcpupin);
+ size_t nvcpupin);
int virDomainVcpuPinIsDuplicate(virDomainVcpuPinDefPtr *def,
- int nvcpupin,
+ size_t nvcpupin,
int vcpu);
virDomainVcpuPinDefPtr virDomainVcpuPinFindByVcpu(virDomainVcpuPinDefPtr *def,
- int nvcpupin,
+ size_t nvcpupin,
int vcpu);
typedef struct _virDomainNumatuneDef virDomainNumatuneDef;
@@ -1704,7 +1704,7 @@ struct _virDomainDef {
long long quota;
unsigned long long emulator_period;
long long emulator_quota;
- int nvcpupin;
+ size_t nvcpupin;
virDomainVcpuPinDefPtr *vcpupin;
virDomainVcpuPinDefPtr emulatorpin;
} cputune;
@@ -1994,7 +1994,7 @@ int virDomainDefCompatibleDevice(virDomainDefPtr def,
virDomainDeviceDefPtr dev);
int virDomainVcpuPinAdd(virDomainVcpuPinDefPtr **vcpupin_list,
- int *nvcpupin,
+ size_t *nvcpupin,
unsigned char *cpumap,
int maplen,
int vcpu);
diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
index db371a0..48c68db 100644
--- a/src/qemu/qemu_cgroup.c
+++ b/src/qemu/qemu_cgroup.c
@@ -490,7 +490,7 @@ cleanup:
int qemuSetupCgroupVcpuPin(virCgroupPtr cgroup,
virDomainVcpuPinDefPtr *vcpupin,
- int nvcpupin,
+ size_t nvcpupin,
int vcpuid)
{
int i;
diff --git a/src/qemu/qemu_cgroup.h b/src/qemu/qemu_cgroup.h
index c552162..4819df5 100644
--- a/src/qemu/qemu_cgroup.h
+++ b/src/qemu/qemu_cgroup.h
@@ -53,7 +53,7 @@ int qemuSetupCgroupVcpuBW(virCgroupPtr cgroup,
long long quota);
int qemuSetupCgroupVcpuPin(virCgroupPtr cgroup,
virDomainVcpuPinDefPtr *vcpupin,
- int nvcpupin,
+ size_t nvcpupin,
int vcpuid);
int qemuSetupCgroupEmulatorPin(virCgroupPtr cgroup, virBitmapPtr cpumask);
int qemuSetupCgroupForVcpu(struct qemud_driver *driver, virDomainObjPtr vm);
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index feda4d9..c0d360a 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -3910,7 +3910,7 @@ qemudDomainPinVcpuFlags(virDomainPtr dom,
int ret = -1;
qemuDomainObjPrivatePtr priv;
bool doReset = false;
- int newVcpuPinNum = 0;
+ size_t newVcpuPinNum = 0;
virDomainVcpuPinDefPtr *newVcpuPin = NULL;
virBitmapPtr pcpumap = NULL;
@@ -4184,7 +4184,7 @@ qemudDomainPinEmulator(virDomainPtr dom,
int ret = -1;
qemuDomainObjPrivatePtr priv;
bool doReset = false;
- int newVcpuPinNum = 0;
+ size_t newVcpuPinNum = 0;
virDomainVcpuPinDefPtr *newVcpuPin = NULL;
virBitmapPtr pcpumap = NULL;
--
1.7.11.7