From owner-svn-src-all@FreeBSD.ORG Sat Nov 30 06:46:05 2013 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id BC3361E7; Sat, 30 Nov 2013 06:46:05 +0000 (UTC) Received: from aslan.scsiguy.com (www.scsiguy.com [70.89.174.89]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 91A7C1F44; Sat, 30 Nov 2013 06:46:05 +0000 (UTC) Received: from [192.168.0.48] ([192.168.0.48]) (authenticated bits=0) by aslan.scsiguy.com (8.14.7/8.14.5) with ESMTP id rAU6k3wW085408 (version=TLSv1/SSLv3 cipher=AES128-SHA bits=128 verify=NO); Fri, 29 Nov 2013 23:46:04 -0700 (MST) (envelope-from gibbs@scsiguy.com) Content-Type: text/plain; charset=windows-1252 Mime-Version: 1.0 (Mac OS X Mail 7.0 \(1822\)) Subject: Re: svn commit: r258713 - in head/sys: kern sys From: "Justin T. Gibbs" In-Reply-To: <201311281856.rASIuZu8059699@svn.freebsd.org> Date: Fri, 29 Nov 2013 23:46:04 -0700 Content-Transfer-Encoding: quoted-printable Message-Id: <3784C560-3648-4E03-93DA-9A60E3AC401D@scsiguy.com> References: <201311281856.rASIuZu8059699@svn.freebsd.org> To: Andriy Gapon X-Mailer: Apple Mail (2.1822) X-Greylist: Sender succeeded SMTP AUTH, not delayed by milter-greylist-4.4.3 (aslan.scsiguy.com [70.89.174.89]); Fri, 29 Nov 2013 23:46:05 -0700 (MST) Cc: svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.16 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 30 Nov 2013 06:46:05 -0000 Man page update? =97 Justin On Nov 28, 2013, at 11:56 AM, Andriy Gapon wrote: > Author: avg > Date: Thu Nov 28 18:56:34 2013 > New Revision: 258713 > URL: http://svnweb.freebsd.org/changeset/base/258713 >=20 > Log: > add taskqueue_drain_all >=20 > This API has semantics similar to that of taskqueue_drain but acts on > all tasks that might be queued or running on a taskqueue. > A caller must ensure that no new tasks are being enqueued otherwise = this > call would be totally meaningless. For example, if the tasks are > enqueued by an interrupt filter then its interrupt must be disabled. >=20 > MFC after: 10 days >=20 > Modified: > head/sys/kern/subr_taskqueue.c > head/sys/sys/taskqueue.h >=20 > Modified: head/sys/kern/subr_taskqueue.c > = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D > --- head/sys/kern/subr_taskqueue.c Thu Nov 28 16:36:03 2013 = (r258712) > +++ head/sys/kern/subr_taskqueue.c Thu Nov 28 18:56:34 2013 = (r258713) > @@ -300,6 +300,15 @@ taskqueue_enqueue_timeout(struct taskque > return (res); > } >=20 > +static void > +taskqueue_drain_running(struct taskqueue *queue) > +{ > + > + while (!TAILQ_EMPTY(&queue->tq_active)) > + TQ_SLEEP(queue, &queue->tq_active, &queue->tq_mutex, > + PWAIT, "-", 0); > +} > + > void > taskqueue_block(struct taskqueue *queue) > { > @@ -350,6 +359,8 @@ taskqueue_run_locked(struct taskqueue *q > wakeup(task); > } > TAILQ_REMOVE(&queue->tq_active, &tb, tb_link); > + if (TAILQ_EMPTY(&queue->tq_active)) > + wakeup(&queue->tq_active); > } >=20 > void > @@ -434,6 +445,25 @@ taskqueue_drain(struct taskqueue *queue, > } >=20 > void > +taskqueue_drain_all(struct taskqueue *queue) > +{ > + struct task *task; > + > + if (!queue->tq_spin) > + WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL, = __func__); > + > + TQ_LOCK(queue); > + task =3D STAILQ_LAST(&queue->tq_queue, task, ta_link); > + if (task !=3D NULL) > + while (task->ta_pending !=3D 0) > + TQ_SLEEP(queue, task, &queue->tq_mutex, PWAIT, = "-", 0); > + taskqueue_drain_running(queue); > + KASSERT(STAILQ_EMPTY(&queue->tq_queue), > + ("taskqueue queue is not empty after draining")); > + TQ_UNLOCK(queue); > +} > + > +void > taskqueue_drain_timeout(struct taskqueue *queue, > struct timeout_task *timeout_task) > { >=20 > Modified: head/sys/sys/taskqueue.h > = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D > --- head/sys/sys/taskqueue.h Thu Nov 28 16:36:03 2013 = (r258712) > +++ head/sys/sys/taskqueue.h Thu Nov 28 18:56:34 2013 = (r258713) > @@ -81,6 +81,7 @@ int taskqueue_cancel_timeout(struct task > void taskqueue_drain(struct taskqueue *queue, struct task *task); > void taskqueue_drain_timeout(struct taskqueue *queue, > struct timeout_task *timeout_task); > +void taskqueue_drain_all(struct taskqueue *queue); > void taskqueue_free(struct taskqueue *queue); > void taskqueue_run(struct taskqueue *queue); > void taskqueue_block(struct taskqueue *queue); >=20