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 <gre...@linuxfoundation.org>
> Cc: Andrew Morton <a...@linux-foundation.org>
> Cc: Michal Hocko <mho...@kernel.org>
> Cc: Oscar Salvador <osalva...@suse.de>
> Cc: "Rafael J. Wysocki" <raf...@kernel.org>
> Cc: Baoquan He <b...@redhat.com>
> Cc: Wei Yang <richard.weiy...@gmail.com>
> Signed-off-by: David Hildenbrand <da...@redhat.com>

Acked-by: Michal Hocko <mho...@suse.com>

> ---
>  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

Reply via email to