Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F142326474
D11963.id32012.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D11963.id32012.diff
View Options
Index: head/share/man/man9/Makefile
===================================================================
--- head/share/man/man9/Makefile
+++ head/share/man/man9/Makefile
@@ -669,7 +669,8 @@
condvar.9 cv_wait_unlock.9 \
condvar.9 cv_wmesg.9
MLINKS+=config_intrhook.9 config_intrhook_disestablish.9 \
- config_intrhook.9 config_intrhook_establish.9
+ config_intrhook.9 config_intrhook_establish.9 \
+ config_intrhook.9 config_intrhook_oneshot.9
MLINKS+=contigmalloc.9 contigfree.9
MLINKS+=casuword.9 casueword.9 \
casuword.9 casueword32.9 \
Index: head/share/man/man9/config_intrhook.9
===================================================================
--- head/share/man/man9/config_intrhook.9
+++ head/share/man/man9/config_intrhook.9
@@ -26,7 +26,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd September 24, 2006
+.Dd August 10, 2017
.Dt CONFIG_INTRHOOK 9
.Os
.Sh NAME
@@ -35,10 +35,13 @@
but before root is mounted
.Sh SYNOPSIS
.In sys/kernel.h
+.Vt typedef void (*ich_func_t)(void *arg);
.Ft int
.Fn config_intrhook_establish "struct intr_config_hook *hook"
.Ft void
.Fn config_intrhook_disestablish "struct intr_config_hook *hook"
+.Ft void
+.Fn config_intrhook_oneshot "ich_func_t func" "void *arg"
.Sh DESCRIPTION
The
.Fn config_intrhook_establish
@@ -51,6 +54,18 @@
.Fn config_intrhook_disestablish
function removes the entry from the hook queue.
.Pp
+The
+.Fn config_intrhook_oneshot
+function schedules a function to be run as described for
+.Fn config_intrhook_establish ;
+the entry is automatically removed from the hook queue
+after that function runs.
+This is appropriate when additional device configuration must be done
+after interrupts are enabled, but there is no need to stall the
+boot process after that.
+This function allocates memory using M_WAITOK; do not call this while
+holding any non-sleepable locks.
+.Pp
Before root is mounted, all the previously established hooks are
run.
The boot process is then stalled until all handlers remove their hook
@@ -71,8 +86,8 @@
.Bd -literal
struct intr_config_hook {
TAILQ_ENTRY(intr_config_hook) ich_links;/* Private */
- void (*ich_func)(void *arg); /* function to call */
- void *ich_arg; /* Argument to call */
+ ich_func_t ich_func; /* function to call */
+ void *ich_arg; /* Argument to call */
};
.Ed
.Pp
Index: head/sys/kern/subr_autoconf.c
===================================================================
--- head/sys/kern/subr_autoconf.c
+++ head/sys/kern/subr_autoconf.c
@@ -43,6 +43,7 @@
#include <sys/kernel.h>
#include <sys/linker.h>
#include <sys/lock.h>
+#include <sys/malloc.h>
#include <sys/mutex.h>
#include <sys/systm.h>
@@ -63,6 +64,27 @@
static void run_interrupt_driven_config_hooks(void);
/*
+ * Private data and a shim function for implementing config_interhook_oneshot().
+ */
+struct oneshot_config_hook {
+ struct intr_config_hook
+ och_hook; /* Must be first */
+ ich_func_t och_func;
+ void *och_arg;
+};
+
+static void
+config_intrhook_oneshot_func(void *arg)
+{
+ struct oneshot_config_hook *ohook;
+
+ ohook = arg;
+ ohook->och_func(ohook->och_arg);
+ config_intrhook_disestablish(&ohook->och_hook);
+ free(ohook, M_DEVBUF);
+}
+
+/*
* If we wait too long for an interrupt-driven config hook to return, print
* a diagnostic.
*/
@@ -181,6 +203,22 @@
/* XXX Sufficient for modules loaded after initial config??? */
run_interrupt_driven_config_hooks();
return (0);
+}
+
+/*
+ * Register a hook function that is automatically unregistered after it runs.
+ */
+void
+config_intrhook_oneshot(ich_func_t func, void *arg)
+{
+ struct oneshot_config_hook *ohook;
+
+ ohook = malloc(sizeof(*ohook), M_DEVBUF, M_WAITOK);
+ ohook->och_func = func;
+ ohook->och_arg = arg;
+ ohook->och_hook.ich_func = config_intrhook_oneshot_func;
+ ohook->och_hook.ich_arg = ohook;
+ config_intrhook_establish(&ohook->och_hook);
}
void
Index: head/sys/sys/kernel.h
===================================================================
--- head/sys/sys/kernel.h
+++ head/sys/sys/kernel.h
@@ -400,13 +400,16 @@
#define TUNABLE_STR_FETCH(path, var, size) \
getenv_string((path), (var), (size))
+typedef void (*ich_func_t)(void *_arg);
+
struct intr_config_hook {
TAILQ_ENTRY(intr_config_hook) ich_links;
- void (*ich_func)(void *arg);
- void *ich_arg;
+ ich_func_t ich_func;
+ void *ich_arg;
};
int config_intrhook_establish(struct intr_config_hook *hook);
void config_intrhook_disestablish(struct intr_config_hook *hook);
+void config_intrhook_oneshot(ich_func_t _func, void *_arg);
#endif /* !_SYS_KERNEL_H_*/
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, Jan 19, 3:06 PM (5 h, 35 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27747677
Default Alt Text
D11963.id32012.diff (4 KB)
Attached To
Mode
D11963: Add config_intrhook_oneshot(): schedule an intrhook function and automatically unregister it after it runs.
Attached
Detach File
Event Timeline
Log In to Comment