Skip to content

Commit b2f3171

Browse files
committed
Merge tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm
Pull kvm fixes from Paolo Bonzini: "ARM64: - Pass the correct address to mte_clear_page_tags() on initialising a tagged page - Plug a race against a GICv4.1 doorbell interrupt while saving the vgic-v3 pending state. x86: - A command line parsing fix and a clang compilation fix for selftests - A fix for a longstanding VMX issue, that surprisingly was only found now to affect real world guests" * tag 'for-linus' of git://git.kernel.org/pub/scm/virt/kvm/kvm: KVM: selftests: Make reclaim_period_ms input always be positive KVM: x86/vmx: Do not skip segment attributes if unusable bit is set selftests: kvm: move declaration at the beginning of main() KVM: arm64: GICv4.1: Fix race with doorbell on VPE activation/deactivation KVM: arm64: Pass the actual page address to mte_clear_page_tags()
2 parents 02db81a + c2c46b1 commit b2f3171

File tree

7 files changed

+32
-34
lines changed

7 files changed

+32
-34
lines changed

arch/arm64/kvm/guest.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1079,7 +1079,7 @@ long kvm_vm_ioctl_mte_copy_tags(struct kvm *kvm,
10791079

10801080
/* uaccess failed, don't leave stale tags */
10811081
if (num_tags != MTE_GRANULES_PER_PAGE)
1082-
mte_clear_page_tags(page);
1082+
mte_clear_page_tags(maddr);
10831083
set_page_mte_tagged(page);
10841084

10851085
kvm_release_pfn_dirty(pfn);

arch/arm64/kvm/vgic/vgic-v3.c

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -350,26 +350,23 @@ int vgic_v3_lpi_sync_pending_status(struct kvm *kvm, struct vgic_irq *irq)
350350
* The deactivation of the doorbell interrupt will trigger the
351351
* unmapping of the associated vPE.
352352
*/
353-
static void unmap_all_vpes(struct vgic_dist *dist)
353+
static void unmap_all_vpes(struct kvm *kvm)
354354
{
355-
struct irq_desc *desc;
355+
struct vgic_dist *dist = &kvm->arch.vgic;
356356
int i;
357357

358-
for (i = 0; i < dist->its_vm.nr_vpes; i++) {
359-
desc = irq_to_desc(dist->its_vm.vpes[i]->irq);
360-
irq_domain_deactivate_irq(irq_desc_get_irq_data(desc));
361-
}
358+
for (i = 0; i < dist->its_vm.nr_vpes; i++)
359+
free_irq(dist->its_vm.vpes[i]->irq, kvm_get_vcpu(kvm, i));
362360
}
363361

364-
static void map_all_vpes(struct vgic_dist *dist)
362+
static void map_all_vpes(struct kvm *kvm)
365363
{
366-
struct irq_desc *desc;
364+
struct vgic_dist *dist = &kvm->arch.vgic;
367365
int i;
368366

369-
for (i = 0; i < dist->its_vm.nr_vpes; i++) {
370-
desc = irq_to_desc(dist->its_vm.vpes[i]->irq);
371-
irq_domain_activate_irq(irq_desc_get_irq_data(desc), false);
372-
}
367+
for (i = 0; i < dist->its_vm.nr_vpes; i++)
368+
WARN_ON(vgic_v4_request_vpe_irq(kvm_get_vcpu(kvm, i),
369+
dist->its_vm.vpes[i]->irq));
373370
}
374371

375372
/**
@@ -394,7 +391,7 @@ int vgic_v3_save_pending_tables(struct kvm *kvm)
394391
* and enabling of the doorbells have already been done.
395392
*/
396393
if (kvm_vgic_global_state.has_gicv4_1) {
397-
unmap_all_vpes(dist);
394+
unmap_all_vpes(kvm);
398395
vlpi_avail = true;
399396
}
400397

@@ -444,7 +441,7 @@ int vgic_v3_save_pending_tables(struct kvm *kvm)
444441

445442
out:
446443
if (vlpi_avail)
447-
map_all_vpes(dist);
444+
map_all_vpes(kvm);
448445

449446
return ret;
450447
}

arch/arm64/kvm/vgic/vgic-v4.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,11 @@ void vgic_v4_get_vlpi_state(struct vgic_irq *irq, bool *val)
222222
*val = !!(*ptr & mask);
223223
}
224224

225+
int vgic_v4_request_vpe_irq(struct kvm_vcpu *vcpu, int irq)
226+
{
227+
return request_irq(irq, vgic_v4_doorbell_handler, 0, "vcpu", vcpu);
228+
}
229+
225230
/**
226231
* vgic_v4_init - Initialize the GICv4 data structures
227232
* @kvm: Pointer to the VM being initialized
@@ -283,8 +288,7 @@ int vgic_v4_init(struct kvm *kvm)
283288
irq_flags &= ~IRQ_NOAUTOEN;
284289
irq_set_status_flags(irq, irq_flags);
285290

286-
ret = request_irq(irq, vgic_v4_doorbell_handler,
287-
0, "vcpu", vcpu);
291+
ret = vgic_v4_request_vpe_irq(vcpu, irq);
288292
if (ret) {
289293
kvm_err("failed to allocate vcpu IRQ%d\n", irq);
290294
/*

arch/arm64/kvm/vgic/vgic.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,5 +331,6 @@ int vgic_v4_init(struct kvm *kvm);
331331
void vgic_v4_teardown(struct kvm *kvm);
332332
void vgic_v4_configure_vsgis(struct kvm *kvm);
333333
void vgic_v4_get_vlpi_state(struct vgic_irq *irq, bool *val);
334+
int vgic_v4_request_vpe_irq(struct kvm_vcpu *vcpu, int irq);
334335

335336
#endif

arch/x86/kvm/vmx/vmx.c

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3440,18 +3440,15 @@ static u32 vmx_segment_access_rights(struct kvm_segment *var)
34403440
{
34413441
u32 ar;
34423442

3443-
if (var->unusable || !var->present)
3444-
ar = 1 << 16;
3445-
else {
3446-
ar = var->type & 15;
3447-
ar |= (var->s & 1) << 4;
3448-
ar |= (var->dpl & 3) << 5;
3449-
ar |= (var->present & 1) << 7;
3450-
ar |= (var->avl & 1) << 12;
3451-
ar |= (var->l & 1) << 13;
3452-
ar |= (var->db & 1) << 14;
3453-
ar |= (var->g & 1) << 15;
3454-
}
3443+
ar = var->type & 15;
3444+
ar |= (var->s & 1) << 4;
3445+
ar |= (var->dpl & 3) << 5;
3446+
ar |= (var->present & 1) << 7;
3447+
ar |= (var->avl & 1) << 12;
3448+
ar |= (var->l & 1) << 13;
3449+
ar |= (var->db & 1) << 14;
3450+
ar |= (var->g & 1) << 15;
3451+
ar |= (var->unusable || !var->present) << 16;
34553452

34563453
return ar;
34573454
}

tools/testing/selftests/kvm/x86_64/nx_huge_pages_test.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ int main(int argc, char **argv)
241241
while ((opt = getopt(argc, argv, "hp:t:r")) != -1) {
242242
switch (opt) {
243243
case 'p':
244-
reclaim_period_ms = atoi_non_negative("Reclaim period", optarg);
244+
reclaim_period_ms = atoi_positive("Reclaim period", optarg);
245245
break;
246246
case 't':
247247
token = atoi_paranoid(optarg);

tools/testing/selftests/kvm/x86_64/xen_shinfo_test.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,7 @@ static void *juggle_shinfo_state(void *arg)
434434
int main(int argc, char *argv[])
435435
{
436436
struct timespec min_ts, max_ts, vm_ts;
437+
struct kvm_xen_hvm_attr evt_reset;
437438
struct kvm_vm *vm;
438439
pthread_t thread;
439440
bool verbose;
@@ -962,10 +963,8 @@ int main(int argc, char *argv[])
962963
}
963964

964965
done:
965-
struct kvm_xen_hvm_attr evt_reset = {
966-
.type = KVM_XEN_ATTR_TYPE_EVTCHN,
967-
.u.evtchn.flags = KVM_XEN_EVTCHN_RESET,
968-
};
966+
evt_reset.type = KVM_XEN_ATTR_TYPE_EVTCHN;
967+
evt_reset.u.evtchn.flags = KVM_XEN_EVTCHN_RESET;
969968
vm_ioctl(vm, KVM_XEN_HVM_SET_ATTR, &evt_reset);
970969

971970
alarm(0);

0 commit comments

Comments
 (0)