x86: Use __pa_symbol instead of __pa on C visible symbols
When I made an attempt at separating __pa_symbol and __pa I found that there were a number of cases where __pa was used on an obvious symbol. I also caught one non-obvious case as _brk_start and _brk_end are based on the address of __brk_base which is a C visible symbol. In mark_rodata_ro I was able to reduce the overhead of kernel symbol to virtual memory translation by using a combination of __va(__pa_symbol()) instead of page_address(virt_to_page()). Signed-off-by: Alexander Duyck <alexander.h.duyck@intel.com> Link: http://lkml.kernel.org/r/20121116215640.8521.80483.stgit@ahduyck-cp1.jf.intel.com Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
This commit is contained in:

committed by
H. Peter Anvin

parent
05a476b6e3
commit
fc8d782677
@@ -770,12 +770,10 @@ void set_kernel_text_ro(void)
|
||||
void mark_rodata_ro(void)
|
||||
{
|
||||
unsigned long start = PFN_ALIGN(_text);
|
||||
unsigned long rodata_start =
|
||||
((unsigned long)__start_rodata + PAGE_SIZE - 1) & PAGE_MASK;
|
||||
unsigned long rodata_start = PFN_ALIGN(__start_rodata);
|
||||
unsigned long end = (unsigned long) &__end_rodata_hpage_align;
|
||||
unsigned long text_end = PAGE_ALIGN((unsigned long) &__stop___ex_table);
|
||||
unsigned long rodata_end = PAGE_ALIGN((unsigned long) &__end_rodata);
|
||||
unsigned long data_start = (unsigned long) &_sdata;
|
||||
unsigned long text_end = PFN_ALIGN(&__stop___ex_table);
|
||||
unsigned long rodata_end = PFN_ALIGN(&__end_rodata);
|
||||
|
||||
printk(KERN_INFO "Write protecting the kernel read-only data: %luk\n",
|
||||
(end - start) >> 10);
|
||||
@@ -800,12 +798,12 @@ void mark_rodata_ro(void)
|
||||
#endif
|
||||
|
||||
free_init_pages("unused kernel memory",
|
||||
(unsigned long) page_address(virt_to_page(text_end)),
|
||||
(unsigned long)
|
||||
page_address(virt_to_page(rodata_start)));
|
||||
(unsigned long) __va(__pa_symbol(text_end)),
|
||||
(unsigned long) __va(__pa_symbol(rodata_start)));
|
||||
|
||||
free_init_pages("unused kernel memory",
|
||||
(unsigned long) page_address(virt_to_page(rodata_end)),
|
||||
(unsigned long) page_address(virt_to_page(data_start)));
|
||||
(unsigned long) __va(__pa_symbol(rodata_end)),
|
||||
(unsigned long) __va(__pa_symbol(_sdata)));
|
||||
}
|
||||
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user