Patches contributed by Eötvös Lorand University


commit 18e413f7193ed2f6991d959863f46330813aa242
Author: Ingo Molnar <mingo@elte.hu>
Date:   Sat Apr 26 19:10:17 2008 +0200

    uml: Kconfig cleanup
    
    pointed out by Linus: arch/um/Kconfig.x86_64 should
    include arch/x86/Kconfig.cpu instead of defining those
    symbols itself.
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/arch/um/Kconfig.x86_64 b/arch/um/Kconfig.x86_64
index 3fbe69e359ed..5696e7b374b3 100644
--- a/arch/um/Kconfig.x86_64
+++ b/arch/um/Kconfig.x86_64
@@ -1,3 +1,10 @@
+
+menu "Host processor type and features"
+
+source "arch/x86/Kconfig.cpu"
+
+endmenu
+
 config UML_X86
 	bool
 	default y

commit 297e1b256b1090adbb4357608be3d4301e76c0ce
Author: Ingo Molnar <mingo@elte.hu>
Date:   Sat Apr 26 18:59:42 2008 +0200

    uml: fix build error
    
    fix:
    
     arch/um/os-Linux/helper.c: In function 'run_helper':
     arch/um/os-Linux/helper.c:73: error: 'PATH_MAX' undeclared (first use in this function)
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/arch/um/os-Linux/helper.c b/arch/um/os-Linux/helper.c
index f4bd349d4412..f25c29a12d00 100644
--- a/arch/um/os-Linux/helper.c
+++ b/arch/um/os-Linux/helper.c
@@ -14,6 +14,7 @@
 #include "os.h"
 #include "um_malloc.h"
 #include "user.h"
+#include <linux/limits.h>
 
 struct helper_data {
 	void (*pre_exec)(void*);

commit 2a8a2719be1397c64e726ccd1c0933a11dc493d0
Author: Ingo Molnar <mingo@elte.hu>
Date:   Sat Apr 26 10:26:52 2008 +0200

    x86 PAT: decouple from nonpromisc devmem
    
    Linus pointed it out that PAT should not depend on NONPROMISC_DEVMEM.
    
    Also make PAT non-default.
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 4d350b5cbc71..4aa4180b106c 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -1049,9 +1049,9 @@ config MTRR
 	  See <file:Documentation/mtrr.txt> for more information.
 
 config X86_PAT
-	def_bool y
+	bool
 	prompt "x86 PAT support"
-	depends on MTRR && NONPROMISC_DEVMEM
+	depends on MTRR
 	help
 	  Use PAT attributes to setup page level cache control.
 

commit 765c68bd54c76d4126796e49af2a1428a258429f
Author: Ingo Molnar <mingo@elte.hu>
Date:   Wed Apr 9 11:03:37 2008 +0200

    generic: make optimized inlining arch-opt-in
    
    Stephen Rothwell reported that linux-next did not build on powerpc64.
    
    make optimized inlining dependent on architecture opt-in.
    
    Reported-by: Stephen Rothwell <sfr@canb.auug.org.au>
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 4d350b5cbc71..3b6ff3b4ad20 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -142,6 +142,9 @@ config AUDIT_ARCH
 config ARCH_SUPPORTS_AOUT
 	def_bool y
 
+config ARCH_SUPPORTS_OPTIMIZED_INLINING
+	def_bool y
+
 # Use the generic interrupt handling code in kernel/irq/:
 config GENERIC_HARDIRQS
 	bool
diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h
index 340bc5d92772..b2fd7547b58d 100644
--- a/include/linux/compiler-gcc.h
+++ b/include/linux/compiler-gcc.h
@@ -31,7 +31,8 @@
 /*
  * Force always-inline if the user requests it so via the .config:
  */
-#if !defined(CONFIG_OPTIMIZE_INLINING) && (__GNUC__ >= 4)
+#if !defined(CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING) || \
+    !defined(CONFIG_OPTIMIZE_INLINING) && (__GNUC__ >= 4)
 # define inline		inline		__attribute__((always_inline))
 # define __inline__	__inline__	__attribute__((always_inline))
 # define __inline	__inline	__attribute__((always_inline))

commit 60a3cdd0639473c79c253bc08c8ef8f882cca107
Author: Ingo Molnar <mingo@elte.hu>
Date:   Mon Mar 3 12:38:52 2008 +0100

    x86: add optimized inlining
    
    add CONFIG_OPTIMIZE_INLINING=y.
    
    allow gcc to optimize the kernel image's size by uninlining
    functions that have been marked 'inline'. Previously gcc was
    forced by Linux to always-inline these functions via a gcc
    attribute:
    
     #define inline inline __attribute__((always_inline))
    
    Especially when the user has already selected
    CONFIG_OPTIMIZE_FOR_SIZE=y this can make a huge difference in
    kernel image size (using a standard Fedora .config):
    
       text    data     bss     dec           hex filename
       5613924  562708 3854336 10030968    990f78 vmlinux.before
       5486689  562708 3854336  9903733    971e75 vmlinux.after
    
    that's a 2.3% text size reduction (!).
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/arch/x86/Kconfig.debug b/arch/x86/Kconfig.debug
index 239fd9fba0a5..5b1979a45a1e 100644
--- a/arch/x86/Kconfig.debug
+++ b/arch/x86/Kconfig.debug
@@ -257,3 +257,16 @@ config CPA_DEBUG
 	  Do change_page_attr() self-tests every 30 seconds.
 
 endmenu
+
+config OPTIMIZE_INLINING
+	bool "Allow gcc to uninline functions marked 'inline'"
+	default y
+	help
+	  This option determines if the kernel forces gcc to inline the functions
+	  developers have marked 'inline'. Doing so takes away freedom from gcc to
+	  do what it thinks is best, which is desirable for the gcc 3.x series of
+	  compilers. The gcc 4.x series have a rewritten inlining algorithm and
+	  disabling this option will generate a smaller kernel there. Hopefully
+	  this algorithm is so good that allowing gcc4 to make the decision can
+	  become the default in the future, until then this option is there to
+	  test gcc for this.
diff --git a/arch/x86/configs/i386_defconfig b/arch/x86/configs/i386_defconfig
index 3df340b54e57..ad7ddaaff588 100644
--- a/arch/x86/configs/i386_defconfig
+++ b/arch/x86/configs/i386_defconfig
@@ -1421,6 +1421,7 @@ CONFIG_DEBUG_BUGVERBOSE=y
 # CONFIG_DEBUG_VM is not set
 # CONFIG_DEBUG_LIST is not set
 # CONFIG_FRAME_POINTER is not set
+CONFIG_OPTIMIZE_INLINING=y
 # CONFIG_RCU_TORTURE_TEST is not set
 # CONFIG_LKDTM is not set
 # CONFIG_FAULT_INJECTION is not set
diff --git a/arch/x86/configs/x86_64_defconfig b/arch/x86/configs/x86_64_defconfig
index eef98cb00c62..2d6f5b2809d2 100644
--- a/arch/x86/configs/x86_64_defconfig
+++ b/arch/x86/configs/x86_64_defconfig
@@ -1346,6 +1346,7 @@ CONFIG_DEBUG_BUGVERBOSE=y
 # CONFIG_DEBUG_VM is not set
 # CONFIG_DEBUG_LIST is not set
 # CONFIG_FRAME_POINTER is not set
+CONFIG_OPTIMIZE_INLINING=y
 # CONFIG_RCU_TORTURE_TEST is not set
 # CONFIG_LKDTM is not set
 # CONFIG_FAULT_INJECTION is not set
diff --git a/include/linux/compiler-gcc.h b/include/linux/compiler-gcc.h
index fe23792f05c1..340bc5d92772 100644
--- a/include/linux/compiler-gcc.h
+++ b/include/linux/compiler-gcc.h
@@ -28,9 +28,15 @@
 #define __must_be_array(a) \
   BUILD_BUG_ON_ZERO(__builtin_types_compatible_p(typeof(a), typeof(&a[0])))
 
-#define inline		inline		__attribute__((always_inline))
-#define __inline__	__inline__	__attribute__((always_inline))
-#define __inline	__inline	__attribute__((always_inline))
+/*
+ * Force always-inline if the user requests it so via the .config:
+ */
+#if !defined(CONFIG_OPTIMIZE_INLINING) && (__GNUC__ >= 4)
+# define inline		inline		__attribute__((always_inline))
+# define __inline__	__inline__	__attribute__((always_inline))
+# define __inline	__inline	__attribute__((always_inline))
+#endif
+
 #define __deprecated			__attribute__((deprecated))
 #define __packed			__attribute__((packed))
 #define __weak				__attribute__((weak))

commit 8db979bcfe46dcdced1065e9359e4ef7a50b8a6f
Author: Ingo Molnar <mingo@elte.hu>
Date:   Sat Apr 26 10:26:52 2008 +0200

    x86 PAT: decouple from nonpromisc devmem
    
    Linus pointed it out that PAT should not depend on NONPROMISC_DEVMEM.
    
    Also make PAT non-default.
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
index 4d350b5cbc71..4aa4180b106c 100644
--- a/arch/x86/Kconfig
+++ b/arch/x86/Kconfig
@@ -1049,9 +1049,9 @@ config MTRR
 	  See <file:Documentation/mtrr.txt> for more information.
 
 config X86_PAT
-	def_bool y
+	bool
 	prompt "x86 PAT support"
-	depends on MTRR && NONPROMISC_DEVMEM
+	depends on MTRR
 	help
 	  Use PAT attributes to setup page level cache control.
 

commit 1ebcc654f010d4a63f3ebf8ddd2cab5a709b1824
Author: Ingo Molnar <mingo@elte.hu>
Date:   Sat Apr 26 11:40:31 2008 +0200

    x86 PAT: tone down debugging messages
    
    Linus reported these excessive debug printouts:
    
    >       Overlap at 0xe0300000-0xe0400000
    >       Overlap at 0xe0300000-0xe0380000
    >       Overlap at 0xe0300000-0xe0400000
    >       Overlap at 0xe0300000-0xe0400000
    >       Overlap at 0xe0300000-0xe0400000
    >       Overlap at 0xe0300000-0xe0400000
    >       Overlap at 0xe0300000-0xe0400000
    
    turn that into a pr_debug().
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c
index ef8b64b89c7d..9851265e4d65 100644
--- a/arch/x86/mm/pat.c
+++ b/arch/x86/mm/pat.c
@@ -334,7 +334,7 @@ int reserve_memtype(u64 start, u64 end, unsigned long req_type,
 				break;
 			}
 
-			printk("Overlap at 0x%Lx-0x%Lx\n",
+			pr_debug("Overlap at 0x%Lx-0x%Lx\n",
 			       saved_ptr->start, saved_ptr->end);
 			/* No conflict. Go ahead and add this new entry */
 			list_add(&new_entry->nd, saved_ptr->nd.prev);

commit 00c6b2d5d7b2414bd46c620d6a8c37fa7a716f29
Author: Ingo Molnar <mingo@elte.hu>
Date:   Fri Apr 25 17:07:03 2008 +0200

    x86: harden kernel code patching
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c
index 60299f61843f..65c7857a90dd 100644
--- a/arch/x86/kernel/alternative.c
+++ b/arch/x86/kernel/alternative.c
@@ -519,6 +519,7 @@ void *__kprobes text_poke(void *addr, const void *opcode, size_t len)
 		pages[1] = vmalloc_to_page(addr + PAGE_SIZE);
 	} else {
 		pages[0] = virt_to_page(addr);
+		WARN_ON(!PageReserved(pages[0]));
 		pages[1] = virt_to_page(addr + PAGE_SIZE);
 	}
 	BUG_ON(!pages[0]);

commit 70c9f590ffc3f959cc81c1a3cecb6b8133caf35d
Author: Ingo Molnar <mingo@elte.hu>
Date:   Fri Apr 25 18:05:57 2008 +0200

    x86: remove set_fixmap() warning
    
    set_fixmap()+clear_fixmap() is safe.
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index 7a81dd020693..b798e7b92b17 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -173,7 +173,7 @@ set_pte_phys(unsigned long vaddr, unsigned long phys, pgprot_t prot)
 	new_pte = pfn_pte(phys >> PAGE_SHIFT, prot);
 
 	pte = pte_offset_kernel(pmd, vaddr);
-	if (!pte_none(*pte) &&
+	if (!pte_none(*pte) && pte_val(new_pte) &&
 	    pte_val(*pte) != (pte_val(new_pte) & __supported_pte_mask))
 		pte_ERROR(*pte);
 	set_pte(pte, new_pte);

commit 82a355f5a2fdc203e5a32626d667ec43fc76b8b1
Author: Ingo Molnar <mingo@elte.hu>
Date:   Fri Apr 25 18:28:21 2008 +0200

    x86: make __set_fixmap() non-init
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index 1ff7906a9a4d..7a81dd020693 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -135,7 +135,7 @@ static __init void *spp_getpage(void)
 	return ptr;
 }
 
-static __init void
+static void
 set_pte_phys(unsigned long vaddr, unsigned long phys, pgprot_t prot)
 {
 	pgd_t *pgd;
@@ -214,8 +214,7 @@ void __init cleanup_highmap(void)
 }
 
 /* NOTE: this is meant to be run only at boot */
-void __init
-__set_fixmap(enum fixed_addresses idx, unsigned long phys, pgprot_t prot)
+void __set_fixmap(enum fixed_addresses idx, unsigned long phys, pgprot_t prot)
 {
 	unsigned long address = __fix_to_virt(idx);