From owner-svn-src-projects@FreeBSD.ORG  Tue Jun 22 08:05:54 2010
Return-Path: <owner-svn-src-projects@FreeBSD.ORG>
Delivered-To: svn-src-projects@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 7FB501065670;
	Tue, 22 Jun 2010 08:05:54 +0000 (UTC)
	(envelope-from jeff@FreeBSD.org)
Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c])
	by mx1.freebsd.org (Postfix) with ESMTP id 561508FC1C;
	Tue, 22 Jun 2010 08:05:54 +0000 (UTC)
Received: from svn.freebsd.org (localhost [127.0.0.1])
	by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o5M85skd083311;
	Tue, 22 Jun 2010 08:05:54 GMT (envelope-from jeff@svn.freebsd.org)
Received: (from jeff@localhost)
	by svn.freebsd.org (8.14.3/8.14.3/Submit) id o5M85sxc083308;
	Tue, 22 Jun 2010 08:05:54 GMT (envelope-from jeff@svn.freebsd.org)
Message-Id: <201006220805.o5M85sxc083308@svn.freebsd.org>
From: Jeff Roberson <jeff@FreeBSD.org>
Date: Tue, 22 Jun 2010 08:05:54 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-projects@freebsd.org
X-SVN-Group: projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Cc: 
Subject: svn commit: r209422 - in projects/ofed/head/sys: kern sys
X-BeenThere: svn-src-projects@freebsd.org
X-Mailman-Version: 2.1.5
Precedence: list
List-Id: "SVN commit messages for the src &quot; projects&quot;
	tree" <svn-src-projects.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
	<mailto:svn-src-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-projects>
List-Post: <mailto:svn-src-projects@freebsd.org>
List-Help: <mailto:svn-src-projects-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/svn-src-projects>, 
	<mailto:svn-src-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Tue, 22 Jun 2010 08:05:54 -0000

Author: jeff
Date: Tue Jun 22 08:05:54 2010
New Revision: 209422
URL: http://svn.freebsd.org/changeset/base/209422

Log:
   - Add a taskqueue_cancel() routine that is compatible with the similar
     workqueue_cancel() in linux.  This is like taskqueue_drain() except
     it will stop the task from running at all if it has not yet been
     scheduled.
  
  Sponsored by:   Isilon Systems, iX Systems, and Panasas.

Modified:
  projects/ofed/head/sys/kern/subr_taskqueue.c
  projects/ofed/head/sys/sys/taskqueue.h

Modified: projects/ofed/head/sys/kern/subr_taskqueue.c
==============================================================================
--- projects/ofed/head/sys/kern/subr_taskqueue.c	Tue Jun 22 08:04:42 2010	(r209421)
+++ projects/ofed/head/sys/kern/subr_taskqueue.c	Tue Jun 22 08:05:54 2010	(r209422)
@@ -250,6 +250,44 @@ taskqueue_run(struct taskqueue *queue)
 		TQ_UNLOCK(queue);
 }
 
+int
+taskqueue_cancel(struct taskqueue *queue, struct task *task)
+{
+	int pending;
+
+	if (queue->tq_spin) {		/* XXX */
+		mtx_lock_spin(&queue->tq_mutex);
+		pending = task->ta_pending;
+		while (task->ta_pending != 0) {
+			if ((task->ta_flags & TA_FLAGS_RUNNING) == 0) {
+				STAILQ_REMOVE(&queue->tq_queue, task,
+				    task, ta_link);
+				task->ta_pending = 0;
+				break;
+			} else
+				msleep_spin(task, &queue->tq_mutex, "-", 0);
+		}
+		mtx_unlock_spin(&queue->tq_mutex);
+	} else {
+		WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL, __func__);
+
+		mtx_lock(&queue->tq_mutex);
+		pending = task->ta_pending;
+		while (task->ta_pending != 0) {
+			if ((task->ta_flags & TA_FLAGS_RUNNING) == 0) {
+				STAILQ_REMOVE(&queue->tq_queue, task,
+				    task, ta_link);
+				task->ta_pending = 0;
+				break;
+			} else
+				msleep(task, &queue->tq_mutex, PWAIT, "-", 0);
+		}
+		mtx_unlock(&queue->tq_mutex);
+	}
+
+	return (pending);
+}
+
 void
 taskqueue_drain(struct taskqueue *queue, struct task *task)
 {

Modified: projects/ofed/head/sys/sys/taskqueue.h
==============================================================================
--- projects/ofed/head/sys/sys/taskqueue.h	Tue Jun 22 08:04:42 2010	(r209421)
+++ projects/ofed/head/sys/sys/taskqueue.h	Tue Jun 22 08:05:54 2010	(r209422)
@@ -54,6 +54,7 @@ struct taskqueue *taskqueue_create(const
 int	taskqueue_start_threads(struct taskqueue **tqp, int count, int pri,
 				const char *name, ...) __printflike(4, 5);
 int	taskqueue_enqueue(struct taskqueue *queue, struct task *task);
+int	taskqueue_cancel(struct taskqueue *queue, struct task *task);
 void	taskqueue_drain(struct taskqueue *queue, struct task *task);
 void	taskqueue_free(struct taskqueue *queue);
 void	taskqueue_run(struct taskqueue *queue);