https://bugzilla.redhat.com/show_bug.cgi?id=1235180
We have API allow vpu to be deleted, but an vcpu may be
included in some domain vcpu sched, so add a new API to
allow removing an iothread from some entry.
Split the virDomainIOThreadSchedDelId to reuse some code.
Signed-off-by: Luyao Huang <lhuang(a)redhat.com>
---
src/conf/domain_conf.c | 48 ++++++++++++++++++++++++++++++++++--------------
src/conf/domain_conf.h | 1 +
src/libvirt_private.syms | 1 +
src/qemu/qemu_driver.c | 6 ++++--
4 files changed, 40 insertions(+), 16 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 183e66c..7a464a6 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -17996,29 +17996,49 @@ virDomainIOThreadIDDel(virDomainDefPtr def,
}
}
-void
-virDomainIOThreadSchedDelId(virDomainDefPtr def,
- unsigned int iothreadid)
+static void
+virDomainThreadSchedDelId(virDomainThreadSchedParamPtr *threadsched,
+ size_t *nthreadsched,
+ unsigned int id)
{
size_t i;
- if (!def->cputune.iothreadsched || !def->cputune.niothreadsched)
- return;
-
- for (i = 0; i < def->cputune.niothreadsched; i++) {
- if (virBitmapIsBitSet(def->cputune.iothreadsched[i].ids, iothreadid)) {
- ignore_value(virBitmapClearBit(def->cputune.iothreadsched[i].ids,
- iothreadid));
- if (virBitmapIsAllClear(def->cputune.iothreadsched[i].ids)) {
- virBitmapFree(def->cputune.iothreadsched[i].ids);
- VIR_DELETE_ELEMENT(def->cputune.iothreadsched, i,
- def->cputune.niothreadsched);
+ for (i = 0; i < *nthreadsched; i++) {
+ if (virBitmapIsBitSet((*threadsched)[i].ids, id)) {
+ ignore_value(virBitmapClearBit((*threadsched)[i].ids, id));
+ if (virBitmapIsAllClear((*threadsched)[i].ids)) {
+ virBitmapFree((*threadsched)[i].ids);
+ VIR_DELETE_ELEMENT((*threadsched), i, *nthreadsched);
}
return;
}
}
}
+void
+virDomainIOThreadSchedDelId(virDomainDefPtr def,
+ unsigned int iothreadid)
+{
+ if (!def->cputune.iothreadsched || !def->cputune.niothreadsched)
+ return;
+
+ virDomainThreadSchedDelId(&def->cputune.iothreadsched,
+ &def->cputune.niothreadsched,
+ iothreadid);
+}
+
+void
+virDomainVcpuSchedDelId(virDomainDefPtr def,
+ unsigned int vcpuid)
+{
+ if (!def->cputune.vcpusched || !def->cputune.nvcpusched)
+ return;
+
+ virDomainThreadSchedDelId(&def->cputune.vcpusched,
+ &def->cputune.nvcpusched,
+ vcpuid);
+}
+
virDomainPinDefPtr
virDomainPinFind(virDomainPinDefPtr *def,
int npin,
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index c96a6e4..a74dbc9 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -2662,6 +2662,7 @@ virDomainIOThreadIDDefPtr virDomainIOThreadIDAdd(virDomainDefPtr
def,
unsigned int iothread_id);
void virDomainIOThreadIDDel(virDomainDefPtr def, unsigned int iothread_id);
void virDomainIOThreadSchedDelId(virDomainDefPtr def, unsigned int iothread_id);
+void virDomainVcpuSchedDelId(virDomainDefPtr def, unsigned int vcpuid);
unsigned int virDomainDefFormatConvertXMLFlags(unsigned int flags);
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 1566d11..169d641 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -479,6 +479,7 @@ virDomainTPMBackendTypeToString;
virDomainTPMDefFree;
virDomainTPMModelTypeFromString;
virDomainTPMModelTypeToString;
+virDomainVcpuSchedDelId;
virDomainVideoDefaultRAM;
virDomainVideoDefaultType;
virDomainVideoDefFree;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index c1373de..245443c 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -4966,12 +4966,14 @@ qemuDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
}
if (persistentDef) {
- /* remove vcpupin entries for vcpus that were unplugged */
+ /* remove vcpupin and vcpusched entries for vcpus that were unplugged */
if (nvcpus < persistentDef->vcpus) {
- for (i = persistentDef->vcpus - 1; i >= nvcpus; i--)
+ for (i = persistentDef->vcpus - 1; i >= nvcpus; i--) {
virDomainPinDel(&persistentDef->cputune.vcpupin,
&persistentDef->cputune.nvcpupin,
i);
+ virDomainVcpuSchedDelId(persistentDef, i);
+ }
}
if (flags & VIR_DOMAIN_VCPU_MAXIMUM) {
--
1.8.3.1