Page MenuHomeFreeBSD

D29746.id87379.diff
No OneTemporary

D29746.id87379.diff

diff --git a/sys/kern/kern_event.c b/sys/kern/kern_event.c
--- a/sys/kern/kern_event.c
+++ b/sys/kern/kern_event.c
@@ -161,6 +161,7 @@
static int filt_proc(struct knote *kn, long hint);
static int filt_fileattach(struct knote *kn);
static void filt_timerexpire(void *knx);
+static void filt_timerexpire_l(struct knote *kn, bool proc_locked);
static int filt_timerattach(struct knote *kn);
static void filt_timerdetach(struct knote *kn);
static void filt_timerstart(struct knote *kn, sbintime_t to);
@@ -706,21 +707,19 @@
TAILQ_FOREACH_SAFE(kc, &p->p_kqtim_stop, link, kc1) {
TAILQ_REMOVE(&p->p_kqtim_stop, kc, link);
if (kc->next <= now)
- filt_timerexpire(kc->kn);
+ filt_timerexpire_l(kc->kn, true);
else
kqtimer_sched_callout(kc);
}
}
static void
-filt_timerexpire(void *knx)
+filt_timerexpire_l(struct knote *kn, bool proc_locked)
{
- struct knote *kn;
struct kq_timer_cb_data *kc;
struct proc *p;
sbintime_t now;
- kn = knx;
kc = kn->kn_ptr.p_v;
if ((kn->kn_flags & EV_ONESHOT) != 0 || kc->to == 0) {
@@ -742,17 +741,26 @@
*/
p = kc->p;
if (P_SHOULDSTOP(p) || P_KILLED(p)) {
- PROC_LOCK(p);
+ if (!proc_locked)
+ PROC_LOCK(p);
if (P_SHOULDSTOP(p) || P_KILLED(p)) {
TAILQ_INSERT_TAIL(&p->p_kqtim_stop, kc, link);
- PROC_UNLOCK(p);
+ if (!proc_locked)
+ PROC_UNLOCK(p);
return;
}
- PROC_UNLOCK(p);
+ if (!proc_locked)
+ PROC_UNLOCK(p);
}
kqtimer_sched_callout(kc);
}
+static void
+filt_timerexpire(void *knx)
+{
+ filt_timerexpire_l(knx, false);
+}
+
/*
* data contains amount of time to sleep
*/
diff --git a/sys/kern/kern_time.c b/sys/kern/kern_time.c
--- a/sys/kern/kern_time.c
+++ b/sys/kern/kern_time.c
@@ -105,6 +105,7 @@
static int realtimer_delete(struct itimer *);
static void realtimer_clocktime(clockid_t, struct timespec *);
static void realtimer_expire(void *);
+static void realtimer_expire_l(struct itimer *it, bool proc_locked);
static int register_posix_clock(int, const struct kclock *);
static void itimer_fire(struct itimer *it);
@@ -919,7 +920,7 @@
if ((it->it_flags & ITF_PSTOPPED) != 0) {
it->it_flags &= ~ITF_PSTOPPED;
if ((it->it_flags & ITF_DELETING) == 0)
- realtimer_expire(it);
+ realtimer_expire_l(it, true);
}
ITIMER_UNLOCK(it);
}
@@ -1663,18 +1664,14 @@
.tv_nsec = (ns) % 1000000000 \
}
-/* Timeout callback for realtime timer */
static void
-realtimer_expire(void *arg)
+realtimer_expire_l(struct itimer *it, bool proc_locked)
{
struct timespec cts, ts;
struct timeval tv;
- struct itimer *it;
struct proc *p;
uint64_t interval, now, overruns, value;
- it = (struct itimer *)arg;
-
realtimer_clocktime(it->it_clockid, &cts);
/* Only fire if time is reached. */
if (timespeccmp(&cts, &it->it_time.it_value, >=)) {
@@ -1708,8 +1705,9 @@
/* single shot timer ? */
timespecclear(&it->it_time.it_value);
}
+
+ p = it->it_proc;
if (timespecisset(&it->it_time.it_value)) {
- p = it->it_proc;
if (P_SHOULDSTOP(p) || P_KILLED(p)) {
it->it_flags |= ITF_PSTOPPED;
} else {
@@ -1719,9 +1717,14 @@
realtimer_expire, it);
}
}
+
itimer_enter(it);
ITIMER_UNLOCK(it);
+ if (proc_locked)
+ PROC_UNLOCK(p);
itimer_fire(it);
+ if (proc_locked)
+ PROC_LOCK(p);
ITIMER_LOCK(it);
itimer_leave(it);
} else if (timespecisset(&it->it_time.it_value)) {
@@ -1738,6 +1741,13 @@
}
}
+/* Timeout callback for realtime timer */
+static void
+realtimer_expire(void *arg)
+{
+ realtimer_expire_l(arg, false);
+}
+
static void
itimer_fire(struct itimer *it)
{

File Metadata

Mime Type
text/plain
Expires
Thu, Feb 19, 7:58 AM (13 h, 16 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
28873563
Default Alt Text
D29746.id87379.diff (3 KB)

Event Timeline