summaryrefslogtreecommitdiffstats
path: root/sys/sys/_task.h
diff options
context:
space:
mode:
authorrwatson <rwatson@FreeBSD.org>2004-01-23 20:44:26 +0000
committerrwatson <rwatson@FreeBSD.org>2004-01-23 20:44:26 +0000
commit718d82cd61f270ab6f5586658e3d6204b35e4f64 (patch)
treecad255f8a586699981e032637c52523632e2f1bc /sys/sys/_task.h
parentcd37a854086191ba3b4fc2e379dc71b33a8ca0ec (diff)
downloadFreeBSD-src-718d82cd61f270ab6f5586658e3d6204b35e4f64.zip
FreeBSD-src-718d82cd61f270ab6f5586658e3d6204b35e4f64.tar.gz
Defer the vrele() on a jail's root vnode reference from prison_free()
to a new prison_complete() task run by a task queue. This removes a requirement for grabbing Giant in crfree(). Embed the 'struct task' in 'struct prison' so that we don't have to allocate memory from prison_free() (which means we also defer the FREE()). With this change, I believe grabbing Giant from crfree() can now be removed, but need to check the uidinfo code paths. To avoid header pollution, move the definition of 'struct task' to _task.h, and recursively include from taskqueue.h and jail.h; much preferably to all files including jail.h picking up a requirement to include taskqueue.h. Bumped into by: sam Reviewed by: bde, tjr
Diffstat (limited to 'sys/sys/_task.h')
-rw-r--r--sys/sys/_task.h54
1 files changed, 54 insertions, 0 deletions
diff --git a/sys/sys/_task.h b/sys/sys/_task.h
new file mode 100644
index 0000000..c5c5a68
--- /dev/null
+++ b/sys/sys/_task.h
@@ -0,0 +1,54 @@
+/*-
+ * Copyright (c) 2000 Doug Rabson
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _SYS__TASK_H_
+#define _SYS__TASK_H_
+
+#ifndef _KERNEL
+#error "no user-servicable parts inside"
+#endif
+
+#include <sys/queue.h>
+
+/*
+ * Each task includes a function which is called from
+ * taskqueue_run(). The first argument is taken from the 'ta_context'
+ * field of struct task and the second argument is a count of how many
+ * times the task was enqueued before the call to taskqueue_run().
+ */
+typedef void task_fn_t(void *context, int pending);
+
+struct task {
+ STAILQ_ENTRY(task) ta_link; /* link for queue */
+ int ta_pending; /* count times queued */
+ int ta_priority; /* priority of task in queue */
+ task_fn_t *ta_func; /* task handler */
+ void *ta_context; /* argument for handler */
+};
+
+#endif /* !_SYS__TASK_H_ */
OpenPOWER on IntegriCloud