diff options
| author | Andrew Morton <akpm@osdl.org> | 2003-07-02 08:47:30 -0700 |
|---|---|---|
| committer | Linus Torvalds <torvalds@home.osdl.org> | 2003-07-02 08:47:30 -0700 |
| commit | 98eb235b7febbb2941e1b442b92fc5e23b0d7a83 (patch) | |
| tree | a3b52be876db0c2204c909b7a2340910485c0f0a /include/linux/slab.h | |
| parent | 17003453e368de3c1ab7700ab134bce5f0b50e47 (diff) | |
[PATCH] page unmapping debug
From: Manfred Spraul <manfred@colorfullife.com>
Manfred's latest page unmapping debug patch.
The patch adds support for a special debug mode to both the page and the slab
allocator: Unused pages are removed from the kernel linear mapping. This
means that now any access to freed memory will cause an immediate exception.
Right now, read accesses remain totally unnoticed and write accesses may be
catched by the slab poisoning, but usually far too late for a meaningfull bug
report.
The implementation is based on a new arch dependant function,
kernel_map_pages(), that removes the pages from the linear mapping. It's
right now only implemented for i386.
Changelog:
- Add kernel_map_pages() for i386, based on change_page_attr. If
DEBUG_PAGEALLOC is not set, then the function is an empty stub. The stub
is in <linux/mm.h>, i.e. it exists for all archs.
- Make change_page_attr irq safe. Note that it's not fully irq safe due to
the lack of the tlb flush ipi, but it's good enough for kernel_map_pages().
Another problem is that kernel_map_pages is not permitted to fail, thus
PSE is disabled if DEBUG_PAGEALLOC is enabled
- use kernel_map pages for the page allocator.
- use kernel_map_pages for the slab allocator.
I couldn't resist and added additional debugging support into mm/slab.c:
* at kfree time, the complete backtrace of the kfree caller is stored
in the freed object.
* a ptrinfo() function that dumps all known data about a kernel virtual
address: the pte value, if it belongs to a slab cache the cache name and
additional info.
* merging of common code: new helper function obj_dbglen and obj_dbghdr
for the conversion between the user visible object pointers/len and the
actual, internal addresses and len values.
Diffstat (limited to 'include/linux/slab.h')
| -rw-r--r-- | include/linux/slab.h | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/include/linux/slab.h b/include/linux/slab.h index 843c8d638d29..9f8bccba4ad3 100644 --- a/include/linux/slab.h +++ b/include/linux/slab.h @@ -114,6 +114,8 @@ extern kmem_cache_t *signal_cachep; extern kmem_cache_t *sighand_cachep; extern kmem_cache_t *bio_cachep; +void ptrinfo(unsigned long addr); + #endif /* __KERNEL__ */ #endif /* _LINUX_SLAB_H */ |
