[PATCH] virhostcpu: Fix build with clang and newest kernel headers

Daniel P. Berrangé berrange at redhat.com
Tue Aug 23 14:42:38 UTC 2022


On Tue, Aug 23, 2022 at 04:15:54PM +0200, Peter Krempa wrote:
> The most recent environment e.g. present in our Fedora Rawhide builds
> fail to build the tree with clang with the following error:
> 
> ../src/util/virhostcpu.c:1291:25: error: field 'header' with variable sized type 'struct kvm_msrs' not at the end of a struct or class is a GNU extension [-Werror,-Wgnu-variable-sized-type-not-at-end]
>         struct kvm_msrs header;
>                         ^
> 
> The problem seems to be that clang doesn't like the new way the
> 'entries' field in struct kvm_msrs is declared.
> 
> To work around the issue we can simply allocate the variable dynamically
> and use the 'entries' member as it was intended to to access the
> members.

We explicitly only support GCC and CLang, and intentionally rely on
many GNU extensions to C. CLang is trying to be helpful to people
who need fully portable C code, but we don't care about that. So
why not just turn off the warning by adding

  -Wno-gnu-variable-sized-style-not-at-end

better than making our code less understandable IMHO

> 
> Signed-off-by: Peter Krempa <pkrempa at redhat.com>
> ---
>  src/util/virhostcpu.c | 15 ++++++---------
>  1 file changed, 6 insertions(+), 9 deletions(-)
> 
> diff --git a/src/util/virhostcpu.c b/src/util/virhostcpu.c
> index 54d0166b85..c1e8dc8078 100644
> --- a/src/util/virhostcpu.c
> +++ b/src/util/virhostcpu.c
> @@ -1287,25 +1287,22 @@ virHostCPUGetMSRFromKVM(unsigned long index,
>                          uint64_t *result)
>  {
>      VIR_AUTOCLOSE fd = -1;
> -    struct {
> -        struct kvm_msrs header;
> -        struct kvm_msr_entry entry;
> -    } msr = {
> -        .header = { .nmsrs = 1 },
> -        .entry = { .index = index },
> -    };
> +    g_autofree struct kvm_msrs *msr = g_malloc0(sizeof(struct kvm_msrs) +
> +                                                sizeof(struct kvm_msr_entry));
> +    msr->nmsrs = 1;
> +    msr->entries[0].index = index;
> 
>      if ((fd = open(KVM_DEVICE, O_RDONLY)) < 0) {
>          virReportSystemError(errno, _("Unable to open %s"), KVM_DEVICE);
>          return -1;
>      }
> 
> -    if (ioctl(fd, KVM_GET_MSRS, &msr) < 0) {
> +    if (ioctl(fd, KVM_GET_MSRS, msr) < 0) {
>          VIR_DEBUG("Cannot get MSR 0x%lx from KVM", index);
>          return 1;
>      }
> 
> -    *result = msr.entry.data;
> +    *result = msr->entries[0].data;
>      return 0;
>  }
> 
> -- 
> 2.37.1
> 

With regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|


More information about the libvir-list mailing list