git: 4dfa329f4861 - main - bhyve: Extend mevent to support updating timers
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 10 Apr 2024 15:19:26 UTC
The branch main has been updated by markj:
URL: https://cgit.FreeBSD.org/src/commit/?id=4dfa329f48618d30e0c32529f874c1d0cc7beb00
commit 4dfa329f48618d30e0c32529f874c1d0cc7beb00
Author: Jessica Clarke <jrtc27@jrtc27.com>
AuthorDate: 2024-02-21 22:42:19 +0000
Commit: Mark Johnston <markj@FreeBSD.org>
CommitDate: 2024-04-10 15:17:56 +0000
bhyve: Extend mevent to support updating timers
This will be used by a new PL031 implementation to provide an RTC for
arm64 guests.
Reviewed by: jhb
MFC after: 2 weeks
Obtained from: CheriBSD
---
usr.sbin/bhyve/mevent.c | 34 ++++++++++++++++++++++++----------
usr.sbin/bhyve/mevent.h | 1 +
2 files changed, 25 insertions(+), 10 deletions(-)
diff --git a/usr.sbin/bhyve/mevent.c b/usr.sbin/bhyve/mevent.c
index ce272ce87f3d..dbcc39148ca1 100644
--- a/usr.sbin/bhyve/mevent.c
+++ b/usr.sbin/bhyve/mevent.c
@@ -80,6 +80,12 @@ struct mevent {
LIST_ENTRY(mevent) me_list;
};
+enum mevent_update_type {
+ UPDATE_ENABLE,
+ UPDATE_DISABLE,
+ UPDATE_TIMER,
+};
+
static LIST_HEAD(listhead, mevent) global_head, change_head;
static void
@@ -237,7 +243,6 @@ mevent_build(struct kevent *kev)
*/
close(mevp->me_fd);
} else {
- assert((mevp->me_state & EV_ADD) == 0);
mevent_populate(mevp, &kev[i]);
i++;
}
@@ -375,30 +380,35 @@ mevent_add_disabled(int tfd, enum ev_type type,
}
static int
-mevent_update(struct mevent *evp, bool enable)
+mevent_update(struct mevent *evp, enum mevent_update_type type, int msecs)
{
int newstate;
mevent_qlock();
/*
- * It's not possible to enable/disable a deleted event
+ * It's not possible to update a deleted event
*/
assert((evp->me_state & EV_DELETE) == 0);
newstate = evp->me_state;
- if (enable) {
+ if (type == UPDATE_ENABLE) {
newstate |= EV_ENABLE;
newstate &= ~EV_DISABLE;
- } else {
+ } else if (type == UPDATE_DISABLE) {
newstate |= EV_DISABLE;
newstate &= ~EV_ENABLE;
+ } else {
+ assert(type == UPDATE_TIMER);
+ assert(evp->me_type == EVF_TIMER);
+ newstate |= EV_ADD;
+ evp->me_msecs = msecs;
}
/*
- * No update needed if state isn't changing
+ * No update needed if enable/disable had no effect
*/
- if (evp->me_state != newstate) {
+ if (evp->me_state != newstate || type == UPDATE_TIMER) {
evp->me_state = newstate;
/*
@@ -421,15 +431,19 @@ mevent_update(struct mevent *evp, bool enable)
int
mevent_enable(struct mevent *evp)
{
-
- return (mevent_update(evp, true));
+ return (mevent_update(evp, UPDATE_ENABLE, -1));
}
int
mevent_disable(struct mevent *evp)
{
+ return (mevent_update(evp, UPDATE_DISABLE, -1));
+}
- return (mevent_update(evp, false));
+int
+mevent_timer_update(struct mevent *evp, int msecs)
+{
+ return (mevent_update(evp, UPDATE_TIMER, msecs));
}
static int
diff --git a/usr.sbin/bhyve/mevent.h b/usr.sbin/bhyve/mevent.h
index de70361059bd..23107fc55982 100644
--- a/usr.sbin/bhyve/mevent.h
+++ b/usr.sbin/bhyve/mevent.h
@@ -55,6 +55,7 @@ int mevent_enable(struct mevent *evp);
int mevent_disable(struct mevent *evp);
int mevent_delete(struct mevent *evp);
int mevent_delete_close(struct mevent *evp);
+int mevent_timer_update(struct mevent *evp, int msecs);
void mevent_dispatch(void);