History

Merge tag 'kvm-x86-generic-7.0-rc3' of https://github.com/kvm-x86/linux into HEAD

KVM generic changes for 7.0 - Remove a subtle pseudo-overlay of kvm_stats_desc, which, aside from being unnecessary and confusing, triggered compiler warnings due to -Wflex-array-member-not-at-end. - Document that vcpu->mutex is take outside of kvm->slots_lock and kvm->slots_arch_lock, which is intentional and desirable despite being rather unintuitive.

Paolo Bonzini committed 8 months ago

Commit 94fe3e62 parents 40c2ffc f8211e915 files · +72 −75Browse files

Unified · Split

15 files
  1. Documentation/virt/kvm/locking.rst +2 −0
  2. arch/arm64/kvm/guest.c +2 −2
  3. arch/loongarch/kvm/vcpu.c +1 −1
  4. arch/loongarch/kvm/vm.c +1 −1
  5. arch/mips/kvm/mips.c +2 −2
  6. arch/powerpc/kvm/book3s.c +2 −2
  7. arch/powerpc/kvm/booke.c +2 −2
  8. arch/riscv/kvm/vcpu.c +1 −1
  9. arch/riscv/kvm/vm.c +1 −1
  10. arch/s390/kvm/kvm-s390.c +2 −2
  11. arch/x86/kvm/x86.c +2 −2
  12. include/linux/kvm_host.h +35 −48
  13. include/uapi/linux/kvm.h +8 −0
  14. virt/kvm/binary_stats.c +1 −1
  15. virt/kvm/kvm_main.c +10 −10
Documentation/virt/kvm/locking.rst+2−0
@@ -17,6 +17,8 @@ The acquisition orders for mutexes are as follows: · 16 unmodified lines
1717
1818 - kvm->lock is taken outside kvm->slots_lock and kvm->irq_lock
1919
20+- vcpu->mutex is taken outside kvm->slots_lock and kvm->slots_arch_lock
21+
2022 - kvm->slots_lock is taken outside kvm->irq_lock, though acquiring
2123 them together is quite rare.
2224
arch/arm64/kvm/guest.c+2−2
@@ -29,7 +29,7 @@ · 28 unmodified lines
2929
3030 #include "trace.h"
3131
32−const struct _kvm_stats_desc kvm_vm_stats_desc[] = {
32+const struct kvm_stats_desc kvm_vm_stats_desc[] = {
3333 KVM_GENERIC_VM_STATS()
3434 };
3535
@@ -42,7 +42,7 @@ const struct kvm_stats_header kvm_vm_stats_header = { · 6 unmodified lines
4242 sizeof(kvm_vm_stats_desc),
4343 };
4444
45−const struct _kvm_stats_desc kvm_vcpu_stats_desc[] = {
45+const struct kvm_stats_desc kvm_vcpu_stats_desc[] = {
4646 KVM_GENERIC_VCPU_STATS(),
4747 STATS_DESC_COUNTER(VCPU, hvc_exit_stat),
4848 STATS_DESC_COUNTER(VCPU, wfe_exit_stat),
arch/loongarch/kvm/vcpu.c+1−1
@@ -14,7 +14,7 @@ · 13 unmodified lines
1414 #define CREATE_TRACE_POINTS
1515 #include "trace.h"
1616
17−const struct _kvm_stats_desc kvm_vcpu_stats_desc[] = {
17+const struct kvm_stats_desc kvm_vcpu_stats_desc[] = {
1818 KVM_GENERIC_VCPU_STATS(),
1919 STATS_DESC_COUNTER(VCPU, int_exits),
2020 STATS_DESC_COUNTER(VCPU, idle_exits),
arch/loongarch/kvm/vm.c+1−1
@@ -10,7 +10,7 @@ · 9 unmodified lines
1010 #include <asm/kvm_eiointc.h>
1111 #include <asm/kvm_pch_pic.h>
1212
13−const struct _kvm_stats_desc kvm_vm_stats_desc[] = {
13+const struct kvm_stats_desc kvm_vm_stats_desc[] = {
1414 KVM_GENERIC_VM_STATS(),
1515 STATS_DESC_ICOUNTER(VM, pages),
1616 STATS_DESC_ICOUNTER(VM, hugepages),
arch/mips/kvm/mips.c+2−2
@@ -38,7 +38,7 @@ · 37 unmodified lines
3838 #define VECTORSPACING 0x100 /* for EI/VI mode */
3939 #endif
4040
41−const struct _kvm_stats_desc kvm_vm_stats_desc[] = {
41+const struct kvm_stats_desc kvm_vm_stats_desc[] = {
4242 KVM_GENERIC_VM_STATS()
4343 };
4444
@@ -51,7 +51,7 @@ const struct kvm_stats_header kvm_vm_stats_header = { · 6 unmodified lines
5151 sizeof(kvm_vm_stats_desc),
5252 };
5353
54−const struct _kvm_stats_desc kvm_vcpu_stats_desc[] = {
54+const struct kvm_stats_desc kvm_vcpu_stats_desc[] = {
5555 KVM_GENERIC_VCPU_STATS(),
5656 STATS_DESC_COUNTER(VCPU, wait_exits),
5757 STATS_DESC_COUNTER(VCPU, cache_exits),
arch/powerpc/kvm/book3s.c+2−2
@@ -38,7 +38,7 @@ · 37 unmodified lines
3838
3939 /* #define EXIT_DEBUG */
4040
41−const struct _kvm_stats_desc kvm_vm_stats_desc[] = {
41+const struct kvm_stats_desc kvm_vm_stats_desc[] = {
4242 KVM_GENERIC_VM_STATS(),
4343 STATS_DESC_ICOUNTER(VM, num_2M_pages),
4444 STATS_DESC_ICOUNTER(VM, num_1G_pages)
@@ -53,7 +53,7 @@ const struct kvm_stats_header kvm_vm_stats_header = { · 8 unmodified lines
5353 sizeof(kvm_vm_stats_desc),
5454 };
5555
56−const struct _kvm_stats_desc kvm_vcpu_stats_desc[] = {
56+const struct kvm_stats_desc kvm_vcpu_stats_desc[] = {
5757 KVM_GENERIC_VCPU_STATS(),
5858 STATS_DESC_COUNTER(VCPU, sum_exits),
5959 STATS_DESC_COUNTER(VCPU, mmio_exits),
arch/powerpc/kvm/booke.c+2−2
@@ -36,7 +36,7 @@ · 35 unmodified lines
3636
3737 unsigned long kvmppc_booke_handlers;
3838
39−const struct _kvm_stats_desc kvm_vm_stats_desc[] = {
39+const struct kvm_stats_desc kvm_vm_stats_desc[] = {
4040 KVM_GENERIC_VM_STATS(),
4141 STATS_DESC_ICOUNTER(VM, num_2M_pages),
4242 STATS_DESC_ICOUNTER(VM, num_1G_pages)
@@ -51,7 +51,7 @@ const struct kvm_stats_header kvm_vm_stats_header = { · 8 unmodified lines
5151 sizeof(kvm_vm_stats_desc),
5252 };
5353
54−const struct _kvm_stats_desc kvm_vcpu_stats_desc[] = {
54+const struct kvm_stats_desc kvm_vcpu_stats_desc[] = {
5555 KVM_GENERIC_VCPU_STATS(),
5656 STATS_DESC_COUNTER(VCPU, sum_exits),
5757 STATS_DESC_COUNTER(VCPU, mmio_exits),
arch/riscv/kvm/vcpu.c+1−1
@@ -24,7 +24,7 @@ · 23 unmodified lines
2424 #define CREATE_TRACE_POINTS
2525 #include "trace.h"
2626
27−const struct _kvm_stats_desc kvm_vcpu_stats_desc[] = {
27+const struct kvm_stats_desc kvm_vcpu_stats_desc[] = {
2828 KVM_GENERIC_VCPU_STATS(),
2929 STATS_DESC_COUNTER(VCPU, ecall_exit_stat),
3030 STATS_DESC_COUNTER(VCPU, wfi_exit_stat),
arch/riscv/kvm/vm.c+1−1
@@ -13,7 +13,7 @@ · 12 unmodified lines
1313 #include <linux/kvm_host.h>
1414 #include <asm/kvm_mmu.h>
1515
16−const struct _kvm_stats_desc kvm_vm_stats_desc[] = {
16+const struct kvm_stats_desc kvm_vm_stats_desc[] = {
1717 KVM_GENERIC_VM_STATS()
1818 };
1919 static_assert(ARRAY_SIZE(kvm_vm_stats_desc) ==
arch/s390/kvm/kvm-s390.c+2−2
@@ -65,7 +65,7 @@ · 64 unmodified lines
6565 #define VCPU_IRQS_MAX_BUF (sizeof(struct kvm_s390_irq) * \
6666 (KVM_MAX_VCPUS + LOCAL_IRQS))
6767
68−const struct _kvm_stats_desc kvm_vm_stats_desc[] = {
68+const struct kvm_stats_desc kvm_vm_stats_desc[] = {
6969 KVM_GENERIC_VM_STATS(),
7070 STATS_DESC_COUNTER(VM, inject_io),
7171 STATS_DESC_COUNTER(VM, inject_float_mchk),
@@ -91,7 +91,7 @@ const struct kvm_stats_header kvm_vm_stats_header = { · 19 unmodified lines
9191 sizeof(kvm_vm_stats_desc),
9292 };
9393
94−const struct _kvm_stats_desc kvm_vcpu_stats_desc[] = {
94+const struct kvm_stats_desc kvm_vcpu_stats_desc[] = {
9595 KVM_GENERIC_VCPU_STATS(),
9696 STATS_DESC_COUNTER(VCPU, exit_userspace),
9797 STATS_DESC_COUNTER(VCPU, exit_null),
arch/x86/kvm/x86.c+2−2
@@ -243,7 +243,7 @@ EXPORT_SYMBOL_FOR_KVM_INTERNAL(enable_ipiv); · 242 unmodified lines
243243 bool __read_mostly enable_device_posted_irqs = true;
244244 EXPORT_SYMBOL_FOR_KVM_INTERNAL(enable_device_posted_irqs);
245245
246−const struct _kvm_stats_desc kvm_vm_stats_desc[] = {
246+const struct kvm_stats_desc kvm_vm_stats_desc[] = {
247247 KVM_GENERIC_VM_STATS(),
248248 STATS_DESC_COUNTER(VM, mmu_shadow_zapped),
249249 STATS_DESC_COUNTER(VM, mmu_pte_write),
@@ -269,7 +269,7 @@ const struct kvm_stats_header kvm_vm_stats_header = { · 19 unmodified lines
269269 sizeof(kvm_vm_stats_desc),
270270 };
271271
272−const struct _kvm_stats_desc kvm_vcpu_stats_desc[] = {
272+const struct kvm_stats_desc kvm_vcpu_stats_desc[] = {
273273 KVM_GENERIC_VCPU_STATS(),
274274 STATS_DESC_COUNTER(VCPU, pf_taken),
275275 STATS_DESC_COUNTER(VCPU, pf_fixed),
include/linux/kvm_host.h+35−48
@@ -1940,56 +1940,43 @@ enum kvm_stat_kind { · 1939 unmodified lines
19401940
19411941 struct kvm_stat_data {
19421942 struct kvm *kvm;
1943− const struct _kvm_stats_desc *desc;
1943+ const struct kvm_stats_desc *desc;
19441944 enum kvm_stat_kind kind;
19451945 };
19461946
1947−struct _kvm_stats_desc {
1948− struct kvm_stats_desc desc;
1949− char name[KVM_STATS_NAME_SIZE];
1950−};
1951−
1952−#define STATS_DESC_COMMON(type, unit, base, exp, sz, bsz) \
1953− .flags = type | unit | base | \
1954− BUILD_BUG_ON_ZERO(type & ~KVM_STATS_TYPE_MASK) | \
1955− BUILD_BUG_ON_ZERO(unit & ~KVM_STATS_UNIT_MASK) | \
1956− BUILD_BUG_ON_ZERO(base & ~KVM_STATS_BASE_MASK), \
1957− .exponent = exp, \
1958− .size = sz, \
1947+#define STATS_DESC_COMMON(type, unit, base, exp, sz, bsz) \
1948+ .flags = type | unit | base | \
1949+ BUILD_BUG_ON_ZERO(type & ~KVM_STATS_TYPE_MASK) | \
1950+ BUILD_BUG_ON_ZERO(unit & ~KVM_STATS_UNIT_MASK) | \
1951+ BUILD_BUG_ON_ZERO(base & ~KVM_STATS_BASE_MASK), \
1952+ .exponent = exp, \
1953+ .size = sz, \
19591954 .bucket_size = bsz
19601955
1961−#define VM_GENERIC_STATS_DESC(stat, type, unit, base, exp, sz, bsz) \
1962− { \
1963− { \
1964− STATS_DESC_COMMON(type, unit, base, exp, sz, bsz), \
1965− .offset = offsetof(struct kvm_vm_stat, generic.stat) \
1966− }, \
1967− .name = #stat, \
1968− }
1969−#define VCPU_GENERIC_STATS_DESC(stat, type, unit, base, exp, sz, bsz) \
1970− { \
1971− { \
1972− STATS_DESC_COMMON(type, unit, base, exp, sz, bsz), \
1973− .offset = offsetof(struct kvm_vcpu_stat, generic.stat) \
1974− }, \
1975− .name = #stat, \
1976− }
1977−#define VM_STATS_DESC(stat, type, unit, base, exp, sz, bsz) \
1978− { \
1979− { \
1980− STATS_DESC_COMMON(type, unit, base, exp, sz, bsz), \
1981− .offset = offsetof(struct kvm_vm_stat, stat) \
1982− }, \
1983− .name = #stat, \
1984− }
1985−#define VCPU_STATS_DESC(stat, type, unit, base, exp, sz, bsz) \
1986− { \
1987− { \
1988− STATS_DESC_COMMON(type, unit, base, exp, sz, bsz), \
1989− .offset = offsetof(struct kvm_vcpu_stat, stat) \
1990− }, \
1991− .name = #stat, \
1992− }
1956+#define VM_GENERIC_STATS_DESC(stat, type, unit, base, exp, sz, bsz) \
1957+{ \
1958+ STATS_DESC_COMMON(type, unit, base, exp, sz, bsz), \
1959+ .offset = offsetof(struct kvm_vm_stat, generic.stat), \
1960+ .name = #stat, \
1961+}
1962+#define VCPU_GENERIC_STATS_DESC(stat, type, unit, base, exp, sz, bsz) \
1963+{ \
1964+ STATS_DESC_COMMON(type, unit, base, exp, sz, bsz), \
1965+ .offset = offsetof(struct kvm_vcpu_stat, generic.stat), \
1966+ .name = #stat, \
1967+}
1968+#define VM_STATS_DESC(stat, type, unit, base, exp, sz, bsz) \
1969+{ \
1970+ STATS_DESC_COMMON(type, unit, base, exp, sz, bsz), \
1971+ .offset = offsetof(struct kvm_vm_stat, stat), \
1972+ .name = #stat, \
1973+}
1974+#define VCPU_STATS_DESC(stat, type, unit, base, exp, sz, bsz) \
1975+{ \
1976+ STATS_DESC_COMMON(type, unit, base, exp, sz, bsz), \
1977+ .offset = offsetof(struct kvm_vcpu_stat, stat), \
1978+ .name = #stat, \
1979+}
19931980 /* SCOPE: VM, VM_GENERIC, VCPU, VCPU_GENERIC */
19941981 #define STATS_DESC(SCOPE, stat, type, unit, base, exp, sz, bsz) \
19951982 SCOPE##_STATS_DESC(stat, type, unit, base, exp, sz, bsz)
@@ -2066,7 +2053,7 @@ struct _kvm_stats_desc { · 70 unmodified lines
20662053 STATS_DESC_IBOOLEAN(VCPU_GENERIC, blocking)
20672054
20682055 ssize_t kvm_stats_read(char *id, const struct kvm_stats_header *header,
2069− const struct _kvm_stats_desc *desc,
2056+ const struct kvm_stats_desc *desc,
20702057 void *stats, size_t size_stats,
20712058 char __user *user_buffer, size_t size, loff_t *offset);
20722059
@@ -2111,9 +2098,9 @@ static inline void kvm_stats_log_hist_update(u64 *data, size_t size, u64 value) · 38 unmodified lines
21112098
21122099
21132100 extern const struct kvm_stats_header kvm_vm_stats_header;
2114−extern const struct _kvm_stats_desc kvm_vm_stats_desc[];
2101+extern const struct kvm_stats_desc kvm_vm_stats_desc[];
21152102 extern const struct kvm_stats_header kvm_vcpu_stats_header;
2116−extern const struct _kvm_stats_desc kvm_vcpu_stats_desc[];
2103+extern const struct kvm_stats_desc kvm_vcpu_stats_desc[];
21172104
21182105 static inline int mmu_invalidate_retry(struct kvm *kvm, unsigned long mmu_seq)
21192106 {
include/uapi/linux/kvm.h+8−0
@@ -14,6 +14,10 @@ · 13 unmodified lines
1414 #include <linux/ioctl.h>
1515 #include <asm/kvm.h>
1616
17+#ifdef __KERNEL__
18+#include <linux/kvm_types.h>
19+#endif
20+
1721 #define KVM_API_VERSION 12
1822
1923 /*
@@ -1601,7 +1605,11 @@ struct kvm_stats_desc { · 1581 unmodified lines
16011605 __u16 size;
16021606 __u32 offset;
16031607 __u32 bucket_size;
1608+#ifdef __KERNEL__
1609+ char name[KVM_STATS_NAME_SIZE];
1610+#else
16041611 char name[];
1612+#endif
16051613 };
16061614
16071615 #define KVM_GET_STATS_FD _IO(KVMIO, 0xce)
virt/kvm/binary_stats.c+1−1
@@ -50,7 +50,7 @@ · 49 unmodified lines
5050 * Return: the number of bytes that has been successfully read
5151 */
5252 ssize_t kvm_stats_read(char *id, const struct kvm_stats_header *header,
53− const struct _kvm_stats_desc *desc,
53+ const struct kvm_stats_desc *desc,
5454 void *stats, size_t size_stats,
5555 char __user *user_buffer, size_t size, loff_t *offset)
5656 {
virt/kvm/kvm_main.c+10−10
@@ -973,9 +973,9 @@ static void kvm_free_memslots(struct kvm *kvm, struct kvm_memslots *slots) · 972 unmodified lines
973973 kvm_free_memslot(kvm, memslot);
974974 }
975975
976−static umode_t kvm_stats_debugfs_mode(const struct _kvm_stats_desc *pdesc)
976+static umode_t kvm_stats_debugfs_mode(const struct kvm_stats_desc *desc)
977977 {
978− switch (pdesc->desc.flags & KVM_STATS_TYPE_MASK) {
978+ switch (desc->flags & KVM_STATS_TYPE_MASK) {
979979 case KVM_STATS_TYPE_INSTANT:
980980 return 0444;
981981 case KVM_STATS_TYPE_CUMULATIVE:
@@ -1010,7 +1010,7 @@ static int kvm_create_vm_debugfs(struct kvm *kvm, const char *fdname) · 28 unmodified lines
10101010 struct dentry *dent;
10111011 char dir_name[ITOA_MAX_LEN * 2];
10121012 struct kvm_stat_data *stat_data;
1013− const struct _kvm_stats_desc *pdesc;
1013+ const struct kvm_stats_desc *pdesc;
10141014 int i, ret = -ENOMEM;
10151015 int kvm_debugfs_num_entries = kvm_vm_stats_header.num_desc +
10161016 kvm_vcpu_stats_header.num_desc;
@@ -6171,11 +6171,11 @@ static int kvm_stat_data_get(void *data, u64 *val) · 5154 unmodified lines
61716171 switch (stat_data->kind) {
61726172 case KVM_STAT_VM:
61736173 r = kvm_get_stat_per_vm(stat_data->kvm,
6174− stat_data->desc->desc.offset, val);
6174+ stat_data->desc->offset, val);
61756175 break;
61766176 case KVM_STAT_VCPU:
61776177 r = kvm_get_stat_per_vcpu(stat_data->kvm,
6178− stat_data->desc->desc.offset, val);
6178+ stat_data->desc->offset, val);
61796179 break;
61806180 }
61816181
@@ -6193,11 +6193,11 @@ static int kvm_stat_data_clear(void *data, u64 val) · 11 unmodified lines
61936193 switch (stat_data->kind) {
61946194 case KVM_STAT_VM:
61956195 r = kvm_clear_stat_per_vm(stat_data->kvm,
6196− stat_data->desc->desc.offset);
6196+ stat_data->desc->offset);
61976197 break;
61986198 case KVM_STAT_VCPU:
61996199 r = kvm_clear_stat_per_vcpu(stat_data->kvm,
6200− stat_data->desc->desc.offset);
6200+ stat_data->desc->offset);
62016201 break;
62026202 }
62036203
@@ -6345,7 +6345,7 @@ static void kvm_uevent_notify_change(unsigned int type, struct kvm *kvm) · 141 unmodified lines
63456345 static void kvm_init_debug(void)
63466346 {
63476347 const struct file_operations *fops;
6348− const struct _kvm_stats_desc *pdesc;
6348+ const struct kvm_stats_desc *pdesc;
63496349 int i;
63506350
63516351 kvm_debugfs_dir = debugfs_create_dir("kvm", NULL);
@@ -6358,7 +6358,7 @@ static void kvm_init_debug(void) · 6 unmodified lines
63586358 fops = &vm_stat_readonly_fops;
63596359 debugfs_create_file(pdesc->name, kvm_stats_debugfs_mode(pdesc),
63606360 kvm_debugfs_dir,
6361− (void *)(long)pdesc->desc.offset, fops);
6361+ (void *)(long)pdesc->offset, fops);
63626362 }
63636363
63646364 for (i = 0; i < kvm_vcpu_stats_header.num_desc; ++i) {
@@ -6369,7 +6369,7 @@ static void kvm_init_debug(void) · 4 unmodified lines
63696369 fops = &vcpu_stat_readonly_fops;
63706370 debugfs_create_file(pdesc->name, kvm_stats_debugfs_mode(pdesc),
63716371 kvm_debugfs_dir,
6372− (void *)(long)pdesc->desc.offset, fops);
6372+ (void *)(long)pdesc->offset, fops);
63736373 }
63746374 }
63756375