virhostcpu: Fix build with clang and newest kernel headers

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.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
This commit is contained in:
Peter Krempa 2022-08-23 15:29:43 +02:00
parent 3c2d06d78e
commit 56b3ee7439
1 changed files with 6 additions and 9 deletions

View File

@ -1287,25 +1287,22 @@ virHostCPUGetMSRFromKVM(unsigned long index,
uint64_t *result) uint64_t *result)
{ {
VIR_AUTOCLOSE fd = -1; VIR_AUTOCLOSE fd = -1;
struct { g_autofree struct kvm_msrs *msr = g_malloc0(sizeof(struct kvm_msrs) +
struct kvm_msrs header; sizeof(struct kvm_msr_entry));
struct kvm_msr_entry entry; msr->nmsrs = 1;
} msr = { msr->entries[0].index = index;
.header = { .nmsrs = 1 },
.entry = { .index = index },
};
if ((fd = open(KVM_DEVICE, O_RDONLY)) < 0) { if ((fd = open(KVM_DEVICE, O_RDONLY)) < 0) {
virReportSystemError(errno, _("Unable to open %s"), KVM_DEVICE); virReportSystemError(errno, _("Unable to open %s"), KVM_DEVICE);
return -1; 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); VIR_DEBUG("Cannot get MSR 0x%lx from KVM", index);
return 1; return 1;
} }
*result = msr.entry.data; *result = msr->entries[0].data;
return 0; return 0;
} }