mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
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


  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®