git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Revert "net: validate variable length ll headers"
[pandora-kernel.git]
/
mm
/
vmalloc.c
diff --git
a/mm/vmalloc.c
b/mm/vmalloc.c
index
1d8b32f
..
1431458
100644
(file)
--- 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 */
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;
};
struct rcu_head rcu_head;
};
@@
-349,6
+349,12
@@
static struct vmap_area *alloc_vmap_area(unsigned long size,
if (unlikely(!va))
return ERR_PTR(-ENOMEM);
if (unlikely(!va))
return ERR_PTR(-ENOMEM);
+ /*
+ * Only scan the relevant parts containing pointers to other objects
+ * to avoid false negatives.
+ */
+ kmemleak_scan_area(&va->rb_node, SIZE_MAX, gfp_mask & GFP_RECLAIM_MASK);
+
retry:
spin_lock(&vmap_area_lock);
/*
retry:
spin_lock(&vmap_area_lock);
/*
@@
-1160,9
+1166,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);
/* 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->va_start = (unsigned long)tmp->addr;
va->va_end = va->va_start + tmp->size;
+ va->vm = tmp;
__insert_vmap_area(va);
}
__insert_vmap_area(va);
}
@@
-1260,7
+1267,7
@@
static void setup_vmalloc_vm(struct vm_struct *vm, struct vmap_area *va,
vm->addr = (void *)va->va_start;
vm->size = va->va_end - va->va_start;
vm->caller = caller;
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;
}
va->flags |= VM_VM_AREA;
}
@@
-1290,7
+1297,7
@@
static struct vm_struct *__get_vm_area_node(unsigned long size,
unsigned long align, unsigned long flags, unsigned long start,
unsigned long end, int node, gfp_t gfp_mask, void *caller)
{
unsigned long align, unsigned long flags, unsigned long start,
unsigned long end, int node, gfp_t gfp_mask, void *caller)
{
- st
atic st
ruct vmap_area *va;
+ struct vmap_area *va;
struct vm_struct *area;
BUG_ON(in_interrupt());
struct vm_struct *area;
BUG_ON(in_interrupt());
@@
-1383,7
+1390,7
@@
static struct vm_struct *find_vm_area(const void *addr)
va = find_vmap_area((unsigned long)addr);
if (va && va->flags & VM_VM_AREA)
va = find_vmap_area((unsigned long)addr);
if (va && va->flags & VM_VM_AREA)
- return va->
private
;
+ return va->
vm
;
return NULL;
}
return NULL;
}
@@
-1402,7
+1409,7
@@
struct vm_struct *remove_vm_area(const void *addr)
va = find_vmap_area((unsigned long)addr);
if (va && va->flags & VM_VM_AREA) {
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;
if (!(vm->flags & VM_UNLIST)) {
struct vm_struct *tmp, **p;
@@
-1643,11
+1650,11
@@
void *__vmalloc_node_range(unsigned long size, unsigned long align,
insert_vmalloc_vmlist(area);
/*
insert_vmalloc_vmlist(area);
/*
- * A ref_count =
3 is needed because the vm_struct and vmap_area
- *
structures allocated in the __get_vm_area_node() function contain
- *
references to the virtual address of
the vmalloc'ed block.
+ * A ref_count =
2 is needed because vm_struct allocated in
+ *
__get_vm_area_node() contains a reference to the virtual address of
+ * the vmalloc'ed block.
*/
*/
- kmemleak_alloc(addr, real_size,
3
, gfp_mask);
+ kmemleak_alloc(addr, real_size,
2
, gfp_mask);
return addr;
return addr;