Patches contributed by Eötvös Lorand University


commit 4ec71fa2d2c3f1040348f2604f4b8ccc833d1c2e
Author: Ingo Molnar <mingo@elte.hu>
Date:   Wed Jan 21 10:24:27 2009 +0100

    x86: uv cleanup, build fix
    
    Fix:
    
     arch/x86/mm/srat_64.c: In function ‘acpi_numa_processor_affinity_init’:
     arch/x86/mm/srat_64.c:141: error: implicit declaration of function ‘get_uv_system_type’
     arch/x86/mm/srat_64.c:141: error: ‘UV_X2APIC’ undeclared (first use in this function)
     arch/x86/mm/srat_64.c:141: error: (Each undeclared identifier is reported only once
     arch/x86/mm/srat_64.c:141: error: for each function it appears in.)
    
    A couple of UV definitions were moved to asm/uv/uv.h, but srat_64.c did
    not include that header. Add it.
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/arch/x86/mm/srat_64.c b/arch/x86/mm/srat_64.c
index 09737c8af074..15df1baee100 100644
--- a/arch/x86/mm/srat_64.c
+++ b/arch/x86/mm/srat_64.c
@@ -21,6 +21,7 @@
 #include <asm/numa.h>
 #include <asm/e820.h>
 #include <asm/genapic.h>
+#include <asm/uv/uv.h>
 
 int acpi_numa __initdata;
 

commit 55f4949f5765e7a29863b6d17a774601810732f5
Author: Ingo Molnar <mingo@elte.hu>
Date:   Wed Jan 21 10:08:53 2009 +0100

    x86, mm: move tlb.c to arch/x86/mm/
    
    Impact: cleanup
    
    Now that it's unified, move the (SMP) TLB flushing code from arch/x86/kernel/
    to arch/x86/mm/, where it belongs logically.
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile
index 0626a88fbb46..0b3272f58bd9 100644
--- a/arch/x86/kernel/Makefile
+++ b/arch/x86/kernel/Makefile
@@ -58,7 +58,7 @@ obj-$(CONFIG_PCI)		+= early-quirks.o
 apm-y				:= apm_32.o
 obj-$(CONFIG_APM)		+= apm.o
 obj-$(CONFIG_X86_SMP)		+= smp.o
-obj-$(CONFIG_X86_SMP)		+= smpboot.o tsc_sync.o ipi.o tlb.o
+obj-$(CONFIG_X86_SMP)		+= smpboot.o tsc_sync.o ipi.o
 obj-$(CONFIG_X86_32_SMP)	+= smpcommon.o
 obj-$(CONFIG_X86_64_SMP)	+= tsc_sync.o smpcommon.o
 obj-$(CONFIG_X86_TRAMPOLINE)	+= trampoline_$(BITS).o
diff --git a/arch/x86/mm/Makefile b/arch/x86/mm/Makefile
index d8cc96a2738f..9f05157220f5 100644
--- a/arch/x86/mm/Makefile
+++ b/arch/x86/mm/Makefile
@@ -1,6 +1,8 @@
 obj-y	:=  init_$(BITS).o fault.o ioremap.o extable.o pageattr.o mmap.o \
 	    pat.o pgtable.o gup.o
 
+obj-$(CONFIG_X86_SMP)		+= tlb.o
+
 obj-$(CONFIG_X86_32)		+= pgtable_32.o iomap_32.o
 
 obj-$(CONFIG_HUGETLB_PAGE)	+= hugetlbpage.o
diff --git a/arch/x86/kernel/tlb.c b/arch/x86/mm/tlb.c
similarity index 100%
rename from arch/x86/kernel/tlb.c
rename to arch/x86/mm/tlb.c

commit 3eb3963fd1974c63e9bb3cfe774abc3e1995e479
Merge: ae2b56b92bd3 5766b842b23c
Author: Ingo Molnar <mingo@elte.hu>
Date:   Wed Jan 21 10:14:17 2009 +0100

    Merge branch 'cpus4096' into core/percpu
    
    Conflicts:
            arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
            arch/x86/kernel/tlb_32.c
    
    Merge it here because both the cpumask changes and the ongoing percpu
    work is touching the TLB code. The percpu changes take precedence, as
    they eliminate tlb_32.c altogether.
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

commit ae2b56b92bd33b416528986528e0732c98c7a285
Merge: 8f5d36ed5bb6 16c2d3f895a3
Author: Ingo Molnar <mingo@elte.hu>
Date:   Wed Jan 21 10:04:52 2009 +0100

    Merge branch 'tj-percpu' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/misc into core/percpu

commit 552b8aa4d1edcc1c764ff6f61a7686347a2d1827
Author: Ingo Molnar <mingo@elte.hu>
Date:   Tue Jan 20 09:31:49 2009 +0100

    Revert "x86: signal: change type of paramter for sys_rt_sigreturn()"
    
    This reverts commit 4217458dafaa57d8e26a46f5d05ab8c53cf64191.
    
    Justin Madru bisected this commit, it was causing weird Firefox
    crashes.
    
    The reason is that GCC mis-optimizes (re-uses) the on-stack parameters of
    the calling frame, which corrupts the syscall return pt_regs state and
    thus corrupts user-space register state.
    
    So we go back to the slightly less clean but more optimization-safe
    method of getting to pt_regs. Also add a comment to explain this.
    
    Resolves: http://bugzilla.kernel.org/show_bug.cgi?id=12505
    
    Reported-and-bisected-by: Justin Madru <jdm64@gawab.com>
    Tested-by: Justin Madru <jdm64@gawab.com>
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/arch/x86/include/asm/syscalls.h b/arch/x86/include/asm/syscalls.h
index 9c6797c3e56c..c0b0bda754ee 100644
--- a/arch/x86/include/asm/syscalls.h
+++ b/arch/x86/include/asm/syscalls.h
@@ -40,7 +40,7 @@ asmlinkage int sys_sigaction(int, const struct old_sigaction __user *,
 			     struct old_sigaction __user *);
 asmlinkage int sys_sigaltstack(unsigned long);
 asmlinkage unsigned long sys_sigreturn(unsigned long);
-asmlinkage int sys_rt_sigreturn(struct pt_regs);
+asmlinkage int sys_rt_sigreturn(unsigned long);
 
 /* kernel/ioport.c */
 asmlinkage long sys_iopl(unsigned long);
diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c
index 89bb7668041d..df0587f24c54 100644
--- a/arch/x86/kernel/signal.c
+++ b/arch/x86/kernel/signal.c
@@ -632,9 +632,16 @@ static long do_rt_sigreturn(struct pt_regs *regs)
 }
 
 #ifdef CONFIG_X86_32
-asmlinkage int sys_rt_sigreturn(struct pt_regs regs)
+/*
+ * Note: do not pass in pt_regs directly as with tail-call optimization
+ * GCC will incorrectly stomp on the caller's frame and corrupt user-space
+ * register state:
+ */
+asmlinkage int sys_rt_sigreturn(unsigned long __unused)
 {
-	return do_rt_sigreturn(&regs);
+	struct pt_regs *regs = (struct pt_regs *)&__unused;
+
+	return do_rt_sigreturn(regs);
 }
 #else /* !CONFIG_X86_32 */
 asmlinkage long sys_rt_sigreturn(struct pt_regs *regs)

commit 0ce1c383681370964e7f77dd44506aeb3a6ba657
Merge: 0a2a18b721ab 1de9e8e70f5a
Author: Ingo Molnar <mingo@elte.hu>
Date:   Tue Jan 20 09:23:28 2009 +0100

    Merge commit 'v2.6.29-rc2' into x86/mm

commit 5766b842b23c6b40935a5f3bd435b2bcdaff2143
Author: Ingo Molnar <mingo@elte.hu>
Date:   Tue Jan 20 09:13:15 2009 +0100

    x86, cpumask: fix tlb flush race
    
    Impact: fix bootup crash
    
    The cpumask is now passed in as a reference to mm->cpu_vm_mask, not on
    the stack - hence it is not constant anymore during the TLB flush.
    
    That way it could race and some static sanity checks would trigger:
    
    [  238.154287] ------------[ cut here ]------------
    [  238.156039] kernel BUG at arch/x86/kernel/tlb_32.c:130!
    [  238.156039] invalid opcode: 0000 [#1] SMP
    [  238.156039] last sysfs file: /sys/class/net/eth2/address
    [  238.156039] Modules linked in:
    [  238.156039]
    [  238.156039] Pid: 6493, comm: ifup-eth Not tainted (2.6.29-rc2-tip #1) P4DC6
    [  238.156039] EIP: 0060:[<c0118f87>] EFLAGS: 00010202 CPU: 2
    [  238.156039] EIP is at native_flush_tlb_others+0x35/0x158
    [  238.156039] EAX: c0ef972c EBX: f6143301 ECX: 00000000 EDX: 00000000
    [  238.156039] ESI: f61433a8 EDI: f6143200 EBP: f34f3e00 ESP: f34f3df0
    [  238.156039]  DS: 007b ES: 007b FS: 00d8 GS: 0000 SS: 0068
    [  238.156039] Process ifup-eth (pid: 6493, ti=f34f2000 task=f399ab00 task.ti=f34f2000)
    [  238.156039] Stack:
    [  238.156039]  ffffffff f61433a8 ffffffff f6143200 f34f3e18 c0118e9c 00000000 f6143200
    [  238.156039]  f61433a8 f5bec738 f34f3e28 c0119435 c2b5b830 f6143200 f34f3e34 c01c2dc3
    [  238.156039]  bffd9000 f34f3e60 c01c3051 00000000 ffffffff f34f3e4c 00000000 00000071
    [  238.156039] Call Trace:
    [  238.156039]  [<c0118e9c>] ? flush_tlb_others+0x52/0x5b
    [  238.156039]  [<c0119435>] ? flush_tlb_mm+0x7f/0x8b
    [  238.156039]  [<c01c2dc3>] ? tlb_finish_mmu+0x2d/0x55
    [  238.156039]  [<c01c3051>] ? exit_mmap+0x124/0x170
    [  238.156039]  [<c013e965>] ? mmput+0x40/0xf5
    [  238.156039]  [<c01e4788>] ? flush_old_exec+0x640/0x94b
    [  238.156039]  [<c01ddb4e>] ? fsnotify_access+0x37/0x39
    [  238.156039]  [<c01e3435>] ? kernel_read+0x39/0x4b
    [  238.156039]  [<c021bc8a>] ? load_elf_binary+0x4a1/0x11bb
    [  238.156039]  [<c01c0af9>] ? might_fault+0x51/0x9c
    [  238.156039]  [<c010a2cc>] ? paravirt_read_tsc+0x20/0x4f
    [  238.156039]  [<c010a406>] ? native_sched_clock+0x5d/0x60
    [  238.156039]  [<c01e2fda>] ? search_binary_handler+0xab/0x2c4
    [  238.156039]  [<c021b7e9>] ? load_elf_binary+0x0/0x11bb
    [  238.156039]  [<c04ae9a5>] ? _raw_read_unlock+0x21/0x46
    [  238.156039]  [<c021b7e9>] ? load_elf_binary+0x0/0x11bb
    [  238.156039]  [<c01e2fe1>] ? search_binary_handler+0xb2/0x2c4
    [  238.156039]  [<c01e4076>] ? do_execve+0x21c/0x2ee
    [  238.156039]  [<c01029b7>] ? sys_execve+0x51/0x8c
    [  238.156039]  [<c0103eaf>] ? sysenter_do_call+0x12/0x43
    
    Fix it by not assuming that the cpumask is constant.
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/arch/x86/kernel/tlb_32.c b/arch/x86/kernel/tlb_32.c
index ec53818f4e38..d37bbfcb813d 100644
--- a/arch/x86/kernel/tlb_32.c
+++ b/arch/x86/kernel/tlb_32.c
@@ -125,9 +125,8 @@ void native_flush_tlb_others(const struct cpumask *cpumask,
 			     struct mm_struct *mm, unsigned long va)
 {
 	/*
-	 * - mask must exist :)
+	 * mm must exist :)
 	 */
-	BUG_ON(cpumask_empty(cpumask));
 	BUG_ON(!mm);
 
 	/*
@@ -138,14 +137,18 @@ void native_flush_tlb_others(const struct cpumask *cpumask,
 	spin_lock(&tlbstate_lock);
 
 	cpumask_andnot(flush_cpumask, cpumask, cpumask_of(smp_processor_id()));
-#ifdef CONFIG_HOTPLUG_CPU
-	/* If a CPU which we ran on has gone down, OK. */
 	cpumask_and(flush_cpumask, flush_cpumask, cpu_online_mask);
+
+	/*
+	 * If a task whose mm mask we are looking at has descheduled and
+	 * has cleared its presence from the mask, or if a CPU which we ran
+	 * on has gone down then there might be no flush work left:
+	 */
 	if (unlikely(cpumask_empty(flush_cpumask))) {
 		spin_unlock(&tlbstate_lock);
 		return;
 	}
-#endif
+
 	flush_mm = mm;
 	flush_va = va;
 

commit 8f5d36ed5bb6e33024619eaee15b7ce2e3d115b3
Merge: 5cdc5e9e69d4 6b7c38d55587
Author: Ingo Molnar <mingo@elte.hu>
Date:   Tue Jan 20 08:23:45 2009 +0100

    Merge branch 'tj-percpu' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/misc into core/percpu

commit bfa318ad52a23f1e303d176b44366cdd2bb71ad2
Author: Ingo Molnar <mingo@elte.hu>
Date:   Thu Jan 15 15:46:08 2009 +0100

    fix: crash: IP: __bitmap_intersects+0x48/0x73
    
    -tip testing found this crash:
    
    > [   35.258515] calling  acpi_cpufreq_init+0x0/0x127 @ 1
    > [   35.264127] BUG: unable to handle kernel NULL pointer dereference at (null)
    > [   35.267554] IP: [<ffffffff80478092>] __bitmap_intersects+0x48/0x73
    > [   35.267554] PGD 0
    > [   35.267554] Oops: 0000 [#1] SMP DEBUG_PAGEALLOC
    
    arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c is still broken: there's no
    allocation of the variable mask, so we pass in an uninitialized cmd.mask
    field to drv_read(), which then passes it to the scheduler which then
    crashes ...
    
    Switch it over to the much simpler constant-cpumask-pointers approach.
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
index 5bf2c834a236..4b1c319d30c3 100644
--- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
+++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
@@ -145,7 +145,7 @@ typedef union {
 
 struct drv_cmd {
 	unsigned int type;
-	cpumask_var_t mask;
+	const struct cpumask *mask;
 	drv_addr_union addr;
 	u32 val;
 };
@@ -231,6 +231,7 @@ static u32 get_cur_val(const struct cpumask *mask)
 		return 0;
 	}
 
+	cmd.mask = mask;
 	drv_read(&cmd);
 
 	dprintk("get_cur_val = %u\n", cmd.val);
@@ -397,9 +398,6 @@ static int acpi_cpufreq_target(struct cpufreq_policy *policy,
 		return -ENODEV;
 	}
 
-	if (unlikely(!alloc_cpumask_var(&cmd.mask, GFP_KERNEL)))
-		return -ENOMEM;
-
 	perf = data->acpi_data;
 	result = cpufreq_frequency_table_target(policy,
 						data->freq_table,
@@ -444,9 +442,9 @@ static int acpi_cpufreq_target(struct cpufreq_policy *policy,
 
 	/* cpufreq holds the hotplug lock, so we are safe from here on */
 	if (policy->shared_type != CPUFREQ_SHARED_TYPE_ANY)
-		cpumask_and(cmd.mask, cpu_online_mask, policy->cpus);
+		cmd.mask = policy->cpus;
 	else
-		cpumask_copy(cmd.mask, cpumask_of(policy->cpu));
+		cmd.mask = cpumask_of(policy->cpu);
 
 	freqs.old = perf->states[perf->state].core_frequency * 1000;
 	freqs.new = data->freq_table[next_state].frequency;
@@ -473,7 +471,6 @@ static int acpi_cpufreq_target(struct cpufreq_policy *policy,
 	perf->state = next_perf_state;
 
 out:
-	free_cpumask_var(cmd.mask);
 	return result;
 }
 

commit 5cdc5e9e69d4dc3a3630ae1fa666401b2a8dcde6
Author: Ingo Molnar <mingo@elte.hu>
Date:   Mon Jan 19 20:49:37 2009 +0100

    x86: fully honor "nolapic", fix
    
    Impact: build fix
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/arch/x86/kernel/apic.c b/arch/x86/kernel/apic.c
index 485787955834..9ca12af6c876 100644
--- a/arch/x86/kernel/apic.c
+++ b/arch/x86/kernel/apic.c
@@ -1131,7 +1131,9 @@ void __cpuinit setup_local_APIC(void)
 	int i, j;
 
 	if (disable_apic) {
+#ifdef CONFIG_X86_IO_APIC
 		disable_ioapic_setup();
+#endif
 		return;
 	}