zfs/module/spl
Brian Behlendorf d9acd930b5 taskq delay/cancel functionality
Add the ability to dispatch a delayed task to a taskq.  The desired
behavior is for the task to be queued but not executed by a worker
thread until the expiration time is reached.  To achieve this two
new functions were added.

* taskq_dispatch_delay() -

  This function behaves exactly like taskq_dispatch() however it
takes a third 'expire_time' argument.  The caller should pass the
desired time the task should be executed as an absolute value in
jiffies.  The task is guarenteed not to run before this time, it
may run slightly latter if all the worker threads are busy.

* taskq_cancel_id() -

  Given a task id attempt to cancel the task before it gets executed.
This is primarily useful for canceling delay tasks but can be used for
canceling any previously dispatched task.  There are three possible
return values.

  0      - The task was found and canceled before it was executed.
  ENOENT - The task was not found, either it was already run or an
           invalid task id was supplied by the caller.
  EBUSY  - The task is currently executing any may not be canceled.
           This function will block until the task has been completed.

* taskq_wait_all() -

  The taskq_wait_id() function was renamed taskq_wait_all() to more
clearly reflect its actual behavior.  It is only curreny used by
the splat taskq regression tests.

* taskq_wait_id() -

  Historically, the only difference between this function and
taskq_wait() was that you passed the task id.  In both functions you
would block until ALL lower task ids which executed.  This was
semantically correct but could be very slow particularly if there
were delay tasks submitted.

  To better accomidate the delay tasks this function was reimplemnted.
It will now only block until the passed task id has been completed.

This is actually a fairly low risk change for a few reasons.

* Only new ZFS callers will make use of the new interfaces and
  very little common code was changed to support the new functions.

* The existing taskq_wait() implementation was not changed just
  slightly refactored.

* The newly optimized taskq_wait_id() implementation was never
  used by ZFS we can't accidentally introduce a new bug there.

NOTE: This functionality does not exist in the Illumos taskqs.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
2012-12-12 09:54:07 -08:00
..
Makefile.in Add script for builtin module building. 2012-07-26 15:13:09 -07:00
spl-atomic.c Linux 2.6.39 compat, DEFINE_SPINLOCK() 2011-04-20 12:01:11 -07:00
spl-condvar.c Condition variable reference counts 2012-11-06 14:48:55 -08:00
spl-cred.c Add crgetfsuid()/crgetfsgid() helpers 2011-03-22 12:18:44 -07:00
spl-debug.c Wrap trace_set_debug_header in trace_[get|put]_tcd 2012-08-23 10:01:20 -07:00
spl-err.c Add --enable-debug-log configure option 2012-02-02 11:27:54 -08:00
spl-generic.c Determine the hostid on demand. 2012-07-26 15:14:02 -07:00
spl-kmem.c Disable FS reclaim when allocating new slabs 2012-11-27 13:43:27 -08:00
spl-kobj.c Remove VN_HOLD/VN_RELE/VOP_PUTPAGE 2011-01-12 11:38:05 -08:00
spl-kstat.c Add KSTAT_TYPE_TXG type 2012-11-02 15:17:40 -07:00
spl-mutex.c Fix undefined reference on spl_mutex_spin_max(). 2012-07-26 14:54:53 -07:00
spl-proc.c Improved vmem cached deadlock detection 2012-11-06 14:54:15 -08:00
spl-rwlock.c Public Release Prep 2010-05-17 15:18:00 -07:00
spl-taskq.c taskq delay/cancel functionality 2012-12-12 09:54:07 -08:00
spl-thread.c Switch KM_SLEEP to KM_PUSHPAGE 2012-09-12 12:27:09 -07:00
spl-time.c Minor 32-bit fix cast to hrtime_t before the mutliply. 2010-05-23 09:51:17 -07:00
spl-tsd.c Switch KM_SLEEP to KM_PUSHPAGE 2012-10-11 16:22:29 -07:00
spl-vnode.c Handle errors from spl_kern_path_locked() 2012-12-03 12:06:25 -08:00
spl-xdr.c Prefix all SPL debug macros with 'S' 2010-07-20 13:30:40 -07:00
spl-zlib.c Set KMC_NOEMERGENCY for zlib workspaces 2012-09-07 14:36:26 -07:00