Introduce names for ZTHRs
When debugging issues or generally analyzing the runtime of a system it would be nice to be able to tell the different ZTHRs running by name rather than having to analyze their stack. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Matthew Ahrens <mahrens@delphix.com> Co-authored-by: Ryan Moeller <ryan@iXsystems.com> Signed-off-by: Serapheim Dimitropoulos <serapheim@delphix.com> Closes #10630
This commit is contained in:
parent
5678d3f593
commit
843e9ca2e1
|
@ -65,7 +65,7 @@ extern struct proc *zfsproc;
|
||||||
|
|
||||||
static __inline kthread_t *
|
static __inline kthread_t *
|
||||||
do_thread_create(caddr_t stk, size_t stksize, void (*proc)(void *), void *arg,
|
do_thread_create(caddr_t stk, size_t stksize, void (*proc)(void *), void *arg,
|
||||||
size_t len, proc_t *pp, int state, pri_t pri)
|
size_t len, proc_t *pp, int state, pri_t pri, const char *name)
|
||||||
{
|
{
|
||||||
kthread_t *td = NULL;
|
kthread_t *td = NULL;
|
||||||
int error;
|
int error;
|
||||||
|
@ -78,7 +78,7 @@ do_thread_create(caddr_t stk, size_t stksize, void (*proc)(void *), void *arg,
|
||||||
ASSERT(state == TS_RUN);
|
ASSERT(state == TS_RUN);
|
||||||
|
|
||||||
error = kproc_kthread_add(proc, arg, &zfsproc, &td,
|
error = kproc_kthread_add(proc, arg, &zfsproc, &td,
|
||||||
RFSTOPPED, stksize / PAGE_SIZE, "zfskern", "solthread %p", proc);
|
RFSTOPPED, stksize / PAGE_SIZE, "zfskern", "%s", name);
|
||||||
if (error == 0) {
|
if (error == 0) {
|
||||||
thread_lock(td);
|
thread_lock(td);
|
||||||
sched_prio(td, pri);
|
sched_prio(td, pri);
|
||||||
|
@ -90,8 +90,11 @@ do_thread_create(caddr_t stk, size_t stksize, void (*proc)(void *), void *arg,
|
||||||
return (td);
|
return (td);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define thread_create_named(name, stk, stksize, proc, arg, len, \
|
||||||
|
pp, state, pri) \
|
||||||
|
do_thread_create(stk, stksize, proc, arg, len, pp, state, pri, name)
|
||||||
#define thread_create(stk, stksize, proc, arg, len, pp, state, pri) \
|
#define thread_create(stk, stksize, proc, arg, len, pp, state, pri) \
|
||||||
do_thread_create(stk, stksize, proc, arg, len, pp, state, pri)
|
do_thread_create(stk, stksize, proc, arg, len, pp, state, pri, #proc)
|
||||||
#define thread_exit() kthread_exit()
|
#define thread_exit() kthread_exit()
|
||||||
|
|
||||||
int uread(proc_t *, void *, size_t, uintptr_t);
|
int uread(proc_t *, void *, size_t, uintptr_t);
|
||||||
|
|
|
@ -45,6 +45,11 @@
|
||||||
|
|
||||||
typedef void (*thread_func_t)(void *);
|
typedef void (*thread_func_t)(void *);
|
||||||
|
|
||||||
|
#define thread_create_named(name, stk, stksize, func, arg, len, \
|
||||||
|
pp, state, pri) \
|
||||||
|
__thread_create(stk, stksize, (thread_func_t)func, \
|
||||||
|
name, arg, len, pp, state, pri)
|
||||||
|
|
||||||
/* BEGIN CSTYLED */
|
/* BEGIN CSTYLED */
|
||||||
#define thread_create(stk, stksize, func, arg, len, pp, state, pri) \
|
#define thread_create(stk, stksize, func, arg, len, pp, state, pri) \
|
||||||
__thread_create(stk, stksize, (thread_func_t)func, \
|
__thread_create(stk, stksize, (thread_func_t)func, \
|
||||||
|
|
|
@ -218,6 +218,9 @@ typedef pthread_t kthread_t;
|
||||||
#define kpreempt(x) yield()
|
#define kpreempt(x) yield()
|
||||||
#define getcomm() "unknown"
|
#define getcomm() "unknown"
|
||||||
|
|
||||||
|
#define thread_create_named(name, stk, stksize, func, arg, len, \
|
||||||
|
pp, state, pri) \
|
||||||
|
zk_thread_create(func, arg, stksize, state)
|
||||||
#define thread_create(stk, stksize, func, arg, len, pp, state, pri) \
|
#define thread_create(stk, stksize, func, arg, len, pp, state, pri) \
|
||||||
zk_thread_create(func, arg, stksize, state)
|
zk_thread_create(func, arg, stksize, state)
|
||||||
#define thread_exit() pthread_exit(NULL)
|
#define thread_exit() pthread_exit(NULL)
|
||||||
|
|
|
@ -24,10 +24,11 @@ typedef struct zthr zthr_t;
|
||||||
typedef void (zthr_func_t)(void *, zthr_t *);
|
typedef void (zthr_func_t)(void *, zthr_t *);
|
||||||
typedef boolean_t (zthr_checkfunc_t)(void *, zthr_t *);
|
typedef boolean_t (zthr_checkfunc_t)(void *, zthr_t *);
|
||||||
|
|
||||||
extern zthr_t *zthr_create(zthr_checkfunc_t checkfunc,
|
extern zthr_t *zthr_create(const char *zthr_name,
|
||||||
zthr_func_t *func, void *arg);
|
zthr_checkfunc_t checkfunc, zthr_func_t *func, void *arg);
|
||||||
extern zthr_t *zthr_create_timer(zthr_checkfunc_t *checkfunc,
|
extern zthr_t *zthr_create_timer(const char *zthr_name,
|
||||||
zthr_func_t *func, void *arg, hrtime_t nano_wait);
|
zthr_checkfunc_t *checkfunc, zthr_func_t *func, void *arg,
|
||||||
|
hrtime_t nano_wait);
|
||||||
extern void zthr_destroy(zthr_t *t);
|
extern void zthr_destroy(zthr_t *t);
|
||||||
|
|
||||||
extern void zthr_wakeup(zthr_t *t);
|
extern void zthr_wakeup(zthr_t *t);
|
||||||
|
|
|
@ -7339,10 +7339,10 @@ arc_init(void)
|
||||||
kstat_install(arc_ksp);
|
kstat_install(arc_ksp);
|
||||||
}
|
}
|
||||||
|
|
||||||
arc_evict_zthr = zthr_create_timer(arc_evict_cb_check,
|
arc_evict_zthr = zthr_create_timer("arc_evict",
|
||||||
arc_evict_cb, NULL, SEC2NSEC(1));
|
arc_evict_cb_check, arc_evict_cb, NULL, SEC2NSEC(1));
|
||||||
arc_reap_zthr = zthr_create_timer(arc_reap_cb_check,
|
arc_reap_zthr = zthr_create_timer("arc_reap",
|
||||||
arc_reap_cb, NULL, SEC2NSEC(1));
|
arc_reap_cb_check, arc_reap_cb, NULL, SEC2NSEC(1));
|
||||||
|
|
||||||
arc_warm = B_FALSE;
|
arc_warm = B_FALSE;
|
||||||
|
|
||||||
|
|
|
@ -2548,7 +2548,8 @@ static void
|
||||||
spa_start_livelist_destroy_thread(spa_t *spa)
|
spa_start_livelist_destroy_thread(spa_t *spa)
|
||||||
{
|
{
|
||||||
ASSERT3P(spa->spa_livelist_delete_zthr, ==, NULL);
|
ASSERT3P(spa->spa_livelist_delete_zthr, ==, NULL);
|
||||||
spa->spa_livelist_delete_zthr = zthr_create(
|
spa->spa_livelist_delete_zthr =
|
||||||
|
zthr_create("z_livelist_destroy",
|
||||||
spa_livelist_delete_cb_check, spa_livelist_delete_cb, spa);
|
spa_livelist_delete_cb_check, spa_livelist_delete_cb, spa);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2755,8 +2756,10 @@ spa_start_livelist_condensing_thread(spa_t *spa)
|
||||||
spa->spa_to_condense.cancelled = B_FALSE;
|
spa->spa_to_condense.cancelled = B_FALSE;
|
||||||
|
|
||||||
ASSERT3P(spa->spa_livelist_condense_zthr, ==, NULL);
|
ASSERT3P(spa->spa_livelist_condense_zthr, ==, NULL);
|
||||||
spa->spa_livelist_condense_zthr = zthr_create(
|
spa->spa_livelist_condense_zthr =
|
||||||
spa_livelist_condense_cb_check, spa_livelist_condense_cb, spa);
|
zthr_create("z_livelist_condense",
|
||||||
|
spa_livelist_condense_cb_check,
|
||||||
|
spa_livelist_condense_cb, spa);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -2772,7 +2775,8 @@ spa_spawn_aux_threads(spa_t *spa)
|
||||||
|
|
||||||
ASSERT3P(spa->spa_checkpoint_discard_zthr, ==, NULL);
|
ASSERT3P(spa->spa_checkpoint_discard_zthr, ==, NULL);
|
||||||
spa->spa_checkpoint_discard_zthr =
|
spa->spa_checkpoint_discard_zthr =
|
||||||
zthr_create(spa_checkpoint_discard_thread_check,
|
zthr_create("z_checkpoint_discard",
|
||||||
|
spa_checkpoint_discard_thread_check,
|
||||||
spa_checkpoint_discard_thread, spa);
|
spa_checkpoint_discard_thread, spa);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -884,7 +884,8 @@ void
|
||||||
spa_start_indirect_condensing_thread(spa_t *spa)
|
spa_start_indirect_condensing_thread(spa_t *spa)
|
||||||
{
|
{
|
||||||
ASSERT3P(spa->spa_condense_zthr, ==, NULL);
|
ASSERT3P(spa->spa_condense_zthr, ==, NULL);
|
||||||
spa->spa_condense_zthr = zthr_create(spa_condense_indirect_thread_check,
|
spa->spa_condense_zthr = zthr_create("z_indirect_condense",
|
||||||
|
spa_condense_indirect_thread_check,
|
||||||
spa_condense_indirect_thread, spa);
|
spa_condense_indirect_thread, spa);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2017, 2019 by Delphix. All rights reserved.
|
* Copyright (c) 2017, 2020 by Delphix. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -269,9 +269,11 @@ zthr_procedure(void *arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
zthr_t *
|
zthr_t *
|
||||||
zthr_create(zthr_checkfunc_t *checkfunc, zthr_func_t *func, void *arg)
|
zthr_create(const char *zthr_name, zthr_checkfunc_t *checkfunc,
|
||||||
|
zthr_func_t *func, void *arg)
|
||||||
{
|
{
|
||||||
return (zthr_create_timer(checkfunc, func, arg, (hrtime_t)0));
|
return (zthr_create_timer(zthr_name, checkfunc,
|
||||||
|
func, arg, (hrtime_t)0));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -280,8 +282,8 @@ zthr_create(zthr_checkfunc_t *checkfunc, zthr_func_t *func, void *arg)
|
||||||
* start working if required) will be triggered.
|
* start working if required) will be triggered.
|
||||||
*/
|
*/
|
||||||
zthr_t *
|
zthr_t *
|
||||||
zthr_create_timer(zthr_checkfunc_t *checkfunc, zthr_func_t *func,
|
zthr_create_timer(const char *zthr_name, zthr_checkfunc_t *checkfunc,
|
||||||
void *arg, hrtime_t max_sleep)
|
zthr_func_t *func, void *arg, hrtime_t max_sleep)
|
||||||
{
|
{
|
||||||
zthr_t *t = kmem_zalloc(sizeof (*t), KM_SLEEP);
|
zthr_t *t = kmem_zalloc(sizeof (*t), KM_SLEEP);
|
||||||
mutex_init(&t->zthr_state_lock, NULL, MUTEX_DEFAULT, NULL);
|
mutex_init(&t->zthr_state_lock, NULL, MUTEX_DEFAULT, NULL);
|
||||||
|
@ -295,8 +297,9 @@ zthr_create_timer(zthr_checkfunc_t *checkfunc, zthr_func_t *func,
|
||||||
t->zthr_arg = arg;
|
t->zthr_arg = arg;
|
||||||
t->zthr_sleep_timeout = max_sleep;
|
t->zthr_sleep_timeout = max_sleep;
|
||||||
|
|
||||||
t->zthr_thread = thread_create(NULL, 0, zthr_procedure, t,
|
t->zthr_thread = thread_create_named(zthr_name, NULL, 0,
|
||||||
0, &p0, TS_RUN, minclsyspri);
|
zthr_procedure, t, 0, &p0, TS_RUN, minclsyspri);
|
||||||
|
|
||||||
mutex_exit(&t->zthr_state_lock);
|
mutex_exit(&t->zthr_state_lock);
|
||||||
|
|
||||||
return (t);
|
return (t);
|
||||||
|
|
Loading…
Reference in New Issue