Merge tag 'kmemleak' of git://git.kernel.org/pub/scm/linux/kernel/git/cmarinas/linux
Kmemleak patches Main features: - Handle percpu memory allocations (only scanning them, not actually reporting). - Memory hotplug support. Usability improvements: - Show the origin of early allocations. - Report previously found leaks even if kmemleak has been disabled by some error. * tag 'kmemleak' of git://git.kernel.org/pub/scm/linux/kernel/git/cmarinas/linux: kmemleak: Add support for memory hotplug kmemleak: Handle percpu memory allocation kmemleak: Report previously found leaks even after an error kmemleak: When the early log buffer is exceeded, report the actual number kmemleak: Show where early_log issues come from
This commit is contained in:
12
mm/percpu.c
12
mm/percpu.c
@ -67,6 +67,7 @@
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/vmalloc.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/kmemleak.h>
|
||||
|
||||
#include <asm/cacheflush.h>
|
||||
#include <asm/sections.h>
|
||||
@ -710,6 +711,7 @@ static void __percpu *pcpu_alloc(size_t size, size_t align, bool reserved)
|
||||
const char *err;
|
||||
int slot, off, new_alloc;
|
||||
unsigned long flags;
|
||||
void __percpu *ptr;
|
||||
|
||||
if (unlikely(!size || size > PCPU_MIN_UNIT_SIZE || align > PAGE_SIZE)) {
|
||||
WARN(true, "illegal size (%zu) or align (%zu) for "
|
||||
@ -802,7 +804,9 @@ area_found:
|
||||
mutex_unlock(&pcpu_alloc_mutex);
|
||||
|
||||
/* return address relative to base address */
|
||||
return __addr_to_pcpu_ptr(chunk->base_addr + off);
|
||||
ptr = __addr_to_pcpu_ptr(chunk->base_addr + off);
|
||||
kmemleak_alloc_percpu(ptr, size);
|
||||
return ptr;
|
||||
|
||||
fail_unlock:
|
||||
spin_unlock_irqrestore(&pcpu_lock, flags);
|
||||
@ -916,6 +920,8 @@ void free_percpu(void __percpu *ptr)
|
||||
if (!ptr)
|
||||
return;
|
||||
|
||||
kmemleak_free_percpu(ptr);
|
||||
|
||||
addr = __pcpu_ptr_to_addr(ptr);
|
||||
|
||||
spin_lock_irqsave(&pcpu_lock, flags);
|
||||
@ -1639,6 +1645,8 @@ int __init pcpu_embed_first_chunk(size_t reserved_size, size_t dyn_size,
|
||||
rc = -ENOMEM;
|
||||
goto out_free_areas;
|
||||
}
|
||||
/* kmemleak tracks the percpu allocations separately */
|
||||
kmemleak_free(ptr);
|
||||
areas[group] = ptr;
|
||||
|
||||
base = min(ptr, base);
|
||||
@ -1753,6 +1761,8 @@ int __init pcpu_page_first_chunk(size_t reserved_size,
|
||||
"for cpu%u\n", psize_str, cpu);
|
||||
goto enomem;
|
||||
}
|
||||
/* kmemleak tracks the percpu allocations separately */
|
||||
kmemleak_free(ptr);
|
||||
pages[j++] = virt_to_page(ptr);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user