On Wed, Mar 11, 2020 at 02:20:02PM +0000, Wei Yang wrote: >On Wed, Mar 11, 2020 at 01:30:24PM +0100, 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> Ok, I got the reason. Reviewed-by: Wei Yang <richard.weiyang@xxxxxxxxx> >>--- >> 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); > >In your following patch, you did the same conversion. Is it possible to merge >them into this one? > >> 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 > >-- >Wei Yang >Help you, Help me -- Wei Yang Help you, Help me