Skip to content

Commit

Permalink
KVM: x86/xen: Update self test for Xen PV timers
Browse files Browse the repository at this point in the history
Add test cases for timers in the past, and reading the status of a timer
which has already fired.

Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
Message-Id: <20220309143835.253911-3-dwmw2@infradead.org>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
  • Loading branch information
David Woodhouse authored and Paolo Bonzini committed Apr 2, 2022
1 parent 25eaeeb commit a29833e
Showing 1 changed file with 32 additions and 3 deletions.
35 changes: 32 additions & 3 deletions tools/testing/selftests/kvm/x86_64/xen_shinfo_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -325,6 +325,11 @@ static void guest_code(void)
guest_wait_for_irq();

GUEST_SYNC(20);

/* Timer should have fired already */
guest_wait_for_irq();

GUEST_SYNC(21);
}

static int cmp_timespec(struct timespec *a, struct timespec *b)
Expand Down Expand Up @@ -746,22 +751,46 @@ int main(int argc, char *argv[])

tmr.u.timer.expires_ns = rs->state_entry_time + 100000000,
vcpu_ioctl(vm, VCPU_ID, KVM_XEN_VCPU_SET_ATTR, &tmr);
alarm(1);
break;

case 19:
shinfo->evtchn_pending[0] = shinfo->evtchn_mask[0] = 0;
if (verbose)
printf("Testing SCHEDOP_poll wake on unmasked event\n");

tmr.u.timer.expires_ns = rs->state_entry_time + 100000000,
vcpu_ioctl(vm, VCPU_ID, KVM_XEN_VCPU_SET_ATTR, &tmr);
evtchn_irq_expected = true;
tmr.u.timer.expires_ns = rs->state_entry_time + 100000000;
vcpu_ioctl(vm, VCPU_ID, KVM_XEN_VCPU_SET_ATTR, &tmr);

/* Read it back and check the pending time is reported correctly */
tmr.u.timer.expires_ns = 0;
vcpu_ioctl(vm, VCPU_ID, KVM_XEN_VCPU_GET_ATTR, &tmr);
TEST_ASSERT(tmr.u.timer.expires_ns == rs->state_entry_time + 100000000,
"Timer not reported pending");
alarm(1);
break;

case 20:
TEST_ASSERT(!evtchn_irq_expected,
"Expected event channel IRQ but it didn't happen");
shinfo->evtchn_pending[1] = 0;
/* Read timer and check it is no longer pending */
vcpu_ioctl(vm, VCPU_ID, KVM_XEN_VCPU_GET_ATTR, &tmr);
TEST_ASSERT(!tmr.u.timer.expires_ns, "Timer still reported pending");

shinfo->evtchn_pending[0] = 0;
if (verbose)
printf("Testing timer in the past\n");

evtchn_irq_expected = true;
tmr.u.timer.expires_ns = rs->state_entry_time - 100000000ULL;
vcpu_ioctl(vm, VCPU_ID, KVM_XEN_VCPU_SET_ATTR, &tmr);
alarm(1);
break;

case 21:
TEST_ASSERT(!evtchn_irq_expected,
"Expected event channel IRQ but it didn't happen");
goto done;

case 0x20:
Expand Down

0 comments on commit a29833e

Please sign in to comment.