From: "Ted Unangst" Subject: disestablish dohooks To: tech@openbsd.org Date: Tue, 10 Jun 2025 04:48:04 -0400 Unless I've missed something, the only in use remnant of the hooks code is for startup hooks. And never disestablished. So we can burn through one layer of abstraction, and also eliminate one unused function entirely. There's also a collection of man.9 pages. Index: kern/kern_subr.c =================================================================== RCS file: /home/cvs/src/sys/kern/kern_subr.c,v diff -u -p -r1.52 kern_subr.c --- kern/kern_subr.c 31 Jan 2023 15:18:56 -0000 1.52 +++ kern/kern_subr.c 10 Jun 2025 08:44:28 -0000 @@ -262,8 +262,7 @@ struct hook_desc_head startuphook_list = TAILQ_HEAD_INITIALIZER(startuphook_list); void * -hook_establish(struct hook_desc_head *head, int tail, void (*fn)(void *), - void *arg) +startuphook_establish(void (*fn)(void *), void *arg) { struct hook_desc *hdp; @@ -273,53 +272,23 @@ hook_establish(struct hook_desc_head *he hdp->hd_fn = fn; hdp->hd_arg = arg; - if (tail) - TAILQ_INSERT_TAIL(head, hdp, hd_list); - else - TAILQ_INSERT_HEAD(head, hdp, hd_list); + TAILQ_INSERT_TAIL(&startuphook_list, hdp, hd_list); return (hdp); } -void -hook_disestablish(struct hook_desc_head *head, void *vhook) -{ - struct hook_desc *hdp; - -#ifdef DIAGNOSTIC - for (hdp = TAILQ_FIRST(head); hdp != NULL; - hdp = TAILQ_NEXT(hdp, hd_list)) - if (hdp == vhook) - break; - if (hdp == NULL) - return; -#endif - hdp = vhook; - TAILQ_REMOVE(head, hdp, hd_list); - free(hdp, M_DEVBUF, sizeof(*hdp)); -} - /* * Run hooks. Startup hooks are invoked right after scheduler_start but - * before root is mounted. Shutdown hooks are invoked immediately before the - * system is halted or rebooted, i.e. after file systems unmounted, - * after crash dump done, etc. + * before root is mounted. */ void -dohooks(struct hook_desc_head *head, int flags) +dostartuphooks(void) { - struct hook_desc *hdp, *hdp_temp; + struct hook_desc *hdp; - if ((flags & HOOK_REMOVE) == 0) { - TAILQ_FOREACH_SAFE(hdp, head, hd_list, hdp_temp) { - (*hdp->hd_fn)(hdp->hd_arg); - } - } else { - while ((hdp = TAILQ_FIRST(head)) != NULL) { - TAILQ_REMOVE(head, hdp, hd_list); - (*hdp->hd_fn)(hdp->hd_arg); - if ((flags & HOOK_FREE) != 0) - free(hdp, M_DEVBUF, sizeof(*hdp)); - } + while ((hdp = TAILQ_FIRST(&startuphook_list)) != NULL) { + TAILQ_REMOVE(&startuphook_list, hdp, hd_list); + (*hdp->hd_fn)(hdp->hd_arg); + free(hdp, M_DEVBUF, sizeof(*hdp)); } } Index: sys/systm.h =================================================================== RCS file: /home/cvs/src/sys/sys/systm.h,v diff -u -p -r1.173 systm.h --- sys/systm.h 3 Jun 2025 00:20:31 -0000 1.173 +++ sys/systm.h 10 Jun 2025 08:42:55 -0000 @@ -302,18 +302,8 @@ TAILQ_HEAD(hook_desc_head, hook_desc); extern struct hook_desc_head startuphook_list; -void *hook_establish(struct hook_desc_head *, int, void (*)(void *), void *); -void hook_disestablish(struct hook_desc_head *, void *); -void dohooks(struct hook_desc_head *, int); - -#define HOOK_REMOVE 0x01 -#define HOOK_FREE 0x02 - -#define startuphook_establish(fn, arg) \ - hook_establish(&startuphook_list, 1, (fn), (arg)) -#define startuphook_disestablish(vhook) \ - hook_disestablish(&startuphook_list, (vhook)) -#define dostartuphooks() dohooks(&startuphook_list, HOOK_REMOVE|HOOK_FREE) +void *startuphook_establish(void (*)(void *), void *); +void dostartuphooks(void); struct uio; int uiomove(void *, size_t, struct uio *);