On Tue, Mar 29, 2016 at 18:09:44 +0200, Andrea Bolognani wrote: > Instead of relying on substring search, tokenize the input > and process each CPU flag separately. This ensures CPU flag > detection will continue to work correctly even if we start > looking for CPU flags whose name might appear as part of > other CPU flags' names. > > The result of processing is stored in a virBitmap, which > means we don't have to parse /proc/cpuinfo in its entirety > for each single CPU flag we want to check. > > Moreover, use of the newly-introduced virHostValidateCPUFlag > enumeration ensures we don't go looking for random CPU flags > which might actually be simple typos. > --- > The concern was raised by John in > > https://www.redhat.com/archives/libvir-list/2016-March/msg01301.html > > when discussing a new check on the "sie" CPU flag. > > tools/virt-host-validate-common.c | 50 +++++++++++++++++++++++++++++---------- > tools/virt-host-validate-common.h | 13 +++++++++- > tools/virt-host-validate-qemu.c | 12 ++++++++-- > 3 files changed, 60 insertions(+), 15 deletions(-) > > diff --git a/tools/virt-host-validate-common.c b/tools/virt-host-validate-common.c > index 8ebf73e..57fa332 100644 > --- a/tools/virt-host-validate-common.c > +++ b/tools/virt-host-validate-common.c [...] > @@ -188,29 +191,47 @@ int virHostValidateNamespace(const char *hvname, > } > > > -bool virHostValidateHasCPUFlag(const char *name) > +virBitmapPtr virHostValidateGetCPUFlags(void) > { > - FILE *fp = fopen("/proc/cpuinfo", "r"); > - bool ret = false; > + FILE *fp; > + virBitmapPtr flags; > > - if (!fp) > - return false; > + if (!(fp = fopen("/proc/cpuinfo", "r"))) > + return NULL; > + > + if (!(flags = virBitmapNewQuiet(VIR_HOST_VALIDATE_CPU_FLAG_LAST))) Since you are already using libvirt's utils ... > + return NULL; > > do { > char line[1024]; > + char *saveptr; > + char *token; > > if (!fgets(line, sizeof(line), fp)) > break; > > - if (strstr(line, name)) { > - ret = true; > - break; > + if (!(token = strtok_r(line, " \t\n", &saveptr))) Why not virStringSplit ... > + continue; > + > + /* The line we're interested in is marked either as "flags" or > + * as "Features" depending on the architecture, so check both > + * prefixes. It's very unlikely that there will be no whitespace > + * between the line name and the colon, but handle that as well */ > + if (strcmp(token, "flags") && strcmp(token, "flags:") && And STREQ? Peter
Attachment:
signature.asc
Description: Digital signature
-- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list