mm-vmalloc-fix-align-value-calculation-error-v2
authorzijun_hu <zijun_hu@zoho.com>
Sat, 10 Sep 2016 10:34:03 +0000 (20:34 +1000)
committerStephen Rothwell <sfr@canb.auug.org.au>
Sat, 10 Sep 2016 10:34:03 +0000 (20:34 +1000)
i provide another patch called v2 based on your suggestion as shown below
it have following correction against original patch v1
1) use name get_count_order_long() instead of get_order_long()
2) return -1 if @l == 0 to consist with get_order_long()
3) cast type to int before returning from get_count_order_long()
4) move up function parameter checking for __get_vm_area_node()
5) more commit message is offered to make issue and approach clear
any comments about new patch is welcome

Link: http://lkml.kernel.org/r/57AABC8B.1040409@zoho.com
Signed-off-by: zijun_hu <zijun_hu@htc.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
include/linux/bitops.h
mm/vmalloc.c

index 711d12dcda2f8aa682f17c4f8ed6f18fc324117a..93a07d1827c619a4457493d8f672a5c8cf7601c6 100644 (file)
@@ -75,23 +75,6 @@ static inline int get_count_order(unsigned int count)
        return order;
 }
 
-/**
- * get_count_order_long - get order after rounding @l up to power of 2
- * @l: parameter
- *
- * The same as get_count_order() but accepts a long type parameter
- * or 0 is returned if @l == 0UL
- */
-static inline int get_count_order_long(unsigned long l)
-{
-       if (l == 0UL)
-               return 0;
-       else if (l & (l - 1UL))
-               return fls_long(l);
-       else
-               return fls_long(l) - 1;
-}
-
 static __always_inline unsigned long hweight_long(unsigned long w)
 {
        return sizeof(w) == 4 ? hweight32(w) : hweight64(w);
@@ -208,6 +191,22 @@ static inline unsigned fls_long(unsigned long l)
        return fls64(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
index 08032de13ebefde27b9dccecc15c290cb620f36f..80660a0f989b6371dfa08406de6cd11bfd136382 100644 (file)
@@ -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, get_count_order_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;
This page took 0.028577 seconds and 5 git commands to generate.