Hello.
Here is the patch for xenoprof/ia64 support.
In fact xenoprof/ia64 has been supported for long time, but I hesitated
to post this patch because sometimes the result was wrong.
But now it was fixed and I'm expecting that the patches will be
merged soon.
BTW the patch to opd_interface.h for DOMAIN_SWTICH_CODE
is posted. Is it possible to add defined(__ia64__) check?
Design note on xenoprof/ia64:
The perfmon model is that performance monitoring is per-thread, and
Linux kernel owns PMU and manages PMU context switch.
For system wide profiling, a thread is created on each physical CPUs
and the thread manages physical PMU.
On the other hand, on Xen/IA64 the hypervisor owns PMU so that
perfmon driver in the Linux kernel was patched such that
it calls the PERFMON hypercall to request Xen/IA64 to manipulate PMU.
Thus creating a thread on each virtual CPUs doesn't make sense for
xenoprof. Instead allocate a single context and calls perfmon driver
only once for xenoprof system wide profiling.
thanks,
Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx>
diff -r a5ef8c5f641e -r 394a663e3f71 daemon/opd_perfmon.c
--- a/daemon/opd_perfmon.c Mon Dec 17 17:50:15 2007 +0900
+++ b/daemon/opd_perfmon.c Mon Dec 17 18:15:40 2007 +0900
@@ -380,6 +380,7 @@ static void wait_for_child(struct child
close(child->up_pipe[1]);
}
+static struct child* xen_ctx;
void perfmon_init(void)
{
@@ -388,6 +389,24 @@ void perfmon_init(void)
if (cpu_type == CPU_TIMER_INT)
return;
+
+ if (!no_xen) {
+ xen_ctx = xmalloc(sizeof(struct child));
+ xen_ctx->pid = getpid();
+ xen_ctx->up_pipe[0] = -1;
+ xen_ctx->up_pipe[1] = -1;
+ xen_ctx->sigusr1 = 0;
+ xen_ctx->sigusr2 = 0;
+ xen_ctx->sigterm = 0;
+
+ create_context(xen_ctx);
+
+ write_pmu(xen_ctx);
+
+ load_context(xen_ctx);
+ return;
+ }
+
nr = sysconf(_SC_NPROCESSORS_ONLN);
if (nr == -1) {
@@ -431,6 +450,9 @@ void perfmon_exit(void)
if (cpu_type == CPU_TIMER_INT)
return;
+ if (!no_xen)
+ return;
+
for (i = 0; i < nr_cpus; ++i) {
kill(children[i].pid, SIGKILL);
waitpid(children[i].pid, NULL, 0);
@@ -445,6 +467,11 @@ void perfmon_start(void)
if (cpu_type == CPU_TIMER_INT)
return;
+ if (!no_xen) {
+ perfmon_start_child(xen_ctx->ctx_fd);
+ return;
+ }
+
for (i = 0; i < nr_cpus; ++i)
kill(children[i].pid, SIGUSR1);
}
@@ -457,6 +484,11 @@ void perfmon_stop(void)
if (cpu_type == CPU_TIMER_INT)
return;
+ if (!no_xen) {
+ perfmon_stop_child(xen_ctx->ctx_fd);
+ return;
+ }
+
for (i = 0; i < nr_cpus; ++i)
kill(children[i].pid, SIGUSR2);
}
--
yamahata
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel
|