mirror of
https://github.com/torvalds/linux.git
synced 2026-05-26 08:02:27 +02:00
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/20230113124606.10221-2-dwmw2@infradead.org Signed-off-by: David Woodhouse <dwmw@amazon.co.uk> Signed-off-by: Sean Christopherson <seanjc@google.com> Message-Id: <20230204024151.1373296-5-seanjc@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
e7062a98d0
commit
e6239a4ec5
|
|
@ -26,6 +26,9 @@
|
|||
#define DUMMY_REGION_GPA (SHINFO_REGION_GPA + (3 * PAGE_SIZE))
|
||||
#define DUMMY_REGION_SLOT 11
|
||||
|
||||
#define DUMMY_REGION_GPA_2 (SHINFO_REGION_GPA + (4 * PAGE_SIZE))
|
||||
#define DUMMY_REGION_SLOT_2 12
|
||||
|
||||
#define SHINFO_ADDR (SHINFO_REGION_GPA)
|
||||
#define VCPU_INFO_ADDR (SHINFO_REGION_GPA + 0x40)
|
||||
#define PVTIME_ADDR (SHINFO_REGION_GPA + PAGE_SIZE)
|
||||
|
|
@ -54,6 +57,7 @@ enum {
|
|||
TEST_EVTCHN_SLOWPATH,
|
||||
TEST_EVTCHN_SEND_IOCTL,
|
||||
TEST_EVTCHN_HCALL,
|
||||
TEST_EVTCHN_HCALL_SLOWPATH,
|
||||
TEST_EVTCHN_HCALL_EVENTFD,
|
||||
TEST_TIMER_SETUP,
|
||||
TEST_TIMER_WAIT,
|
||||
|
|
@ -260,6 +264,16 @@ static void guest_code(void)
|
|||
|
||||
guest_wait_for_irq();
|
||||
|
||||
GUEST_SYNC(TEST_EVTCHN_HCALL_SLOWPATH);
|
||||
|
||||
/*
|
||||
* Same again, but this time the host has messed with memslots so it
|
||||
* should take the slow path in kvm_xen_set_evtchn().
|
||||
*/
|
||||
xen_hypercall(__HYPERVISOR_event_channel_op, EVTCHNOP_send, &s);
|
||||
|
||||
guest_wait_for_irq();
|
||||
|
||||
GUEST_SYNC(TEST_EVTCHN_HCALL_EVENTFD);
|
||||
|
||||
/* Deliver "outbound" event channel to an eventfd which
|
||||
|
|
@ -753,6 +767,19 @@ int main(int argc, char *argv[])
|
|||
alarm(1);
|
||||
break;
|
||||
|
||||
case TEST_EVTCHN_HCALL_SLOWPATH:
|
||||
TEST_ASSERT(!evtchn_irq_expected,
|
||||
"Expected event channel IRQ but it didn't happen");
|
||||
shinfo->evtchn_pending[0] = 0;
|
||||
|
||||
if (verbose)
|
||||
printf("Testing guest EVTCHNOP_send direct to evtchn after memslot change\n");
|
||||
vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS,
|
||||
DUMMY_REGION_GPA_2, DUMMY_REGION_SLOT_2, 1, 0);
|
||||
evtchn_irq_expected = true;
|
||||
alarm(1);
|
||||
break;
|
||||
|
||||
case TEST_EVTCHN_HCALL_EVENTFD:
|
||||
TEST_ASSERT(!evtchn_irq_expected,
|
||||
"Expected event channel IRQ but it didn't happen");
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user