Patches contributed by Eötvös Lorand University


commit ea6bff368548d79529421a9dc0710fc5330eb504
Author: Ingo Molnar <mingo@elte.hu>
Date:   Fri Aug 28 10:44:56 2009 +0200

    modules: Fix build error in the !CONFIG_KALLSYMS case
    
    > James Bottomley (1):
    >       module: workaround duplicate section names
    
    -tip testing found that this patch breaks the build on x86 if
    CONFIG_KALLSYMS is disabled:
    
     kernel/module.c: In function ‘load_module’:
     kernel/module.c:2367: error: ‘struct module’ has no member named ‘sect_attrs’
     distcc[8269] ERROR: compile kernel/module.c on ph/32 failed
     make[1]: *** [kernel/module.o] Error 1
     make: *** [kernel] Error 2
     make: *** Waiting for unfinished jobs....
    
    Commit 1b364bf misses the fact that section attributes are only
    built and dealt with if kallsyms is enabled. The patch below fixes
    this.
    
    ( note, technically speaking this should depend on CONFIG_SYSFS as
      well but this patch is correct too and keeps the #ifdef less
      intrusive - in the KALLSYMS && !SYSFS case the code is a NOP. )
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>
    [ Replaced patch with a slightly cleaner variation by James Bottomley ]
    Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

diff --git a/kernel/module.c b/kernel/module.c
index eccb561dd8a3..2d537186191f 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -1274,6 +1274,10 @@ static void add_notes_attrs(struct module *mod, unsigned int nsect,
 	struct module_notes_attrs *notes_attrs;
 	struct bin_attribute *nattr;
 
+	/* failed to create section attributes, so can't create notes */
+	if (!mod->sect_attrs)
+		return;
+
 	/* Count notes sections and allocate structures.  */
 	notes = 0;
 	for (i = 0; i < nsect; i++)
@@ -2355,8 +2359,7 @@ static noinline struct module *load_module(void __user *umod,
 	if (err < 0)
 		goto unlink;
 	add_sect_attrs(mod, hdr->e_shnum, secstrings, sechdrs);
-	if (mod->sect_attrs)
-		add_notes_attrs(mod, hdr->e_shnum, secstrings, sechdrs);
+	add_notes_attrs(mod, hdr->e_shnum, secstrings, sechdrs);
 
 	/* Get rid of temporary copy */
 	vfree(hdr);

commit 66c6e29f24a50173fc1e761c3e2483c8d64e3b1a
Merge: 6c347d43eea2 117226d15850
Author: Ingo Molnar <mingo@elte.hu>
Date:   Fri Aug 28 13:53:07 2009 +0200

    Merge branch 'tracing/core' of git://git.kernel.org/pub/scm/linux/kernel/git/frederic/random-tracing into tracing/core

commit 6bb56347f5162d1a7cb1dc461023360781ecd4c0
Author: Ingo Molnar <mingo@elte.hu>
Date:   Fri Aug 28 13:44:53 2009 +0200

    perf_counters: Increase paranoia level
    
    Per-cpu counters are an ASLR information leak as they show
    the execution other tasks do. Increase the paranoia level
    to 1, which disallows per-cpu counters. (they still allow
    counting/profiling of own tasks - and admin can profile
    everything.)
    
    Acked-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Mike Galbraith <efault@gmx.de>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
    Cc: Frederic Weisbecker <fweisbec@gmail.com>
    LKML-Reference: <new-submission>
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/kernel/perf_counter.c b/kernel/perf_counter.c
index f274e1959885..7d4bb83b78cf 100644
--- a/kernel/perf_counter.c
+++ b/kernel/perf_counter.c
@@ -50,7 +50,7 @@ static atomic_t nr_task_counters __read_mostly;
  *  1 - disallow cpu counters to unpriv
  *  2 - disallow kernel profiling to unpriv
  */
-int sysctl_perf_counter_paranoid __read_mostly;
+int sysctl_perf_counter_paranoid __read_mostly = 1;
 
 static inline bool perf_paranoid_cpu(void)
 {

commit 35dce1a99d010f3d738af4ce1b9b77302fdfe69c
Merge: 7cb2e3ee2aee 1c569f0264ea
Author: Ingo Molnar <mingo@elte.hu>
Date:   Wed Aug 26 08:29:02 2009 +0200

    Merge branch 'tracing/core' of git://git.kernel.org/pub/scm/linux/kernel/git/frederic/random-tracing into tracing/core
    
    Conflicts:
            include/linux/tracepoint.h
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --cc include/linux/tracepoint.h
index 0341f2e2698a,846a4ae501eb..63a3f7a80580
--- a/include/linux/tracepoint.h
+++ b/include/linux/tracepoint.h
@@@ -295,5 -273,9 +282,8 @@@ static inline void tracepoint_synchroni
  
  #define TRACE_EVENT(name, proto, args, struct, assign, print)	\
  	DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))
+ #define TRACE_EVENT_FN(name, proto, args, struct,		\
+ 		assign, print, reg, unreg)			\
+ 	DECLARE_TRACE(name, PARAMS(proto), PARAMS(args))
 -#endif
  
 -#endif
 +#endif /* ifdef TRACE_EVENT (see note above) */

commit daedc71836e5a398fd0cc0e12c5cb43539478485
Merge: c36ba80ea01d 422bef879e84
Author: Ingo Molnar <mingo@elte.hu>
Date:   Tue Aug 25 10:04:27 2009 +0200

    Merge commit 'v2.6.31-rc7' into irq/core
    
    Merge reason: move from an -rc2 base to -rc7.
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

commit 5f9ece02401116b29eb04396b99ea092acb75dd8
Merge: 9f51e24ee8b5 422bef879e84
Author: Ingo Molnar <mingo@elte.hu>
Date:   Mon Aug 24 12:25:44 2009 +0200

    Merge commit 'v2.6.31-rc7' into x86/cleanups
    
    Merge reason: we were on -rc1 before - go up to -rc7
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --cc arch/x86/kernel/cpu/amd.c
index c6eb02e69875,63fddcd082cd..83b217c7225f
--- a/arch/x86/kernel/cpu/amd.c
+++ b/arch/x86/kernel/cpu/amd.c
@@@ -400,8 -398,15 +400,15 @@@ static void __cpuinit init_amd(struct c
  		u32 level;
  
  		level = cpuid_eax(1);
 -		if((level >= 0x0f48 && level < 0x0f50) || level >= 0x0f58)
 +		if ((level >= 0x0f48 && level < 0x0f50) || level >= 0x0f58)
  			set_cpu_cap(c, X86_FEATURE_REP_GOOD);
+ 
+ 		/*
+ 		 * Some BIOSes incorrectly force this feature, but only K8
+ 		 * revision D (model = 0x14) and later actually support it.
+ 		 */
+ 		if (c->x86_model < 0x14)
+ 			clear_cpu_cap(c, X86_FEATURE_LAHF_LM);
  	}
  	if (c->x86 == 0x10 || c->x86 == 0x11)
  		set_cpu_cap(c, X86_FEATURE_REP_GOOD);

commit 96d6e48bc6b38342a59ccd23e25907d12caaeaf8
Merge: 6e086437f35a 4464fcaa9cbf
Author: Ingo Molnar <mingo@elte.hu>
Date:   Wed Aug 19 14:50:35 2009 +0200

    Merge branch 'perfcounters/urgent' into perfcounters/core
    
    Conflicts:
            tools/perf/builtin-annotate.c
            tools/perf/builtin-report.c
    
    Merge reason: resolve these conflicts.
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --cc tools/perf/builtin-annotate.c
index 96d421f7161d,5e17de984dc8..4ac618b34254
--- a/tools/perf/builtin-annotate.c
+++ b/tools/perf/builtin-annotate.c
@@@ -629,8 -981,15 +630,15 @@@ process_fork_event(event_t *event, unsi
  		(void *)(long)(event->header.size),
  		event->fork.pid, event->fork.ppid);
  
+ 	/*
+ 	 * A thread clone will have the same PID for both
+ 	 * parent and child.
+ 	 */
+ 	if (thread == parent)
+ 		return 0;
+ 
  	if (!thread || !parent || thread__fork(thread, parent)) {
 -		dprintf("problem processing PERF_EVENT_FORK, skipping event.\n");
 +		dump_printf("problem processing PERF_EVENT_FORK, skipping event.\n");
  		return -1;
  	}
  	total_fork++;
@@@ -976,7 -1335,12 +984,12 @@@ static int __cmd_annotate(void
  		exit(-1);
  	}
  
 -	if (!force && (stat.st_uid != geteuid())) {
++	if (!force && (input_stat.st_uid != geteuid())) {
+ 		fprintf(stderr, "file: %s not owned by current user\n", input_name);
+ 		exit(-1);
+ 	}
+ 
 -	if (!stat.st_size) {
 +	if (!input_stat.st_size) {
  		fprintf(stderr, "zero-sized file, nothing to do!\n");
  		exit(0);
  	}
diff --cc tools/perf/builtin-report.c
index 3fc0d471b90b,8b2ec882e6e0..d2e28820ee60
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@@ -1404,7 -1857,12 +1405,12 @@@ static int __cmd_report(void
  		exit(-1);
  	}
  
 -	if (!force && (stat.st_uid != geteuid())) {
++	if (!force && (input_stat.st_uid != geteuid())) {
+ 		fprintf(stderr, "file: %s not owned by current user\n", input_name);
+ 		exit(-1);
+ 	}
+ 
 -	if (!stat.st_size) {
 +	if (!input_stat.st_size) {
  		fprintf(stderr, "zero-sized file, nothing to do!\n");
  		exit(0);
  	}
@@@ -1614,7 -2069,8 +1620,8 @@@ static const struct option options[] = 
  		    "be more verbose (show symbol address, etc)"),
  	OPT_BOOLEAN('D', "dump-raw-trace", &dump_trace,
  		    "dump raw trace in ASCII"),
 -	OPT_STRING('k', "vmlinux", &vmlinux, "file", "vmlinux pathname"),
 +	OPT_STRING('k', "vmlinux", &vmlinux_name, "file", "vmlinux pathname"),
+ 	OPT_BOOLEAN('f', "force", &force, "don't complain, do it"),
  	OPT_BOOLEAN('m', "modules", &modules,
  		    "load module symbols - WARNING: use only with -k and LIVE kernel"),
  	OPT_BOOLEAN('n', "show-nr-samples", &show_nr_samples,

commit 8a517c514d5893602cf85c1b4c47afbbc04d2198
Merge: c64b04fe6e0c 422bef879e84
Author: Ingo Molnar <mingo@elte.hu>
Date:   Sun Aug 23 11:18:47 2009 +0200

    Merge commit 'v2.6.31-rc7' into x86/cpu

commit 4a683bf94b8a10e2bb0da07aec3ac0a55e5de61f
Author: Ingo Molnar <mingo@elte.hu>
Date:   Fri Aug 21 12:53:36 2009 +0200

    tracing: Fix too large stack usage in do_one_initcall()
    
    One of my testboxes triggered this nasty stack overflow crash
    during SCSI probing:
    
    [    5.874004] sd 0:0:0:0: [sda] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
    [    5.875004] device: 'sda': device_add
    [    5.878004] BUG: unable to handle kernel NULL pointer dereference at 00000a0c
    [    5.878004] IP: [<b1008321>] print_context_stack+0x81/0x110
    [    5.878004] *pde = 00000000
    [    5.878004] Thread overran stack, or stack corrupted
    [    5.878004] Oops: 0000 [#1] PREEMPT SMP DEBUG_PAGEALLOC
    [    5.878004] last sysfs file:
    [    5.878004]
    [    5.878004] Pid: 1, comm: swapper Not tainted (2.6.31-rc6-tip-01272-g9919e28-dirty #5685)
    [    5.878004] EIP: 0060:[<b1008321>] EFLAGS: 00010083 CPU: 0
    [    5.878004] EIP is at print_context_stack+0x81/0x110
    [    5.878004] EAX: cf8a3000 EBX: cf8a3fe4 ECX: 00000049 EDX: 00000000
    [    5.878004] ESI: b1cfce84 EDI: 00000000 EBP: cf8a3018 ESP: cf8a2ff4
    [    5.878004]  DS: 007b ES: 007b FS: 00d8 GS: 0000 SS: 0068
    [    5.878004] Process swapper (pid: 1, ti=cf8a2000 task=cf8a8000 task.ti=cf8a3000)
    [    5.878004] Stack:
    [    5.878004]  b1004867 fffff000 cf8a3ffc
    [    5.878004] Call Trace:
    [    5.878004]  [<b1004867>] ? kernel_thread_helper+0x7/0x10
    [    5.878004] BUG: unable to handle kernel NULL pointer dereference at 00000a0c
    [    5.878004] IP: [<b1008321>] print_context_stack+0x81/0x110
    [    5.878004] *pde = 00000000
    [    5.878004] Thread overran stack, or stack corrupted
    [    5.878004] Oops: 0000 [#2] PREEMPT SMP DEBUG_PAGEALLOC
    
    The oops did not reveal any more details about the real stack
    that we have and the system got into an infinite loop of
    recursive pagefaults.
    
    So i booted with CONFIG_STACK_TRACER=y and the 'stacktrace' boot
    parameter. The box did not crash (timings/conditions probably
    changed a tiny bit to trigger the catastrophic crash), but the
    /debug/tracing/stack_trace file was rather revealing:
    
            Depth    Size   Location    (72 entries)
            -----    ----   --------
      0)     3704      52   __change_page_attr+0xb8/0x290
      1)     3652      24   __change_page_attr_set_clr+0x43/0x90
      2)     3628      60   kernel_map_pages+0x108/0x120
      3)     3568      40   prep_new_page+0x7d/0x130
      4)     3528      84   get_page_from_freelist+0x106/0x420
      5)     3444     116   __alloc_pages_nodemask+0xd7/0x550
      6)     3328      36   allocate_slab+0xb1/0x100
      7)     3292      36   new_slab+0x1c/0x160
      8)     3256      36   __slab_alloc+0x133/0x2b0
      9)     3220       4   kmem_cache_alloc+0x1bb/0x1d0
     10)     3216     108   create_object+0x28/0x250
     11)     3108      40   kmemleak_alloc+0x81/0xc0
     12)     3068      24   kmem_cache_alloc+0x162/0x1d0
     13)     3044      52   scsi_pool_alloc_command+0x29/0x70
     14)     2992      20   scsi_host_alloc_command+0x22/0x70
     15)     2972      24   __scsi_get_command+0x1b/0x90
     16)     2948      28   scsi_get_command+0x35/0x90
     17)     2920      24   scsi_setup_blk_pc_cmnd+0xd4/0x100
     18)     2896     128   sd_prep_fn+0x332/0xa70
     19)     2768      36   blk_peek_request+0xe7/0x1d0
     20)     2732      56   scsi_request_fn+0x54/0x520
     21)     2676      12   __generic_unplug_device+0x2b/0x40
     22)     2664      24   blk_execute_rq_nowait+0x59/0x80
     23)     2640     172   blk_execute_rq+0x6b/0xb0
     24)     2468      32   scsi_execute+0xe0/0x140
     25)     2436      64   scsi_execute_req+0x152/0x160
     26)     2372      60   scsi_vpd_inquiry+0x6c/0x90
     27)     2312      44   scsi_get_vpd_page+0x112/0x160
     28)     2268      52   sd_revalidate_disk+0x1df/0x320
     29)     2216      92   rescan_partitions+0x98/0x330
     30)     2124      52   __blkdev_get+0x309/0x350
     31)     2072       8   blkdev_get+0xf/0x20
     32)     2064      44   register_disk+0xff/0x120
     33)     2020      36   add_disk+0x6e/0xb0
     34)     1984      44   sd_probe_async+0xfb/0x1d0
     35)     1940      44   __async_schedule+0xf4/0x1b0
     36)     1896       8   async_schedule+0x12/0x20
     37)     1888      60   sd_probe+0x305/0x360
     38)     1828      44   really_probe+0x63/0x170
     39)     1784      36   driver_probe_device+0x5d/0x60
     40)     1748      16   __device_attach+0x49/0x50
     41)     1732      32   bus_for_each_drv+0x5b/0x80
     42)     1700      24   device_attach+0x6b/0x70
     43)     1676      16   bus_attach_device+0x47/0x60
     44)     1660      76   device_add+0x33d/0x400
     45)     1584      52   scsi_sysfs_add_sdev+0x6a/0x2c0
     46)     1532     108   scsi_add_lun+0x44b/0x460
     47)     1424     116   scsi_probe_and_add_lun+0x182/0x4e0
     48)     1308      36   __scsi_add_device+0xd9/0xe0
     49)     1272      44   ata_scsi_scan_host+0x10b/0x190
     50)     1228      24   async_port_probe+0x96/0xd0
     51)     1204      44   __async_schedule+0xf4/0x1b0
     52)     1160       8   async_schedule+0x12/0x20
     53)     1152      48   ata_host_register+0x171/0x1d0
     54)     1104      60   ata_pci_sff_activate_host+0xf3/0x230
     55)     1044      44   ata_pci_sff_init_one+0xea/0x100
     56)     1000      48   amd_init_one+0xb2/0x190
     57)      952       8   local_pci_probe+0x13/0x20
     58)      944      32   pci_device_probe+0x68/0x90
     59)      912      44   really_probe+0x63/0x170
     60)      868      36   driver_probe_device+0x5d/0x60
     61)      832      20   __driver_attach+0x89/0xa0
     62)      812      32   bus_for_each_dev+0x5b/0x80
     63)      780      12   driver_attach+0x1e/0x20
     64)      768      72   bus_add_driver+0x14b/0x2d0
     65)      696      36   driver_register+0x6e/0x150
     66)      660      20   __pci_register_driver+0x53/0xc0
     67)      640       8   amd_init+0x14/0x16
     68)      632     572   do_one_initcall+0x2b/0x1d0
     69)       60      12   do_basic_setup+0x56/0x6a
     70)       48      20   kernel_init+0x84/0xce
     71)       28      28   kernel_thread_helper+0x7/0x10
    
    There's a lot of fat functions on that stack trace, but
    the largest of all is do_one_initcall(). This is due to
    the boot trace entry variables being on the stack.
    
    Fixing this is relatively easy, initcalls are fundamentally
    serialized, so we can move the local variables to file scope.
    
    Note that this large stack footprint was present for a
    couple of months already - what pushed my system over
    the edge was the addition of kmemleak to the call-chain:
    
      6)     3328      36   allocate_slab+0xb1/0x100
      7)     3292      36   new_slab+0x1c/0x160
      8)     3256      36   __slab_alloc+0x133/0x2b0
      9)     3220       4   kmem_cache_alloc+0x1bb/0x1d0
     10)     3216     108   create_object+0x28/0x250
     11)     3108      40   kmemleak_alloc+0x81/0xc0
     12)     3068      24   kmem_cache_alloc+0x162/0x1d0
     13)     3044      52   scsi_pool_alloc_command+0x29/0x70
    
    This pushes the total to ~3800 bytes, only a tiny bit
    more was needed to corrupt the on-kernel-stack thread_info.
    
    The fix reduces the stack footprint from 572 bytes
    to 28 bytes.
    
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Frederic Weisbecker <fweisbec@gmail.com>
    Cc: Steven Rostedt <srostedt@redhat.com>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Jens Axboe <jens.axboe@oracle.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: <stable@kernel.org>
    LKML-Reference: <new-submission>
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/init/main.c b/init/main.c
index 2c5ade79eb81..98e679e3494a 100644
--- a/init/main.c
+++ b/init/main.c
@@ -733,13 +733,14 @@ static void __init do_ctors(void)
 int initcall_debug;
 core_param(initcall_debug, initcall_debug, bool, 0644);
 
+static char msgbuf[64];
+static struct boot_trace_call call;
+static struct boot_trace_ret ret;
+
 int do_one_initcall(initcall_t fn)
 {
 	int count = preempt_count();
 	ktime_t calltime, delta, rettime;
-	char msgbuf[64];
-	struct boot_trace_call call;
-	struct boot_trace_ret ret;
 
 	if (initcall_debug) {
 		call.caller = task_pid_nr(current);

commit cbcb340cb6a6f9f32724c90493f509dd41105e20
Merge: 78b89ecd7317 ce2eef33d35c
Author: Ingo Molnar <mingo@elte.hu>
Date:   Thu Aug 20 12:05:24 2009 +0200

    Merge branch 'bugfix' of git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen into x86/urgent