Index: mm/mm/page_alloc.c =================================================================== --- mm.orig/mm/page_alloc.c 2005-09-03 19:21:21.000000000 +0200 +++ mm/mm/page_alloc.c 2005-09-03 22:15:07.000000000 +0200 @@ -769,54 +769,22 @@ } #ifdef CONFIG_PAGE_OWNER -static inline int valid_stack_ptr(struct thread_info *tinfo, void *p) -{ - return p > (void *)tinfo && - p < (void *)tinfo + THREAD_SIZE - 3; -} - -static inline void __stack_trace(struct page *page, unsigned long *stack, - unsigned long bp) +static inline void set_page_owner(struct page *page, + unsigned int order, unsigned int gfp_mask) { - int i = 0; - unsigned long addr; - struct thread_info *tinfo = (struct thread_info *) - ((unsigned long)stack & (~(THREAD_SIZE - 1))); + int i; + unsigned long *ptr = (unsigned long *) &ptr; memset(page->trace, 0, sizeof(long) * 8); -#ifdef CONFIG_FRAME_POINTER - while (valid_stack_ptr(tinfo, (void *)bp)) { - addr = *(unsigned long *)(bp + sizeof(long)); - page->trace[i] = addr; - if (++i >= 8) - break; - bp = *(unsigned long *)bp; - } -#else - while (valid_stack_ptr(tinfo, stack)) { - addr = *stack++; - if (__kernel_text_address(addr)) { - page->trace[i] = addr; - if (++i >= 8) - break; - } - } -#endif -} - -static inline void set_page_owner(struct page *page, - unsigned int order, unsigned int gfp_mask) -{ - unsigned long address, bp; -#ifdef X86_64 - asm ("movq %%rbp, %0" : "=r" (bp) : ); -#else - asm ("movl %%ebp, %0" : "=r" (bp) : ); -#endif page->order = (int) order; page->gfp_mask = gfp_mask; - __stack_trace(page, &address, bp); + for (i = 0; i < 8; i++) { + ptr = next_stack_func(ptr, i); + if (!ptr) + return; + page->trace[i] = *ptr; + } } #endif /* CONFIG_PAGE_OWNER */