From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
To: linux-kernel@vger.kernel.org, hpa@zytor.com,
suresh.b.siddha@intel.com, rostedt@goodmis.org, jeremy@goop.org
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Subject: [PATCH] x86_64: allow sections that are recycled to set _PAGE_RW
Date: Fri, 12 Feb 2010 22:15:28 -0500 [thread overview]
Message-ID: <1266030928-2126-2-git-send-email-konrad.wilk@oracle.com> (raw)
In-Reply-To: <1266030928-2126-1-git-send-email-konrad.wilk@oracle.com>
This fixes BUG: unable to handle kernel paging request at ffff8800013f4000
IP: [<ffffffff8102bb0b>] free_init_pages+0xa3/0xcc
PGD 1611067 PUD 1615067 PMD 556b067 PTE 100000013f4025
...
[<ffffffff8102c2cb>] mark_rodata_ro+0x4a2/0x527
[<ffffffff810021a5>] init_post+0x2b/0x10e
...
On platforms where the pages to be recycled ("free") are 4KB (Xen PV guest).
In the mark_rodata_ro, we set the .text through .sdata section to RO,
then for selective sections (.__stop___ex_table -> .__start_rodata)
and (.__end_rodata -> ._sdata) set them to RW. The logic in
static_protections forbids this and unsets the _PAGE_RW attribute.
This is not an issue if the sections to be recycled are in 2MB pages
so on native platform this isn't seen.
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
---
arch/x86/mm/pageattr.c | 13 +++++++++++--
1 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
index 1d4eb93..44ebcd7 100644
--- a/arch/x86/mm/pageattr.c
+++ b/arch/x86/mm/pageattr.c
@@ -291,8 +291,17 @@ static inline pgprot_t static_protections(pgprot_t prot, unsigned long address,
*/
if (kernel_set_to_readonly &&
within(address, (unsigned long)_text,
- (unsigned long)__end_rodata_hpage_align))
- pgprot_val(forbidden) |= _PAGE_RW;
+ (unsigned long)__end_rodata_hpage_align)) {
+ /* When 'kernel_set_to_readonly', it is OK to set PAGE_RW
+ * on the ones that are being recycled by free_init_pages
+ * in mark_rodata_ro.
+ */
+ if (!within(address, (unsigned long)&__stop___ex_table,
+ (unsigned long)&__start_rodata) &&
+ !within(address, (unsigned long)&__end_rodata,
+ (unsigned long)&_sdata))
+ pgprot_val(forbidden) |= _PAGE_RW;
+ }
#endif
prot = __pgprot(pgprot_val(prot) & ~pgprot_val(forbidden));
--
1.6.2.5
next prev parent reply other threads:[~2010-02-13 3:36 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-02-13 3:15 [PATCH] fix BUG: unable to handle kernel .. in free_init_pages called from mark_rodata_ro Konrad Rzeszutek Wilk
2010-02-13 3:15 ` Konrad Rzeszutek Wilk [this message]
2010-02-13 20:08 ` [PATCH] x86_64: allow sections that are recycled to set _PAGE_RW Suresh Siddha
2010-02-14 5:12 ` H. Peter Anvin
2010-02-16 22:13 ` [LKML] " Konrad Rzeszutek Wilk
2010-02-18 19:51 ` Suresh Siddha
2010-02-22 23:48 ` [tip:x86/urgent] x86_64, cpa: Don't work hard in preserving kernel 2M mappings when using 4K already tip-bot for Suresh Siddha
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=1266030928-2126-2-git-send-email-konrad.wilk@oracle.com \
--to=konrad.wilk@oracle.com \
--cc=hpa@zytor.com \
--cc=jeremy@goop.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rostedt@goodmis.org \
--cc=suresh.b.siddha@intel.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®