From 49c18327bd588565c1ffdbde34d334fc57ffe43a Mon Sep 17 00:00:00 2001 From: Mateusz Guzik Date: Sun, 14 Aug 2022 17:39:35 +0000 Subject: [PATCH 1/7] Switch thread eventhandlers to the new API --- .../opensolaris/uts/common/dtrace/fasttrap.c | 12 ++++++------ sys/compat/linuxkpi/common/src/linux_current.c | 10 ++++------ sys/kern/init_main.c | 4 ++-- sys/kern/kern_kcov.c | 5 ++--- sys/kern/kern_proc.c | 4 ++-- sys/kern/kern_thread.c | 18 +++++++++--------- sys/sys/eventhandler.h | 9 --------- sys/sys/proc.h | 6 +++--- 8 files changed, 28 insertions(+), 40 deletions(-) diff --git a/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c b/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c index 04ef3ecc3e8d..b25dcc4c1b4b 100644 --- a/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c +++ b/sys/cddl/contrib/opensolaris/uts/common/dtrace/fasttrap.c @@ -222,7 +222,7 @@ static fasttrap_proc_t *fasttrap_proc_lookup(pid_t); static void fasttrap_proc_release(fasttrap_proc_t *); #ifndef illumos -static void fasttrap_thread_dtor(void *, struct thread *); +static void fasttrap_thread_dtor(void *); #endif #define FASTTRAP_PROVS_INDEX(pid, name) \ @@ -232,7 +232,6 @@ static void fasttrap_thread_dtor(void *, struct thread *); #ifndef illumos struct rmlock fasttrap_tp_lock; -static eventhandler_tag fasttrap_thread_dtor_tag; #endif static unsigned long tpoints_hash_size = FASTTRAP_TPOINTS_DEFAULT_SIZE; @@ -383,13 +382,15 @@ fasttrap_scraddr(struct thread *td, fasttrap_proc_t *fprc) * free list. */ static void -fasttrap_thread_dtor(void *arg __unused, struct thread *td) +fasttrap_thread_dtor(void *arg) { fasttrap_bucket_t *bucket; fasttrap_proc_t *fprc; fasttrap_scrspace_t *scrspc; pid_t pid; + struct thread *td; + td = arg; if (td->t_dtrace_sscr == NULL) return; @@ -2501,8 +2502,7 @@ fasttrap_load(void) * This event handler must run before kdtrace_thread_dtor() since it * accesses the thread's struct kdtrace_thread. */ - fasttrap_thread_dtor_tag = EVENTHANDLER_REGISTER(thread_dtor, - fasttrap_thread_dtor, NULL, EVENTHANDLER_PRI_FIRST); + EVENTHANDLER_SLEEPABLE_REGISTER(thread_dtor, fasttrap_thread_dtor, FIRST); #endif /* @@ -2604,7 +2604,7 @@ fasttrap_unload(void) #endif #ifndef illumos - EVENTHANDLER_DEREGISTER(thread_dtor, fasttrap_thread_dtor_tag); + EVENTHANDLER_SLEEPABLE_DEREGISTER(thread_dtor, fasttrap_thread_dtor); for (i = 0; i < fasttrap_tpoints.fth_nent; i++) mutex_destroy(&fasttrap_tpoints.fth_table[i].ftb_mtx); diff --git a/sys/compat/linuxkpi/common/src/linux_current.c b/sys/compat/linuxkpi/common/src/linux_current.c index 925d96770cc2..c1dd3f9d8e7e 100644 --- a/sys/compat/linuxkpi/common/src/linux_current.c +++ b/sys/compat/linuxkpi/common/src/linux_current.c @@ -43,8 +43,6 @@ __FBSDID("$FreeBSD$"); extern u_int first_msi_irq, num_msi_irqs; #endif -static eventhandler_tag linuxkpi_thread_dtor_tag; - static uma_zone_t linux_current_zone; static uma_zone_t linux_mm_zone; @@ -176,9 +174,10 @@ linux_free_current(struct task_struct *ts) } static void -linuxkpi_thread_dtor(void *arg __unused, struct thread *td) +linuxkpi_thread_dtor(void *arg) { struct task_struct *ts; + struct thread *td = arg; ts = td->td_lkpi_task; if (ts == NULL) @@ -297,8 +296,7 @@ linux_current_init(void *arg __unused) atomic_thread_fence_seq_cst(); - linuxkpi_thread_dtor_tag = EVENTHANDLER_REGISTER(thread_dtor, - linuxkpi_thread_dtor, NULL, EVENTHANDLER_PRI_ANY); + EVENTHANDLER_SLEEPABLE_REGISTER(thread_dtor, linuxkpi_thread_dtor, ANY); lkpi_alloc_current = linux_alloc_current; } SYSINIT(linux_current, SI_SUB_EVENTHANDLER, SI_ORDER_SECOND, @@ -330,7 +328,7 @@ linux_current_uninit(void *arg __unused) thread_reap_barrier(); - EVENTHANDLER_DEREGISTER(thread_dtor, linuxkpi_thread_dtor_tag); + EVENTHANDLER_SLEEPABLE_DEREGISTER(thread_dtor, linuxkpi_thread_dtor); uma_zdestroy(linux_current_zone); uma_zdestroy(linux_mm_zone); diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c index 1974c4e68ce4..739114c6bd3d 100644 --- a/sys/kern/init_main.c +++ b/sys/kern/init_main.c @@ -622,13 +622,13 @@ proc0_init(void *dummy __unused) * to do this until all other structures are fairly sane. */ EVENTHANDLER_DIRECT_INVOKE(process_init, p); - EVENTHANDLER_DIRECT_INVOKE(thread_init, td); + EVENTHANDLER_SLEEPABLE_INVOKE(thread_init, td); #ifdef KDTRACE_HOOKS kdtrace_proc_ctor(p); kdtrace_thread_ctor(td); #endif EVENTHANDLER_DIRECT_INVOKE(process_ctor, p); - EVENTHANDLER_DIRECT_INVOKE(thread_ctor, td); + EVENTHANDLER_SLEEPABLE_INVOKE(thread_ctor, td); /* * Charge root for one process. diff --git a/sys/kern/kern_kcov.c b/sys/kern/kern_kcov.c index 287071e8ac3a..0135edf3c44b 100644 --- a/sys/kern/kern_kcov.c +++ b/sys/kern/kern_kcov.c @@ -516,7 +516,7 @@ kcov_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int fflag __unused, } static void -kcov_thread_dtor(void *arg __unused, struct thread *td) +kcov_thread_dtor(struct thread *td) { struct kcov_info *info; @@ -575,8 +575,7 @@ kcov_init(const void *unused) return; } - EVENTHANDLER_REGISTER(thread_dtor, kcov_thread_dtor, NULL, - EVENTHANDLER_PRI_ANY); + EVENTHANDLER_SLEEPABLE_REGISTER(thread_dtor, kcov_thread_dtor, ANY); } SYSINIT(kcovdev, SI_SUB_LAST, SI_ORDER_ANY, kcov_init, NULL); diff --git a/sys/kern/kern_proc.c b/sys/kern/kern_proc.c index 3983e536e70e..62e888500e1a 100644 --- a/sys/kern/kern_proc.c +++ b/sys/kern/kern_proc.c @@ -221,7 +221,7 @@ proc_ctor(void *mem, int size, void *arg, int flags) td = FIRST_THREAD_IN_PROC(p); if (td != NULL) { /* Make sure all thread constructors are executed */ - EVENTHANDLER_DIRECT_INVOKE(thread_ctor, td); + EVENTHANDLER_SLEEPABLE_INVOKE(thread_ctor, td); } return (0); } @@ -249,7 +249,7 @@ proc_dtor(void *mem, int size, void *arg) ast_kclear(td); /* Make sure all thread destructors are executed */ - EVENTHANDLER_DIRECT_INVOKE(thread_dtor, td); + EVENTHANDLER_SLEEPABLE_INVOKE(thread_dtor, td); } EVENTHANDLER_DIRECT_INVOKE(process_dtor, p); #ifdef KDTRACE_HOOKS diff --git a/sys/kern/kern_thread.c b/sys/kern/kern_thread.c index 39bda326dc0d..95f573197b51 100644 --- a/sys/kern/kern_thread.c +++ b/sys/kern/kern_thread.c @@ -170,10 +170,10 @@ static struct rwlock *tidhashtbl_lock; #define TIDHASH(tid) (&tidhashtbl[(tid) & tidhash]) #define TIDHASHLOCK(tid) (&tidhashtbl_lock[(tid) & tidhashlock]) -EVENTHANDLER_LIST_DEFINE(thread_ctor); -EVENTHANDLER_LIST_DEFINE(thread_dtor); -EVENTHANDLER_LIST_DEFINE(thread_init); -EVENTHANDLER_LIST_DEFINE(thread_fini); +EVENTHANDLER_SLEEPABLE_DEFINE(thread_ctor); +EVENTHANDLER_SLEEPABLE_DEFINE(thread_dtor); +EVENTHANDLER_SLEEPABLE_DEFINE(thread_init); +EVENTHANDLER_SLEEPABLE_DEFINE(thread_fini); static bool thread_count_inc_try(void) @@ -424,7 +424,7 @@ thread_init(void *mem, int size, int flags) td->td_sleepqueue = sleepq_alloc(); td->td_turnstile = turnstile_alloc(); td->td_rlqe = NULL; - EVENTHANDLER_DIRECT_INVOKE(thread_init, td); + EVENTHANDLER_SLEEPABLE_INVOKE(thread_init, td); umtx_thread_init(td); td->td_kstack = 0; td->td_sel = NULL; @@ -440,7 +440,7 @@ thread_fini(void *mem, int size) struct thread *td; td = (struct thread *)mem; - EVENTHANDLER_DIRECT_INVOKE(thread_fini, td); + EVENTHANDLER_SLEEPABLE_INVOKE(thread_fini, td); rlqentry_free(td->td_rlqe); turnstile_free(td->td_turnstile); sleepq_free(td->td_sleepqueue); @@ -630,7 +630,7 @@ thread_reap_domain(struct thread_domain_data *tdd) while (itd != NULL) { ntd = itd->td_zombie; - EVENTHANDLER_DIRECT_INVOKE(thread_dtor, itd); + EVENTHANDLER_SLEEPABLE_INVOKE(thread_dtor, itd); tidbatch_add(&tidbatch, itd); credbatch_add(&credbatch, itd); MPASS(itd->td_limit != NULL); @@ -780,7 +780,7 @@ thread_alloc(int pages) bzero(&td->td_sa.args, sizeof(td->td_sa.args)); kmsan_thread_alloc(td); cpu_thread_alloc(td); - EVENTHANDLER_DIRECT_INVOKE(thread_ctor, td); + EVENTHANDLER_SLEEPABLE_INVOKE(thread_ctor, td); return (td); } @@ -824,7 +824,7 @@ thread_free(struct thread *td) { lwpid_t tid; - EVENTHANDLER_DIRECT_INVOKE(thread_dtor, td); + EVENTHANDLER_SLEEPABLE_INVOKE(thread_dtor, td); tid = td->td_tid; thread_free_batched(td); tid_free(tid); diff --git a/sys/sys/eventhandler.h b/sys/sys/eventhandler.h index 6abf450ac020..d09c85651c58 100644 --- a/sys/sys/eventhandler.h +++ b/sys/sys/eventhandler.h @@ -266,15 +266,6 @@ EVENTHANDLER_DECLARE(app_coredump_progress, app_coredump_progress_fn); EVENTHANDLER_DECLARE(app_coredump_finish, app_coredump_finish_fn); EVENTHANDLER_DECLARE(app_coredump_error, app_coredump_error_fn); -typedef void (*thread_ctor_fn)(void *, struct thread *); -typedef void (*thread_dtor_fn)(void *, struct thread *); -typedef void (*thread_fini_fn)(void *, struct thread *); -typedef void (*thread_init_fn)(void *, struct thread *); -EVENTHANDLER_DECLARE(thread_ctor, thread_ctor_fn); -EVENTHANDLER_DECLARE(thread_dtor, thread_dtor_fn); -EVENTHANDLER_DECLARE(thread_init, thread_init_fn); -EVENTHANDLER_DECLARE(thread_fini, thread_fini_fn); - typedef void (*uma_zone_chfn)(void *); EVENTHANDLER_DECLARE(nmbclusters_change, uma_zone_chfn); EVENTHANDLER_DECLARE(nmbufs_change, uma_zone_chfn); diff --git a/sys/sys/proc.h b/sys/sys/proc.h index fb1553539b1c..36091db679d1 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -1354,9 +1354,9 @@ EVENTHANDLER_LIST_DECLARE(process_exit); EVENTHANDLER_LIST_DECLARE(process_fork); EVENTHANDLER_LIST_DECLARE(process_exec); -EVENTHANDLER_LIST_DECLARE(thread_ctor); -EVENTHANDLER_LIST_DECLARE(thread_dtor); -EVENTHANDLER_LIST_DECLARE(thread_init); +EVENTHANDLER_SLEEPABLE_DECLARE(thread_ctor); +EVENTHANDLER_SLEEPABLE_DECLARE(thread_dtor); +EVENTHANDLER_SLEEPABLE_DECLARE(thread_init); #endif /* _KERNEL */ -- 2.34.1