On Fri, Oct 3, 2014 at 1:21 AM, Thomas Meyer <[email protected]> wrote:
> Hi,
>
> When you pass an initrd to UML and the size of the initrd is too big for
> the current kernel memory, a panic() call is done with the message("Out
> of memory").
>
> But this message never hits the stdout as the following stack trace
> dumps because there is no current_thread_info() in the UML stack, which
> is still active at this time:
Do you see the message if you boot UML with the earlyprintk parameter?
> (gdb) bt
> #0 dump_stack_print_info (log_lvl=0x6053f583 "\001d") at
> kernel/printk/printk.c:2979
> #1 0x000000006047126b in __dump_stack () at lib/dump_stack.c:14
> #2 dump_stack () at lib/dump_stack.c:50
> #3 0x000000006046bf87 in panic (fmt=<optimized out>) at kernel/panic.c:110
> #4 0x0000000060010bc7 in ___alloc_bootmem (limit=<optimized out>,
> goal=<optimized out>, align=<optimized out>, size=<optimized out>) a
> t mm/bootmem.c:674
> #5 __alloc_bootmem (size=55792228, align=<optimized out>, goal=<optimized
> out>) at mm/bootmem.c:696
> #6 0x0000000060004eca in read_initrd () at arch/um/kernel/initrd.c:39
> #7 0x0000000060004b71 in uml_postsetup () at arch/um/kernel/um_arch.c:228
> #8 linux_main (argc=<optimized out>, argv=0x7fffffffdf98) at
> arch/um/kernel/um_arch.c:377
> #9 0x00000000600059db in main (argc=<optimized out>, argv=0x7fffffffdf98,
> envp=<optimized out>) at arch/um/os-Linux/main.c:156
>
> So current_thread_info() will return the stack of the UML program
> itself, which is an invalid struct thread_info:
> thread info= 0x7fffffffc000
>
> so the access to current->pid, will segfault as "current" is a macro for
> current_thread_info()->task->pid and task is NULL.
>
> 2978│ void dump_stack_print_info(const char *log_lvl)
> 2979│ {
> 2980│ struct thread_info * ti = current_thread_info();
> 2981│ printf("thread info =%p\n", ti);
> 2982│
> 2983│ printk("%sCPU: %d PID: %d Comm: %.20s %s %s %.*s\n",
> 2984│ log_lvl, raw_smp_processor_id(), current->pid,
> current->comm,
> 2985│ print_tainted(), init_utsname()->release,
> 2986├> (int)strcspn(init_utsname()->version, " "),
> 2987│ init_utsname()->version);
>
>
> any ideas how to fix this?
>
> I tried to add this, but this failed horribly:
>
> diff --git a/arch/um/include/asm/thread_info.h
> b/arch/um/include/asm/thread_info.h
> --- a/arch/um/include/asm/thread_info.h
> +++ b/arch/um/include/asm/thread_info.h
> @@ -12,6 +12,11 @@
> #include <asm/page.h>
> #include <asm/uaccess.h>
>
> +#define DEBUG_CHECK_CURRENT_TI
> +#ifdef DEBUG_CHECK_CURRENT_TI
> +#include <kern_util.h>
> +#endif
> +
> struct thread_info {
> struct task_struct *task; /* main task structure */
> struct exec_domain *exec_domain; /* execution domain */
> @@ -53,6 +59,12 @@ static inline struct thread_info *current_thread_info(void)
>
> asm volatile ("" : "=r" (p) : "0" (&ti));
> ti = (struct thread_info *) (((unsigned long)p) & ~mask);
> +#ifdef DEBUG_CHECK_CURRENT_TI
> + if(!is_kernel_addr((void*)ti)) {
> + printk(KERN_CRIT "Access to current_thread_info() from
> non-kernel stack!\n");
> +// return &init_thread_info;
> + }
> +#endif
> return ti;
> }
>
> diff --git a/arch/um/include/shared/kern_util.h
> b/arch/um/include/shared/kern_util.h
> index 83a91f9..545503e 100644
> --- a/arch/um/include/shared/kern_util.h
> +++ b/arch/um/include/shared/kern_util.h
> @@ -19,6 +19,7 @@ extern int kmalloc_ok;
> #define UML_ROUND_UP(addr) \
> ((((unsigned long) addr) + PAGE_SIZE - 1) & PAGE_MASK)
>
> +extern int is_kernel_addr(void* addr);
> extern unsigned long alloc_stack(int order, int atomic);
> extern void free_stack(unsigned long stack, int order);
>
> diff --git a/arch/um/os-Linux/main.c b/arch/um/os-Linux/main.c
> index df9191a..a1caebb 100644
> --- a/arch/um/os-Linux/main.c
> +++ b/arch/um/os-Linux/main.c
> @@ -254,7 +255,7 @@ void __wrap_free(void *ptr)
> * there is a possibility for memory leaks.
> */
>
> - if ((addr >= uml_physmem) && (addr < high_physmem)) {
> + if (is_kernel_addr(addr)) {
> if (kmalloc_ok)
> kfree(ptr);
> }
> @@ -264,3 +265,10 @@ void __wrap_free(void *ptr)
> }
> else __real_free(ptr);
> }
> +
> +int is_kernel_addr(void* addr)
> +{
> + if((addr >= uml_physmem) && (addr < high_physmem))
> + return 1;
> + return 0;
> +}
> \ No newline at end of file
>
>
>
> ------------------------------------------------------------------------------
> Meet PCI DSS 3.0 Compliance Requirements with EventLog Analyzer
> Achieve PCI DSS 3.0 Compliant Status with Out-of-the-box PCI DSS Reports
> Are you Audit-Ready for PCI DSS 3.0 Compliance? Download White paper
> Comply to PCI DSS 3.0 Requirement 10 and 11.5 with EventLog Analyzer
> http://pubads.g.doubleclick.net/gampad/clk?id=154622311&iu=/4140/ostg.clktrk
> _______________________________________________
> User-mode-linux-devel mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel
--
Thanks,
//richard
------------------------------------------------------------------------------
Meet PCI DSS 3.0 Compliance Requirements with EventLog Analyzer
Achieve PCI DSS 3.0 Compliant Status with Out-of-the-box PCI DSS Reports
Are you Audit-Ready for PCI DSS 3.0 Compliance? Download White paper
Comply to PCI DSS 3.0 Requirement 10 and 11.5 with EventLog Analyzer
http://pubads.g.doubleclick.net/gampad/clk?id=154622311&iu=/4140/ostg.clktrk
_______________________________________________
User-mode-linux-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel