patch for oprofile-0.9.1 which oprofile-0.9.1-xen.patch has already
been applied
Signed-off-by: SUZUKI Kazuhiro <kaz@xxxxxxxxxxxxxx>
diff -Nur oprofile-0.9.1-xen/daemon/opd_events.c
oprofile-0.9.1-xenoprof/daemon/opd_events.c
--- oprofile-0.9.1-xen/daemon/opd_events.c 2005-05-03 00:06:57.000000000
+0900
+++ oprofile-0.9.1-xenoprof/daemon/opd_events.c 2006-07-03 14:37:28.000000000
+0900
@@ -88,6 +88,7 @@
= event->count = event->um = 0;
event->kernel = 1;
event->user = 1;
+ event->domain = 1;
return;
}
@@ -111,6 +112,7 @@
event->um = copy_ulong(&c, ':');
event->kernel = copy_ulong(&c, ':');
event->user = copy_ulong(&c, ',');
+ event->domain = xenimage != NULL;
++cur;
}
diff -Nur oprofile-0.9.1-xen/daemon/opd_events.h
oprofile-0.9.1-xenoprof/daemon/opd_events.h
--- oprofile-0.9.1-xen/daemon/opd_events.h 2005-05-03 00:06:58.000000000
+0900
+++ oprofile-0.9.1-xenoprof/daemon/opd_events.h 2006-06-07 13:32:38.000000000
+0900
@@ -24,6 +24,7 @@
unsigned long um;
unsigned long kernel;
unsigned long user;
+ unsigned long domain;
};
/* needed for opd_perfmon.c */
diff -Nur oprofile-0.9.1-xen/daemon/opd_perfmon.c
oprofile-0.9.1-xenoprof/daemon/opd_perfmon.c
--- oprofile-0.9.1-xen/daemon/opd_perfmon.c 2004-12-13 08:26:35.000000000
+0900
+++ oprofile-0.9.1-xenoprof/daemon/opd_perfmon.c 2006-07-03
14:10:55.000000000 +0900
@@ -33,6 +33,7 @@
#ifdef HAVE_SCHED_SETAFFINITY
#include <sched.h>
#endif
+#include <mntent.h>
extern op_cpu cpu_type;
@@ -241,6 +242,7 @@
*/
#define PMC_MANDATORY (1UL << 23)
#define PMC_USER (1UL << 3)
+#define PMC_DOMAIN (1UL << 2)
#define PMC_KERNEL (1UL << 0)
for (i = 0; i < op_nr_counters && opd_events[i].name; ++i) {
struct opd_event * event = &opd_events[i];
@@ -252,6 +254,8 @@
: (pc[i].reg_value &= ~PMC_USER);
(event->kernel) ? (pc[i].reg_value |= PMC_KERNEL)
: (pc[i].reg_value &= ~PMC_KERNEL);
+ (event->domain) ? (pc[i].reg_value |= PMC_DOMAIN)
+ : (pc[i].reg_value &= ~PMC_DOMAIN);
pc[i].reg_value &= ~(0xff << 8);
pc[i].reg_value |= ((event->value & 0xff) << 8);
pc[i].reg_value &= ~(0xf << 16);
@@ -381,6 +385,101 @@
}
+/*
+ * We get # of online CPUs from /proc/processor,
+ * because patches/linux-2.6.16.13/xen-hotplug.patch does
+ * not work correctlly.
+ */
+# define GET_NPROCS_PARSER(FP, BUFFER, RESULT) \
+ do \
+ { \
+ (RESULT) = 0; \
+ /* Read all lines and count the lines starting with the string \
+ "processor". We don't have to fear extremely long lines since \
+ the kernel will not generate them. 8192 bytes are really \
+ enough. */ \
+ while (fgets_unlocked (BUFFER, sizeof (BUFFER), FP) != 0) \
+ if (strncmp (BUFFER, "processor", 9) == 0) \
+ ++(RESULT); \
+ } \
+ while (0)
+
+static const char path_proc[] = "/proc";
+
+static const char *
+get_proc_path (char *buffer, size_t bufsize)
+{
+ struct mntent mount_point;
+ struct mntent *entry;
+ char *result = NULL;
+ char *copy_result;
+ FILE *fp;
+
+ /* First find the mount point of the proc filesystem. */
+ fp = setmntent (_PATH_MOUNTED, "r");
+ if (fp == NULL)
+ fp = setmntent (_PATH_MNTTAB, "r");
+ if (fp != NULL)
+ {
+ /* We don't need locking. */
+ while ((entry = getmntent_r (fp, &mount_point, buffer, bufsize))
+ != NULL)
+ if (strcmp (mount_point.mnt_type, "proc") == 0)
+ {
+ result = mount_point.mnt_dir;
+ break;
+ }
+ endmntent (fp);
+ }
+
+ /* If we haven't found anything this is generally a bad sign but we
+ handle it gracefully. We return what is hopefully the right
+ answer (/proc) but we don't remember this. This will enable
+ programs which started before the system is fully running to
+ adjust themselves. */
+ if (result == NULL)
+ return path_proc;
+
+ /* Make a copy we can keep around. */
+ copy_result = strdup (result);
+ if (copy_result == NULL)
+ return result;
+
+ return copy_result;
+}
+
+int get_nprocs (void)
+{
+ FILE *fp;
+ char buffer[8192];
+ const char *proc_path;
+ int result = 1;
+
+ /* XXX Here will come a test for the new system call. */
+
+ /* Get mount point of proc filesystem. */
+ proc_path = get_proc_path (buffer, sizeof buffer);
+
+ /* If we haven't found an appropriate entry return 1. */
+ if (proc_path != NULL)
+ {
+ char *proc_fname = alloca (strlen (proc_path) + sizeof ("/cpuinfo"));
+
+ __stpcpy (__stpcpy (proc_fname, proc_path), "/cpuinfo");
+
+ fp = fopen (proc_fname, "rc");
+ if (fp != NULL)
+ {
+ /* No threads use this stream. */
+ GET_NPROCS_PARSER (fp, buffer, result);
+ fclose (fp);
+ }
+ }
+
+ return result;
+}
+
+
void perfmon_init(void)
{
size_t i;
@@ -389,11 +488,19 @@
if (cpu_type == CPU_TIMER_INT)
return;
+ /*
+ * patches/linux-2.6.16.13/xen-hotplug.patch does not work correctlly.
+ * So, we get # of online CPUs from /proc/processor.
+ */
+#if 0
nr = sysconf(_SC_NPROCESSORS_ONLN);
if (nr == -1) {
fprintf(stderr, "Couldn't determine number of CPUs.\n");
exit(EXIT_FAILURE);
}
+#else
+ nr = get_nprocs();
+#endif
nr_cpus = nr;
_______________________________________________
Xen-ia64-devel mailing list
Xen-ia64-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-ia64-devel
|