[tip:x86/mm] x86: Fix warning about cast from pointer to integer of different size

2012-11-19 Thread tip-bot for Alexander Duyck
Commit-ID:  bbee3aec3472fc2ca10b6b1020aec84567ea25ce
Gitweb: http://git.kernel.org/tip/bbee3aec3472fc2ca10b6b1020aec84567ea25ce
Author: Alexander Duyck 
AuthorDate: Mon, 19 Nov 2012 10:31:37 -0800
Committer:  H. Peter Anvin 
CommitDate: Mon, 19 Nov 2012 10:45:19 -0800

x86: Fix warning about cast from pointer to integer of different size

This patch fixes a warning reported by the kbuild test robot where we were
casting a pointer to a physical address which represents an integer of a
different size.  Per the suggestion of Peter Anvin I am replacing it and one
other spot where I made a similar cast with an unsigned long.

Signed-off-by: Alexander Duyck 
Link: 
http://lkml.kernel.org/r/20121119182927.3655.7641.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin 
---
 arch/x86/kernel/head32.c | 2 +-
 arch/x86/kernel/head64.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/x86/kernel/head32.c b/arch/x86/kernel/head32.c
index f15db0c..e175548 100644
--- a/arch/x86/kernel/head32.c
+++ b/arch/x86/kernel/head32.c
@@ -31,7 +31,7 @@ static void __init i386_default_early_setup(void)
 void __init i386_start_kernel(void)
 {
memblock_reserve(__pa_symbol(_text),
-(phys_addr_t)__bss_stop - (phys_addr_t)_text);
+(unsigned long)__bss_stop - (unsigned long)_text);
 
 #ifdef CONFIG_BLK_DEV_INITRD
/* Reserve INITRD */
diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c
index 42f5df1..7b215a5 100644
--- a/arch/x86/kernel/head64.c
+++ b/arch/x86/kernel/head64.c
@@ -98,7 +98,7 @@ void __init x86_64_start_reservations(char *real_mode_data)
copy_bootdata(__va(real_mode_data));
 
memblock_reserve(__pa_symbol(_text),
-(phys_addr_t)__bss_stop - (phys_addr_t)_text);
+(unsigned long)__bss_stop - (unsigned long)_text);
 
 #ifdef CONFIG_BLK_DEV_INITRD
/* Reserve INITRD */
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/mm] x86: Fix warning about cast from pointer to integer of different size

2012-11-19 Thread tip-bot for Alexander Duyck
Commit-ID:  bbee3aec3472fc2ca10b6b1020aec84567ea25ce
Gitweb: http://git.kernel.org/tip/bbee3aec3472fc2ca10b6b1020aec84567ea25ce
Author: Alexander Duyck alexander.h.du...@intel.com
AuthorDate: Mon, 19 Nov 2012 10:31:37 -0800
Committer:  H. Peter Anvin h...@linux.intel.com
CommitDate: Mon, 19 Nov 2012 10:45:19 -0800

x86: Fix warning about cast from pointer to integer of different size

This patch fixes a warning reported by the kbuild test robot where we were
casting a pointer to a physical address which represents an integer of a
different size.  Per the suggestion of Peter Anvin I am replacing it and one
other spot where I made a similar cast with an unsigned long.

Signed-off-by: Alexander Duyck alexander.h.du...@intel.com
Link: 
http://lkml.kernel.org/r/20121119182927.3655.7641.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin h...@linux.intel.com
---
 arch/x86/kernel/head32.c | 2 +-
 arch/x86/kernel/head64.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/x86/kernel/head32.c b/arch/x86/kernel/head32.c
index f15db0c..e175548 100644
--- a/arch/x86/kernel/head32.c
+++ b/arch/x86/kernel/head32.c
@@ -31,7 +31,7 @@ static void __init i386_default_early_setup(void)
 void __init i386_start_kernel(void)
 {
memblock_reserve(__pa_symbol(_text),
-(phys_addr_t)__bss_stop - (phys_addr_t)_text);
+(unsigned long)__bss_stop - (unsigned long)_text);
 
 #ifdef CONFIG_BLK_DEV_INITRD
/* Reserve INITRD */
diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c
index 42f5df1..7b215a5 100644
--- a/arch/x86/kernel/head64.c
+++ b/arch/x86/kernel/head64.c
@@ -98,7 +98,7 @@ void __init x86_64_start_reservations(char *real_mode_data)
copy_bootdata(__va(real_mode_data));
 
memblock_reserve(__pa_symbol(_text),
-(phys_addr_t)__bss_stop - (phys_addr_t)_text);
+(unsigned long)__bss_stop - (unsigned long)_text);
 
 #ifdef CONFIG_BLK_DEV_INITRD
/* Reserve INITRD */
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/mm] x86/acpi: Use __pa_symbol instead of __pa on C visible symbols

2012-11-16 Thread tip-bot for Alexander Duyck
Commit-ID:  afd51a0e32cd79261f0e823400886ed322a355ac
Gitweb: http://git.kernel.org/tip/afd51a0e32cd79261f0e823400886ed322a355ac
Author: Alexander Duyck 
AuthorDate: Fri, 16 Nov 2012 13:57:43 -0800
Committer:  H. Peter Anvin 
CommitDate: Fri, 16 Nov 2012 16:42:10 -0800

x86/acpi: Use __pa_symbol instead of __pa on C visible symbols

This change just updates one spot where __pa was being used when __pa_symbol
should have been used.  By using __pa_symbol we are able to drop a few extra
lines of code as we don't have to test to see if the virtual pointer is a
part of the kernel text or just standard virtual memory.

Cc: Len Brown 
Cc: Pavel Machek 
Acked-by: "Rafael J. Wysocki" 
Signed-off-by: Alexander Duyck 
Link: 
http://lkml.kernel.org/r/20121116215737.8521.51167.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin 
---
 arch/x86/kernel/acpi/sleep.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c
index 11676cf..f146a3c 100644
--- a/arch/x86/kernel/acpi/sleep.c
+++ b/arch/x86/kernel/acpi/sleep.c
@@ -69,7 +69,7 @@ int acpi_suspend_lowlevel(void)
 
 #ifndef CONFIG_64BIT
header->pmode_entry = (u32)_pmode_return;
-   header->pmode_cr3 = (u32)__pa(_page_table);
+   header->pmode_cr3 = (u32)__pa_symbol(initial_page_table);
saved_magic = 0x12345678;
 #else /* CONFIG_64BIT */
 #ifdef CONFIG_SMP
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/mm] x86/ftrace: Use __pa_symbol instead of __pa on C visible symbols

2012-11-16 Thread tip-bot for Alexander Duyck
Commit-ID:  217f155e9fc68bf2a6c58a7b47e0d1ce68d78818
Gitweb: http://git.kernel.org/tip/217f155e9fc68bf2a6c58a7b47e0d1ce68d78818
Author: Alexander Duyck 
AuthorDate: Fri, 16 Nov 2012 13:57:32 -0800
Committer:  H. Peter Anvin 
CommitDate: Fri, 16 Nov 2012 16:42:09 -0800

x86/ftrace: Use __pa_symbol instead of __pa on C visible symbols

Instead of using __pa which is meant to be a general function for converting
virtual addresses to physical addresses we can use __pa_symbol which is the
preferred way of decoding kernel text virtual addresses to physical addresses.

In this case we are not directly converting C visible symbols however if we
know that the instruction pointer is somewhere between _text and _etext we
know that we are going to be translating an address form the kernel text
space.

Cc: Steven Rostedt 
Cc: Frederic Weisbecker 
Signed-off-by: Alexander Duyck 
Link: 
http://lkml.kernel.org/r/20121116215718.8521.24026.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin 
---
 arch/x86/kernel/ftrace.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c
index 1d41402..42a392a 100644
--- a/arch/x86/kernel/ftrace.c
+++ b/arch/x86/kernel/ftrace.c
@@ -89,7 +89,7 @@ do_ftrace_mod_code(unsigned long ip, const void *new_code)
 * kernel identity mapping to modify code.
 */
if (within(ip, (unsigned long)_text, (unsigned long)_etext))
-   ip = (unsigned long)__va(__pa(ip));
+   ip = (unsigned long)__va(__pa_symbol(ip));
 
return probe_kernel_write((void *)ip, new_code, MCOUNT_INSN_SIZE);
 }
@@ -279,7 +279,7 @@ static int ftrace_write(unsigned long ip, const char *val, 
int size)
 * kernel identity mapping to modify code.
 */
if (within(ip, (unsigned long)_text, (unsigned long)_etext))
-   ip = (unsigned long)__va(__pa(ip));
+   ip = (unsigned long)__va(__pa_symbol(ip));
 
return probe_kernel_write((void *)ip, val, size);
 }
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/mm] x86: Use __pa_symbol instead of __pa on C visible symbols

2012-11-16 Thread tip-bot for Alexander Duyck
Commit-ID:  fc8d782677f163dee76427fdd8a92bebd2b50b23
Gitweb: http://git.kernel.org/tip/fc8d782677f163dee76427fdd8a92bebd2b50b23
Author: Alexander Duyck 
AuthorDate: Fri, 16 Nov 2012 13:57:13 -0800
Committer:  H. Peter Anvin 
CommitDate: Fri, 16 Nov 2012 16:42:09 -0800

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 
Link: 
http://lkml.kernel.org/r/20121116215640.8521.80483.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin 
---
 arch/x86/kernel/cpu/intel.c |  2 +-
 arch/x86/kernel/setup.c | 16 
 arch/x86/mm/init_64.c   | 18 --
 arch/x86/mm/pageattr.c  |  8 
 arch/x86/platform/efi/efi.c |  4 ++--
 arch/x86/realmode/init.c|  8 
 6 files changed, 27 insertions(+), 29 deletions(-)

diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
index 198e019..2249e7e 100644
--- a/arch/x86/kernel/cpu/intel.c
+++ b/arch/x86/kernel/cpu/intel.c
@@ -168,7 +168,7 @@ int __cpuinit ppro_with_ram_bug(void)
 #ifdef CONFIG_X86_F00F_BUG
 static void __cpuinit trap_init_f00f_bug(void)
 {
-   __set_fixmap(FIX_F00F_IDT, __pa(_table), PAGE_KERNEL_RO);
+   __set_fixmap(FIX_F00F_IDT, __pa_symbol(idt_table), PAGE_KERNEL_RO);
 
/*
 * Update the IDT descriptor and reload the IDT so that
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index ca45696..2702c5d 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -300,8 +300,8 @@ static void __init cleanup_highmap(void)
 static void __init reserve_brk(void)
 {
if (_brk_end > _brk_start)
-   memblock_reserve(__pa(_brk_start),
-__pa(_brk_end) - __pa(_brk_start));
+   memblock_reserve(__pa_symbol(_brk_start),
+_brk_end - _brk_start);
 
/* Mark brk area as locked down and no longer taking any
   new allocations */
@@ -761,12 +761,12 @@ void __init setup_arch(char **cmdline_p)
init_mm.end_data = (unsigned long) _edata;
init_mm.brk = _brk_end;
 
-   code_resource.start = virt_to_phys(_text);
-   code_resource.end = virt_to_phys(_etext)-1;
-   data_resource.start = virt_to_phys(_etext);
-   data_resource.end = virt_to_phys(_edata)-1;
-   bss_resource.start = virt_to_phys(&__bss_start);
-   bss_resource.end = virt_to_phys(&__bss_stop)-1;
+   code_resource.start = __pa_symbol(_text);
+   code_resource.end = __pa_symbol(_etext)-1;
+   data_resource.start = __pa_symbol(_etext);
+   data_resource.end = __pa_symbol(_edata)-1;
+   bss_resource.start = __pa_symbol(__bss_start);
+   bss_resource.end = __pa_symbol(__bss_stop)-1;
 
 #ifdef CONFIG_CMDLINE_BOOL
 #ifdef CONFIG_CMDLINE_OVERRIDE
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index 3baff25..0374a10 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -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)),
+   

[tip:x86/mm] x86: Drop 4 unnecessary calls to __pa_symbol

2012-11-16 Thread tip-bot for Alexander Duyck
Commit-ID:  05a476b6e3795f205806662bf09ab95774266292
Gitweb: http://git.kernel.org/tip/05a476b6e3795f205806662bf09ab95774266292
Author: Alexander Duyck 
AuthorDate: Fri, 16 Nov 2012 13:56:35 -0800
Committer:  H. Peter Anvin 
CommitDate: Fri, 16 Nov 2012 16:42:09 -0800

x86: Drop 4 unnecessary calls to __pa_symbol

While debugging the __pa_symbol inline patch I found that there were a couple
spots where __pa_symbol was used as follows:
__pa_symbol(x) - __pa_symbol(y)

The compiler had reduced them to:
x - y

Since we also support a debug case where __pa_symbol is a function call it
would probably be useful to just change the two cases I found so that they are
always just treated as "x - y".  As such I am casting the values to
phys_addr_t and then doing simple subtraction so that the correct type and
value is returned.

Signed-off-by: Alexander Duyck 
Link: 
http://lkml.kernel.org/r/20121116215552.8521.68085.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin 
---
 arch/x86/kernel/head32.c | 4 ++--
 arch/x86/kernel/head64.c | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/arch/x86/kernel/head32.c b/arch/x86/kernel/head32.c
index c18f59d..f15db0c 100644
--- a/arch/x86/kernel/head32.c
+++ b/arch/x86/kernel/head32.c
@@ -30,8 +30,8 @@ static void __init i386_default_early_setup(void)
 
 void __init i386_start_kernel(void)
 {
-   memblock_reserve(__pa_symbol(&_text),
-__pa_symbol(&__bss_stop) - __pa_symbol(&_text));
+   memblock_reserve(__pa_symbol(_text),
+(phys_addr_t)__bss_stop - (phys_addr_t)_text);
 
 #ifdef CONFIG_BLK_DEV_INITRD
/* Reserve INITRD */
diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c
index 037df57..42f5df1 100644
--- a/arch/x86/kernel/head64.c
+++ b/arch/x86/kernel/head64.c
@@ -97,8 +97,8 @@ void __init x86_64_start_reservations(char *real_mode_data)
 {
copy_bootdata(__va(real_mode_data));
 
-   memblock_reserve(__pa_symbol(&_text),
-__pa_symbol(&__bss_stop) - __pa_symbol(&_text));
+   memblock_reserve(__pa_symbol(_text),
+(phys_addr_t)__bss_stop - (phys_addr_t)_text);
 
 #ifdef CONFIG_BLK_DEV_INITRD
/* Reserve INITRD */
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/mm] x86: Make it so that __pa_symbol can only process kernel symbols on x86_64

2012-11-16 Thread tip-bot for Alexander Duyck
Commit-ID:  7d74275d39def4d3ccc8cf4725388bf79ef13861
Gitweb: http://git.kernel.org/tip/7d74275d39def4d3ccc8cf4725388bf79ef13861
Author: Alexander Duyck 
AuthorDate: Fri, 16 Nov 2012 13:55:46 -0800
Committer:  H. Peter Anvin 
CommitDate: Fri, 16 Nov 2012 16:42:09 -0800

x86: Make it so that __pa_symbol can only process kernel symbols on x86_64

I submitted an earlier patch that make __phys_addr an inline.  This obviously
results in an increase in the code size.  One step I can take to reduce that
is to make it so that the __pa_symbol call does a direct translation for
kernel addresses instead of covering all of virtual memory.

On my system this reduced the size for __pa_symbol from 5 instructions
totalling 30 bytes to 3 instructions totalling 16 bytes.

Signed-off-by: Alexander Duyck 
Link: 
http://lkml.kernel.org/r/20121116215356.8521.92472.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin 
---
 arch/x86/include/asm/page.h|  3 ++-
 arch/x86/include/asm/page_32.h |  1 +
 arch/x86/include/asm/page_64.h |  3 +++
 arch/x86/mm/physaddr.c | 11 +++
 4 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/arch/x86/include/asm/page.h b/arch/x86/include/asm/page.h
index 8ca8283..3698a6a 100644
--- a/arch/x86/include/asm/page.h
+++ b/arch/x86/include/asm/page.h
@@ -44,7 +44,8 @@ static inline void copy_user_page(void *to, void *from, 
unsigned long vaddr,
  * case properly. Once all supported versions of gcc understand it, we can
  * remove this Voodoo magic stuff. (i.e. once gcc3.x is deprecated)
  */
-#define __pa_symbol(x) __pa(__phys_reloc_hide((unsigned long)(x)))
+#define __pa_symbol(x) \
+   __phys_addr_symbol(__phys_reloc_hide((unsigned long)(x)))
 
 #define __va(x)((void *)((unsigned 
long)(x)+PAGE_OFFSET))
 
diff --git a/arch/x86/include/asm/page_32.h b/arch/x86/include/asm/page_32.h
index da4e762..4d550d0 100644
--- a/arch/x86/include/asm/page_32.h
+++ b/arch/x86/include/asm/page_32.h
@@ -15,6 +15,7 @@ extern unsigned long __phys_addr(unsigned long);
 #else
 #define __phys_addr(x) __phys_addr_nodebug(x)
 #endif
+#define __phys_addr_symbol(x)  __phys_addr(x)
 #define __phys_reloc_hide(x)   RELOC_HIDE((x), 0)
 
 #ifdef CONFIG_FLATMEM
diff --git a/arch/x86/include/asm/page_64.h b/arch/x86/include/asm/page_64.h
index 5138174..0f1ddee 100644
--- a/arch/x86/include/asm/page_64.h
+++ b/arch/x86/include/asm/page_64.h
@@ -21,8 +21,11 @@ static inline unsigned long __phys_addr_nodebug(unsigned 
long x)
 
 #ifdef CONFIG_DEBUG_VIRTUAL
 extern unsigned long __phys_addr(unsigned long);
+extern unsigned long __phys_addr_symbol(unsigned long);
 #else
 #define __phys_addr(x) __phys_addr_nodebug(x)
+#define __phys_addr_symbol(x) \
+   ((unsigned long)(x) - __START_KERNEL_map + phys_base)
 #endif
 
 #define __phys_reloc_hide(x)   (x)
diff --git a/arch/x86/mm/physaddr.c b/arch/x86/mm/physaddr.c
index fd40d75..c73fedd 100644
--- a/arch/x86/mm/physaddr.c
+++ b/arch/x86/mm/physaddr.c
@@ -28,6 +28,17 @@ unsigned long __phys_addr(unsigned long x)
return x;
 }
 EXPORT_SYMBOL(__phys_addr);
+
+unsigned long __phys_addr_symbol(unsigned long x)
+{
+   unsigned long y = x - __START_KERNEL_map;
+
+   /* only check upper bounds since lower bounds will trigger carry */
+   VIRTUAL_BUG_ON(y >= KERNEL_IMAGE_SIZE);
+
+   return y + phys_base;
+}
+EXPORT_SYMBOL(__phys_addr_symbol);
 #endif
 
 bool __virt_addr_valid(unsigned long x)
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/mm] x86: Improve __phys_addr performance by making use of carry flags and inlining

2012-11-16 Thread tip-bot for Alexander Duyck
Commit-ID:  0bdf525f04afd3a32c14e5a8778771f9c9e0f074
Gitweb: http://git.kernel.org/tip/0bdf525f04afd3a32c14e5a8778771f9c9e0f074
Author: Alexander Duyck 
AuthorDate: Fri, 16 Nov 2012 13:53:51 -0800
Committer:  H. Peter Anvin 
CommitDate: Fri, 16 Nov 2012 16:42:08 -0800

x86: Improve __phys_addr performance by making use of carry flags and inlining

This patch is meant to improve overall system performance when making use of
the __phys_addr call.  To do this I have implemented several changes.

First if CONFIG_DEBUG_VIRTUAL is not defined __phys_addr is made an inline,
similar to how this is currently handled in 32 bit.  However in order to do
this it is required to export phys_base so that it is available if __phys_addr
is used in kernel modules.

The second change was to streamline the code by making use of the carry flag
on an add operation instead of performing a compare on a 64 bit value.  The
advantage to this is that it allows us to significantly reduce the overall
size of the call.  On my Xeon E5 system the entire __phys_addr inline call
consumes a little less than 32 bytes and 5 instructions.  I also applied
similar logic to the debug version of the function.  My testing shows that the
debug version of the function with this patch applied is slightly faster than
the non-debug version without the patch.

Finally I also applied the same logic changes to __virt_addr_valid since it
used the same general code flow as __phys_addr and could achieve similar gains
though these changes.

Signed-off-by: Alexander Duyck 
Link: 
http://lkml.kernel.org/r/20121116215315.8521.46270.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin 
---
 arch/x86/include/asm/page_64.h   | 14 ++
 arch/x86/kernel/x8664_ksyms_64.c |  3 +++
 arch/x86/mm/physaddr.c   | 40 +---
 3 files changed, 42 insertions(+), 15 deletions(-)

diff --git a/arch/x86/include/asm/page_64.h b/arch/x86/include/asm/page_64.h
index 4150999..5138174 100644
--- a/arch/x86/include/asm/page_64.h
+++ b/arch/x86/include/asm/page_64.h
@@ -9,7 +9,21 @@
 extern unsigned long max_pfn;
 extern unsigned long phys_base;
 
+static inline unsigned long __phys_addr_nodebug(unsigned long x)
+{
+   unsigned long y = x - __START_KERNEL_map;
+
+   /* use the carry flag to determine if x was < __START_KERNEL_map */
+   x = y + ((x > y) ? phys_base : (__START_KERNEL_map - PAGE_OFFSET));
+
+   return x;
+}
+
+#ifdef CONFIG_DEBUG_VIRTUAL
 extern unsigned long __phys_addr(unsigned long);
+#else
+#define __phys_addr(x) __phys_addr_nodebug(x)
+#endif
 
 #define __phys_reloc_hide(x)   (x)
 
diff --git a/arch/x86/kernel/x8664_ksyms_64.c b/arch/x86/kernel/x8664_ksyms_64.c
index 1330dd1..b014d94 100644
--- a/arch/x86/kernel/x8664_ksyms_64.c
+++ b/arch/x86/kernel/x8664_ksyms_64.c
@@ -59,6 +59,9 @@ EXPORT_SYMBOL(memcpy);
 EXPORT_SYMBOL(__memcpy);
 EXPORT_SYMBOL(memmove);
 
+#ifndef CONFIG_DEBUG_VIRTUAL
+EXPORT_SYMBOL(phys_base);
+#endif
 EXPORT_SYMBOL(empty_zero_page);
 #ifndef CONFIG_PARAVIRT
 EXPORT_SYMBOL(native_load_gs_index);
diff --git a/arch/x86/mm/physaddr.c b/arch/x86/mm/physaddr.c
index d2e2735..fd40d75 100644
--- a/arch/x86/mm/physaddr.c
+++ b/arch/x86/mm/physaddr.c
@@ -8,33 +8,43 @@
 
 #ifdef CONFIG_X86_64
 
+#ifdef CONFIG_DEBUG_VIRTUAL
 unsigned long __phys_addr(unsigned long x)
 {
-   if (x >= __START_KERNEL_map) {
-   x -= __START_KERNEL_map;
-   VIRTUAL_BUG_ON(x >= KERNEL_IMAGE_SIZE);
-   x += phys_base;
+   unsigned long y = x - __START_KERNEL_map;
+
+   /* use the carry flag to determine if x was < __START_KERNEL_map */
+   if (unlikely(x > y)) {
+   x = y + phys_base;
+
+   VIRTUAL_BUG_ON(y >= KERNEL_IMAGE_SIZE);
} else {
-   VIRTUAL_BUG_ON(x < PAGE_OFFSET);
-   x -= PAGE_OFFSET;
-   VIRTUAL_BUG_ON(!phys_addr_valid(x));
+   x = y + (__START_KERNEL_map - PAGE_OFFSET);
+
+   /* carry flag will be set if starting x was >= PAGE_OFFSET */
+   VIRTUAL_BUG_ON((x > y) || !phys_addr_valid(x));
}
+
return x;
 }
 EXPORT_SYMBOL(__phys_addr);
+#endif
 
 bool __virt_addr_valid(unsigned long x)
 {
-   if (x >= __START_KERNEL_map) {
-   x -= __START_KERNEL_map;
-   if (x >= KERNEL_IMAGE_SIZE)
+   unsigned long y = x - __START_KERNEL_map;
+
+   /* use the carry flag to determine if x was < __START_KERNEL_map */
+   if (unlikely(x > y)) {
+   x = y + phys_base;
+
+   if (y >= KERNEL_IMAGE_SIZE)
return false;
-   x += phys_base;
} else {
-   if (x < PAGE_OFFSET)
-   return false;
-   x -= PAGE_OFFSET;
-   if (!phys_addr_valid(x))
+   x = y + (__START_KERNEL_map - PAGE_OFFSET);
+
+   /* carry flag will be set if starting x was >= PAGE_OFFSET 

[tip:x86/mm] x86: Move some contents of page_64_types.h into pgtable_64.h and page_64.h

2012-11-16 Thread tip-bot for Alexander Duyck
Commit-ID:  fb50b020c5331c8c4bee0eb875865f5f8be6c03a
Gitweb: http://git.kernel.org/tip/fb50b020c5331c8c4bee0eb875865f5f8be6c03a
Author: Alexander Duyck 
AuthorDate: Fri, 16 Nov 2012 13:53:09 -0800
Committer:  H. Peter Anvin 
CommitDate: Fri, 16 Nov 2012 16:40:34 -0800

x86: Move some contents of page_64_types.h into pgtable_64.h and page_64.h

This patch is meant to clean-up the fact that we have several functions in
page_64_types.h which really don't belong there.  I found this issue when I
had tried to replace __phys_addr with an inline function.  It resulted in the
realmode bits generating compile warnings about types.  In order to resolve
that I am relocating the address translation to page_64.h since this is in
keeping with where these functions are located in 32 bit.

In addtion I have relocated several functions defined in init_64.c to
pgtable_64.h as this seems to be where most of the functions related to
memory initialization were already located.

[ hpa: added missing #include  to apic_numachip.c,
  as reported by Yinghai Lu. ]

Signed-off-by: Alexander Duyck 
Link: 
http://lkml.kernel.org/r/20121116215244.8521.31505.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin 
Cc: Yinghai Lu 
Cc: Daniel J Blueman 
---
 arch/x86/include/asm/page_64.h   | 19 +++
 arch/x86/include/asm/page_64_types.h | 22 --
 arch/x86/include/asm/pgtable_64.h|  5 +
 arch/x86/kernel/apic/apic_numachip.c |  1 +
 4 files changed, 25 insertions(+), 22 deletions(-)

diff --git a/arch/x86/include/asm/page_64.h b/arch/x86/include/asm/page_64.h
index 072694e..4150999 100644
--- a/arch/x86/include/asm/page_64.h
+++ b/arch/x86/include/asm/page_64.h
@@ -3,4 +3,23 @@
 
 #include 
 
+#ifndef __ASSEMBLY__
+
+/* duplicated to the one in bootmem.h */
+extern unsigned long max_pfn;
+extern unsigned long phys_base;
+
+extern unsigned long __phys_addr(unsigned long);
+
+#define __phys_reloc_hide(x)   (x)
+
+#ifdef CONFIG_FLATMEM
+#define pfn_valid(pfn)  ((pfn) < max_pfn)
+#endif
+
+void clear_page(void *page);
+void copy_page(void *to, void *from);
+
+#endif /* !__ASSEMBLY__ */
+
 #endif /* _ASM_X86_PAGE_64_H */
diff --git a/arch/x86/include/asm/page_64_types.h 
b/arch/x86/include/asm/page_64_types.h
index 320f7bb..8b491e6 100644
--- a/arch/x86/include/asm/page_64_types.h
+++ b/arch/x86/include/asm/page_64_types.h
@@ -50,26 +50,4 @@
 #define KERNEL_IMAGE_SIZE  (512 * 1024 * 1024)
 #define KERNEL_IMAGE_START _AC(0x8000, UL)
 
-#ifndef __ASSEMBLY__
-void clear_page(void *page);
-void copy_page(void *to, void *from);
-
-/* duplicated to the one in bootmem.h */
-extern unsigned long max_pfn;
-extern unsigned long phys_base;
-
-extern unsigned long __phys_addr(unsigned long);
-#define __phys_reloc_hide(x)   (x)
-
-#define vmemmap ((struct page *)VMEMMAP_START)
-
-extern void init_extra_mapping_uc(unsigned long phys, unsigned long size);
-extern void init_extra_mapping_wb(unsigned long phys, unsigned long size);
-
-#endif /* !__ASSEMBLY__ */
-
-#ifdef CONFIG_FLATMEM
-#define pfn_valid(pfn)  ((pfn) < max_pfn)
-#endif
-
 #endif /* _ASM_X86_PAGE_64_DEFS_H */
diff --git a/arch/x86/include/asm/pgtable_64.h 
b/arch/x86/include/asm/pgtable_64.h
index 47356f9..b5d30ad 100644
--- a/arch/x86/include/asm/pgtable_64.h
+++ b/arch/x86/include/asm/pgtable_64.h
@@ -183,6 +183,11 @@ extern void cleanup_highmap(void);
 
 #define __HAVE_ARCH_PTE_SAME
 
+#define vmemmap ((struct page *)VMEMMAP_START)
+
+extern void init_extra_mapping_uc(unsigned long phys, unsigned long size);
+extern void init_extra_mapping_wb(unsigned long phys, unsigned long size);
+
 #endif /* !__ASSEMBLY__ */
 
 #endif /* _ASM_X86_PGTABLE_64_H */
diff --git a/arch/x86/kernel/apic/apic_numachip.c 
b/arch/x86/kernel/apic/apic_numachip.c
index a65829a..ae9196f 100644
--- a/arch/x86/kernel/apic/apic_numachip.c
+++ b/arch/x86/kernel/apic/apic_numachip.c
@@ -27,6 +27,7 @@
 #include 
 #include 
 #include 
+#include 
 
 static int numachip_system __read_mostly;
 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/mm] x86/acpi: Use __pa_symbol instead of __pa on C visible symbols

2012-11-16 Thread tip-bot for Alexander Duyck
Commit-ID:  40276eb3568125e86014d703bae48dbfcb3c20f3
Gitweb: http://git.kernel.org/tip/40276eb3568125e86014d703bae48dbfcb3c20f3
Author: Alexander Duyck 
AuthorDate: Fri, 16 Nov 2012 13:57:43 -0800
Committer:  H. Peter Anvin 
CommitDate: Fri, 16 Nov 2012 15:20:50 -0800

x86/acpi: Use __pa_symbol instead of __pa on C visible symbols

This change just updates one spot where __pa was being used when __pa_symbol
should have been used.  By using __pa_symbol we are able to drop a few extra
lines of code as we don't have to test to see if the virtual pointer is a
part of the kernel text or just standard virtual memory.

Cc: Len Brown 
Cc: Pavel Machek 
Acked-by: "Rafael J. Wysocki" 
Signed-off-by: Alexander Duyck 
Link: 
http://lkml.kernel.org/r/20121116215737.8521.51167.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin 
---
 arch/x86/kernel/acpi/sleep.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c
index 11676cf..f146a3c 100644
--- a/arch/x86/kernel/acpi/sleep.c
+++ b/arch/x86/kernel/acpi/sleep.c
@@ -69,7 +69,7 @@ int acpi_suspend_lowlevel(void)
 
 #ifndef CONFIG_64BIT
header->pmode_entry = (u32)_pmode_return;
-   header->pmode_cr3 = (u32)__pa(_page_table);
+   header->pmode_cr3 = (u32)__pa_symbol(initial_page_table);
saved_magic = 0x12345678;
 #else /* CONFIG_64BIT */
 #ifdef CONFIG_SMP
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/mm] x86/ftrace: Use __pa_symbol instead of __pa on C visible symbols

2012-11-16 Thread tip-bot for Alexander Duyck
Commit-ID:  f38ad48f05973079aff40ac7a5a5ab463f7cee32
Gitweb: http://git.kernel.org/tip/f38ad48f05973079aff40ac7a5a5ab463f7cee32
Author: Alexander Duyck 
AuthorDate: Fri, 16 Nov 2012 13:57:32 -0800
Committer:  H. Peter Anvin 
CommitDate: Fri, 16 Nov 2012 15:20:43 -0800

x86/ftrace: Use __pa_symbol instead of __pa on C visible symbols

Instead of using __pa which is meant to be a general function for converting
virtual addresses to physical addresses we can use __pa_symbol which is the
preferred way of decoding kernel text virtual addresses to physical addresses.

In this case we are not directly converting C visible symbols however if we
know that the instruction pointer is somewhere between _text and _etext we
know that we are going to be translating an address form the kernel text
space.

Cc: Steven Rostedt 
Cc: Frederic Weisbecker 
Signed-off-by: Alexander Duyck 
Link: 
http://lkml.kernel.org/r/20121116215718.8521.24026.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin 
---
 arch/x86/kernel/ftrace.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c
index 1d41402..42a392a 100644
--- a/arch/x86/kernel/ftrace.c
+++ b/arch/x86/kernel/ftrace.c
@@ -89,7 +89,7 @@ do_ftrace_mod_code(unsigned long ip, const void *new_code)
 * kernel identity mapping to modify code.
 */
if (within(ip, (unsigned long)_text, (unsigned long)_etext))
-   ip = (unsigned long)__va(__pa(ip));
+   ip = (unsigned long)__va(__pa_symbol(ip));
 
return probe_kernel_write((void *)ip, new_code, MCOUNT_INSN_SIZE);
 }
@@ -279,7 +279,7 @@ static int ftrace_write(unsigned long ip, const char *val, 
int size)
 * kernel identity mapping to modify code.
 */
if (within(ip, (unsigned long)_text, (unsigned long)_etext))
-   ip = (unsigned long)__va(__pa(ip));
+   ip = (unsigned long)__va(__pa_symbol(ip));
 
return probe_kernel_write((void *)ip, val, size);
 }
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/mm] x86: Use __pa_symbol instead of __pa on C visible symbols

2012-11-16 Thread tip-bot for Alexander Duyck
Commit-ID:  132bc57b030fcdc0968e7cd217e3063f64ec5dce
Gitweb: http://git.kernel.org/tip/132bc57b030fcdc0968e7cd217e3063f64ec5dce
Author: Alexander Duyck 
AuthorDate: Fri, 16 Nov 2012 13:57:13 -0800
Committer:  H. Peter Anvin 
CommitDate: Fri, 16 Nov 2012 15:20:42 -0800

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 
Link: 
http://lkml.kernel.org/r/20121116215640.8521.80483.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin 
---
 arch/x86/kernel/cpu/intel.c |  2 +-
 arch/x86/kernel/setup.c | 16 
 arch/x86/mm/init_64.c   | 18 --
 arch/x86/mm/pageattr.c  |  8 
 arch/x86/platform/efi/efi.c |  4 ++--
 arch/x86/realmode/init.c|  8 
 6 files changed, 27 insertions(+), 29 deletions(-)

diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
index 198e019..2249e7e 100644
--- a/arch/x86/kernel/cpu/intel.c
+++ b/arch/x86/kernel/cpu/intel.c
@@ -168,7 +168,7 @@ int __cpuinit ppro_with_ram_bug(void)
 #ifdef CONFIG_X86_F00F_BUG
 static void __cpuinit trap_init_f00f_bug(void)
 {
-   __set_fixmap(FIX_F00F_IDT, __pa(_table), PAGE_KERNEL_RO);
+   __set_fixmap(FIX_F00F_IDT, __pa_symbol(idt_table), PAGE_KERNEL_RO);
 
/*
 * Update the IDT descriptor and reload the IDT so that
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index ca45696..2702c5d 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -300,8 +300,8 @@ static void __init cleanup_highmap(void)
 static void __init reserve_brk(void)
 {
if (_brk_end > _brk_start)
-   memblock_reserve(__pa(_brk_start),
-__pa(_brk_end) - __pa(_brk_start));
+   memblock_reserve(__pa_symbol(_brk_start),
+_brk_end - _brk_start);
 
/* Mark brk area as locked down and no longer taking any
   new allocations */
@@ -761,12 +761,12 @@ void __init setup_arch(char **cmdline_p)
init_mm.end_data = (unsigned long) _edata;
init_mm.brk = _brk_end;
 
-   code_resource.start = virt_to_phys(_text);
-   code_resource.end = virt_to_phys(_etext)-1;
-   data_resource.start = virt_to_phys(_etext);
-   data_resource.end = virt_to_phys(_edata)-1;
-   bss_resource.start = virt_to_phys(&__bss_start);
-   bss_resource.end = virt_to_phys(&__bss_stop)-1;
+   code_resource.start = __pa_symbol(_text);
+   code_resource.end = __pa_symbol(_etext)-1;
+   data_resource.start = __pa_symbol(_etext);
+   data_resource.end = __pa_symbol(_edata)-1;
+   bss_resource.start = __pa_symbol(__bss_start);
+   bss_resource.end = __pa_symbol(__bss_stop)-1;
 
 #ifdef CONFIG_CMDLINE_BOOL
 #ifdef CONFIG_CMDLINE_OVERRIDE
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index 3baff25..0374a10 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -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)),
+   

[tip:x86/mm] x86: Drop 4 unnecessary calls to __pa_symbol

2012-11-16 Thread tip-bot for Alexander Duyck
Commit-ID:  409fa8dcd2c8b1ec1e705ad99b152bce665af025
Gitweb: http://git.kernel.org/tip/409fa8dcd2c8b1ec1e705ad99b152bce665af025
Author: Alexander Duyck 
AuthorDate: Fri, 16 Nov 2012 13:56:35 -0800
Committer:  H. Peter Anvin 
CommitDate: Fri, 16 Nov 2012 15:20:28 -0800

x86: Drop 4 unnecessary calls to __pa_symbol

While debugging the __pa_symbol inline patch I found that there were a couple
spots where __pa_symbol was used as follows:
__pa_symbol(x) - __pa_symbol(y)

The compiler had reduced them to:
x - y

Since we also support a debug case where __pa_symbol is a function call it
would probably be useful to just change the two cases I found so that they are
always just treated as "x - y".  As such I am casting the values to
phys_addr_t and then doing simple subtraction so that the correct type and
value is returned.

Signed-off-by: Alexander Duyck 
Link: 
http://lkml.kernel.org/r/20121116215552.8521.68085.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin 
---
 arch/x86/kernel/head32.c | 4 ++--
 arch/x86/kernel/head64.c | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/arch/x86/kernel/head32.c b/arch/x86/kernel/head32.c
index c18f59d..f15db0c 100644
--- a/arch/x86/kernel/head32.c
+++ b/arch/x86/kernel/head32.c
@@ -30,8 +30,8 @@ static void __init i386_default_early_setup(void)
 
 void __init i386_start_kernel(void)
 {
-   memblock_reserve(__pa_symbol(&_text),
-__pa_symbol(&__bss_stop) - __pa_symbol(&_text));
+   memblock_reserve(__pa_symbol(_text),
+(phys_addr_t)__bss_stop - (phys_addr_t)_text);
 
 #ifdef CONFIG_BLK_DEV_INITRD
/* Reserve INITRD */
diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c
index 037df57..42f5df1 100644
--- a/arch/x86/kernel/head64.c
+++ b/arch/x86/kernel/head64.c
@@ -97,8 +97,8 @@ void __init x86_64_start_reservations(char *real_mode_data)
 {
copy_bootdata(__va(real_mode_data));
 
-   memblock_reserve(__pa_symbol(&_text),
-__pa_symbol(&__bss_stop) - __pa_symbol(&_text));
+   memblock_reserve(__pa_symbol(_text),
+(phys_addr_t)__bss_stop - (phys_addr_t)_text);
 
 #ifdef CONFIG_BLK_DEV_INITRD
/* Reserve INITRD */
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/mm] x86: Make it so that __pa_symbol can only process kernel symbols on x86_64

2012-11-16 Thread tip-bot for Alexander Duyck
Commit-ID:  bf4010fcf8f241a81693556b5abb48d9dbc33f97
Gitweb: http://git.kernel.org/tip/bf4010fcf8f241a81693556b5abb48d9dbc33f97
Author: Alexander Duyck 
AuthorDate: Fri, 16 Nov 2012 13:55:46 -0800
Committer:  H. Peter Anvin 
CommitDate: Fri, 16 Nov 2012 15:20:25 -0800

x86: Make it so that __pa_symbol can only process kernel symbols on x86_64

I submitted an earlier patch that make __phys_addr an inline.  This obviously
results in an increase in the code size.  One step I can take to reduce that
is to make it so that the __pa_symbol call does a direct translation for
kernel addresses instead of covering all of virtual memory.

On my system this reduced the size for __pa_symbol from 5 instructions
totalling 30 bytes to 3 instructions totalling 16 bytes.

Signed-off-by: Alexander Duyck 
Link: 
http://lkml.kernel.org/r/20121116215356.8521.92472.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin 
---
 arch/x86/include/asm/page.h|  3 ++-
 arch/x86/include/asm/page_32.h |  1 +
 arch/x86/include/asm/page_64.h |  3 +++
 arch/x86/mm/physaddr.c | 11 +++
 4 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/arch/x86/include/asm/page.h b/arch/x86/include/asm/page.h
index 8ca8283..3698a6a 100644
--- a/arch/x86/include/asm/page.h
+++ b/arch/x86/include/asm/page.h
@@ -44,7 +44,8 @@ static inline void copy_user_page(void *to, void *from, 
unsigned long vaddr,
  * case properly. Once all supported versions of gcc understand it, we can
  * remove this Voodoo magic stuff. (i.e. once gcc3.x is deprecated)
  */
-#define __pa_symbol(x) __pa(__phys_reloc_hide((unsigned long)(x)))
+#define __pa_symbol(x) \
+   __phys_addr_symbol(__phys_reloc_hide((unsigned long)(x)))
 
 #define __va(x)((void *)((unsigned 
long)(x)+PAGE_OFFSET))
 
diff --git a/arch/x86/include/asm/page_32.h b/arch/x86/include/asm/page_32.h
index da4e762..4d550d0 100644
--- a/arch/x86/include/asm/page_32.h
+++ b/arch/x86/include/asm/page_32.h
@@ -15,6 +15,7 @@ extern unsigned long __phys_addr(unsigned long);
 #else
 #define __phys_addr(x) __phys_addr_nodebug(x)
 #endif
+#define __phys_addr_symbol(x)  __phys_addr(x)
 #define __phys_reloc_hide(x)   RELOC_HIDE((x), 0)
 
 #ifdef CONFIG_FLATMEM
diff --git a/arch/x86/include/asm/page_64.h b/arch/x86/include/asm/page_64.h
index 5138174..0f1ddee 100644
--- a/arch/x86/include/asm/page_64.h
+++ b/arch/x86/include/asm/page_64.h
@@ -21,8 +21,11 @@ static inline unsigned long __phys_addr_nodebug(unsigned 
long x)
 
 #ifdef CONFIG_DEBUG_VIRTUAL
 extern unsigned long __phys_addr(unsigned long);
+extern unsigned long __phys_addr_symbol(unsigned long);
 #else
 #define __phys_addr(x) __phys_addr_nodebug(x)
+#define __phys_addr_symbol(x) \
+   ((unsigned long)(x) - __START_KERNEL_map + phys_base)
 #endif
 
 #define __phys_reloc_hide(x)   (x)
diff --git a/arch/x86/mm/physaddr.c b/arch/x86/mm/physaddr.c
index fd40d75..c73fedd 100644
--- a/arch/x86/mm/physaddr.c
+++ b/arch/x86/mm/physaddr.c
@@ -28,6 +28,17 @@ unsigned long __phys_addr(unsigned long x)
return x;
 }
 EXPORT_SYMBOL(__phys_addr);
+
+unsigned long __phys_addr_symbol(unsigned long x)
+{
+   unsigned long y = x - __START_KERNEL_map;
+
+   /* only check upper bounds since lower bounds will trigger carry */
+   VIRTUAL_BUG_ON(y >= KERNEL_IMAGE_SIZE);
+
+   return y + phys_base;
+}
+EXPORT_SYMBOL(__phys_addr_symbol);
 #endif
 
 bool __virt_addr_valid(unsigned long x)
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/mm] x86: Improve __phys_addr performance by making use of carry flags and inlining

2012-11-16 Thread tip-bot for Alexander Duyck
Commit-ID:  9dfc3fc0305e158f44c9bb05e9fa13be6125cc4b
Gitweb: http://git.kernel.org/tip/9dfc3fc0305e158f44c9bb05e9fa13be6125cc4b
Author: Alexander Duyck 
AuthorDate: Fri, 16 Nov 2012 13:53:51 -0800
Committer:  H. Peter Anvin 
CommitDate: Fri, 16 Nov 2012 15:20:20 -0800

x86: Improve __phys_addr performance by making use of carry flags and inlining

This patch is meant to improve overall system performance when making use of
the __phys_addr call.  To do this I have implemented several changes.

First if CONFIG_DEBUG_VIRTUAL is not defined __phys_addr is made an inline,
similar to how this is currently handled in 32 bit.  However in order to do
this it is required to export phys_base so that it is available if __phys_addr
is used in kernel modules.

The second change was to streamline the code by making use of the carry flag
on an add operation instead of performing a compare on a 64 bit value.  The
advantage to this is that it allows us to significantly reduce the overall
size of the call.  On my Xeon E5 system the entire __phys_addr inline call
consumes a little less than 32 bytes and 5 instructions.  I also applied
similar logic to the debug version of the function.  My testing shows that the
debug version of the function with this patch applied is slightly faster than
the non-debug version without the patch.

Finally I also applied the same logic changes to __virt_addr_valid since it
used the same general code flow as __phys_addr and could achieve similar gains
though these changes.

Signed-off-by: Alexander Duyck 
Link: 
http://lkml.kernel.org/r/20121116215315.8521.46270.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin 
---
 arch/x86/include/asm/page_64.h   | 14 ++
 arch/x86/kernel/x8664_ksyms_64.c |  3 +++
 arch/x86/mm/physaddr.c   | 40 +---
 3 files changed, 42 insertions(+), 15 deletions(-)

diff --git a/arch/x86/include/asm/page_64.h b/arch/x86/include/asm/page_64.h
index 4150999..5138174 100644
--- a/arch/x86/include/asm/page_64.h
+++ b/arch/x86/include/asm/page_64.h
@@ -9,7 +9,21 @@
 extern unsigned long max_pfn;
 extern unsigned long phys_base;
 
+static inline unsigned long __phys_addr_nodebug(unsigned long x)
+{
+   unsigned long y = x - __START_KERNEL_map;
+
+   /* use the carry flag to determine if x was < __START_KERNEL_map */
+   x = y + ((x > y) ? phys_base : (__START_KERNEL_map - PAGE_OFFSET));
+
+   return x;
+}
+
+#ifdef CONFIG_DEBUG_VIRTUAL
 extern unsigned long __phys_addr(unsigned long);
+#else
+#define __phys_addr(x) __phys_addr_nodebug(x)
+#endif
 
 #define __phys_reloc_hide(x)   (x)
 
diff --git a/arch/x86/kernel/x8664_ksyms_64.c b/arch/x86/kernel/x8664_ksyms_64.c
index 1330dd1..b014d94 100644
--- a/arch/x86/kernel/x8664_ksyms_64.c
+++ b/arch/x86/kernel/x8664_ksyms_64.c
@@ -59,6 +59,9 @@ EXPORT_SYMBOL(memcpy);
 EXPORT_SYMBOL(__memcpy);
 EXPORT_SYMBOL(memmove);
 
+#ifndef CONFIG_DEBUG_VIRTUAL
+EXPORT_SYMBOL(phys_base);
+#endif
 EXPORT_SYMBOL(empty_zero_page);
 #ifndef CONFIG_PARAVIRT
 EXPORT_SYMBOL(native_load_gs_index);
diff --git a/arch/x86/mm/physaddr.c b/arch/x86/mm/physaddr.c
index d2e2735..fd40d75 100644
--- a/arch/x86/mm/physaddr.c
+++ b/arch/x86/mm/physaddr.c
@@ -8,33 +8,43 @@
 
 #ifdef CONFIG_X86_64
 
+#ifdef CONFIG_DEBUG_VIRTUAL
 unsigned long __phys_addr(unsigned long x)
 {
-   if (x >= __START_KERNEL_map) {
-   x -= __START_KERNEL_map;
-   VIRTUAL_BUG_ON(x >= KERNEL_IMAGE_SIZE);
-   x += phys_base;
+   unsigned long y = x - __START_KERNEL_map;
+
+   /* use the carry flag to determine if x was < __START_KERNEL_map */
+   if (unlikely(x > y)) {
+   x = y + phys_base;
+
+   VIRTUAL_BUG_ON(y >= KERNEL_IMAGE_SIZE);
} else {
-   VIRTUAL_BUG_ON(x < PAGE_OFFSET);
-   x -= PAGE_OFFSET;
-   VIRTUAL_BUG_ON(!phys_addr_valid(x));
+   x = y + (__START_KERNEL_map - PAGE_OFFSET);
+
+   /* carry flag will be set if starting x was >= PAGE_OFFSET */
+   VIRTUAL_BUG_ON((x > y) || !phys_addr_valid(x));
}
+
return x;
 }
 EXPORT_SYMBOL(__phys_addr);
+#endif
 
 bool __virt_addr_valid(unsigned long x)
 {
-   if (x >= __START_KERNEL_map) {
-   x -= __START_KERNEL_map;
-   if (x >= KERNEL_IMAGE_SIZE)
+   unsigned long y = x - __START_KERNEL_map;
+
+   /* use the carry flag to determine if x was < __START_KERNEL_map */
+   if (unlikely(x > y)) {
+   x = y + phys_base;
+
+   if (y >= KERNEL_IMAGE_SIZE)
return false;
-   x += phys_base;
} else {
-   if (x < PAGE_OFFSET)
-   return false;
-   x -= PAGE_OFFSET;
-   if (!phys_addr_valid(x))
+   x = y + (__START_KERNEL_map - PAGE_OFFSET);
+
+   /* carry flag will be set if starting x was >= PAGE_OFFSET 

[tip:x86/mm] x86: Move some contents of page_64_types.h into pgtable_64.h and page_64.h

2012-11-16 Thread tip-bot for Alexander Duyck
Commit-ID:  66d61384e9b4087f044ce86cb4adb12fe4623a6b
Gitweb: http://git.kernel.org/tip/66d61384e9b4087f044ce86cb4adb12fe4623a6b
Author: Alexander Duyck 
AuthorDate: Fri, 16 Nov 2012 13:53:09 -0800
Committer:  H. Peter Anvin 
CommitDate: Fri, 16 Nov 2012 15:20:10 -0800

x86: Move some contents of page_64_types.h into pgtable_64.h and page_64.h

This patch is meant to clean-up the fact that we have several functions in
page_64_types.h which really don't belong there.  I found this issue when I
had tried to replace __phys_addr with an inline function.  It resulted in the
realmode bits generating compile warnings about types.  In order to resolve
that I am relocating the address translation to page_64.h since this is in
keeping with where these functions are located in 32 bit.

In addtion I have relocated several functions defined in init_64.c to
pgtable_64.h as this seems to be where most of the functions related to
memory initialization were already located.

Signed-off-by: Alexander Duyck 
Link: 
http://lkml.kernel.org/r/20121116215244.8521.31505.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin 
---
 arch/x86/include/asm/page_64.h   | 19 +++
 arch/x86/include/asm/page_64_types.h | 22 --
 arch/x86/include/asm/pgtable_64.h|  5 +
 3 files changed, 24 insertions(+), 22 deletions(-)

diff --git a/arch/x86/include/asm/page_64.h b/arch/x86/include/asm/page_64.h
index 072694e..4150999 100644
--- a/arch/x86/include/asm/page_64.h
+++ b/arch/x86/include/asm/page_64.h
@@ -3,4 +3,23 @@
 
 #include 
 
+#ifndef __ASSEMBLY__
+
+/* duplicated to the one in bootmem.h */
+extern unsigned long max_pfn;
+extern unsigned long phys_base;
+
+extern unsigned long __phys_addr(unsigned long);
+
+#define __phys_reloc_hide(x)   (x)
+
+#ifdef CONFIG_FLATMEM
+#define pfn_valid(pfn)  ((pfn) < max_pfn)
+#endif
+
+void clear_page(void *page);
+void copy_page(void *to, void *from);
+
+#endif /* !__ASSEMBLY__ */
+
 #endif /* _ASM_X86_PAGE_64_H */
diff --git a/arch/x86/include/asm/page_64_types.h 
b/arch/x86/include/asm/page_64_types.h
index 320f7bb..8b491e6 100644
--- a/arch/x86/include/asm/page_64_types.h
+++ b/arch/x86/include/asm/page_64_types.h
@@ -50,26 +50,4 @@
 #define KERNEL_IMAGE_SIZE  (512 * 1024 * 1024)
 #define KERNEL_IMAGE_START _AC(0x8000, UL)
 
-#ifndef __ASSEMBLY__
-void clear_page(void *page);
-void copy_page(void *to, void *from);
-
-/* duplicated to the one in bootmem.h */
-extern unsigned long max_pfn;
-extern unsigned long phys_base;
-
-extern unsigned long __phys_addr(unsigned long);
-#define __phys_reloc_hide(x)   (x)
-
-#define vmemmap ((struct page *)VMEMMAP_START)
-
-extern void init_extra_mapping_uc(unsigned long phys, unsigned long size);
-extern void init_extra_mapping_wb(unsigned long phys, unsigned long size);
-
-#endif /* !__ASSEMBLY__ */
-
-#ifdef CONFIG_FLATMEM
-#define pfn_valid(pfn)  ((pfn) < max_pfn)
-#endif
-
 #endif /* _ASM_X86_PAGE_64_DEFS_H */
diff --git a/arch/x86/include/asm/pgtable_64.h 
b/arch/x86/include/asm/pgtable_64.h
index 47356f9..b5d30ad 100644
--- a/arch/x86/include/asm/pgtable_64.h
+++ b/arch/x86/include/asm/pgtable_64.h
@@ -183,6 +183,11 @@ extern void cleanup_highmap(void);
 
 #define __HAVE_ARCH_PTE_SAME
 
+#define vmemmap ((struct page *)VMEMMAP_START)
+
+extern void init_extra_mapping_uc(unsigned long phys, unsigned long size);
+extern void init_extra_mapping_wb(unsigned long phys, unsigned long size);
+
 #endif /* !__ASSEMBLY__ */
 
 #endif /* _ASM_X86_PGTABLE_64_H */
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/mm] x86: Move some contents of page_64_types.h into pgtable_64.h and page_64.h

2012-11-16 Thread tip-bot for Alexander Duyck
Commit-ID:  66d61384e9b4087f044ce86cb4adb12fe4623a6b
Gitweb: http://git.kernel.org/tip/66d61384e9b4087f044ce86cb4adb12fe4623a6b
Author: Alexander Duyck alexander.h.du...@intel.com
AuthorDate: Fri, 16 Nov 2012 13:53:09 -0800
Committer:  H. Peter Anvin h...@linux.intel.com
CommitDate: Fri, 16 Nov 2012 15:20:10 -0800

x86: Move some contents of page_64_types.h into pgtable_64.h and page_64.h

This patch is meant to clean-up the fact that we have several functions in
page_64_types.h which really don't belong there.  I found this issue when I
had tried to replace __phys_addr with an inline function.  It resulted in the
realmode bits generating compile warnings about types.  In order to resolve
that I am relocating the address translation to page_64.h since this is in
keeping with where these functions are located in 32 bit.

In addtion I have relocated several functions defined in init_64.c to
pgtable_64.h as this seems to be where most of the functions related to
memory initialization were already located.

Signed-off-by: Alexander Duyck alexander.h.du...@intel.com
Link: 
http://lkml.kernel.org/r/20121116215244.8521.31505.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin h...@linux.intel.com
---
 arch/x86/include/asm/page_64.h   | 19 +++
 arch/x86/include/asm/page_64_types.h | 22 --
 arch/x86/include/asm/pgtable_64.h|  5 +
 3 files changed, 24 insertions(+), 22 deletions(-)

diff --git a/arch/x86/include/asm/page_64.h b/arch/x86/include/asm/page_64.h
index 072694e..4150999 100644
--- a/arch/x86/include/asm/page_64.h
+++ b/arch/x86/include/asm/page_64.h
@@ -3,4 +3,23 @@
 
 #include asm/page_64_types.h
 
+#ifndef __ASSEMBLY__
+
+/* duplicated to the one in bootmem.h */
+extern unsigned long max_pfn;
+extern unsigned long phys_base;
+
+extern unsigned long __phys_addr(unsigned long);
+
+#define __phys_reloc_hide(x)   (x)
+
+#ifdef CONFIG_FLATMEM
+#define pfn_valid(pfn)  ((pfn)  max_pfn)
+#endif
+
+void clear_page(void *page);
+void copy_page(void *to, void *from);
+
+#endif /* !__ASSEMBLY__ */
+
 #endif /* _ASM_X86_PAGE_64_H */
diff --git a/arch/x86/include/asm/page_64_types.h 
b/arch/x86/include/asm/page_64_types.h
index 320f7bb..8b491e6 100644
--- a/arch/x86/include/asm/page_64_types.h
+++ b/arch/x86/include/asm/page_64_types.h
@@ -50,26 +50,4 @@
 #define KERNEL_IMAGE_SIZE  (512 * 1024 * 1024)
 #define KERNEL_IMAGE_START _AC(0x8000, UL)
 
-#ifndef __ASSEMBLY__
-void clear_page(void *page);
-void copy_page(void *to, void *from);
-
-/* duplicated to the one in bootmem.h */
-extern unsigned long max_pfn;
-extern unsigned long phys_base;
-
-extern unsigned long __phys_addr(unsigned long);
-#define __phys_reloc_hide(x)   (x)
-
-#define vmemmap ((struct page *)VMEMMAP_START)
-
-extern void init_extra_mapping_uc(unsigned long phys, unsigned long size);
-extern void init_extra_mapping_wb(unsigned long phys, unsigned long size);
-
-#endif /* !__ASSEMBLY__ */
-
-#ifdef CONFIG_FLATMEM
-#define pfn_valid(pfn)  ((pfn)  max_pfn)
-#endif
-
 #endif /* _ASM_X86_PAGE_64_DEFS_H */
diff --git a/arch/x86/include/asm/pgtable_64.h 
b/arch/x86/include/asm/pgtable_64.h
index 47356f9..b5d30ad 100644
--- a/arch/x86/include/asm/pgtable_64.h
+++ b/arch/x86/include/asm/pgtable_64.h
@@ -183,6 +183,11 @@ extern void cleanup_highmap(void);
 
 #define __HAVE_ARCH_PTE_SAME
 
+#define vmemmap ((struct page *)VMEMMAP_START)
+
+extern void init_extra_mapping_uc(unsigned long phys, unsigned long size);
+extern void init_extra_mapping_wb(unsigned long phys, unsigned long size);
+
 #endif /* !__ASSEMBLY__ */
 
 #endif /* _ASM_X86_PGTABLE_64_H */
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/mm] x86: Improve __phys_addr performance by making use of carry flags and inlining

2012-11-16 Thread tip-bot for Alexander Duyck
Commit-ID:  9dfc3fc0305e158f44c9bb05e9fa13be6125cc4b
Gitweb: http://git.kernel.org/tip/9dfc3fc0305e158f44c9bb05e9fa13be6125cc4b
Author: Alexander Duyck alexander.h.du...@intel.com
AuthorDate: Fri, 16 Nov 2012 13:53:51 -0800
Committer:  H. Peter Anvin h...@linux.intel.com
CommitDate: Fri, 16 Nov 2012 15:20:20 -0800

x86: Improve __phys_addr performance by making use of carry flags and inlining

This patch is meant to improve overall system performance when making use of
the __phys_addr call.  To do this I have implemented several changes.

First if CONFIG_DEBUG_VIRTUAL is not defined __phys_addr is made an inline,
similar to how this is currently handled in 32 bit.  However in order to do
this it is required to export phys_base so that it is available if __phys_addr
is used in kernel modules.

The second change was to streamline the code by making use of the carry flag
on an add operation instead of performing a compare on a 64 bit value.  The
advantage to this is that it allows us to significantly reduce the overall
size of the call.  On my Xeon E5 system the entire __phys_addr inline call
consumes a little less than 32 bytes and 5 instructions.  I also applied
similar logic to the debug version of the function.  My testing shows that the
debug version of the function with this patch applied is slightly faster than
the non-debug version without the patch.

Finally I also applied the same logic changes to __virt_addr_valid since it
used the same general code flow as __phys_addr and could achieve similar gains
though these changes.

Signed-off-by: Alexander Duyck alexander.h.du...@intel.com
Link: 
http://lkml.kernel.org/r/20121116215315.8521.46270.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin h...@linux.intel.com
---
 arch/x86/include/asm/page_64.h   | 14 ++
 arch/x86/kernel/x8664_ksyms_64.c |  3 +++
 arch/x86/mm/physaddr.c   | 40 +---
 3 files changed, 42 insertions(+), 15 deletions(-)

diff --git a/arch/x86/include/asm/page_64.h b/arch/x86/include/asm/page_64.h
index 4150999..5138174 100644
--- a/arch/x86/include/asm/page_64.h
+++ b/arch/x86/include/asm/page_64.h
@@ -9,7 +9,21 @@
 extern unsigned long max_pfn;
 extern unsigned long phys_base;
 
+static inline unsigned long __phys_addr_nodebug(unsigned long x)
+{
+   unsigned long y = x - __START_KERNEL_map;
+
+   /* use the carry flag to determine if x was  __START_KERNEL_map */
+   x = y + ((x  y) ? phys_base : (__START_KERNEL_map - PAGE_OFFSET));
+
+   return x;
+}
+
+#ifdef CONFIG_DEBUG_VIRTUAL
 extern unsigned long __phys_addr(unsigned long);
+#else
+#define __phys_addr(x) __phys_addr_nodebug(x)
+#endif
 
 #define __phys_reloc_hide(x)   (x)
 
diff --git a/arch/x86/kernel/x8664_ksyms_64.c b/arch/x86/kernel/x8664_ksyms_64.c
index 1330dd1..b014d94 100644
--- a/arch/x86/kernel/x8664_ksyms_64.c
+++ b/arch/x86/kernel/x8664_ksyms_64.c
@@ -59,6 +59,9 @@ EXPORT_SYMBOL(memcpy);
 EXPORT_SYMBOL(__memcpy);
 EXPORT_SYMBOL(memmove);
 
+#ifndef CONFIG_DEBUG_VIRTUAL
+EXPORT_SYMBOL(phys_base);
+#endif
 EXPORT_SYMBOL(empty_zero_page);
 #ifndef CONFIG_PARAVIRT
 EXPORT_SYMBOL(native_load_gs_index);
diff --git a/arch/x86/mm/physaddr.c b/arch/x86/mm/physaddr.c
index d2e2735..fd40d75 100644
--- a/arch/x86/mm/physaddr.c
+++ b/arch/x86/mm/physaddr.c
@@ -8,33 +8,43 @@
 
 #ifdef CONFIG_X86_64
 
+#ifdef CONFIG_DEBUG_VIRTUAL
 unsigned long __phys_addr(unsigned long x)
 {
-   if (x = __START_KERNEL_map) {
-   x -= __START_KERNEL_map;
-   VIRTUAL_BUG_ON(x = KERNEL_IMAGE_SIZE);
-   x += phys_base;
+   unsigned long y = x - __START_KERNEL_map;
+
+   /* use the carry flag to determine if x was  __START_KERNEL_map */
+   if (unlikely(x  y)) {
+   x = y + phys_base;
+
+   VIRTUAL_BUG_ON(y = KERNEL_IMAGE_SIZE);
} else {
-   VIRTUAL_BUG_ON(x  PAGE_OFFSET);
-   x -= PAGE_OFFSET;
-   VIRTUAL_BUG_ON(!phys_addr_valid(x));
+   x = y + (__START_KERNEL_map - PAGE_OFFSET);
+
+   /* carry flag will be set if starting x was = PAGE_OFFSET */
+   VIRTUAL_BUG_ON((x  y) || !phys_addr_valid(x));
}
+
return x;
 }
 EXPORT_SYMBOL(__phys_addr);
+#endif
 
 bool __virt_addr_valid(unsigned long x)
 {
-   if (x = __START_KERNEL_map) {
-   x -= __START_KERNEL_map;
-   if (x = KERNEL_IMAGE_SIZE)
+   unsigned long y = x - __START_KERNEL_map;
+
+   /* use the carry flag to determine if x was  __START_KERNEL_map */
+   if (unlikely(x  y)) {
+   x = y + phys_base;
+
+   if (y = KERNEL_IMAGE_SIZE)
return false;
-   x += phys_base;
} else {
-   if (x  PAGE_OFFSET)
-   return false;
-   x -= PAGE_OFFSET;
-   if (!phys_addr_valid(x))
+   x = y + (__START_KERNEL_map - 

[tip:x86/mm] x86: Make it so that __pa_symbol can only process kernel symbols on x86_64

2012-11-16 Thread tip-bot for Alexander Duyck
Commit-ID:  bf4010fcf8f241a81693556b5abb48d9dbc33f97
Gitweb: http://git.kernel.org/tip/bf4010fcf8f241a81693556b5abb48d9dbc33f97
Author: Alexander Duyck alexander.h.du...@intel.com
AuthorDate: Fri, 16 Nov 2012 13:55:46 -0800
Committer:  H. Peter Anvin h...@linux.intel.com
CommitDate: Fri, 16 Nov 2012 15:20:25 -0800

x86: Make it so that __pa_symbol can only process kernel symbols on x86_64

I submitted an earlier patch that make __phys_addr an inline.  This obviously
results in an increase in the code size.  One step I can take to reduce that
is to make it so that the __pa_symbol call does a direct translation for
kernel addresses instead of covering all of virtual memory.

On my system this reduced the size for __pa_symbol from 5 instructions
totalling 30 bytes to 3 instructions totalling 16 bytes.

Signed-off-by: Alexander Duyck alexander.h.du...@intel.com
Link: 
http://lkml.kernel.org/r/20121116215356.8521.92472.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin h...@linux.intel.com
---
 arch/x86/include/asm/page.h|  3 ++-
 arch/x86/include/asm/page_32.h |  1 +
 arch/x86/include/asm/page_64.h |  3 +++
 arch/x86/mm/physaddr.c | 11 +++
 4 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/arch/x86/include/asm/page.h b/arch/x86/include/asm/page.h
index 8ca8283..3698a6a 100644
--- a/arch/x86/include/asm/page.h
+++ b/arch/x86/include/asm/page.h
@@ -44,7 +44,8 @@ static inline void copy_user_page(void *to, void *from, 
unsigned long vaddr,
  * case properly. Once all supported versions of gcc understand it, we can
  * remove this Voodoo magic stuff. (i.e. once gcc3.x is deprecated)
  */
-#define __pa_symbol(x) __pa(__phys_reloc_hide((unsigned long)(x)))
+#define __pa_symbol(x) \
+   __phys_addr_symbol(__phys_reloc_hide((unsigned long)(x)))
 
 #define __va(x)((void *)((unsigned 
long)(x)+PAGE_OFFSET))
 
diff --git a/arch/x86/include/asm/page_32.h b/arch/x86/include/asm/page_32.h
index da4e762..4d550d0 100644
--- a/arch/x86/include/asm/page_32.h
+++ b/arch/x86/include/asm/page_32.h
@@ -15,6 +15,7 @@ extern unsigned long __phys_addr(unsigned long);
 #else
 #define __phys_addr(x) __phys_addr_nodebug(x)
 #endif
+#define __phys_addr_symbol(x)  __phys_addr(x)
 #define __phys_reloc_hide(x)   RELOC_HIDE((x), 0)
 
 #ifdef CONFIG_FLATMEM
diff --git a/arch/x86/include/asm/page_64.h b/arch/x86/include/asm/page_64.h
index 5138174..0f1ddee 100644
--- a/arch/x86/include/asm/page_64.h
+++ b/arch/x86/include/asm/page_64.h
@@ -21,8 +21,11 @@ static inline unsigned long __phys_addr_nodebug(unsigned 
long x)
 
 #ifdef CONFIG_DEBUG_VIRTUAL
 extern unsigned long __phys_addr(unsigned long);
+extern unsigned long __phys_addr_symbol(unsigned long);
 #else
 #define __phys_addr(x) __phys_addr_nodebug(x)
+#define __phys_addr_symbol(x) \
+   ((unsigned long)(x) - __START_KERNEL_map + phys_base)
 #endif
 
 #define __phys_reloc_hide(x)   (x)
diff --git a/arch/x86/mm/physaddr.c b/arch/x86/mm/physaddr.c
index fd40d75..c73fedd 100644
--- a/arch/x86/mm/physaddr.c
+++ b/arch/x86/mm/physaddr.c
@@ -28,6 +28,17 @@ unsigned long __phys_addr(unsigned long x)
return x;
 }
 EXPORT_SYMBOL(__phys_addr);
+
+unsigned long __phys_addr_symbol(unsigned long x)
+{
+   unsigned long y = x - __START_KERNEL_map;
+
+   /* only check upper bounds since lower bounds will trigger carry */
+   VIRTUAL_BUG_ON(y = KERNEL_IMAGE_SIZE);
+
+   return y + phys_base;
+}
+EXPORT_SYMBOL(__phys_addr_symbol);
 #endif
 
 bool __virt_addr_valid(unsigned long x)
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/mm] x86: Drop 4 unnecessary calls to __pa_symbol

2012-11-16 Thread tip-bot for Alexander Duyck
Commit-ID:  409fa8dcd2c8b1ec1e705ad99b152bce665af025
Gitweb: http://git.kernel.org/tip/409fa8dcd2c8b1ec1e705ad99b152bce665af025
Author: Alexander Duyck alexander.h.du...@intel.com
AuthorDate: Fri, 16 Nov 2012 13:56:35 -0800
Committer:  H. Peter Anvin h...@linux.intel.com
CommitDate: Fri, 16 Nov 2012 15:20:28 -0800

x86: Drop 4 unnecessary calls to __pa_symbol

While debugging the __pa_symbol inline patch I found that there were a couple
spots where __pa_symbol was used as follows:
__pa_symbol(x) - __pa_symbol(y)

The compiler had reduced them to:
x - y

Since we also support a debug case where __pa_symbol is a function call it
would probably be useful to just change the two cases I found so that they are
always just treated as x - y.  As such I am casting the values to
phys_addr_t and then doing simple subtraction so that the correct type and
value is returned.

Signed-off-by: Alexander Duyck alexander.h.du...@intel.com
Link: 
http://lkml.kernel.org/r/20121116215552.8521.68085.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin h...@linux.intel.com
---
 arch/x86/kernel/head32.c | 4 ++--
 arch/x86/kernel/head64.c | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/arch/x86/kernel/head32.c b/arch/x86/kernel/head32.c
index c18f59d..f15db0c 100644
--- a/arch/x86/kernel/head32.c
+++ b/arch/x86/kernel/head32.c
@@ -30,8 +30,8 @@ static void __init i386_default_early_setup(void)
 
 void __init i386_start_kernel(void)
 {
-   memblock_reserve(__pa_symbol(_text),
-__pa_symbol(__bss_stop) - __pa_symbol(_text));
+   memblock_reserve(__pa_symbol(_text),
+(phys_addr_t)__bss_stop - (phys_addr_t)_text);
 
 #ifdef CONFIG_BLK_DEV_INITRD
/* Reserve INITRD */
diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c
index 037df57..42f5df1 100644
--- a/arch/x86/kernel/head64.c
+++ b/arch/x86/kernel/head64.c
@@ -97,8 +97,8 @@ void __init x86_64_start_reservations(char *real_mode_data)
 {
copy_bootdata(__va(real_mode_data));
 
-   memblock_reserve(__pa_symbol(_text),
-__pa_symbol(__bss_stop) - __pa_symbol(_text));
+   memblock_reserve(__pa_symbol(_text),
+(phys_addr_t)__bss_stop - (phys_addr_t)_text);
 
 #ifdef CONFIG_BLK_DEV_INITRD
/* Reserve INITRD */
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/mm] x86: Use __pa_symbol instead of __pa on C visible symbols

2012-11-16 Thread tip-bot for Alexander Duyck
Commit-ID:  132bc57b030fcdc0968e7cd217e3063f64ec5dce
Gitweb: http://git.kernel.org/tip/132bc57b030fcdc0968e7cd217e3063f64ec5dce
Author: Alexander Duyck alexander.h.du...@intel.com
AuthorDate: Fri, 16 Nov 2012 13:57:13 -0800
Committer:  H. Peter Anvin h...@linux.intel.com
CommitDate: Fri, 16 Nov 2012 15:20:42 -0800

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.du...@intel.com
Link: 
http://lkml.kernel.org/r/20121116215640.8521.80483.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin h...@linux.intel.com
---
 arch/x86/kernel/cpu/intel.c |  2 +-
 arch/x86/kernel/setup.c | 16 
 arch/x86/mm/init_64.c   | 18 --
 arch/x86/mm/pageattr.c  |  8 
 arch/x86/platform/efi/efi.c |  4 ++--
 arch/x86/realmode/init.c|  8 
 6 files changed, 27 insertions(+), 29 deletions(-)

diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
index 198e019..2249e7e 100644
--- a/arch/x86/kernel/cpu/intel.c
+++ b/arch/x86/kernel/cpu/intel.c
@@ -168,7 +168,7 @@ int __cpuinit ppro_with_ram_bug(void)
 #ifdef CONFIG_X86_F00F_BUG
 static void __cpuinit trap_init_f00f_bug(void)
 {
-   __set_fixmap(FIX_F00F_IDT, __pa(idt_table), PAGE_KERNEL_RO);
+   __set_fixmap(FIX_F00F_IDT, __pa_symbol(idt_table), PAGE_KERNEL_RO);
 
/*
 * Update the IDT descriptor and reload the IDT so that
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index ca45696..2702c5d 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -300,8 +300,8 @@ static void __init cleanup_highmap(void)
 static void __init reserve_brk(void)
 {
if (_brk_end  _brk_start)
-   memblock_reserve(__pa(_brk_start),
-__pa(_brk_end) - __pa(_brk_start));
+   memblock_reserve(__pa_symbol(_brk_start),
+_brk_end - _brk_start);
 
/* Mark brk area as locked down and no longer taking any
   new allocations */
@@ -761,12 +761,12 @@ void __init setup_arch(char **cmdline_p)
init_mm.end_data = (unsigned long) _edata;
init_mm.brk = _brk_end;
 
-   code_resource.start = virt_to_phys(_text);
-   code_resource.end = virt_to_phys(_etext)-1;
-   data_resource.start = virt_to_phys(_etext);
-   data_resource.end = virt_to_phys(_edata)-1;
-   bss_resource.start = virt_to_phys(__bss_start);
-   bss_resource.end = virt_to_phys(__bss_stop)-1;
+   code_resource.start = __pa_symbol(_text);
+   code_resource.end = __pa_symbol(_etext)-1;
+   data_resource.start = __pa_symbol(_etext);
+   data_resource.end = __pa_symbol(_edata)-1;
+   bss_resource.start = __pa_symbol(__bss_start);
+   bss_resource.end = __pa_symbol(__bss_stop)-1;
 
 #ifdef CONFIG_CMDLINE_BOOL
 #ifdef CONFIG_CMDLINE_OVERRIDE
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index 3baff25..0374a10 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -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)));
+ 

[tip:x86/mm] x86/ftrace: Use __pa_symbol instead of __pa on C visible symbols

2012-11-16 Thread tip-bot for Alexander Duyck
Commit-ID:  f38ad48f05973079aff40ac7a5a5ab463f7cee32
Gitweb: http://git.kernel.org/tip/f38ad48f05973079aff40ac7a5a5ab463f7cee32
Author: Alexander Duyck alexander.h.du...@intel.com
AuthorDate: Fri, 16 Nov 2012 13:57:32 -0800
Committer:  H. Peter Anvin h...@linux.intel.com
CommitDate: Fri, 16 Nov 2012 15:20:43 -0800

x86/ftrace: Use __pa_symbol instead of __pa on C visible symbols

Instead of using __pa which is meant to be a general function for converting
virtual addresses to physical addresses we can use __pa_symbol which is the
preferred way of decoding kernel text virtual addresses to physical addresses.

In this case we are not directly converting C visible symbols however if we
know that the instruction pointer is somewhere between _text and _etext we
know that we are going to be translating an address form the kernel text
space.

Cc: Steven Rostedt rost...@goodmis.org
Cc: Frederic Weisbecker fweis...@gmail.com
Signed-off-by: Alexander Duyck alexander.h.du...@intel.com
Link: 
http://lkml.kernel.org/r/20121116215718.8521.24026.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin h...@linux.intel.com
---
 arch/x86/kernel/ftrace.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c
index 1d41402..42a392a 100644
--- a/arch/x86/kernel/ftrace.c
+++ b/arch/x86/kernel/ftrace.c
@@ -89,7 +89,7 @@ do_ftrace_mod_code(unsigned long ip, const void *new_code)
 * kernel identity mapping to modify code.
 */
if (within(ip, (unsigned long)_text, (unsigned long)_etext))
-   ip = (unsigned long)__va(__pa(ip));
+   ip = (unsigned long)__va(__pa_symbol(ip));
 
return probe_kernel_write((void *)ip, new_code, MCOUNT_INSN_SIZE);
 }
@@ -279,7 +279,7 @@ static int ftrace_write(unsigned long ip, const char *val, 
int size)
 * kernel identity mapping to modify code.
 */
if (within(ip, (unsigned long)_text, (unsigned long)_etext))
-   ip = (unsigned long)__va(__pa(ip));
+   ip = (unsigned long)__va(__pa_symbol(ip));
 
return probe_kernel_write((void *)ip, val, size);
 }
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/mm] x86/acpi: Use __pa_symbol instead of __pa on C visible symbols

2012-11-16 Thread tip-bot for Alexander Duyck
Commit-ID:  40276eb3568125e86014d703bae48dbfcb3c20f3
Gitweb: http://git.kernel.org/tip/40276eb3568125e86014d703bae48dbfcb3c20f3
Author: Alexander Duyck alexander.h.du...@intel.com
AuthorDate: Fri, 16 Nov 2012 13:57:43 -0800
Committer:  H. Peter Anvin h...@linux.intel.com
CommitDate: Fri, 16 Nov 2012 15:20:50 -0800

x86/acpi: Use __pa_symbol instead of __pa on C visible symbols

This change just updates one spot where __pa was being used when __pa_symbol
should have been used.  By using __pa_symbol we are able to drop a few extra
lines of code as we don't have to test to see if the virtual pointer is a
part of the kernel text or just standard virtual memory.

Cc: Len Brown len.br...@intel.com
Cc: Pavel Machek pa...@ucw.cz
Acked-by: Rafael J. Wysocki r...@sisk.pl
Signed-off-by: Alexander Duyck alexander.h.du...@intel.com
Link: 
http://lkml.kernel.org/r/20121116215737.8521.51167.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin h...@linux.intel.com
---
 arch/x86/kernel/acpi/sleep.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c
index 11676cf..f146a3c 100644
--- a/arch/x86/kernel/acpi/sleep.c
+++ b/arch/x86/kernel/acpi/sleep.c
@@ -69,7 +69,7 @@ int acpi_suspend_lowlevel(void)
 
 #ifndef CONFIG_64BIT
header-pmode_entry = (u32)wakeup_pmode_return;
-   header-pmode_cr3 = (u32)__pa(initial_page_table);
+   header-pmode_cr3 = (u32)__pa_symbol(initial_page_table);
saved_magic = 0x12345678;
 #else /* CONFIG_64BIT */
 #ifdef CONFIG_SMP
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/mm] x86: Move some contents of page_64_types.h into pgtable_64.h and page_64.h

2012-11-16 Thread tip-bot for Alexander Duyck
Commit-ID:  fb50b020c5331c8c4bee0eb875865f5f8be6c03a
Gitweb: http://git.kernel.org/tip/fb50b020c5331c8c4bee0eb875865f5f8be6c03a
Author: Alexander Duyck alexander.h.du...@intel.com
AuthorDate: Fri, 16 Nov 2012 13:53:09 -0800
Committer:  H. Peter Anvin h...@linux.intel.com
CommitDate: Fri, 16 Nov 2012 16:40:34 -0800

x86: Move some contents of page_64_types.h into pgtable_64.h and page_64.h

This patch is meant to clean-up the fact that we have several functions in
page_64_types.h which really don't belong there.  I found this issue when I
had tried to replace __phys_addr with an inline function.  It resulted in the
realmode bits generating compile warnings about types.  In order to resolve
that I am relocating the address translation to page_64.h since this is in
keeping with where these functions are located in 32 bit.

In addtion I have relocated several functions defined in init_64.c to
pgtable_64.h as this seems to be where most of the functions related to
memory initialization were already located.

[ hpa: added missing #include asm/pgtable.h to apic_numachip.c,
  as reported by Yinghai Lu. ]

Signed-off-by: Alexander Duyck alexander.h.du...@intel.com
Link: 
http://lkml.kernel.org/r/20121116215244.8521.31505.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin h...@linux.intel.com
Cc: Yinghai Lu ying...@kernel.org
Cc: Daniel J Blueman dan...@numascale-asia.com
---
 arch/x86/include/asm/page_64.h   | 19 +++
 arch/x86/include/asm/page_64_types.h | 22 --
 arch/x86/include/asm/pgtable_64.h|  5 +
 arch/x86/kernel/apic/apic_numachip.c |  1 +
 4 files changed, 25 insertions(+), 22 deletions(-)

diff --git a/arch/x86/include/asm/page_64.h b/arch/x86/include/asm/page_64.h
index 072694e..4150999 100644
--- a/arch/x86/include/asm/page_64.h
+++ b/arch/x86/include/asm/page_64.h
@@ -3,4 +3,23 @@
 
 #include asm/page_64_types.h
 
+#ifndef __ASSEMBLY__
+
+/* duplicated to the one in bootmem.h */
+extern unsigned long max_pfn;
+extern unsigned long phys_base;
+
+extern unsigned long __phys_addr(unsigned long);
+
+#define __phys_reloc_hide(x)   (x)
+
+#ifdef CONFIG_FLATMEM
+#define pfn_valid(pfn)  ((pfn)  max_pfn)
+#endif
+
+void clear_page(void *page);
+void copy_page(void *to, void *from);
+
+#endif /* !__ASSEMBLY__ */
+
 #endif /* _ASM_X86_PAGE_64_H */
diff --git a/arch/x86/include/asm/page_64_types.h 
b/arch/x86/include/asm/page_64_types.h
index 320f7bb..8b491e6 100644
--- a/arch/x86/include/asm/page_64_types.h
+++ b/arch/x86/include/asm/page_64_types.h
@@ -50,26 +50,4 @@
 #define KERNEL_IMAGE_SIZE  (512 * 1024 * 1024)
 #define KERNEL_IMAGE_START _AC(0x8000, UL)
 
-#ifndef __ASSEMBLY__
-void clear_page(void *page);
-void copy_page(void *to, void *from);
-
-/* duplicated to the one in bootmem.h */
-extern unsigned long max_pfn;
-extern unsigned long phys_base;
-
-extern unsigned long __phys_addr(unsigned long);
-#define __phys_reloc_hide(x)   (x)
-
-#define vmemmap ((struct page *)VMEMMAP_START)
-
-extern void init_extra_mapping_uc(unsigned long phys, unsigned long size);
-extern void init_extra_mapping_wb(unsigned long phys, unsigned long size);
-
-#endif /* !__ASSEMBLY__ */
-
-#ifdef CONFIG_FLATMEM
-#define pfn_valid(pfn)  ((pfn)  max_pfn)
-#endif
-
 #endif /* _ASM_X86_PAGE_64_DEFS_H */
diff --git a/arch/x86/include/asm/pgtable_64.h 
b/arch/x86/include/asm/pgtable_64.h
index 47356f9..b5d30ad 100644
--- a/arch/x86/include/asm/pgtable_64.h
+++ b/arch/x86/include/asm/pgtable_64.h
@@ -183,6 +183,11 @@ extern void cleanup_highmap(void);
 
 #define __HAVE_ARCH_PTE_SAME
 
+#define vmemmap ((struct page *)VMEMMAP_START)
+
+extern void init_extra_mapping_uc(unsigned long phys, unsigned long size);
+extern void init_extra_mapping_wb(unsigned long phys, unsigned long size);
+
 #endif /* !__ASSEMBLY__ */
 
 #endif /* _ASM_X86_PGTABLE_64_H */
diff --git a/arch/x86/kernel/apic/apic_numachip.c 
b/arch/x86/kernel/apic/apic_numachip.c
index a65829a..ae9196f 100644
--- a/arch/x86/kernel/apic/apic_numachip.c
+++ b/arch/x86/kernel/apic/apic_numachip.c
@@ -27,6 +27,7 @@
 #include asm/apic.h
 #include asm/ipi.h
 #include asm/apic_flat_64.h
+#include asm/pgtable.h
 
 static int numachip_system __read_mostly;
 
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/mm] x86: Improve __phys_addr performance by making use of carry flags and inlining

2012-11-16 Thread tip-bot for Alexander Duyck
Commit-ID:  0bdf525f04afd3a32c14e5a8778771f9c9e0f074
Gitweb: http://git.kernel.org/tip/0bdf525f04afd3a32c14e5a8778771f9c9e0f074
Author: Alexander Duyck alexander.h.du...@intel.com
AuthorDate: Fri, 16 Nov 2012 13:53:51 -0800
Committer:  H. Peter Anvin h...@linux.intel.com
CommitDate: Fri, 16 Nov 2012 16:42:08 -0800

x86: Improve __phys_addr performance by making use of carry flags and inlining

This patch is meant to improve overall system performance when making use of
the __phys_addr call.  To do this I have implemented several changes.

First if CONFIG_DEBUG_VIRTUAL is not defined __phys_addr is made an inline,
similar to how this is currently handled in 32 bit.  However in order to do
this it is required to export phys_base so that it is available if __phys_addr
is used in kernel modules.

The second change was to streamline the code by making use of the carry flag
on an add operation instead of performing a compare on a 64 bit value.  The
advantage to this is that it allows us to significantly reduce the overall
size of the call.  On my Xeon E5 system the entire __phys_addr inline call
consumes a little less than 32 bytes and 5 instructions.  I also applied
similar logic to the debug version of the function.  My testing shows that the
debug version of the function with this patch applied is slightly faster than
the non-debug version without the patch.

Finally I also applied the same logic changes to __virt_addr_valid since it
used the same general code flow as __phys_addr and could achieve similar gains
though these changes.

Signed-off-by: Alexander Duyck alexander.h.du...@intel.com
Link: 
http://lkml.kernel.org/r/20121116215315.8521.46270.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin h...@linux.intel.com
---
 arch/x86/include/asm/page_64.h   | 14 ++
 arch/x86/kernel/x8664_ksyms_64.c |  3 +++
 arch/x86/mm/physaddr.c   | 40 +---
 3 files changed, 42 insertions(+), 15 deletions(-)

diff --git a/arch/x86/include/asm/page_64.h b/arch/x86/include/asm/page_64.h
index 4150999..5138174 100644
--- a/arch/x86/include/asm/page_64.h
+++ b/arch/x86/include/asm/page_64.h
@@ -9,7 +9,21 @@
 extern unsigned long max_pfn;
 extern unsigned long phys_base;
 
+static inline unsigned long __phys_addr_nodebug(unsigned long x)
+{
+   unsigned long y = x - __START_KERNEL_map;
+
+   /* use the carry flag to determine if x was  __START_KERNEL_map */
+   x = y + ((x  y) ? phys_base : (__START_KERNEL_map - PAGE_OFFSET));
+
+   return x;
+}
+
+#ifdef CONFIG_DEBUG_VIRTUAL
 extern unsigned long __phys_addr(unsigned long);
+#else
+#define __phys_addr(x) __phys_addr_nodebug(x)
+#endif
 
 #define __phys_reloc_hide(x)   (x)
 
diff --git a/arch/x86/kernel/x8664_ksyms_64.c b/arch/x86/kernel/x8664_ksyms_64.c
index 1330dd1..b014d94 100644
--- a/arch/x86/kernel/x8664_ksyms_64.c
+++ b/arch/x86/kernel/x8664_ksyms_64.c
@@ -59,6 +59,9 @@ EXPORT_SYMBOL(memcpy);
 EXPORT_SYMBOL(__memcpy);
 EXPORT_SYMBOL(memmove);
 
+#ifndef CONFIG_DEBUG_VIRTUAL
+EXPORT_SYMBOL(phys_base);
+#endif
 EXPORT_SYMBOL(empty_zero_page);
 #ifndef CONFIG_PARAVIRT
 EXPORT_SYMBOL(native_load_gs_index);
diff --git a/arch/x86/mm/physaddr.c b/arch/x86/mm/physaddr.c
index d2e2735..fd40d75 100644
--- a/arch/x86/mm/physaddr.c
+++ b/arch/x86/mm/physaddr.c
@@ -8,33 +8,43 @@
 
 #ifdef CONFIG_X86_64
 
+#ifdef CONFIG_DEBUG_VIRTUAL
 unsigned long __phys_addr(unsigned long x)
 {
-   if (x = __START_KERNEL_map) {
-   x -= __START_KERNEL_map;
-   VIRTUAL_BUG_ON(x = KERNEL_IMAGE_SIZE);
-   x += phys_base;
+   unsigned long y = x - __START_KERNEL_map;
+
+   /* use the carry flag to determine if x was  __START_KERNEL_map */
+   if (unlikely(x  y)) {
+   x = y + phys_base;
+
+   VIRTUAL_BUG_ON(y = KERNEL_IMAGE_SIZE);
} else {
-   VIRTUAL_BUG_ON(x  PAGE_OFFSET);
-   x -= PAGE_OFFSET;
-   VIRTUAL_BUG_ON(!phys_addr_valid(x));
+   x = y + (__START_KERNEL_map - PAGE_OFFSET);
+
+   /* carry flag will be set if starting x was = PAGE_OFFSET */
+   VIRTUAL_BUG_ON((x  y) || !phys_addr_valid(x));
}
+
return x;
 }
 EXPORT_SYMBOL(__phys_addr);
+#endif
 
 bool __virt_addr_valid(unsigned long x)
 {
-   if (x = __START_KERNEL_map) {
-   x -= __START_KERNEL_map;
-   if (x = KERNEL_IMAGE_SIZE)
+   unsigned long y = x - __START_KERNEL_map;
+
+   /* use the carry flag to determine if x was  __START_KERNEL_map */
+   if (unlikely(x  y)) {
+   x = y + phys_base;
+
+   if (y = KERNEL_IMAGE_SIZE)
return false;
-   x += phys_base;
} else {
-   if (x  PAGE_OFFSET)
-   return false;
-   x -= PAGE_OFFSET;
-   if (!phys_addr_valid(x))
+   x = y + (__START_KERNEL_map - 

[tip:x86/mm] x86: Make it so that __pa_symbol can only process kernel symbols on x86_64

2012-11-16 Thread tip-bot for Alexander Duyck
Commit-ID:  7d74275d39def4d3ccc8cf4725388bf79ef13861
Gitweb: http://git.kernel.org/tip/7d74275d39def4d3ccc8cf4725388bf79ef13861
Author: Alexander Duyck alexander.h.du...@intel.com
AuthorDate: Fri, 16 Nov 2012 13:55:46 -0800
Committer:  H. Peter Anvin h...@linux.intel.com
CommitDate: Fri, 16 Nov 2012 16:42:09 -0800

x86: Make it so that __pa_symbol can only process kernel symbols on x86_64

I submitted an earlier patch that make __phys_addr an inline.  This obviously
results in an increase in the code size.  One step I can take to reduce that
is to make it so that the __pa_symbol call does a direct translation for
kernel addresses instead of covering all of virtual memory.

On my system this reduced the size for __pa_symbol from 5 instructions
totalling 30 bytes to 3 instructions totalling 16 bytes.

Signed-off-by: Alexander Duyck alexander.h.du...@intel.com
Link: 
http://lkml.kernel.org/r/20121116215356.8521.92472.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin h...@linux.intel.com
---
 arch/x86/include/asm/page.h|  3 ++-
 arch/x86/include/asm/page_32.h |  1 +
 arch/x86/include/asm/page_64.h |  3 +++
 arch/x86/mm/physaddr.c | 11 +++
 4 files changed, 17 insertions(+), 1 deletion(-)

diff --git a/arch/x86/include/asm/page.h b/arch/x86/include/asm/page.h
index 8ca8283..3698a6a 100644
--- a/arch/x86/include/asm/page.h
+++ b/arch/x86/include/asm/page.h
@@ -44,7 +44,8 @@ static inline void copy_user_page(void *to, void *from, 
unsigned long vaddr,
  * case properly. Once all supported versions of gcc understand it, we can
  * remove this Voodoo magic stuff. (i.e. once gcc3.x is deprecated)
  */
-#define __pa_symbol(x) __pa(__phys_reloc_hide((unsigned long)(x)))
+#define __pa_symbol(x) \
+   __phys_addr_symbol(__phys_reloc_hide((unsigned long)(x)))
 
 #define __va(x)((void *)((unsigned 
long)(x)+PAGE_OFFSET))
 
diff --git a/arch/x86/include/asm/page_32.h b/arch/x86/include/asm/page_32.h
index da4e762..4d550d0 100644
--- a/arch/x86/include/asm/page_32.h
+++ b/arch/x86/include/asm/page_32.h
@@ -15,6 +15,7 @@ extern unsigned long __phys_addr(unsigned long);
 #else
 #define __phys_addr(x) __phys_addr_nodebug(x)
 #endif
+#define __phys_addr_symbol(x)  __phys_addr(x)
 #define __phys_reloc_hide(x)   RELOC_HIDE((x), 0)
 
 #ifdef CONFIG_FLATMEM
diff --git a/arch/x86/include/asm/page_64.h b/arch/x86/include/asm/page_64.h
index 5138174..0f1ddee 100644
--- a/arch/x86/include/asm/page_64.h
+++ b/arch/x86/include/asm/page_64.h
@@ -21,8 +21,11 @@ static inline unsigned long __phys_addr_nodebug(unsigned 
long x)
 
 #ifdef CONFIG_DEBUG_VIRTUAL
 extern unsigned long __phys_addr(unsigned long);
+extern unsigned long __phys_addr_symbol(unsigned long);
 #else
 #define __phys_addr(x) __phys_addr_nodebug(x)
+#define __phys_addr_symbol(x) \
+   ((unsigned long)(x) - __START_KERNEL_map + phys_base)
 #endif
 
 #define __phys_reloc_hide(x)   (x)
diff --git a/arch/x86/mm/physaddr.c b/arch/x86/mm/physaddr.c
index fd40d75..c73fedd 100644
--- a/arch/x86/mm/physaddr.c
+++ b/arch/x86/mm/physaddr.c
@@ -28,6 +28,17 @@ unsigned long __phys_addr(unsigned long x)
return x;
 }
 EXPORT_SYMBOL(__phys_addr);
+
+unsigned long __phys_addr_symbol(unsigned long x)
+{
+   unsigned long y = x - __START_KERNEL_map;
+
+   /* only check upper bounds since lower bounds will trigger carry */
+   VIRTUAL_BUG_ON(y = KERNEL_IMAGE_SIZE);
+
+   return y + phys_base;
+}
+EXPORT_SYMBOL(__phys_addr_symbol);
 #endif
 
 bool __virt_addr_valid(unsigned long x)
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/mm] x86: Drop 4 unnecessary calls to __pa_symbol

2012-11-16 Thread tip-bot for Alexander Duyck
Commit-ID:  05a476b6e3795f205806662bf09ab95774266292
Gitweb: http://git.kernel.org/tip/05a476b6e3795f205806662bf09ab95774266292
Author: Alexander Duyck alexander.h.du...@intel.com
AuthorDate: Fri, 16 Nov 2012 13:56:35 -0800
Committer:  H. Peter Anvin h...@linux.intel.com
CommitDate: Fri, 16 Nov 2012 16:42:09 -0800

x86: Drop 4 unnecessary calls to __pa_symbol

While debugging the __pa_symbol inline patch I found that there were a couple
spots where __pa_symbol was used as follows:
__pa_symbol(x) - __pa_symbol(y)

The compiler had reduced them to:
x - y

Since we also support a debug case where __pa_symbol is a function call it
would probably be useful to just change the two cases I found so that they are
always just treated as x - y.  As such I am casting the values to
phys_addr_t and then doing simple subtraction so that the correct type and
value is returned.

Signed-off-by: Alexander Duyck alexander.h.du...@intel.com
Link: 
http://lkml.kernel.org/r/20121116215552.8521.68085.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin h...@linux.intel.com
---
 arch/x86/kernel/head32.c | 4 ++--
 arch/x86/kernel/head64.c | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/arch/x86/kernel/head32.c b/arch/x86/kernel/head32.c
index c18f59d..f15db0c 100644
--- a/arch/x86/kernel/head32.c
+++ b/arch/x86/kernel/head32.c
@@ -30,8 +30,8 @@ static void __init i386_default_early_setup(void)
 
 void __init i386_start_kernel(void)
 {
-   memblock_reserve(__pa_symbol(_text),
-__pa_symbol(__bss_stop) - __pa_symbol(_text));
+   memblock_reserve(__pa_symbol(_text),
+(phys_addr_t)__bss_stop - (phys_addr_t)_text);
 
 #ifdef CONFIG_BLK_DEV_INITRD
/* Reserve INITRD */
diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c
index 037df57..42f5df1 100644
--- a/arch/x86/kernel/head64.c
+++ b/arch/x86/kernel/head64.c
@@ -97,8 +97,8 @@ void __init x86_64_start_reservations(char *real_mode_data)
 {
copy_bootdata(__va(real_mode_data));
 
-   memblock_reserve(__pa_symbol(_text),
-__pa_symbol(__bss_stop) - __pa_symbol(_text));
+   memblock_reserve(__pa_symbol(_text),
+(phys_addr_t)__bss_stop - (phys_addr_t)_text);
 
 #ifdef CONFIG_BLK_DEV_INITRD
/* Reserve INITRD */
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/mm] x86: Use __pa_symbol instead of __pa on C visible symbols

2012-11-16 Thread tip-bot for Alexander Duyck
Commit-ID:  fc8d782677f163dee76427fdd8a92bebd2b50b23
Gitweb: http://git.kernel.org/tip/fc8d782677f163dee76427fdd8a92bebd2b50b23
Author: Alexander Duyck alexander.h.du...@intel.com
AuthorDate: Fri, 16 Nov 2012 13:57:13 -0800
Committer:  H. Peter Anvin h...@linux.intel.com
CommitDate: Fri, 16 Nov 2012 16:42:09 -0800

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.du...@intel.com
Link: 
http://lkml.kernel.org/r/20121116215640.8521.80483.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin h...@linux.intel.com
---
 arch/x86/kernel/cpu/intel.c |  2 +-
 arch/x86/kernel/setup.c | 16 
 arch/x86/mm/init_64.c   | 18 --
 arch/x86/mm/pageattr.c  |  8 
 arch/x86/platform/efi/efi.c |  4 ++--
 arch/x86/realmode/init.c|  8 
 6 files changed, 27 insertions(+), 29 deletions(-)

diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
index 198e019..2249e7e 100644
--- a/arch/x86/kernel/cpu/intel.c
+++ b/arch/x86/kernel/cpu/intel.c
@@ -168,7 +168,7 @@ int __cpuinit ppro_with_ram_bug(void)
 #ifdef CONFIG_X86_F00F_BUG
 static void __cpuinit trap_init_f00f_bug(void)
 {
-   __set_fixmap(FIX_F00F_IDT, __pa(idt_table), PAGE_KERNEL_RO);
+   __set_fixmap(FIX_F00F_IDT, __pa_symbol(idt_table), PAGE_KERNEL_RO);
 
/*
 * Update the IDT descriptor and reload the IDT so that
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
index ca45696..2702c5d 100644
--- a/arch/x86/kernel/setup.c
+++ b/arch/x86/kernel/setup.c
@@ -300,8 +300,8 @@ static void __init cleanup_highmap(void)
 static void __init reserve_brk(void)
 {
if (_brk_end  _brk_start)
-   memblock_reserve(__pa(_brk_start),
-__pa(_brk_end) - __pa(_brk_start));
+   memblock_reserve(__pa_symbol(_brk_start),
+_brk_end - _brk_start);
 
/* Mark brk area as locked down and no longer taking any
   new allocations */
@@ -761,12 +761,12 @@ void __init setup_arch(char **cmdline_p)
init_mm.end_data = (unsigned long) _edata;
init_mm.brk = _brk_end;
 
-   code_resource.start = virt_to_phys(_text);
-   code_resource.end = virt_to_phys(_etext)-1;
-   data_resource.start = virt_to_phys(_etext);
-   data_resource.end = virt_to_phys(_edata)-1;
-   bss_resource.start = virt_to_phys(__bss_start);
-   bss_resource.end = virt_to_phys(__bss_stop)-1;
+   code_resource.start = __pa_symbol(_text);
+   code_resource.end = __pa_symbol(_etext)-1;
+   data_resource.start = __pa_symbol(_etext);
+   data_resource.end = __pa_symbol(_edata)-1;
+   bss_resource.start = __pa_symbol(__bss_start);
+   bss_resource.end = __pa_symbol(__bss_stop)-1;
 
 #ifdef CONFIG_CMDLINE_BOOL
 #ifdef CONFIG_CMDLINE_OVERRIDE
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index 3baff25..0374a10 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -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)));
+ 

[tip:x86/mm] x86/ftrace: Use __pa_symbol instead of __pa on C visible symbols

2012-11-16 Thread tip-bot for Alexander Duyck
Commit-ID:  217f155e9fc68bf2a6c58a7b47e0d1ce68d78818
Gitweb: http://git.kernel.org/tip/217f155e9fc68bf2a6c58a7b47e0d1ce68d78818
Author: Alexander Duyck alexander.h.du...@intel.com
AuthorDate: Fri, 16 Nov 2012 13:57:32 -0800
Committer:  H. Peter Anvin h...@linux.intel.com
CommitDate: Fri, 16 Nov 2012 16:42:09 -0800

x86/ftrace: Use __pa_symbol instead of __pa on C visible symbols

Instead of using __pa which is meant to be a general function for converting
virtual addresses to physical addresses we can use __pa_symbol which is the
preferred way of decoding kernel text virtual addresses to physical addresses.

In this case we are not directly converting C visible symbols however if we
know that the instruction pointer is somewhere between _text and _etext we
know that we are going to be translating an address form the kernel text
space.

Cc: Steven Rostedt rost...@goodmis.org
Cc: Frederic Weisbecker fweis...@gmail.com
Signed-off-by: Alexander Duyck alexander.h.du...@intel.com
Link: 
http://lkml.kernel.org/r/20121116215718.8521.24026.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin h...@linux.intel.com
---
 arch/x86/kernel/ftrace.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/x86/kernel/ftrace.c b/arch/x86/kernel/ftrace.c
index 1d41402..42a392a 100644
--- a/arch/x86/kernel/ftrace.c
+++ b/arch/x86/kernel/ftrace.c
@@ -89,7 +89,7 @@ do_ftrace_mod_code(unsigned long ip, const void *new_code)
 * kernel identity mapping to modify code.
 */
if (within(ip, (unsigned long)_text, (unsigned long)_etext))
-   ip = (unsigned long)__va(__pa(ip));
+   ip = (unsigned long)__va(__pa_symbol(ip));
 
return probe_kernel_write((void *)ip, new_code, MCOUNT_INSN_SIZE);
 }
@@ -279,7 +279,7 @@ static int ftrace_write(unsigned long ip, const char *val, 
int size)
 * kernel identity mapping to modify code.
 */
if (within(ip, (unsigned long)_text, (unsigned long)_etext))
-   ip = (unsigned long)__va(__pa(ip));
+   ip = (unsigned long)__va(__pa_symbol(ip));
 
return probe_kernel_write((void *)ip, val, size);
 }
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[tip:x86/mm] x86/acpi: Use __pa_symbol instead of __pa on C visible symbols

2012-11-16 Thread tip-bot for Alexander Duyck
Commit-ID:  afd51a0e32cd79261f0e823400886ed322a355ac
Gitweb: http://git.kernel.org/tip/afd51a0e32cd79261f0e823400886ed322a355ac
Author: Alexander Duyck alexander.h.du...@intel.com
AuthorDate: Fri, 16 Nov 2012 13:57:43 -0800
Committer:  H. Peter Anvin h...@linux.intel.com
CommitDate: Fri, 16 Nov 2012 16:42:10 -0800

x86/acpi: Use __pa_symbol instead of __pa on C visible symbols

This change just updates one spot where __pa was being used when __pa_symbol
should have been used.  By using __pa_symbol we are able to drop a few extra
lines of code as we don't have to test to see if the virtual pointer is a
part of the kernel text or just standard virtual memory.

Cc: Len Brown len.br...@intel.com
Cc: Pavel Machek pa...@ucw.cz
Acked-by: Rafael J. Wysocki r...@sisk.pl
Signed-off-by: Alexander Duyck alexander.h.du...@intel.com
Link: 
http://lkml.kernel.org/r/20121116215737.8521.51167.st...@ahduyck-cp1.jf.intel.com
Signed-off-by: H. Peter Anvin h...@linux.intel.com
---
 arch/x86/kernel/acpi/sleep.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c
index 11676cf..f146a3c 100644
--- a/arch/x86/kernel/acpi/sleep.c
+++ b/arch/x86/kernel/acpi/sleep.c
@@ -69,7 +69,7 @@ int acpi_suspend_lowlevel(void)
 
 #ifndef CONFIG_64BIT
header-pmode_entry = (u32)wakeup_pmode_return;
-   header-pmode_cr3 = (u32)__pa(initial_page_table);
+   header-pmode_cr3 = (u32)__pa_symbol(initial_page_table);
saved_magic = 0x12345678;
 #else /* CONFIG_64BIT */
 #ifdef CONFIG_SMP
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/