On Mon, Jun 07, 2021 at 10:17:14AM +1000, Dave Chinner wrote: > > From: Dave Chinner <dchinner@xxxxxxxxxx> > > We need to move to per-cpu state for CIL tracking, but to do that we > need to handle CPUs being removed from the system by the hot-plug > code. Introduce generic XFS infrastructure to handle CPU hotplug > events that is set up at module init time and torn down at module > exit time. > > Initially, the CIL only needs CPU dead notifications, so we only set > up a callback for these notifications. The infrastructure can be > updated in future for CPU add notifications easily if every needed. > > Signed-off-by: Dave Chinner <dchinner@xxxxxxxxxx> Looks good, Reviewed-by: Darrick J. Wong <djwong@xxxxxxxxxx> --D > --- > fs/xfs/xfs_super.c | 38 +++++++++++++++++++++++++++++++++++++- > include/linux/cpuhotplug.h | 1 + > 2 files changed, 38 insertions(+), 1 deletion(-) > > diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c > index 017ba9c24c2d..0146d3c89da9 100644 > --- a/fs/xfs/xfs_super.c > +++ b/fs/xfs/xfs_super.c > @@ -2123,6 +2123,35 @@ xfs_destroy_workqueues(void) > destroy_workqueue(xfs_alloc_wq); > } > > +static int > +xfs_cpu_dead( > + unsigned int cpu) > +{ > + return 0; > +} > + > +static int __init > +xfs_cpu_hotplug_init(void) > +{ > + int error; > + > + error = cpuhp_setup_state_nocalls(CPUHP_XFS_DEAD, > + "xfs:dead", NULL, > + xfs_cpu_dead); > + if (error < 0) { > + xfs_alert(NULL, > +"Failed to initialise CPU hotplug, error %d. XFS is non-functional.", > + error); > + } > + return error; > +} > + > +static void > +xfs_cpu_hotplug_destroy(void) > +{ > + cpuhp_remove_state_nocalls(CPUHP_XFS_DEAD); > +} > + > STATIC int __init > init_xfs_fs(void) > { > @@ -2135,10 +2164,14 @@ init_xfs_fs(void) > > xfs_dir_startup(); > > - error = xfs_init_zones(); > + error = xfs_cpu_hotplug_init(); > if (error) > goto out; > > + error = xfs_init_zones(); > + if (error) > + goto out_destroy_hp; > + > error = xfs_init_workqueues(); > if (error) > goto out_destroy_zones; > @@ -2218,6 +2251,8 @@ init_xfs_fs(void) > xfs_destroy_workqueues(); > out_destroy_zones: > xfs_destroy_zones(); > + out_destroy_hp: > + xfs_cpu_hotplug_destroy(); > out: > return error; > } > @@ -2240,6 +2275,7 @@ exit_xfs_fs(void) > xfs_destroy_workqueues(); > xfs_destroy_zones(); > xfs_uuid_table_free(); > + xfs_cpu_hotplug_destroy(); > } > > module_init(init_xfs_fs); > diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h > index 4a62b3980642..bf8f29ad9bf8 100644 > --- a/include/linux/cpuhotplug.h > +++ b/include/linux/cpuhotplug.h > @@ -52,6 +52,7 @@ enum cpuhp_state { > CPUHP_FS_BUFF_DEAD, > CPUHP_PRINTK_DEAD, > CPUHP_MM_MEMCQ_DEAD, > + CPUHP_XFS_DEAD, > CPUHP_PERCPU_CNT_DEAD, > CPUHP_RADIX_DEAD, > CPUHP_PAGE_ALLOC_DEAD,