UML - Stack usage reduction
PATCH 1/1 UML - Stack usage reduction
The KSTK_* macros used an inordinate amount of stack. In order to overcome an impedance mismatch between their interface, which just returns a single register value, and the interface of get_thread_regs, which took a full pt_regs, the implementation created an on-stack pt_regs, filled it in, and returned one field. do_task_stat calls KSTK_* twice, resulting in two local pt_regs, blowing out the stack.
This patch changes the interface (and name) of get_thread_regs to just return a single register from a jmp_buf.
The include of archsetjmp.h" in registers.h to get the definition of jmp_buf exposed a bogus include of <setjmp.h> in start_up.c. <setjmp.h> shouldn't be used anywhere any more since UML uses the klibc setjmp/longjmp.
arch/um/include/registers.h +2 -1
@@ -7,6 +7,7 @@#define __REGISTERS_H#include "sysdep/ptrace.h" +#include "sysdep/archsetjmp.h" extern void init_thread_registers (union uml_pt_regs *to);extern int save_fp_registers (int pid,unsigned long *fp_regs);
@@ -15,6 +16,6 @@ extern void save_registers(int pid, unioextern void restore_registers (int pid,union uml_pt_regs *regs);extern void init_registers (int pid);extern void get_safe_registers (unsigned long * regs,unsigned long * fp_regs); -extern void get_thread_regs (union uml_pt_regs *uml_regs,void *buffer); +extern unsigned long get_thread_reg (int reg,jmp_buf *buf);#endif
arch/um/os-Linux/sys-i386/registers.c +9 -6
@@ -130,11 +130,14 @@ void get_safe_registers(unsigned long *r HOST_FP_SIZE * sizeof(unsigned long)); } -void get_thread_regs (union uml_pt_regs *uml_regs,void *buffer) +unsigned long get_thread_reg (int reg,jmp_buf *buf) { -struct __jmp_buf *jmpbuf = buffer; - -UPT_SET (uml_regs,EIP , jmpbuf->__eip); -UPT_SET (uml_regs,UESP , jmpbuf->__esp); -UPT_SET (uml_regs,EBP , jmpbuf->__ebp); +switch (reg){ +case EIP :return buf[0 ]->__eip; +case UESP :return buf[0 ]->__esp; +case EBP :return buf[0 ]->__ebp; +default : +printk ("get_thread_regs - unknown register %d\n" , reg); +return 0 ; + } }
arch/um/os-Linux/sys-x86_64/registers.c +9 -6
@@ -78,11 +78,14 @@ void get_safe_registers(unsigned long *r HOST_FP_SIZE * sizeof(unsigned long)); } -void get_thread_regs (union uml_pt_regs *uml_regs,void *buffer) +unsigned long get_thread_reg (int reg,jmp_buf *buf) { -struct __jmp_buf *jmpbuf = buffer; - -UPT_SET (uml_regs,RIP , jmpbuf->__rip); -UPT_SET (uml_regs,RSP , jmpbuf->__rsp); -UPT_SET (uml_regs,RBP , jmpbuf->__rbp); +switch (reg){ +case RIP :return buf[0 ]->__rip; +case RSP :return buf[0 ]->__rsp; +case RBP :return buf[0 ]->__rbp; +default : +printk ("get_thread_regs - unknown register %d\n" , reg); +return 0 ; + } }
include/asm-um/processor-generic.h +1 -3
@@ -138,9 +138,7 @@ extern struct cpuinfo_um cpu_data[];#ifdef CONFIG_MODE_SKAS #define KSTK_REG (tsk, reg) \ - ({ union uml_pt_regs regs; \ - get_thread_regs(®s, tsk->thread.mode.skas.switch_buf); \ - UPT_REG(®s, reg); }) + get_thread_reg(reg, tsk->thread.mode.skas.switch_buf)#else #define KSTK_REG (tsk, reg) (0xbadbabe)#endif
arch/um/os-Linux/start_up.c +0 -1
@@ -14,7 +14,6 @@#include <sched.h> #include <fcntl.h> #include <errno.h> -#include <setjmp.h> #include <sys/time.h> #include <sys/wait.h> #include <sys/mman.h>
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
User-mode-linux-devel mailing list [email protected]
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel