From: Ingo Molnar <mingo@elte.hu>
To: linux-kernel@vger.kernel.org
Cc: Andrew Morton <akpm@osdl.org>, Arjan van de Ven <arjanv@infradead.org>
Subject: [patch] compress the stack layout of do_page_fault(), x86
Date: Sat, 9 Jul 2005 16:41:16 +0200 [thread overview]
Message-ID: <20050709144116.GA9444@elte.hu> (raw)
this patch pushes the creation of a rare signal frame (SIGBUS or
SIGSEGV) into a separate function, thus saving stackspace in the main
do_page_fault() stackframe. The effect is 132 bytes less of stack used
by the typical do_page_fault() invocation - resulting in a denser
cache-layout.
(another minor effect is that in case of kernel crashes that come from a
pagefault, we add less space to the already existing frame, giving the
crash functions a slightly higher chance to do their stuff without
overflowing the stack.)
(the changes also result in slightly cleaner code.)
build and boot tested.
Ingo
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Index: linux/arch/i386/mm/fault.c
===================================================================
--- linux.orig/arch/i386/mm/fault.c
+++ linux/arch/i386/mm/fault.c
@@ -201,6 +201,18 @@ static inline int is_prefetch(struct pt_
return 0;
}
+static void force_sig_info_fault(int si_signo, int si_code,
+ unsigned long address, struct task_struct *tsk)
+{
+ siginfo_t info;
+
+ info.si_signo = SIGSEGV;
+ info.si_errno = 0;
+ info.si_code = si_code;
+ info.si_addr = (void __user *)address;
+ force_sig_info(SIGSEGV, &info, tsk);
+}
+
fastcall void do_invalid_op(struct pt_regs *, unsigned long);
/*
@@ -220,9 +232,8 @@ fastcall notrace void do_page_fault(stru
struct vm_area_struct * vma;
unsigned long address;
unsigned long page;
- int write;
- siginfo_t info;
-
+ int write, si_code;
+
/* get the address */
__asm__("movl %%cr2,%0":"=r" (address));
trace_special(regs->eip, error_code, address);
@@ -236,7 +247,7 @@ fastcall notrace void do_page_fault(stru
tsk = current;
- info.si_code = SEGV_MAPERR;
+ si_code = SEGV_MAPERR;
/*
* We fault-in kernel-space virtual memory on-demand. The
@@ -316,7 +327,7 @@ fastcall notrace void do_page_fault(stru
* we can handle it..
*/
good_area:
- info.si_code = SEGV_ACCERR;
+ si_code = SEGV_ACCERR;
write = 0;
switch (error_code & 3) {
default: /* 3: write, present */
@@ -390,11 +401,7 @@ bad_area_nosemaphore:
/* Kernel addresses are always protection faults */
tsk->thread.error_code = error_code | (address >= TASK_SIZE);
tsk->thread.trap_no = 14;
- info.si_signo = SIGSEGV;
- info.si_errno = 0;
- /* info.si_code has been set above */
- info.si_addr = (void __user *)address;
- force_sig_info(SIGSEGV, &info, tsk);
+ force_sig_info_fault(SIGSEGV, si_code, address, tsk);
return;
}
@@ -500,11 +507,7 @@ do_sigbus:
tsk->thread.cr2 = address;
tsk->thread.error_code = error_code;
tsk->thread.trap_no = 14;
- info.si_signo = SIGBUS;
- info.si_errno = 0;
- info.si_code = BUS_ADRERR;
- info.si_addr = (void __user *)address;
- force_sig_info(SIGBUS, &info, tsk);
+ force_sig_info_fault(SIGBUS, BUS_ADRERR, address, tsk);
return;
vmalloc_fault:
next reply other threads:[~2005-07-09 14:41 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-07-09 14:41 Ingo Molnar [this message]
2005-07-09 15:29 ` [patch] compress the stack layout of do_page_fault(), x86 Ingo Molnar
2005-07-09 16:44 ` randy_dunlap
2005-07-09 16:46 ` Ingo Molnar
2005-07-10 3:35 ` Chris Wedgwood
[not found] <20050709144116.GA9444@elte.hu.suse.lists.linux.kernel>
[not found] ` <20050709152924.GA13492@elte.hu.suse.lists.linux.kernel>
2005-07-09 17:05 ` Andi Kleen
2005-07-09 17:31 ` Arjan van de Ven
2005-07-09 19:15 ` Andi Kleen
2005-07-09 19:47 ` Arjan van de Ven
2005-07-09 19:42 ` Ingo Molnar
2005-07-10 16:13 ` Andi Kleen
2005-07-11 2:32 ` Ingo Molnar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20050709144116.GA9444@elte.hu \
--to=mingo@elte.hu \
--cc=akpm@osdl.org \
--cc=arjanv@infradead.org \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.