Merge branch 'x86-irq-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull x86 irq updates from Ingo Molnar: "Here are the main changes in this tree: - Introduce x86-64 IRQ/exception/debug stack guard pages to detect stack overflows immediately and deterministically. - Clean up over a decade worth of cruft accumulated. The outcome of this should be more clear-cut faults/crashes when any of the low level x86 CPU stacks overflow, instead of silent memory corruption and sporadic failures much later on" * 'x86-irq-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (33 commits) x86/irq: Fix outdated comments x86/irq/64: Remove stack overflow debug code x86/irq/64: Remap the IRQ stack with guard pages x86/irq/64: Split the IRQ stack into its own pages x86/irq/64: Init hardirq_stack_ptr during CPU hotplug x86/irq/32: Handle irq stack allocation failure proper x86/irq/32: Invoke irq_ctx_init() from init_IRQ() x86/irq/64: Rename irq_stack_ptr to hardirq_stack_ptr x86/irq/32: Rename hard/softirq_stack to hard/softirq_stack_ptr x86/irq/32: Make irq stack a character array x86/irq/32: Define IRQ_STACK_SIZE x86/dumpstack/64: Speedup in_exception_stack() x86/exceptions: Split debug IST stack x86/exceptions: Enable IST guard pages x86/exceptions: Disconnect IST index and stack order x86/cpu: Remove orig_ist array x86/cpu: Prepare TSS.IST setup for guard pages x86/dumpstack/64: Use cpu_entry_area instead of orig_ist x86/irq/64: Use cpu entry area instead of orig_ist x86/traps: Use cpu_entry_area instead of orig_ist ...
This commit is contained in:
48
mm/slab.c
48
mm/slab.c
@@ -1467,53 +1467,17 @@ static bool is_debug_pagealloc_cache(struct kmem_cache *cachep)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_PAGEALLOC
|
||||
static void store_stackinfo(struct kmem_cache *cachep, unsigned long *addr,
|
||||
unsigned long caller)
|
||||
{
|
||||
int size = cachep->object_size;
|
||||
|
||||
addr = (unsigned long *)&((char *)addr)[obj_offset(cachep)];
|
||||
|
||||
if (size < 5 * sizeof(unsigned long))
|
||||
return;
|
||||
|
||||
*addr++ = 0x12345678;
|
||||
*addr++ = caller;
|
||||
*addr++ = smp_processor_id();
|
||||
size -= 3 * sizeof(unsigned long);
|
||||
{
|
||||
unsigned long *sptr = &caller;
|
||||
unsigned long svalue;
|
||||
|
||||
while (!kstack_end(sptr)) {
|
||||
svalue = *sptr++;
|
||||
if (kernel_text_address(svalue)) {
|
||||
*addr++ = svalue;
|
||||
size -= sizeof(unsigned long);
|
||||
if (size <= sizeof(unsigned long))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
*addr++ = 0x87654321;
|
||||
}
|
||||
|
||||
static void slab_kernel_map(struct kmem_cache *cachep, void *objp,
|
||||
int map, unsigned long caller)
|
||||
static void slab_kernel_map(struct kmem_cache *cachep, void *objp, int map)
|
||||
{
|
||||
if (!is_debug_pagealloc_cache(cachep))
|
||||
return;
|
||||
|
||||
if (caller)
|
||||
store_stackinfo(cachep, objp, caller);
|
||||
|
||||
kernel_map_pages(virt_to_page(objp), cachep->size / PAGE_SIZE, map);
|
||||
}
|
||||
|
||||
#else
|
||||
static inline void slab_kernel_map(struct kmem_cache *cachep, void *objp,
|
||||
int map, unsigned long caller) {}
|
||||
int map) {}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1661,7 +1625,7 @@ static void slab_destroy_debugcheck(struct kmem_cache *cachep,
|
||||
|
||||
if (cachep->flags & SLAB_POISON) {
|
||||
check_poison_obj(cachep, objp);
|
||||
slab_kernel_map(cachep, objp, 1, 0);
|
||||
slab_kernel_map(cachep, objp, 1);
|
||||
}
|
||||
if (cachep->flags & SLAB_RED_ZONE) {
|
||||
if (*dbg_redzone1(cachep, objp) != RED_INACTIVE)
|
||||
@@ -2433,7 +2397,7 @@ static void cache_init_objs_debug(struct kmem_cache *cachep, struct page *page)
|
||||
/* need to poison the objs? */
|
||||
if (cachep->flags & SLAB_POISON) {
|
||||
poison_obj(cachep, objp, POISON_FREE);
|
||||
slab_kernel_map(cachep, objp, 0, 0);
|
||||
slab_kernel_map(cachep, objp, 0);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -2812,7 +2776,7 @@ static void *cache_free_debugcheck(struct kmem_cache *cachep, void *objp,
|
||||
|
||||
if (cachep->flags & SLAB_POISON) {
|
||||
poison_obj(cachep, objp, POISON_FREE);
|
||||
slab_kernel_map(cachep, objp, 0, caller);
|
||||
slab_kernel_map(cachep, objp, 0);
|
||||
}
|
||||
return objp;
|
||||
}
|
||||
@@ -3076,7 +3040,7 @@ static void *cache_alloc_debugcheck_after(struct kmem_cache *cachep,
|
||||
return objp;
|
||||
if (cachep->flags & SLAB_POISON) {
|
||||
check_poison_obj(cachep, objp);
|
||||
slab_kernel_map(cachep, objp, 1, 0);
|
||||
slab_kernel_map(cachep, objp, 1);
|
||||
poison_obj(cachep, objp, POISON_INUSE);
|
||||
}
|
||||
if (cachep->flags & SLAB_STORE_USER)
|
||||
|
Reference in New Issue
Block a user