Patches contributed by Eötvös Lorand University


commit f15b18d0755b3ee4b29991fc2fde535ee41df53c
Author: Ingo Molnar <mingo@elte.hu>
Date:   Sat May 9 10:04:22 2009 +0200

    perf_counter tools: remove debug code from builtin-stat.c
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/Documentation/perf_counter/builtin-stat.c b/Documentation/perf_counter/builtin-stat.c
index e2fa117eab58..cf575c305a6c 100644
--- a/Documentation/perf_counter/builtin-stat.c
+++ b/Documentation/perf_counter/builtin-stat.c
@@ -331,8 +331,6 @@ static void create_perfstat_counter(int counter)
 	hw_event.exclude_kernel = event_mask[counter] & EVENT_MASK_KERNEL;
 	hw_event.exclude_user   = event_mask[counter] & EVENT_MASK_USER;
 
-printf("exclude: %d\n", event_mask[counter]);
-
 	if (scale)
 		hw_event.read_format	= PERF_FORMAT_TOTAL_TIME_ENABLED |
 					  PERF_FORMAT_TOTAL_TIME_RUNNING;

commit f066a155334642b8a206eec625b1925d88c48aeb
Merge: e7c064889606 33df4db04a79
Author: Ingo Molnar <mingo@elte.hu>
Date:   Fri May 8 10:50:00 2009 +0200

    Merge branch 'x86/urgent' into x86/xen
    
    Conflicts:
            arch/frv/include/asm/pgtable.h
            arch/x86/include/asm/required-features.h
            arch/x86/xen/mmu.c
    
    Merge reason: x86/xen was on a .29 base still, move it to a fresher
                  branch and pick up Xen fixes as well, plus resolve
                  conflicts
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

commit 0ad5d703c6c0fcd385d956555460df95dff7eb7e
Merge: 44347d947f62 1cb81b143fa8
Author: Ingo Molnar <mingo@elte.hu>
Date:   Thu May 7 11:18:34 2009 +0200

    Merge branch 'tracing/hw-branch-tracing' into tracing/core
    
    Merge reason: this topic is ready for upstream now. It passed
                  Oleg's review and Andrew had no further mm/*
                  objections/observations either.
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --cc kernel/trace/Makefile
index 7c34cbfff96e,ecc671e9f142..06b85850fab4
--- a/kernel/trace/Makefile
+++ b/kernel/trace/Makefile
@@@ -15,12 -15,16 +15,17 @@@ ifdef CONFIG_TRACING_BRANCHE
  KBUILD_CFLAGS += -DDISABLE_BRANCH_PROFILING
  endif
  
+ #
+ # Make the trace clocks available generally: it's infrastructure
+ # relied on by ptrace for example:
+ #
+ obj-y += trace_clock.o
+ 
  obj-$(CONFIG_FUNCTION_TRACER) += libftrace.o
  obj-$(CONFIG_RING_BUFFER) += ring_buffer.o
 +obj-$(CONFIG_RING_BUFFER_BENCHMARK) += ring_buffer_benchmark.o
  
  obj-$(CONFIG_TRACING) += trace.o
- obj-$(CONFIG_TRACING) += trace_clock.o
  obj-$(CONFIG_TRACING) += trace_output.o
  obj-$(CONFIG_TRACING) += trace_stat.o
  obj-$(CONFIG_TRACING) += trace_printk.o

commit 44347d947f628060b92449702071bfe1d31dfb75
Merge: d94fc523f3c3 413f81eba35d
Author: Ingo Molnar <mingo@elte.hu>
Date:   Thu May 7 11:17:13 2009 +0200

    Merge branch 'linus' into tracing/core
    
    Merge reason: tracing/core was on a .30-rc1 base and was missing out on
                  on a handful of tracing fixes present in .30-rc5-almost.
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

commit 643bec956544d376b7c2a80a3d5c3d0bf94da8d3
Author: Ingo Molnar <mingo@elte.hu>
Date:   Thu May 7 09:12:50 2009 +0200

    x86: clean up arch/x86/kernel/tsc_sync.c a bit
    
     - remove unused define
     - make the lock variable definition stand out some more
     - convert KERN_* to pr_info() / pr_warning()
    
    [ Impact: cleanup ]
    
    LKML-Reference: <new-submission>
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/arch/x86/kernel/tsc_sync.c b/arch/x86/kernel/tsc_sync.c
index bf36328f6ef9..027b5b498993 100644
--- a/arch/x86/kernel/tsc_sync.c
+++ b/arch/x86/kernel/tsc_sync.c
@@ -34,6 +34,7 @@ static __cpuinitdata atomic_t stop_count;
  * of a critical section, to be able to prove TSC time-warps:
  */
 static __cpuinitdata raw_spinlock_t sync_lock = __RAW_SPIN_LOCK_UNLOCKED;
+
 static __cpuinitdata cycles_t last_tsc;
 static __cpuinitdata cycles_t max_warp;
 static __cpuinitdata int nr_warps;
@@ -113,13 +114,12 @@ void __cpuinit check_tsc_sync_source(int cpu)
 		return;
 
 	if (boot_cpu_has(X86_FEATURE_TSC_RELIABLE)) {
-		printk(KERN_INFO
-		       "Skipping synchronization checks as TSC is reliable.\n");
+		pr_info("Skipping synchronization checks as TSC is reliable.\n");
 		return;
 	}
 
-	printk(KERN_INFO "checking TSC synchronization [CPU#%d -> CPU#%d]:",
-			  smp_processor_id(), cpu);
+	pr_info("checking TSC synchronization [CPU#%d -> CPU#%d]:",
+		smp_processor_id(), cpu);
 
 	/*
 	 * Reset it - in case this is a second bootup:
@@ -143,8 +143,8 @@ void __cpuinit check_tsc_sync_source(int cpu)
 
 	if (nr_warps) {
 		printk("\n");
-		printk(KERN_WARNING "Measured %Ld cycles TSC warp between CPUs,"
-				    " turning off TSC clock.\n", max_warp);
+		pr_warning("Measured %Ld cycles TSC warp between CPUs, "
+			   "turning off TSC clock.\n", max_warp);
 		mark_tsc_unstable("check_tsc_sync_source failed");
 	} else {
 		printk(" passed.\n");
@@ -195,5 +195,3 @@ void __cpuinit check_tsc_sync_target(void)
 	while (atomic_read(&stop_count) != cpus)
 		cpu_relax();
 }
-#undef NR_LOOPS
-

commit 3611dfb8eda847c1c8e1a052f57206f7fddc6a7c
Merge: 16c8a10932ae a511e3f968c4
Author: Ingo Molnar <mingo@elte.hu>
Date:   Wed May 6 08:46:27 2009 +0200

    Merge branch 'core/locking' into perfcounters/core
    
    Merge reason: we moved a mutex.h commit that originated from the
                  perfcounters tree into core/locking - but now merge
                  back that branch to solve a merge artifact and to
                  pick up cleanups of this commit that happened in
                  core/locking.
    
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

commit b2e5d8588de0b5341eddad87dbe48d2185eaa3dd
Author: Ingo Molnar <mingo@elte.hu>
Date:   Wed May 6 07:55:33 2009 +0200

    irq: change ->set_affinity() to return status, fix
    
    This build failure:
    
     arch/powerpc/sysdev/mpic.c:810: error: conflicting types for 'mpic_set_affinity'
     arch/powerpc/sysdev/mpic.h:39: error: previous declaration of 'mpic_set_affinity' was here
     make[2]: *** [arch/powerpc/sysdev/mpic.o] Error 1
     make[2]: *** Waiting for unfinished jobs....
    
    Triggers because the function prototype was not updated when the
    function call signature got changed by:
    
       d5dedd4: irq: change ->set_affinity() to return status
    
    [ Impact: build fix on powerpc ]
    
    Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
    Cc: Yinghai Lu <yinghai@kernel.org>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Rusty Russell <rusty@rustcorp.com.au>
    Cc: linux-arch@vger.kernel.org
    LKML-Reference: <49F654E9.4070809@kernel.org>
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/arch/powerpc/sysdev/mpic.h b/arch/powerpc/sysdev/mpic.h
index 3cef2af10f42..eff433c322a0 100644
--- a/arch/powerpc/sysdev/mpic.h
+++ b/arch/powerpc/sysdev/mpic.h
@@ -36,6 +36,6 @@ static inline int mpic_pasemi_msi_init(struct mpic *mpic)
 
 extern int mpic_set_irq_type(unsigned int virq, unsigned int flow_type);
 extern void mpic_set_vector(unsigned int virq, unsigned int vector);
-extern void mpic_set_affinity(unsigned int irq, const struct cpumask *cpumask);
+extern int mpic_set_affinity(unsigned int irq, const struct cpumask *cpumask);
 
 #endif /* _POWERPC_SYSDEV_MPIC_H */

commit 066d7dea32c9bffe6decc0abe465627656cdd84e
Author: Ingo Molnar <mingo@elte.hu>
Date:   Mon May 4 19:04:09 2009 +0200

    perf_counter: fix fixed-purpose counter support on v2 Intel-PERFMON
    
    Fixed-purpose counters stopped working in a simple 'perf stat ls' run:
    
       <not counted>  cache references
       <not counted>  cache misses
    
    Due to:
    
      ef7b3e0: perf_counter, x86: remove vendor check in fixed_mode_idx()
    
    Which made x86_pmu.num_counters_fixed matter: if it's nonzero, the
    fixed-purpose counters are utilized.
    
    But on v2 perfmon this field is not set (despite there being
    fixed-purpose PMCs). So add a quirk to set the number of fixed-purpose
    counters to at least three.
    
    [ Impact: add quirk for three fixed-purpose counters on certain Intel CPUs ]
    
    Cc: Robert Richter <robert.richter@amd.com>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    LKML-Reference: <1241002046-8832-28-git-send-email-robert.richter@amd.com>
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/arch/x86/kernel/cpu/perf_counter.c b/arch/x86/kernel/cpu/perf_counter.c
index 196b58f04448..a6878b0798e5 100644
--- a/arch/x86/kernel/cpu/perf_counter.c
+++ b/arch/x86/kernel/cpu/perf_counter.c
@@ -962,7 +962,13 @@ static int intel_pmu_init(void)
 	x86_pmu = intel_pmu;
 	x86_pmu.version = version;
 	x86_pmu.num_counters = eax.split.num_counters;
-	x86_pmu.num_counters_fixed = edx.split.num_counters_fixed;
+
+	/*
+	 * Quirk: v2 perfmon does not report fixed-purpose counters, so
+	 * assume at least 3 counters:
+	 */
+	x86_pmu.num_counters_fixed = max((int)edx.split.num_counters_fixed, 3);
+
 	x86_pmu.counter_bits = eax.split.bit_width;
 	x86_pmu.counter_mask = (1ULL << eax.split.bit_width) - 1;
 

commit 1dce8d99b85aba6eddb8b8260baea944922e6fe7
Author: Ingo Molnar <mingo@elte.hu>
Date:   Mon May 4 19:23:18 2009 +0200

    perf_counter: convert perf_resource_mutex to a spinlock
    
    Now percpu counters can be initialized very early. But the init
    sequence uses mutex_lock(). Fortunately, perf_resource_mutex should
    be a spinlock anyway, so convert it.
    
    [ Impact: fix crash due to early init mutex use ]
    
    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 fcdafa234a5d..5f86a1156c94 100644
--- a/kernel/perf_counter.c
+++ b/kernel/perf_counter.c
@@ -46,9 +46,9 @@ static atomic_t nr_comm_tracking __read_mostly;
 int sysctl_perf_counter_priv __read_mostly; /* do we need to be privileged */
 
 /*
- * Mutex for (sysadmin-configurable) counter reservations:
+ * Lock for (sysadmin-configurable) counter reservations:
  */
-static DEFINE_MUTEX(perf_resource_mutex);
+static DEFINE_SPINLOCK(perf_resource_lock);
 
 /*
  * Architecture provided APIs - weak aliases:
@@ -3207,9 +3207,9 @@ static void __cpuinit perf_counter_init_cpu(int cpu)
 	cpuctx = &per_cpu(perf_cpu_context, cpu);
 	__perf_counter_init_context(&cpuctx->ctx, NULL);
 
-	mutex_lock(&perf_resource_mutex);
+	spin_lock(&perf_resource_lock);
 	cpuctx->max_pertask = perf_max_counters - perf_reserved_percpu;
-	mutex_unlock(&perf_resource_mutex);
+	spin_unlock(&perf_resource_lock);
 
 	hw_perf_counter_setup(cpu);
 }
@@ -3292,7 +3292,7 @@ perf_set_reserve_percpu(struct sysdev_class *class,
 	if (val > perf_max_counters)
 		return -EINVAL;
 
-	mutex_lock(&perf_resource_mutex);
+	spin_lock(&perf_resource_lock);
 	perf_reserved_percpu = val;
 	for_each_online_cpu(cpu) {
 		cpuctx = &per_cpu(perf_cpu_context, cpu);
@@ -3302,7 +3302,7 @@ perf_set_reserve_percpu(struct sysdev_class *class,
 		cpuctx->max_pertask = mpt;
 		spin_unlock_irq(&cpuctx->ctx.lock);
 	}
-	mutex_unlock(&perf_resource_mutex);
+	spin_unlock(&perf_resource_lock);
 
 	return count;
 }
@@ -3324,9 +3324,9 @@ perf_set_overcommit(struct sysdev_class *class, const char *buf, size_t count)
 	if (val > 1)
 		return -EINVAL;
 
-	mutex_lock(&perf_resource_mutex);
+	spin_lock(&perf_resource_lock);
 	perf_overcommit = val;
-	mutex_unlock(&perf_resource_mutex);
+	spin_unlock(&perf_resource_lock);
 
 	return count;
 }

commit 0d905bca23aca5c86a10ee101bcd3b1abbd40b25
Author: Ingo Molnar <mingo@elte.hu>
Date:   Mon May 4 19:13:30 2009 +0200

    perf_counter: initialize the per-cpu context earlier
    
    percpu scheduling for perfcounters wants to take the context lock,
    but that lock first needs to be initialized. Currently it is an
    early_initcall() - but that is too late, the task tick runs much
    sooner than that.
    
    Call it explicitly from the scheduler init sequence instead.
    
    [ Impact: fix access-before-init crash ]
    
    LKML-Reference: <new-submission>
    Signed-off-by: Ingo Molnar <mingo@elte.hu>

diff --git a/include/linux/perf_counter.h b/include/linux/perf_counter.h
index f776851f8c4b..a356fa69796c 100644
--- a/include/linux/perf_counter.h
+++ b/include/linux/perf_counter.h
@@ -573,6 +573,8 @@ extern struct perf_callchain_entry *perf_callchain(struct pt_regs *regs);
 
 extern int sysctl_perf_counter_priv;
 
+extern void perf_counter_init(void);
+
 #else
 static inline void
 perf_counter_task_sched_in(struct task_struct *task, int cpu)		{ }
@@ -600,9 +602,10 @@ perf_counter_mmap(unsigned long addr, unsigned long len,
 
 static inline void
 perf_counter_munmap(unsigned long addr, unsigned long len,
-		    unsigned long pgoff, struct file *file) 		{ }
+		    unsigned long pgoff, struct file *file)		{ }
 
 static inline void perf_counter_comm(struct task_struct *tsk)		{ }
+static inline void perf_counter_init(void)				{ }
 #endif
 
 #endif /* __KERNEL__ */
diff --git a/kernel/perf_counter.c b/kernel/perf_counter.c
index b9679c36bcc2..fcdafa234a5d 100644
--- a/kernel/perf_counter.c
+++ b/kernel/perf_counter.c
@@ -3265,15 +3265,12 @@ static struct notifier_block __cpuinitdata perf_cpu_nb = {
 	.notifier_call		= perf_cpu_notify,
 };
 
-static int __init perf_counter_init(void)
+void __init perf_counter_init(void)
 {
 	perf_cpu_notify(&perf_cpu_nb, (unsigned long)CPU_UP_PREPARE,
 			(void *)(long)smp_processor_id());
 	register_cpu_notifier(&perf_cpu_nb);
-
-	return 0;
 }
-early_initcall(perf_counter_init);
 
 static ssize_t perf_show_reserve_percpu(struct sysdev_class *class, char *buf)
 {
diff --git a/kernel/sched.c b/kernel/sched.c
index 2f600e30dcf0..a728976a3a6c 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -39,6 +39,7 @@
 #include <linux/completion.h>
 #include <linux/kernel_stat.h>
 #include <linux/debug_locks.h>
+#include <linux/perf_counter.h>
 #include <linux/security.h>
 #include <linux/notifier.h>
 #include <linux/profile.h>
@@ -8996,7 +8997,7 @@ void __init sched_init(void)
 		 * 1024) and two child groups A0 and A1 (of weight 1024 each),
 		 * then A0's share of the cpu resource is:
 		 *
-		 * 	A0's bandwidth = 1024 / (10*1024 + 1024 + 1024) = 8.33%
+		 *	A0's bandwidth = 1024 / (10*1024 + 1024 + 1024) = 8.33%
 		 *
 		 * We achieve this by letting init_task_group's tasks sit
 		 * directly in rq->cfs (i.e init_task_group->se[] = NULL).
@@ -9097,6 +9098,8 @@ void __init sched_init(void)
 	alloc_bootmem_cpumask_var(&cpu_isolated_map);
 #endif /* SMP */
 
+	perf_counter_init();
+
 	scheduler_running = 1;
 }