diff options
author | mlarkin <mlarkin@openbsd.org> | 2019-11-29 00:51:27 +0000 |
---|---|---|
committer | mlarkin <mlarkin@openbsd.org> | 2019-11-29 00:51:27 +0000 |
commit | ee8a17972edfbdf28d1cfbc33a2f60a327956a40 (patch) | |
tree | 84b15c86b253758357ebb4e4c13f2ddf6198bef1 /usr.sbin/vmd/mc146818.c | |
parent | lots of dependencies go away here with ed25519 no longer needing (diff) | |
download | wireguard-openbsd-ee8a17972edfbdf28d1cfbc33a2f60a327956a40.tar.xz wireguard-openbsd-ee8a17972edfbdf28d1cfbc33a2f60a327956a40.zip |
Fix at least one cause of VMs spinning at 100% host CPU
After debugging with ori@, it looks like an event ends up on the wrong
libevent queue, and we end continually de-queueing and re-queueing the
event continually. While it's unclear exactly why this happened, a clue
on libevent's github issues page for the same problem pointed us to using
a different event base for the device events. This seems to have unstuck
ori@'s problematic VM, and I have also seen no more hangs after this.
We have not completely separated the queues; ori@ will work on setting
new libevent bases for those later. But those events are pretty
frequency.
with help from and ok ori@
Diffstat (limited to 'usr.sbin/vmd/mc146818.c')
-rw-r--r-- | usr.sbin/vmd/mc146818.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/usr.sbin/vmd/mc146818.c b/usr.sbin/vmd/mc146818.c index e4a2b84f41c..a400fe7718d 100644 --- a/usr.sbin/vmd/mc146818.c +++ b/usr.sbin/vmd/mc146818.c @@ -1,4 +1,4 @@ -/* $OpenBSD: mc146818.c,v 1.19 2019/05/27 19:21:43 jasper Exp $ */ +/* $OpenBSD: mc146818.c,v 1.20 2019/11/29 00:51:27 mlarkin Exp $ */ /* * Copyright (c) 2016 Mike Larkin <mlarkin@openbsd.org> * @@ -35,6 +35,8 @@ #include "vmm.h" #include "atomicio.h" +extern struct event_base *evbase; + #define MC_DIVIDER_MASK 0xe0 #define MC_RATE_MASK 0xf @@ -172,9 +174,11 @@ mc146818_init(uint32_t vm_id, uint64_t memlo, uint64_t memhi) timerclear(&rtc.per_tv); evtimer_set(&rtc.sec, rtc_fire1, NULL); + event_base_set(evbase, &rtc.sec); evtimer_add(&rtc.sec, &rtc.sec_tv); evtimer_set(&rtc.per, rtc_fireper, (void *)(intptr_t)rtc.vm_id); + event_base_set(evbase, &rtc.per); } /* @@ -341,7 +345,9 @@ mc146818_restore(int fd, uint32_t vm_id) memset(&rtc.sec, 0, sizeof(struct event)); memset(&rtc.per, 0, sizeof(struct event)); evtimer_set(&rtc.sec, rtc_fire1, NULL); + event_base_set(evbase, &rtc.sec); evtimer_set(&rtc.per, rtc_fireper, (void *)(intptr_t)rtc.vm_id); + event_base_set(evbase, &rtc.per); return (0); } |