Subject: Re: [Perfctr-devel] 2.6.19-rc6-git10 new perfmon code base + libpfm + pfmon

From: "Philip J. Mucci" <[email-masked]>
Date: Tue, 28 Nov 2006 15:50:27 +0100

Hi folks,

Linux-MIPS users will need the following patch to add the 'cpu'
directories to sysfs.

Phil

On Mon, 2006-11-27 at 06:37 -0800, Stephane Eranian wrote:
> Hello,
> 
> I have released another version of the perfmon new code base package.
> This version of the kernel patch is relative to 2.6.19-rc6-git10.
> 
> This is a major update because it completes the changes requested 
> during the code review on LKML. As a consequence, the kernel interface
> is NOT backward compatible with previous v2.2 versions. This release has
> the v2.3 version number. Backward compatibility with v2.0 is maintained
> on Itanium processors.
> 
> The kernel patch is split between infrastructure work and perfmon2 proper.
> The infrastructure contains the following changes which will be integrated
> into mainline before perfmon2 is. Those changes should appear in 2.6.20.
> They are provided in the base.diff file.
> 
> The infrastructure changes include:
> 	- x86_64: fix idle_notifier to cover all interrupts entry/exit for idle thread
> 	- i386  : add idle notifier (copy of x86_64 notifier)
> 	- ia64  : idle notifier (copy of x86_64 notifier)
> 	- i386  : add X86_FEATURE_ceforge.net, [email-masked],X86_FEATURE_PEBS to cpufeature.h
> 	- x86_64:  add X86_FEATURE_BTS,X86_FEATURE_PEBS to cpufeature.h
> 	- i386  : add PMU related MSR definitions to msr.h
> 	- x86_64: NMI watchdog uses PERFCTR1 to allow PEBS on Intel Core (requires PERFCTR0)
> 	- all   : remove unused carta_random32.h
> 
> 
> The perfmon2 kernel changes the release to v2.3 and includes the following changes:
> 	- updated to 2.6.19-rc6-git10 
> 	- sampling format identified with clear text string, not UUID anymore
> 	- pfm_create_context() returns file descriptor
> 	- sampling format name passed as argument
> 	- struct pfarg_ctx_t simplified
> 	- using random32() instead of carta_random32() (now obsolete)
> 	- in struct pfarg_pmd, reg_random_seed is obsolete
> 	- added support for Intel Core processors (Core 2 Duo)
> 	- unified PEBS support between P4 and Intel Core
> 	- fix bugs with munmap() of sampling buffer
> 	- changed sysfs to handle new naming for sampling formats
> 	- change rsvd_mask logic in PMU description modules
> 	- make idle notifier registration lazy (only when needed)
> 	- rewritten NMI integration using die_notifier()
> 	- NMI watchdog support and auto-detection for AMD K8, Intel Core
> 	- fix potential issues with locking/irq masking using LockDep checker
> 	- cleaned MIPS PMU description table setup
> 	- various MIPS bugs fixes (Phil Mucci, Manoj Ekbote)
> 	- various PowerPC updates  include PPC32 description table (Phil Mucci)
> 
> Due to problems with the git10 tree, the MIPS kernel does not compile regardless of
> perfmon2. A new patch will be generated once this problem is removed.
> 
> I have also released a new libpfm, libpfm-3.2-061127, with lots of
> changes. Here are some of the most important ones:
> 
> 	- added support for Intel Core (Core 2 Duo)
> 	- updated all example, header files to perfmon v2.3
> 	- updated man pages
> 	- Intel Core PEBS example
> 	- fixed rtop on 32-bit platforms
> 	- various MIPS updates (Phil Mucci)
> 	- big-endian support for MIPS
> 	- various Makefile improvements
> 
> Also a new version of pfmon, pfmon-3.2-061127, with a lot
> of changes as well:
> 	- updated to perfmon v2.3 interface
> 	- support for Intel Core processors (Core 2 Duo)
> 	- support for Intel Core PEBS as a sampling format
> 	- complete rewrite of system-wide  core loops to avoid race conditions with signals
> 	- added --print-interval to print intermediate deltas in system-wide mode
> 	- better handling of perfmon errors
> 	- corrected Montecito checks for L2D_CANCEL events
> 	- factorized 'detailed' sampling format for all arch
> 	- inst-hist default formats for all arch
> 	- corrected sampling buffer auto-sizing based on resource limit constraints
> 	- updated online documentation
> 	
> This version of pfmon requires libpfm-3.2-061127.
> 
> You can get a more detailed log of changes the the CVS tree.
> 
> You can grab the new packages at our web site:
> 
> 	 http://perfmon2.sf.net
> 
> Enjoy,
> 
> PS: I will post a kernel patch to LKML and a diffstat on the perfmon mailing list.
> -- 
> 
> -Stephane
> 
> -------------------------------------------------------------------------
> Take Surveys. Earn Cash. Influence the Future of IT
> Join SourceForge.net's Techsay panel and you'll get the chance to share your
> opinions on IT & business topics through brief surveys - and earn cash
> http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
> _______________________________________________
> Perfctr-devel mailing list
> [email-masked]
> https://lists.sourceforge.net/lists/listinfo/perfctr-devel

Subject: No Subject
From: [email-masked] (Phil Mucci)
To: [email-masked]
Date: Tue, 28 Nov 2006 09:47:09 -0500

Index: perfmon/perfmon_sysfs.c
===================================================================
--- perfmon/perfmon_sysfs.c	(.../perfmon2-post-sf-pre-fixup)	(revision 27882)
+++ perfmon/perfmon_sysfs.c	(.../perfmon2-post-sf-post-fixup)	(revision 27882)
@@ -79,6 +79,10 @@
 
 static struct kobject pfm_kernel_kobj, pfm_kernel_fmt_kobj;
 
+/* Remove this after mips get topology.c files */
+
+struct cpu sysfs_cpus[NR_CPUS];
+
 static void pfm_reset_stats(int cpu)
 {
 	struct pfm_stats *st;
@@ -400,6 +404,19 @@
 	int done_kobj_fmt = 0, done_kobj_kernel = 0;
 	int i, cpu = -1;
 	
+	/* This is a hack to be removed */
+
+        for_each_present_cpu(i) {
+          ret = register_cpu(&sysfs_cpus[i],i,NULL);
+          if (ret)
+            {
+              PFM_INFO("cannot register cpu %d: %d\n",i,ret);
+              goto error;
+            }
+        }
+
+	/* End hack */
+
 	ret = subsystem_register(&pfm_fmt_subsys);
 	if (ret) {
 		PFM_INFO("cannot register pfm_fmt_subsys: %d", ret);

---

From: Ralf Baechle <[email-masked]>
Date: Tue, 28 Nov 2006 18:20:49 +0000

> Linux-MIPS users will need the following patch to add the 'cpu'

This patch is to some file which doesn't even exist in standard
kernels.  Nor should it be done in the perfmon code if it did exist in
the stock kernel.

> Index: perfmon/perfmon_sysfs.c

Why should there be one?  I guess you were looking for topology_init
which exists since Febuary 20 / linux-2.6.16-rc5 and does register all
CPUs.

>  static void pfm_reset_stats(int cpu)

Formatting style, see Documentation/CodingStyle.

  Ralf

---

From: "Philip J. Mucci" <[email-masked]>
Date: Tue, 28 Nov 2006 20:05:02 +0100

Hi Ralf,

Forgive me, I thought Stefane had posted the announcement of the new
perfmon kernel substrate on Linux/MIPS list. I see now that he did not,
so it's likely that the below patch has little meaning to you folks. I
do know however, that there are some broadcom folks tracking this work.

This is not meant to be a patch for the Linux/MIPS tree, but rather the
perfmon2 patch when applied to Linus' latest GIT tree. This hack (marked
as such) gets around a NULL pointer dereference upon boot. I make no
claims other than that it lets the MIPS folks play with the perfmon2
implementation.

Phil

---

From: Ralf Baechle <[email-masked]>
Date: Wed, 29 Nov 2006 16:04:35 +0000

> claims other than that it lets the MIPS folks play with the perfmon2

So following our private mail exchange I've checked in below fix.

  Ralf

commit 83eee867cf914c968933e8bc3acf7a3fe58ceaed
Author: Ralf Baechle <[email-masked]>
Date:   Wed Nov 29 15:04:08 2006 +0000

[MIPS] Do topology_init even on uniprocessor kernels.

Otherwise CPU 0 doesn't show up in sysfs which breaks some software.

Signed-off-by: Ralf Baechle <[email-masked]>

diff --git a/arch/mips/kernel/Makefile b/arch/mips/kernel/Makefile
index cd9cec9..6bfbbed 100644
--- a/arch/mips/kernel/Makefile
+++ b/arch/mips/kernel/Makefile
@@ -6,7 +6,7 @@ extra-y		:= head.o init_task.o vmlinux.l
 
 obj-y		+= cpu-probe.o branch.o entry.o genex.o irq.o process.o \
 		   ptrace.o reset.o semaphore.o setup.o signal.o syscall.o \
-		   time.o traps.o unaligned.o
+		   time.o topology.o traps.o unaligned.o
 
 binfmt_irix-objs	:= irixelf.o irixinv.o irixioctl.o irixsig.o	\
 			   irix5sys.o sysirix.o
diff --git a/arch/mips/kernel/smp.c b/arch/mips/kernel/smp.c
index db80957..49db516 100644
--- a/arch/mips/kernel/smp.c
+++ b/arch/mips/kernel/smp.c
@@ -463,28 +463,5 @@ void flush_tlb_one(unsigned long vaddr)
 	smp_on_each_tlb(flush_tlb_one_ipi, (void *) vaddr);
 }
 
-static DEFINE_PER_CPU(struct cpu, cpu_devices);
-
-static int __init topology_init(void)
-{
-	int i, ret;
-
-#ifdef CONFIG_NUMA
-	for_each_online_node(i)
-		register_one_node(i);
-#endif /* CONFIG_NUMA */
-
-	for_each_present_cpu(i) {
-		ret = register_cpu(&per_cpu(cpu_devices, i), i);
-		if (ret)
-			printk(KERN_WARNING "topology_init: register_cpu %d "
-			       "failed (%d)\n", i, ret);
-	}
-
-	return 0;
-}
-
-subsys_initcall(topology_init);
-
 EXPORT_SYMBOL(flush_tlb_page);
 EXPORT_SYMBOL(flush_tlb_one);
diff --git a/arch/mips/kernel/topology.c b/arch/mips/kernel/topology.c
new file mode 100644
index 0000000..660e44e
--- /dev/null
+++ b/arch/mips/kernel/topology.c
@@ -0,0 +1,29 @@
+#include <linux/cpu.h>
+#include <linux/cpumask.h>
+#include <linux/init.h>
+#include <linux/node.h>
+#include <linux/nodemask.h>
+#include <linux/percpu.h>
+
+static DEFINE_PER_CPU(struct cpu, cpu_devices);
+
+static int __init topology_init(void)
+{
+	int i, ret;
+
+#ifdef CONFIG_NUMA
+	for_each_online_node(i)
+		register_one_node(i);
+#endif /* CONFIG_NUMA */
+
+	for_each_present_cpu(i) {
+		ret = register_cpu(&per_cpu(cpu_devices, i), i);
+		if (ret)
+			printk(KERN_WARNING "topology_init: register_cpu %d "
+			       "failed (%d)\n", i, ret);
+	}
+
+	return 0;
+}
+
+subsys_initcall(topology_init);