summaryrefslogtreecommitdiffstats
path: root/usr.sbin/vmd/mc146818.c
diff options
context:
space:
mode:
authormlarkin <mlarkin@openbsd.org>2019-11-29 00:51:27 +0000
committermlarkin <mlarkin@openbsd.org>2019-11-29 00:51:27 +0000
commitee8a17972edfbdf28d1cfbc33a2f60a327956a40 (patch)
tree84b15c86b253758357ebb4e4c13f2ddf6198bef1 /usr.sbin/vmd/mc146818.c
parentlots of dependencies go away here with ed25519 no longer needing (diff)
downloadwireguard-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.c8
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);
}