This is the mail archive of the
systemtap@sourceware.org
mailing list for the systemtap project.
[patch] ppc64 patch for new benchmark framework
- From: "Gui,Jian" <guij at cn dot ibm dot com>
- To: "Martin Hunt" <hunt at redhat dot com>, "SystemTAP" <systemtap at sources dot redhat dot com>
- Date: Fri, 24 Mar 2006 18:37:58 +0800
- Subject: [patch] ppc64 patch for new benchmark framework
- References: <1142416360.27792.8.camel@dragon>
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")
Attachment:
bench2.ppc64.patch
Description: Binary data