From: Greg Kroah-Hartman Date: Thu, 14 Jun 2012 22:36:59 +0000 (-0700) Subject: 3.0-stable patches X-Git-Tag: v3.0.35~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=8cb4180023fa05862e8f21573f796e898ee47603;p=thirdparty%2Fkernel%2Fstable-queue.git 3.0-stable patches added patches: mm-fix-faulty-initialization-in-vmalloc_init.patch mm-vmalloc.c-change-void-into-explict-vm_struct.patch --- diff --git a/queue-3.0/mm-fix-faulty-initialization-in-vmalloc_init.patch b/queue-3.0/mm-fix-faulty-initialization-in-vmalloc_init.patch new file mode 100644 index 00000000000..1f781dd4b9b --- /dev/null +++ b/queue-3.0/mm-fix-faulty-initialization-in-vmalloc_init.patch @@ -0,0 +1,49 @@ +From dbda591d920b4c7692725b13e3f68ecb251e9080 Mon Sep 17 00:00:00 2001 +From: KyongHo +Date: Tue, 29 May 2012 15:06:49 -0700 +Subject: mm: fix faulty initialization in vmalloc_init() + +From: KyongHo + +commit dbda591d920b4c7692725b13e3f68ecb251e9080 upstream. + +The transfer of ->flags causes some of the static mapping virtual +addresses to be prematurely freed (before the mapping is removed) because +VM_LAZY_FREE gets "set" if tmp->flags has VM_IOREMAP set. This might +cause subsequent vmalloc/ioremap calls to fail because it might allocate +one of the freed virtual address ranges that aren't unmapped. + +va->flags has different types of flags from tmp->flags. If a region with +VM_IOREMAP set is registered with vm_area_add_early(), it will be removed +by __purge_vmap_area_lazy(). + +Fix vmalloc_init() to correctly initialize vmap_area for the given +vm_struct. + +Also initialise va->vm. If it is not set, find_vm_area() for the early +vm regions will always fail. + +Signed-off-by: KyongHo Cho +Cc: "Olav Haugan" +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + mm/vmalloc.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +--- a/mm/vmalloc.c ++++ b/mm/vmalloc.c +@@ -1174,9 +1174,10 @@ void __init vmalloc_init(void) + /* Import existing vmlist entries. */ + for (tmp = vmlist; tmp; tmp = tmp->next) { + va = kzalloc(sizeof(struct vmap_area), GFP_NOWAIT); +- va->flags = tmp->flags | VM_VM_AREA; ++ va->flags = VM_VM_AREA; + va->va_start = (unsigned long)tmp->addr; + va->va_end = va->va_start + tmp->size; ++ va->vm = tmp; + __insert_vmap_area(va); + } + diff --git a/queue-3.0/mm-vmalloc.c-change-void-into-explict-vm_struct.patch b/queue-3.0/mm-vmalloc.c-change-void-into-explict-vm_struct.patch new file mode 100644 index 00000000000..10e8b83382e --- /dev/null +++ b/queue-3.0/mm-vmalloc.c-change-void-into-explict-vm_struct.patch @@ -0,0 +1,61 @@ +From db1aecafef58b5dda39c4228debe2c845e4a27ab Mon Sep 17 00:00:00 2001 +From: Minchan Kim +Date: Tue, 10 Jan 2012 15:08:39 -0800 +Subject: mm/vmalloc.c: change void* into explict vm_struct* + +From: Minchan Kim + +commit db1aecafef58b5dda39c4228debe2c845e4a27ab upstream. + +vmap_area->private is void* but we don't use the field for various purpose +but use only for vm_struct. So change it to a vm_struct* with naming to +improve for readability and type checking. + +Signed-off-by: Minchan Kim +Acked-by: David Rientjes +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + mm/vmalloc.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +--- a/mm/vmalloc.c ++++ b/mm/vmalloc.c +@@ -256,7 +256,7 @@ struct vmap_area { + struct rb_node rb_node; /* address sorted rbtree */ + struct list_head list; /* address sorted list */ + struct list_head purge_list; /* "lazy purge" list */ +- void *private; ++ struct vm_struct *vm; + struct rcu_head rcu_head; + }; + +@@ -1274,7 +1274,7 @@ static void setup_vmalloc_vm(struct vm_s + vm->addr = (void *)va->va_start; + vm->size = va->va_end - va->va_start; + vm->caller = caller; +- va->private = vm; ++ va->vm = vm; + va->flags |= VM_VM_AREA; + } + +@@ -1397,7 +1397,7 @@ static struct vm_struct *find_vm_area(co + + va = find_vmap_area((unsigned long)addr); + if (va && va->flags & VM_VM_AREA) +- return va->private; ++ return va->vm; + + return NULL; + } +@@ -1416,7 +1416,7 @@ struct vm_struct *remove_vm_area(const v + + va = find_vmap_area((unsigned long)addr); + if (va && va->flags & VM_VM_AREA) { +- struct vm_struct *vm = va->private; ++ struct vm_struct *vm = va->vm; + + if (!(vm->flags & VM_UNLIST)) { + struct vm_struct *tmp, **p; diff --git a/queue-3.0/series b/queue-3.0/series index c2bf561c44c..4c92d33248c 100644 --- a/queue-3.0/series +++ b/queue-3.0/series @@ -15,3 +15,5 @@ iwlwifi-don-t-mess-up-the-scd-when-removing-a-key.patch x86-mce-amd-make-apic-lvt-thresholding-interrupt-optional.patch fuse-fix-stat-call-on-32-bit-platforms.patch e1000-save-skb-counts-in-tx-to-avoid-cache-misses.patch +mm-vmalloc.c-change-void-into-explict-vm_struct.patch +mm-fix-faulty-initialization-in-vmalloc_init.patch