summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sys/kern/subr_sleepqueue.c6
-rw-r--r--sys/sys/sleepqueue.h5
2 files changed, 8 insertions, 3 deletions
diff --git a/sys/kern/subr_sleepqueue.c b/sys/kern/subr_sleepqueue.c
index f187544..3e1c0c3 100644
--- a/sys/kern/subr_sleepqueue.c
+++ b/sys/kern/subr_sleepqueue.c
@@ -361,7 +361,8 @@ sleepq_add(void *wchan, struct lock_object *lock, const char *wmesg, int flags,
* sleep queue after timo ticks if the thread has not already been awakened.
*/
void
-sleepq_set_timeout(void *wchan, int timo)
+sleepq_set_timeout_sbt(void *wchan, sbintime_t sbt, sbintime_t pr,
+ int flags)
{
struct sleepqueue_chain *sc;
struct thread *td;
@@ -372,7 +373,8 @@ sleepq_set_timeout(void *wchan, int timo)
MPASS(TD_ON_SLEEPQ(td));
MPASS(td->td_sleepqueue == NULL);
MPASS(wchan != NULL);
- callout_reset_curcpu(&td->td_slpcallout, timo, sleepq_timeout, td);
+ callout_reset_sbt_on(&td->td_slpcallout, sbt, pr,
+ sleepq_timeout, td, PCPU_GET(cpuid), flags | C_DIRECT_EXEC);
}
/*
diff --git a/sys/sys/sleepqueue.h b/sys/sys/sleepqueue.h
index f2a5c75..c21f47d 100644
--- a/sys/sys/sleepqueue.h
+++ b/sys/sys/sleepqueue.h
@@ -108,7 +108,10 @@ struct sleepqueue *sleepq_lookup(void *wchan);
void sleepq_release(void *wchan);
void sleepq_remove(struct thread *td, void *wchan);
int sleepq_signal(void *wchan, int flags, int pri, int queue);
-void sleepq_set_timeout(void *wchan, int timo);
+void sleepq_set_timeout_sbt(void *wchan, sbintime_t sbt,
+ sbintime_t pr, int flags);
+#define sleepq_set_timeout(wchan, timo) \
+ sleepq_set_timeout_sbt((wchan), (tick_sbt * (timo)), 0, C_HARDCLOCK)
u_int sleepq_sleepcnt(void *wchan, int queue);
int sleepq_timedwait(void *wchan, int pri);
int sleepq_timedwait_sig(void *wchan, int pri);
OpenPOWER on IntegriCloud