Prev: [PATCH 1/6] sysfs: Serialize updates to the vfs inode
Next: tip related: radix tree for spareseirq and logical flat clean up
From: Konrad Rzeszutek Wilk on 12 Feb 2010 22:40 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(a)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 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |