Skip to content

Commit

Permalink
FreeBSD: Do zcommon_init sooner to avoid FPU panic
Browse files Browse the repository at this point in the history
There has been a panic affecting some system configurations where the
thread FPU context is disturbed during the fletcher 4 benchmarks,
leading to a panic at boot.

module_init() registers zcommon_init to run in the last subsystem
(SI_SUB_LAST).  Running it as soon as interrupts have been configured
(SI_SUB_INT_CONFIG_HOOKS) makes sure we have finished the benchmarks
before we start doing other things.

While it's not clear *how* the FPU context was being disturbed, this
does seem to avoid it.

Add a module_init_early() macro to run zcommon_init() at this earlier
point on FreeBSD.  On Linux this is defined as module_init().

Authored by: Konstantin Belousov <kib@FreeBSD.org>
Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov>
Signed-off-by: Ryan Moeller <ryan@iXsystems.com>
Closes #11302
  • Loading branch information
Ryan Moeller committed Dec 10, 2020
1 parent b9916b4 commit e071625
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 1 deletion.
7 changes: 7 additions & 0 deletions include/os/freebsd/spl/sys/mod_os.h
Expand Up @@ -93,6 +93,13 @@ wrap_ ## fn(void *dummy __unused) \
} \
SYSINIT(zfs_ ## fn, SI_SUB_LAST, SI_ORDER_FIRST, wrap_ ## fn, NULL)

#define module_init_early(fn) \
static void \
wrap_ ## fn(void *dummy __unused) \
{ \
fn(); \
} \
SYSINIT(zfs_ ## fn, SI_SUB_INT_CONFIG_HOOKS, SI_ORDER_FIRST, wrap_ ## fn, NULL)

#define module_exit(fn) \
static void \
Expand Down
2 changes: 2 additions & 0 deletions include/os/linux/kernel/linux/mod_compat.h
Expand Up @@ -151,4 +151,6 @@ enum scope_prefix_types {
#define ZFS_MODULE_LICENSE(s) MODULE_LICENSE(s)
#define ZFS_MODULE_VERSION(s) MODULE_VERSION(s)

#define module_init_early(fn) module_init(fn)

#endif /* _MOD_COMPAT_H */
2 changes: 1 addition & 1 deletion module/zcommon/zfs_prop.c
Expand Up @@ -1016,7 +1016,7 @@ zcommon_fini(void)
kfpu_fini();
}

module_init(zcommon_init);
module_init_early(zcommon_init);
module_exit(zcommon_fini);

#endif
Expand Down

0 comments on commit e071625

Please sign in to comment.