[libvirt] [PATCH] qemu: Get memory balloon info correctly for text monitor

Osier Yang jyang at redhat.com
Tue Aug 16 03:28:43 UTC 2011


于 2011年08月16日 00:40, Adam Litke 写道:
> Hi Osier,
>
> Just to be clear, this is a cleanup not a bugfix right?  The current
> code should be working properly as written.

No, "virDomainMemoryStats" will return empty result if libvirt
communicates to qemu monitor in text mode. Actually this
is reported by a upstream Debian user, It seems to me packager
of Debian compiles libvirt without QMP support.

> On 08/15/2011 08:58 AM, Osier Yang wrote:
>> * src/qemu/qemu_monitor_text.c: BALLOON_PREFIX was defined as
>> "balloon: actual=", which cause "actual=" is stripped early before
>> the real parsing. This patch changes BALLOON_PREFIX into "balloon: ",
>> and modifies related functions, also renames
>> "qemuMonitorParseExtraBalloonInfo" to "qemuMonitorParseBalloonInfo",
>> as after the changing, it parses all the info returned by "info balloon".
>> ---
>>   src/qemu/qemu_monitor_text.c |   47 +++++++++++++++++++++++++----------------
>>   1 files changed, 29 insertions(+), 18 deletions(-)
>>
>> diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c
>> index 7bf733d..d17d863 100644
>> --- a/src/qemu/qemu_monitor_text.c
>> +++ b/src/qemu/qemu_monitor_text.c
>> @@ -547,8 +547,12 @@ static int parseMemoryStat(char **text, unsigned int tag,
>>               return 0;
>>           }
>>
>> -        /* Convert bytes to kilobytes for libvirt */
>>           switch (tag) {
>> +            /* Convert megabytes to kilobytes for libvirt */
>> +            case VIR_DOMAIN_MEMORY_STAT_ACTUAL_BALLOON:
>> +                value = value<<  10;
>> +                break;
>> +            /* Convert bytes to kilobytes for libvirt */
>>               case VIR_DOMAIN_MEMORY_STAT_SWAP_IN:
>>               case VIR_DOMAIN_MEMORY_STAT_SWAP_OUT:
>>               case VIR_DOMAIN_MEMORY_STAT_UNUSED:
>> @@ -565,15 +569,17 @@ static int parseMemoryStat(char **text, unsigned int tag,
>>   /* The reply from the 'info balloon' command may contain additional memory
>>    * statistics in the form: '[,<tag>=<val>]*'
>>    */
>> -static int qemuMonitorParseExtraBalloonInfo(char *text,
>> -                                            virDomainMemoryStatPtr stats,
>> -                                            unsigned int nr_stats)
>> +static int qemuMonitorParseBalloonInfo(char *text,
>> +                                       virDomainMemoryStatPtr stats,
>> +                                       unsigned int nr_stats)
>>   {
>>       char *p = text;
>>       unsigned int nr_stats_found = 0;
>>
>>       while (*p&&  nr_stats_found<  nr_stats) {
>> -        if (parseMemoryStat(&p, VIR_DOMAIN_MEMORY_STAT_SWAP_IN,
>> +        if (parseMemoryStat(&p, VIR_DOMAIN_MEMORY_STAT_ACTUAL_BALLOON,
>> +                            "actual=",&stats[nr_stats_found]) ||
>> +            parseMemoryStat(&p, VIR_DOMAIN_MEMORY_STAT_SWAP_IN,
>>                               ",mem_swapped_in=",&stats[nr_stats_found]) ||
>>               parseMemoryStat(&p, VIR_DOMAIN_MEMORY_STAT_SWAP_OUT,
>>                               ",mem_swapped_out=",&stats[nr_stats_found]) ||
> According to this code (and actual monitor behavior) 'actual' always
> appears and has to come first.  Therefore, I would still parse the
> 'actual' stat outside of the while loop.
>
>> @@ -584,9 +590,7 @@ static int qemuMonitorParseExtraBalloonInfo(char *text,
>>               parseMemoryStat(&p, VIR_DOMAIN_MEMORY_STAT_UNUSED,
>>                               ",free_mem=",&stats[nr_stats_found]) ||
>>               parseMemoryStat(&p, VIR_DOMAIN_MEMORY_STAT_AVAILABLE,
>> -                            ",total_mem=",&stats[nr_stats_found]) ||
>> -            parseMemoryStat(&p, VIR_DOMAIN_MEMORY_STAT_ACTUAL_BALLOON,
>> -                            ",actual=",&stats[nr_stats_found]))
>> +                            ",total_mem=",&stats[nr_stats_found]))
>>               nr_stats_found++;
>>
>>           /* Skip to the next label.  When *p is ',' the last match attempt
>> @@ -602,7 +606,7 @@ static int qemuMonitorParseExtraBalloonInfo(char *text,
>>
>>
>>   /* The reply from QEMU contains 'ballon: actual=421' where value is in MB */
>> -#define BALLOON_PREFIX "balloon: actual="
>> +#define BALLOON_PREFIX "balloon: "
>>
>>   /*
>>    * Returns: 0 if balloon not supported, +1 if balloon query worked
>> @@ -625,13 +629,22 @@ int qemuMonitorTextGetBalloonInfo(qemuMonitorPtr mon,
>>           unsigned int memMB;
>>           char *end;
>>           offset += strlen(BALLOON_PREFIX);
>> -        if (virStrToLong_ui(offset,&end, 10,&memMB)<  0) {
>> -            qemuReportError(VIR_ERR_OPERATION_FAILED,
>> -                            _("could not parse memory balloon allocation from '%s'"), reply);
>> -            goto cleanup;
>> +
>> +        if (STRPREFIX(offset, "actual=")) {
>> +            offset += strlen("actual=");
>> +
>> +            if (virStrToLong_ui(offset,&end, 10,&memMB)<  0) {
>> +                qemuReportError(VIR_ERR_OPERATION_FAILED,
>> +                                _("could not parse memory balloon allocation from '%s'"), reply);
>> +                goto cleanup;
>> +            }
>> +            *currmem = memMB * 1024;
>> +            ret = 1;
>> +        } else {
>> +            qemuReportError(VIR_ERR_INTERNAL_ERROR,
>> +                            _("unexpected balloon information '%s'"), reply);
>> +            ret = -1;
>>           }
>> -        *currmem = memMB * 1024;
>> -        ret = 1;
>>       } else {
>>           /* We don't raise an error here, since its to be expected that
>>            * many QEMU's don't support ballooning
> Why not just use qemuMonitorParseBalloonInfo() for the logic above?  You
> only need to request one stat since actual must be first.

Not sure if I get your meaning correctly.

If parsing "actual" in qemuMonitorParseBalloonInfo, then yes, agree
using qemuMonitorParseballoonInfo here is more simpler.

But it looks to me you object to parse "actual=" in 
qemuMonitorParseBalloonInfo. :)

I want to explain more about this, all the purpose of this patch
is to prevent "actual=" being stripped before the parsing. And it's
fix a problem, not cleanup.

Osier




More information about the libvir-list mailing list