Skip to content

Commit e6239a4

Browse files
dwmw2bonzini
authored andcommitted
KVM: selftests: Add EVTCHNOP_send slow path test to xen_shinfo_test
When kvm_xen_evtchn_send() takes the slow path because the shinfo GPC needs to be revalidated, it used to violate the SRCU vs. kvm->lock locking rules and potentially cause a deadlock. Now that lockdep is learning to catch such things, make sure that code path is exercised by the selftest. Link: https://lore.kernel.org/all/[email protected] Signed-off-by: David Woodhouse <[email protected]> Signed-off-by: Sean Christopherson <[email protected]> Message-Id: <[email protected]> Signed-off-by: Paolo Bonzini <[email protected]>
1 parent e7062a9 commit e6239a4

File tree

1 file changed

+27
-0
lines changed

1 file changed

+27
-0
lines changed

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@
2626
#define DUMMY_REGION_GPA (SHINFO_REGION_GPA + (3 * PAGE_SIZE))
2727
#define DUMMY_REGION_SLOT 11
2828

29+
#define DUMMY_REGION_GPA_2 (SHINFO_REGION_GPA + (4 * PAGE_SIZE))
30+
#define DUMMY_REGION_SLOT_2 12
31+
2932
#define SHINFO_ADDR (SHINFO_REGION_GPA)
3033
#define VCPU_INFO_ADDR (SHINFO_REGION_GPA + 0x40)
3134
#define PVTIME_ADDR (SHINFO_REGION_GPA + PAGE_SIZE)
@@ -54,6 +57,7 @@ enum {
5457
TEST_EVTCHN_SLOWPATH,
5558
TEST_EVTCHN_SEND_IOCTL,
5659
TEST_EVTCHN_HCALL,
60+
TEST_EVTCHN_HCALL_SLOWPATH,
5761
TEST_EVTCHN_HCALL_EVENTFD,
5862
TEST_TIMER_SETUP,
5963
TEST_TIMER_WAIT,
@@ -260,6 +264,16 @@ static void guest_code(void)
260264

261265
guest_wait_for_irq();
262266

267+
GUEST_SYNC(TEST_EVTCHN_HCALL_SLOWPATH);
268+
269+
/*
270+
* Same again, but this time the host has messed with memslots so it
271+
* should take the slow path in kvm_xen_set_evtchn().
272+
*/
273+
xen_hypercall(__HYPERVISOR_event_channel_op, EVTCHNOP_send, &s);
274+
275+
guest_wait_for_irq();
276+
263277
GUEST_SYNC(TEST_EVTCHN_HCALL_EVENTFD);
264278

265279
/* Deliver "outbound" event channel to an eventfd which
@@ -753,6 +767,19 @@ int main(int argc, char *argv[])
753767
alarm(1);
754768
break;
755769

770+
case TEST_EVTCHN_HCALL_SLOWPATH:
771+
TEST_ASSERT(!evtchn_irq_expected,
772+
"Expected event channel IRQ but it didn't happen");
773+
shinfo->evtchn_pending[0] = 0;
774+
775+
if (verbose)
776+
printf("Testing guest EVTCHNOP_send direct to evtchn after memslot change\n");
777+
vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS,
778+
DUMMY_REGION_GPA_2, DUMMY_REGION_SLOT_2, 1, 0);
779+
evtchn_irq_expected = true;
780+
alarm(1);
781+
break;
782+
756783
case TEST_EVTCHN_HCALL_EVENTFD:
757784
TEST_ASSERT(!evtchn_irq_expected,
758785
"Expected event channel IRQ but it didn't happen");

0 commit comments

Comments
 (0)