On Wed 11-03-20 13:30:24, David Hildenbrand wrote: > Let's use a simple array which we can reuse soon. While at it, move the > string->mmop conversion out of the device hotplug lock. > > Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> > Cc: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> > Cc: Michal Hocko <mhocko@xxxxxxxxxx> > Cc: Oscar Salvador <osalvador@xxxxxxx> > Cc: "Rafael J. Wysocki" <rafael@xxxxxxxxxx> > Cc: Baoquan He <bhe@xxxxxxxxxx> > Cc: Wei Yang <richard.weiyang@xxxxxxxxx> > Signed-off-by: David Hildenbrand <david@xxxxxxxxxx> Acked-by: Michal Hocko <mhocko@xxxxxxxx> > --- > drivers/base/memory.c | 38 +++++++++++++++++++++++--------------- > 1 file changed, 23 insertions(+), 15 deletions(-) > > diff --git a/drivers/base/memory.c b/drivers/base/memory.c > index e7e77cafef80..8a7f29c0bf97 100644 > --- a/drivers/base/memory.c > +++ b/drivers/base/memory.c > @@ -28,6 +28,24 @@ > > #define MEMORY_CLASS_NAME "memory" > > +static const char *const online_type_to_str[] = { > + [MMOP_OFFLINE] = "offline", > + [MMOP_ONLINE] = "online", > + [MMOP_ONLINE_KERNEL] = "online_kernel", > + [MMOP_ONLINE_MOVABLE] = "online_movable", > +}; > + > +static int memhp_online_type_from_str(const char *str) > +{ > + int i; > + > + for (i = 0; i < ARRAY_SIZE(online_type_to_str); i++) { > + if (sysfs_streq(str, online_type_to_str[i])) > + return i; > + } > + return -EINVAL; > +} > + > #define to_memory_block(dev) container_of(dev, struct memory_block, dev) > > static int sections_per_block; > @@ -236,26 +254,17 @@ static int memory_subsys_offline(struct device *dev) > static ssize_t state_store(struct device *dev, struct device_attribute *attr, > const char *buf, size_t count) > { > + const int online_type = memhp_online_type_from_str(buf); > struct memory_block *mem = to_memory_block(dev); > - int ret, online_type; > + int ret; > + > + if (online_type < 0) > + return -EINVAL; > > ret = lock_device_hotplug_sysfs(); > if (ret) > return ret; > > - if (sysfs_streq(buf, "online_kernel")) > - online_type = MMOP_ONLINE_KERNEL; > - else if (sysfs_streq(buf, "online_movable")) > - online_type = MMOP_ONLINE_MOVABLE; > - else if (sysfs_streq(buf, "online")) > - online_type = MMOP_ONLINE; > - else if (sysfs_streq(buf, "offline")) > - online_type = MMOP_OFFLINE; > - else { > - ret = -EINVAL; > - goto err; > - } > - > switch (online_type) { > case MMOP_ONLINE_KERNEL: > case MMOP_ONLINE_MOVABLE: > @@ -271,7 +280,6 @@ static ssize_t state_store(struct device *dev, struct device_attribute *attr, > ret = -EINVAL; /* should never happen */ > } > > -err: > unlock_device_hotplug(); > > if (ret < 0) > -- > 2.24.1 -- Michal Hocko SUSE Labs