Thread (7 messages) 7 messages, 2 authors, 2016-08-10

Re: [PATCH] mm/vmalloc: fix align value calculation error

From: zijun_hu <hidden>
Date: 2016-08-05 15:48:32
Also in: lkml
Subsystem: bitops api, memory management, the rest, vmalloc · Maintainers: Yury Norov, Andrew Morton, Linus Torvalds, Uladzislau Rezki

On 2016/8/5 5:24, Andrew Morton wrote:
quoted
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

it is fixed by handling the specail case manually due to lack of
get_count_order() for long parameter

...
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
@@ -1357,11 +1357,16 @@ static struct vm_struct *__get_vm_area_node(unsigned long size,
 {
 	struct vmap_area *va;
 	struct vm_struct *area;
+	int ioremap_size_order;
 
 	BUG_ON(in_interrupt());
-	if (flags & VM_IOREMAP)
-		align = 1ul << clamp_t(int, fls_long(size),
-				       PAGE_SHIFT, IOREMAP_MAX_ORDER);
+	if (flags & VM_IOREMAP) {
+		ioremap_size_order = fls_long(size);
+		if (is_power_of_2(size) && size != 1)
+			ioremap_size_order--;
+		align = 1ul << clamp_t(int, ioremap_size_order, PAGE_SHIFT,
+				IOREMAP_MAX_ORDER);
+	}
 
 	size = PAGE_ALIGN(size);
 	if (unlikely(!size))
I'm having trouble with this, and a more complete description would
have helped!

As far as I can tell, the current code will decide the following:

size=0x10000: alignment=0x10000
size=0x0f000: alignment=0x8000
no, the current code doesn't achieve the above results as shown below
size=0x10000 -> fls_long(0x10000)=17 -> alignment=0x20000
size=0x0f000 -> fls_long(0x0f000)=16 -> alignment=0x10000
it is wrong for power of 2 value such as size=0x10000
And your patch will change it so that

size=0x10000: alignment=0x8000
size=0x0f000: alignment=0x8000

Correct?
no, my patch will results in the following calculations
size=0x10000: alignment=0x10000
size=0x0f000: alignment=0x10000
If so, I'm struggling to see the sense in this.  Shouldn't we be
changing things so that

size=0x10000: alignment=0x10000
size=0x0f000: alignment=0x10000

?
okay, it is the aim of my patch as explained above
i provide another solution as shown below
i appreciate it since it is more canonical
please help to review and apply it kindly
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help