diff for duplicates of <57AABC8B.1040409@zoho.com> diff --git a/a/1.txt b/N1/1.txt index 441e62b..6a20fec 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -68,3 +68,82 @@ it have following correction against original patch v1 any comments about new patch is welcome this new patch called patch v2 is shown below + +>From 868d3c100f41e16136eed50e47bbfb03d4a16d25 Mon Sep 17 00:00:00 2001 +From: zijun_hu <zijun_hu@htc.com> +Date: Wed, 10 Aug 2016 12:13:41 +0800 +Subject: [PATCH v2 1/1] mm/vmalloc: fix align value calculation error + +it causes double align requirement for __get_vm_area_node() if parameter +size is power of 2 and VM_IOREMAP is set in parameter flags, for example +size=0x10000 -> fls_long(0x10000)=17 -> align=0x20000 + +get_count_order_long() is implemented and used instead of fls_long() for +fixing the bug, for example +size=0x10000 -> get_count_order_long(0x10000)=16 -> align=0x10000 + +Signed-off-by: zijun_hu <zijun_hu@htc.com> +--- + include/linux/bitops.h | 16 ++++++++++++++++ + mm/vmalloc.c | 8 ++++---- + 2 files changed, 20 insertions(+), 4 deletions(-) + +diff --git a/include/linux/bitops.h b/include/linux/bitops.h +index 299e76b..93a07d1 100644 +--- a/include/linux/bitops.h ++++ b/include/linux/bitops.h +@@ -192,6 +192,22 @@ static inline unsigned fls_long(unsigned long l) + } + + /** ++ * get_count_order_long - get order after rounding @l up to power of 2 ++ * @l: parameter ++ * ++ * it is same as get_count_order() but with long type parameter ++ */ ++static inline int get_count_order_long(unsigned long l) ++{ ++ if (l == 0UL) ++ return -1; ++ else if (l & (l - 1UL)) ++ return (int)fls_long(l); ++ else ++ return (int)fls_long(l) - 1; ++} ++ ++/** + * __ffs64 - find first set bit in a 64 bit word + * @word: The 64 bit word + * +diff --git a/mm/vmalloc.c b/mm/vmalloc.c +index 91f44e7..80660a0 100644 +--- a/mm/vmalloc.c ++++ b/mm/vmalloc.c +@@ -1359,14 +1359,14 @@ static struct vm_struct *__get_vm_area_node(unsigned long size, + struct vm_struct *area; + + BUG_ON(in_interrupt()); +- if (flags & VM_IOREMAP) +- align = 1ul << clamp_t(int, fls_long(size), +- PAGE_SHIFT, IOREMAP_MAX_ORDER); +- + size = PAGE_ALIGN(size); + if (unlikely(!size)) + return NULL; + ++ if (flags & VM_IOREMAP) ++ align = 1ul << clamp_t(int, get_count_order_long(size), ++ PAGE_SHIFT, IOREMAP_MAX_ORDER); ++ + area = kzalloc_node(sizeof(*area), gfp_mask & GFP_RECLAIM_MASK, node); + if (unlikely(!area)) + return NULL; +-- +1.9.1 + +> get_count_order() is a weird name and perhaps both of these should be +> renamed to things which actually make sense. That's a separate issue. +> +okay, perhaps, another patch is applied to correct this weird name issue +in the future due to it is a separate issue now +we use get_count_order_long() to consist with get_order_long() now diff --git a/a/content_digest b/N1/content_digest index 650467d..da0ae3b 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -86,6 +86,85 @@ "5) more commit message is offered to make issue and approach clear\n" "any comments about new patch is welcome\n" "\n" - this new patch called patch v2 is shown below + "this new patch called patch v2 is shown below\n" + "\n" + ">From 868d3c100f41e16136eed50e47bbfb03d4a16d25 Mon Sep 17 00:00:00 2001\n" + "From: zijun_hu <zijun_hu@htc.com>\n" + "Date: Wed, 10 Aug 2016 12:13:41 +0800\n" + "Subject: [PATCH v2 1/1] mm/vmalloc: fix align value calculation error\n" + "\n" + "it causes double align requirement for __get_vm_area_node() if parameter\n" + "size is power of 2 and VM_IOREMAP is set in parameter flags, for example\n" + "size=0x10000 -> fls_long(0x10000)=17 -> align=0x20000\n" + "\n" + "get_count_order_long() is implemented and used instead of fls_long() for\n" + "fixing the bug, for example\n" + "size=0x10000 -> get_count_order_long(0x10000)=16 -> align=0x10000\n" + "\n" + "Signed-off-by: zijun_hu <zijun_hu@htc.com>\n" + "---\n" + " include/linux/bitops.h | 16 ++++++++++++++++\n" + " mm/vmalloc.c | 8 ++++----\n" + " 2 files changed, 20 insertions(+), 4 deletions(-)\n" + "\n" + "diff --git a/include/linux/bitops.h b/include/linux/bitops.h\n" + "index 299e76b..93a07d1 100644\n" + "--- a/include/linux/bitops.h\n" + "+++ b/include/linux/bitops.h\n" + "@@ -192,6 +192,22 @@ static inline unsigned fls_long(unsigned long l)\n" + " }\n" + " \n" + " /**\n" + "+ * get_count_order_long - get order after rounding @l up to power of 2\n" + "+ * @l: parameter\n" + "+ *\n" + "+ * it is same as get_count_order() but with long type parameter\n" + "+ */\n" + "+static inline int get_count_order_long(unsigned long l)\n" + "+{\n" + "+\tif (l == 0UL)\n" + "+\t\treturn -1;\n" + "+\telse if (l & (l - 1UL))\n" + "+\t\treturn (int)fls_long(l);\n" + "+\telse\n" + "+\t\treturn (int)fls_long(l) - 1;\n" + "+}\n" + "+\n" + "+/**\n" + " * __ffs64 - find first set bit in a 64 bit word\n" + " * @word: The 64 bit word\n" + " *\n" + "diff --git a/mm/vmalloc.c b/mm/vmalloc.c\n" + "index 91f44e7..80660a0 100644\n" + "--- a/mm/vmalloc.c\n" + "+++ b/mm/vmalloc.c\n" + "@@ -1359,14 +1359,14 @@ static struct vm_struct *__get_vm_area_node(unsigned long size,\n" + " \tstruct vm_struct *area;\n" + " \n" + " \tBUG_ON(in_interrupt());\n" + "-\tif (flags & VM_IOREMAP)\n" + "-\t\talign = 1ul << clamp_t(int, fls_long(size),\n" + "-\t\t\t\t PAGE_SHIFT, IOREMAP_MAX_ORDER);\n" + "-\n" + " \tsize = PAGE_ALIGN(size);\n" + " \tif (unlikely(!size))\n" + " \t\treturn NULL;\n" + " \n" + "+\tif (flags & VM_IOREMAP)\n" + "+\t\talign = 1ul << clamp_t(int, get_count_order_long(size),\n" + "+\t\t\t\t PAGE_SHIFT, IOREMAP_MAX_ORDER);\n" + "+\n" + " \tarea = kzalloc_node(sizeof(*area), gfp_mask & GFP_RECLAIM_MASK, node);\n" + " \tif (unlikely(!area))\n" + " \t\treturn NULL;\n" + "-- \n" + "1.9.1\n" + "\n" + "> get_count_order() is a weird name and perhaps both of these should be\n" + "> renamed to things which actually make sense. That's a separate issue.\n" + "> \n" + "okay, perhaps, another patch is applied to correct this weird name issue\n" + "in the future due to it is a separate issue now\n" + we use get_count_order_long() to consist with get_order_long() now -d36d7f7ff124c0add363b0817d484281eb389366145b03647af79ac8a9e1c018 +6001944f43b87ca54f5def4ba5676a694cf2ae4c11d721552ffb8338dde925a1
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.