Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 4 Mar 2013 11:51:46 +0000 (UTC)
From:      Davide Italiano <davide@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r247783 - in head/sys: kern sys
Message-ID:  <201303041151.r24BpkrJ036413@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: davide
Date: Mon Mar  4 11:51:46 2013
New Revision: 247783
URL: http://svnweb.freebsd.org/changeset/base/247783

Log:
  MFcalloutng:
  Convert sleepqueue(9) bits to the new callout KPI. Take advantage of
  the possibility to run callback directly from hw interrupt context.
  
  Sponsored by:	Google Summer of Code 2012, iXsystems inc.
  Tested by:	flo, marius, ian, markj, Fabian Keil

Modified:
  head/sys/kern/subr_sleepqueue.c
  head/sys/sys/sleepqueue.h

Modified: head/sys/kern/subr_sleepqueue.c
==============================================================================
--- head/sys/kern/subr_sleepqueue.c	Mon Mar  4 11:43:20 2013	(r247782)
+++ head/sys/kern/subr_sleepqueue.c	Mon Mar  4 11:51:46 2013	(r247783)
@@ -361,7 +361,8 @@ sleepq_add(void *wchan, struct lock_obje
  * 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);
 }
 
 /*

Modified: head/sys/sys/sleepqueue.h
==============================================================================
--- head/sys/sys/sleepqueue.h	Mon Mar  4 11:43:20 2013	(r247782)
+++ head/sys/sys/sleepqueue.h	Mon Mar  4 11:51:46 2013	(r247783)
@@ -108,7 +108,10 @@ struct sleepqueue *sleepq_lookup(void *w
 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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201303041151.r24BpkrJ036413>