On Fri, Dec 06, 2019 at 05:24:19PM +0100, Thomas Renninger wrote: > --- /dev/null > +++ b/drivers/base/cpuinfo.c > @@ -0,0 +1,48 @@ > +/* > + * Copyright (C) 2017 SUSE Linux GmbH > + * Written by: Felix Schnizlein <fschnizlein@xxxxxxxx> > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License version > + * 2 as published by the Free Software Foundation. > + * > + * This program is distributed in the hope that it will be useful, but > + * WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * General Public License for more details. > + * > + */ No SPDX line? And you can drop the license boilerplate text as well too. > + > +#include <linux/cpu.h> > +#include <linux/module.h> > +#include <linux/cpuinfo.h> > + > +static struct attribute_group cpuinfo_attr_group = { > + .attrs = cpuinfo_attrs, > + .name = "info" > +}; > + > +static int cpuinfo_add_dev(unsigned int cpu) > +{ > + struct device *dev = get_cpu_device(cpu); > + > + return sysfs_create_group(&dev->kobj, &cpuinfo_attr_group); Why are a set of attributes being added _after_ the device is created? We have fixed up a lot of the "default attribute" logic since 2017, perhaps you should be using that instead? > +} > + > +static int cpuinfo_remove_dev(unsigned int cpu) > +{ > + struct device *dev = get_cpu_device(cpu); > + > + sysfs_remove_group(&dev->kobj, &cpuinfo_attr_group); Same here, I don't think this is needed. > + return 0; > +} > + > +static int cpuinfo_sysfs_init(void) > +{ > + return cpuhp_setup_state(CPUHP_CPUINFO_PREPARE, > + "base/cpuinfo:prepare", > + cpuinfo_add_dev, > + cpuinfo_remove_dev); > +} > + > +device_initcall(cpuinfo_sysfs_init); > diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h > index e51ee772b9f5..2c4c59304bdb 100644 > --- a/include/linux/cpuhotplug.h > +++ b/include/linux/cpuhotplug.h > @@ -78,6 +78,7 @@ enum cpuhp_state { > CPUHP_SH_SH3X_PREPARE, > CPUHP_NET_FLOW_PREPARE, > CPUHP_TOPOLOGY_PREPARE, > + CPUHP_CPUINFO_PREPARE, > CPUHP_NET_IUCV_PREPARE, > CPUHP_ARM_BL_PREPARE, > CPUHP_TRACE_RB_PREPARE, > diff --git a/include/linux/cpuinfo.h b/include/linux/cpuinfo.h > new file mode 100644 > index 000000000000..112ff76d64d5 > --- /dev/null > +++ b/include/linux/cpuinfo.h > @@ -0,0 +1,43 @@ > +/* > + * Copyright (C) 2017 SUSE Linux GmbH > + * Written by: Felix Schnizlein <fschnizlein@xxxxxxxx> > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License version > + * 2 as published by the Free Software Foundation. > + * > + * This program is distributed in the hope that it will be useful, but > + * WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * General Public License for more details. SPDX and boilerplate. > + */ > +#ifndef _LINUX_CPUINFO_H > +#define _LINUX_CPUINFO_H > + > +#ifdef CONFIG_HAVE_CPUINFO_SYSFS > +extern struct attribute *cpuinfo_attrs[]; No need for thie #ifdef really, right? thanks, greg k-h