On Mon, Apr 27, 2015 at 11:54:08 -0400, John Ferlan wrote:
On 04/27/2015 10:35 AM, Peter Krempa wrote:
> On Fri, Apr 24, 2015 at 12:06:00 -0400, John Ferlan wrote:
>> We're about to allow IOThreads to be deleted, but an iothreadid may be
>> included in some domain thread sched, so add a new API to allow removing
>> an iothread from some entry.
>>
>> Then during the writing of the threadsched data and an additional check
>> to determine whether the bitmap is all clear before writing it out.
>>
>> Signed-off-by: John Ferlan <jferlan(a)redhat.com>
>> ---
>> src/conf/domain_conf.c | 20 ++++++++++++++++++++
>> src/conf/domain_conf.h | 1 +
>> src/libvirt_private.syms | 1 +
>> 3 files changed, 22 insertions(+)
>>
>> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
>> index 9d4c916..5f99fbd 100644
>> --- a/src/conf/domain_conf.c
>> +++ b/src/conf/domain_conf.c
>> @@ -17455,6 +17455,24 @@ virDomainIOThreadIDDel(virDomainDefPtr def,
>> }
>> }
>>
>> +void
>> +virDomainIOThreadSchedDelId(virDomainDefPtr def,
>> + unsigned int iothreadid)
>> +{
>> + 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));
>> + return;
>> + }
>
> This function will need to remove the bitmap from the array once it's
> clear, as ...
>
hmm.. OK - I think the iothreadsched implementation was probably
incomplete... Different issue though
>> + }
>> +}
>> +
>> virDomainPinDefPtr
>> virDomainPinFind(virDomainPinDefPtr *def,
>> int npin,
>> @@ -20897,6 +20915,8 @@ virDomainDefFormatInternal(virDomainDefPtr def,
>> virDomainThreadSchedParamPtr sp =
&def->cputune.iothreadsched[i];
>> char *ids = NULL;
>>
>> + if (virBitmapIsAllClear(sp->ids))
>> + continue;
>
> ... this check isn't enough not to oputput empty <cputune> element if
> you removed the last iothread that would have any info that would
> trigger cputune to be formatted. The chance to have such situation is
> extremely slim, but possible.
>
>> if (!(ids = virBitmapFormat(sp->ids)))
>> goto error;
>> virBufferAsprintf(buf, "<iothreadsched iothreads='%s'
scheduler='%s'",
>
> Peter
>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 926a176..0b18720 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -17481,6 +17481,11 @@ virDomainIOThreadSchedDelId(virDomainDefPtr def,
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);
+ }
return;
}
}
@@ -20926,8 +20931,6 @@ virDomainDefFormatInternal(virDomainDefPtr def,
virDomainThreadSchedParamPtr sp = &def->cputune.iothreadsched[i];
char *ids = NULL;
- if (virBitmapIsAllClear(sp->ids))
- continue;
if (!(ids = virBitmapFormat(sp->ids)))
goto error;
virBufferAsprintf(buf, "<iothreadsched iothreads='%s'
scheduler='%s'",
ACK with the squash-in.