Page MenuHomeFreeBSD

D11963.id32012.diff
No OneTemporary

D11963.id32012.diff

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

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)

Event Timeline