aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2021-03-05 23:31:20 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2021-04-09 20:42:56 +0000
commit533e5057ed2503013643bf8450588e4aa58c2b7e (patch)
tree689a52952a48f5465045af1e2ffa6d2b924fc7b6
parent4d27d8d2f3b8ae4ef3efc86b220c7ff2dbdbac5a (diff)
downloadsrc-533e5057ed2503013643bf8450588e4aa58c2b7e.tar.gz
src-533e5057ed2503013643bf8450588e4aa58c2b7e.zip
Add helper for kqueue timers callout scheduling
Reviewed by: markj Tested by: markj, pho Sponsored by: The FreeBSD Foundation MFC after: 2 weeks Differential revision: https://reviews.freebsd.org/D29106
-rw-r--r--sys/kern/kern_event.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c
index 5185723b8d10..5e9f1fc35dfe 100644
--- a/sys/kern/kern_event.c
+++ b/sys/kern/kern_event.c
@@ -676,11 +676,20 @@ timer2sbintime(int64_t data, int flags)
struct kq_timer_cb_data {
struct callout c;
+ struct knote *kn;
+ int cpuid;
sbintime_t next; /* next timer event fires at */
sbintime_t to; /* precalculated timer period, 0 for abs */
};
static void
+kqtimer_sched_callout(struct kq_timer_cb_data *kc)
+{
+ callout_reset_sbt_on(&kc->c, kc->next, 0, filt_timerexpire, kc->kn,
+ kc->cpuid, C_ABSOLUTE);
+}
+
+static void
filt_timerexpire(void *knx)
{
struct knote *kn;
@@ -696,8 +705,7 @@ filt_timerexpire(void *knx)
if (kc->to == 0)
return;
kc->next += kc->to;
- callout_reset_sbt_on(&kc->c, kc->next, 0, filt_timerexpire, kn,
- PCPU_GET(cpuid), C_ABSOLUTE);
+ kqtimer_sched_callout(kc);
}
/*
@@ -753,6 +761,8 @@ filt_timerattach(struct knote *kn)
kn->kn_flags |= EV_CLEAR; /* automatically set */
kn->kn_status &= ~KN_DETACHED; /* knlist_add clears it */
kn->kn_ptr.p_v = kc = malloc(sizeof(*kc), M_KQUEUE, M_WAITOK);
+ kc->kn = kn;
+ kc->cpuid = PCPU_GET(cpuid);
callout_init(&kc->c, 1);
filt_timerstart(kn, to);
@@ -772,8 +782,7 @@ filt_timerstart(struct knote *kn, sbintime_t to)
kc->next = to + sbinuptime();
kc->to = to;
}
- callout_reset_sbt_on(&kc->c, kc->next, 0, filt_timerexpire, kn,
- PCPU_GET(cpuid), C_ABSOLUTE);
+ kqtimer_sched_callout(kc);
}
static void