[patch] ppc64 patch for new benchmark framework

Gui,Jian guij@cn.ibm.com
Fri Mar 24 10:38:00 GMT 2006


Hi, Martin

This patch is to fix three maybe bugs of the new benchmark framework
on ppc64.

This framework works fine on i686 but fails on my ppc64/2.6.9-34.EL
for the following reasons:
1) The function kallsyms_lookup_name("sys_getuid") always return 0
  on ppc64 and we have to use kallsysms_lookup_name(".sys_getuid")
  to get the function entry address instead;
2) The content of /proc/cpuinfo on ppc64 is different from on i686.
  It is like:
  processor       : 0
  cpu             : POWER5 (gr)
  clock           : 1502.496000MHz
  revision        : 2.2
  There is no "model name" or "physical id" information, thus current
  print_header always failed;
3) The assignment of (.addr = "sys_getuid") will trigger a compilation
  error like: "warning: initialization from incompatible pointer type"
  (I'm using gcc-3.4.5-2 + glibc-2.3.4-2.19)

This patch works on ppc64/2.6.9-34.EL and i686/2.6.15.6 and should
apply to snapshot-20060318.

Could you give some comments?  Thanks.

Gui,Jian

diff -Nur src-20060318/runtime/bench2/bench.rb 
src-modified/runtime/bench2/bench.rb
--- src-20060318/runtime/bench2/bench.rb        2006-03-24 
09:03:53.000000000 -0500
+++ src-modified/runtime/bench2/bench.rb        2006-03-24 
09:06:26.000000000 -0500
@@ -149,9 +149,14 @@
 MODULE_AUTHOR(\"automatically generated by bench2/run_bench\");\n\n"
        f << "static int inst_sys_getuid (struct kprobe *p, struct pt_regs 
*regs) {\n"
        f << @code
-       f << "\n  return 0;\n}
-static struct kprobe kp[] = {\n  {\n    .addr = \"sys_getuid\",
-    .pre_handler = inst_sys_getuid\n  }\n};\n
+       f << "\n  return 0;\n}\n"
+       f << " static struct kprobe kp[] = {\n  {\n"
+       f << "#if defined __powerpc64__ \n"
+       f << "  .addr = (void *)\".sys_getuid\",\n"
+       f << "#else \n"
+       f << "  .addr = \"sys_getuid\", \n"
+       f << "#endif\n"
+       f << ".pre_handler = inst_sys_getuid\n  }\n};\n
 #define NUM_KPROBES 1\n
 int probe_start(void)\n{\n  return _stp_register_kprobes (kp, 
NUM_KPROBES);\n}\n
 void probe_exit (void)\n{\n  _stp_unregister_kprobes (kp, NUM_KPROBES); 
\n}\n"
@@ -185,8 +190,17 @@
     else
       @@num_threads = [1]
     end
-    physical_cpus=`grep "physical id" 
/proc/cpuinfo`.split("\n").uniq.length
-    model=`grep "model name" /proc/cpuinfo`.match(/(model 
name\t: )([^\n]*)/)[2]
+    arch=`uname -m`.strip
+    if (arch.match(/ppc64/))
+       cpu=`grep "cpu" /proc/cpuinfo`.match(/(cpu\t\t: )([^\n]*)/)[2]
+       clock=`grep "clock" /proc/cpuinfo`.match(/(clock\t\t: )([^\n]*)/)[2]
+       revision=`grep "revision" 
/proc/cpuinfo`.match(/(revision\t: )([^\n]*)/)[2]
+       cpuinfo=cpu + " " + clock + " revision: " + revision
+    else
+               physical_cpus=`grep "physical id" 
/proc/cpuinfo`.split("\n").uniq.length
+               model=`grep "model name" /proc/cpuinfo`.match(/(model 
name\t: )([^\n]*)/)[2]
+       cpuinfo="(#{physical_cpus} physical) #{model}"
+    end
     puts "SystemTap BENCH2 \t" + `date`
     puts "kernel: " + `uname -r`.strip + " " + `uname -m`.strip
     begin
@@ -195,11 +209,7 @@
     end

     puts `uname -n`.strip + ": " + `uptime`
-    if nproc > 1
-      puts "processors: #{nproc} (#{physical_cpus} physical) #{model}"
-    else
-      puts "processors: #{nproc} #{model}"
-    end
+    puts "processors: #{nproc} #{cpuinfo}"

     begin
       mem=IO.read("/proc/meminfo").split("\n") 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: bench2.ppc64.patch
Type: application/octet-stream
Size: 2272 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/systemtap/attachments/20060324/2d78713b/attachment.obj>


More information about the Systemtap mailing list