[libvirt] [PATCH 3/3] util: virsysinfo: parse frequency information on S390

John Ferlan jferlan at redhat.com
Wed Jan 10 22:34:57 UTC 2018



On 01/09/2018 04:08 AM, Bjoern Walk wrote:
> John Ferlan <jferlan at redhat.com> [2018-01-08, 07:55AM -0500]:
>>
>>
>> On 01/08/2018 03:39 AM, Bjoern Walk wrote:
>>> John Ferlan <jferlan at redhat.com> [2018-01-04, 03:56PM -0500]:
>>>> On 12/19/2017 05:08 AM, Bjoern Walk wrote:
>>>>> diff --git a/src/util/virsysinfo.c b/src/util/virsysinfo.c
>>>>> index ab81b1f7..0c2267e3 100644
>>>>> --- a/src/util/virsysinfo.c
>>>>> +++ b/src/util/virsysinfo.c
>>>>> @@ -495,6 +495,7 @@ virSysinfoParseS390Processor(const char *base, virSysinfoDefPtr ret)
>>>>>      char *tmp_base;
>>>>>      char *manufacturer = NULL;
>>>>>      char *procline = NULL;
>>>>> +    char *ncpu = NULL;
>>>>>      int result = -1;
>>>>>      virSysinfoProcessorDefPtr processor;
>>>>>  
>>>>> @@ -524,11 +525,41 @@ virSysinfoParseS390Processor(const char *base, virSysinfoDefPtr ret)
>>>>>  
>>>>>          VIR_FREE(procline);
>>>>>      }
>>>>> +
>>>>> +    /* now, for each processor found, extract the frequency information */
>>>>> +    tmp_base = (char *) base;
>>>>> +
>>>>> +    while ((tmp_base = strstr(tmp_base, "cpu number")) &&
>>>>> +           (tmp_base = virSysinfoParseS390Line(tmp_base, "cpu number", &ncpu))) {
>>>>> +        unsigned int n;
>>>>> +        char *mhz = NULL;
>>>>> +
>>>>> +        if (virStrToLong_ui(ncpu, NULL, 10, &n) < 0 || n >= ret->nprocessor)
>>>>> +            goto cleanup;
>>>>
>>>> Should these be split?  Reason I ask is if n >= ret->nprocessor, then
>>>> going to cleanup results in returning a failure. That leads to an
>>>> eventual generic command failed for some reason. Of course that reason
>>>> shouldn't be possible, but since this is a CYA exercise, the check
>>>> should have a specific error message - similar to what one would get if
>>>> other calls failed...
>>>
>>> I don't quite follow. You want an explicit error message here if n >=
>>> ret->nprocessor? Right now, for this call sequence there is no error
>>> reporting at all. This just fills the respective driver->hostsysinfo
>>> struct and sets this to NULL in case of an error. Later on, when the
>>> hostsysinfo is used and not available, an error is generated.
>>>
>>
>> When I first read, I read it "out of context"... If the first call
>> fails, then you get an error, if the second call fails, then there is no
>> error so the first question that pops in my mind is - should we provide
>> an error message in that case?
> 
> In general, yes, we should provide some information about what's
> happening. But I found all this code to be somewhat unsatisfactory in
> this regard and wanted to avoid doing to many changes in this series.
> 
>> I would hope that n >= ret->nprocessor couldn't be true considering what
>> was recently read a few lines earlier and if the number was wrong here,
>> then the cpuinfo output would be AFU'd, right?  I don't have picture in
>> my mind of what's being processed, but didn't want to ignore this
>> possible condition.
>>
>> Since @result would be -1, then going to cleanup at this point would be
>> a failure. The question thus becomes should we ignore (and return 0)
>> when cpuinfo is bad and maybe toss out a VIR_DEBUG or should we error
>> out and throw everything away?
> 
> Alright, this sounds good. I agree that we should try to gather as much
> information as possible and don't discard everything when one part
> fails. But again, this whole file has somewhat different semantics.
> 

Cannot disagree with either point!

>> The one thing with waiting for some caller to determine hostsysinfo is
>> not available and an error generated is that we lose the reason why. I
>> defer to you to decide what the best course of action is.
>>
>>>>> +
>>>>> +        if (!(tmp_base = strstr(tmp_base, "cpu MHz dynamic")) ||
>>>>> +            !virSysinfoParseS390Line(tmp_base, "cpu MHz dynamic", &mhz) ||
>>>>> +            !mhz)
>>>>> +            goto cleanup;
> 
> Now, what about those? Should we also just log and return 0 here? CPU
> frequency information has only recently been introduced on S390 and
> running this on a kernel without support for it would now discard
> hostsysinfo entirely.
> 

Thinking partially in terms of something Andrea posted as a result of
something I commented on:

https://www.redhat.com/archives/libvir-list/2018-January/msg00240.html

Maybe we should take the approach of leaving it as zero if we cannot
find what we're looking for...

So the above changes to

    if ((tmp_base = strstr(tmp_base, "cpu MHz dynamic")) &&
        (virSysinfoParseS390Line(tmp_base..., &mhz))
        xxxx = mhz;

IOW: Update the value if both pass and do nothing if one or the other
fails.  If both pass then mhz won't be leaked because we'll save it.

BTW: Since Andrea has pushed and patches 1 & 2 were R-B'd, I've pushed
them.  So it'll just be this third patch with adjustments.

John




More information about the libvir-list mailing list