- frame Xen-specific additions with CONFIG_XEN conditionals
- use per-CPU data
Signed-off-by: Jan Beulich <jbeulich@suse.com>
--- a/drivers/oprofile/buffer_sync.c
+++ b/drivers/oprofile/buffer_sync.c
@@ -42,7 +42,10 @@ static cpumask_t marked_cpus = CPU_MASK_
 static DEFINE_SPINLOCK(task_mortuary);
 static void process_task_mortuary(void);
 
+#ifdef CONFIG_XEN
-static int cpu_current_domain[NR_CPUS];
+#include <linux/percpu.h>
+static DEFINE_PER_CPU(int, current_domain) = COORDINATOR_DOMAIN;
+#endif
 
 /* Take ownership of the task struct and place it on the
  * list for processing. Only after two full buffer syncs
@@ -151,11 +154,12 @@ static void end_sync(void)
 int sync_start(void)
 {
 	int err;
-	int i;
+#ifdef CONFIG_XEN
+	unsigned int cpu;
 
-	for (i = 0; i < NR_CPUS; i++) {
-		cpu_current_domain[i] = COORDINATOR_DOMAIN;
-	}
+	for_each_online_cpu(cpu)
+		per_cpu(current_domain, cpu) = COORDINATOR_DOMAIN;
+#endif
 
 	start_cpu_work();
 
@@ -303,12 +307,14 @@ static void add_cpu_mode_switch(unsigned
 	}
 }
 
+#ifdef CONFIG_XEN
 static void add_domain_switch(unsigned long domain_id)
 {
 	add_event_entry(ESCAPE_CODE);
 	add_event_entry(DOMAIN_SWITCH_CODE);
 	add_event_entry(domain_id);
 }
+#endif
 
 static void
 add_user_ctx_switch(struct task_struct const * task, unsigned long cookie)
@@ -498,6 +504,7 @@ static void mark_done(int cpu)
 	cpus_clear(marked_cpus);
 }
 
+#ifdef CONFIG_XEN
 /* Add IBS samples into event buffer */
 #define IBS_FETCH_SIZE	8
 #define IBS_OP_SIZE		14
@@ -559,6 +566,9 @@ static int add_ibs_data(int cpu, struct 
 
 	return size;
 }
+#else
+#define add_ibs_data(cpu, mm, cpu_mode) 0
+#endif
 
 /* FIXME: this is not sufficient if we implement syscall barrier backtrace
  * traversal, the code switch to sb_sample_start at first kernel enter/exit
@@ -594,11 +604,12 @@ void sync_buffer(int cpu)
  
 	add_cpu_switch(cpu);
 
+#ifdef CONFIG_XEN
 	/* We need to assign the first samples in this CPU buffer to the
 	   same domain that we were processing at the last sync_buffer */
-	if (cpu_current_domain[cpu] != COORDINATOR_DOMAIN) {
-		add_domain_switch(cpu_current_domain[cpu]);
-	}
+	if (per_cpu(current_domain, cpu) != COORDINATOR_DOMAIN)
+		add_domain_switch(per_cpu(current_domain, cpu));
+#endif
 	/* Remember, only we can modify tail_pos */
 
 	available = get_slots(cpu_buf);
@@ -616,8 +627,10 @@ void sync_buffer(int cpu)
 			} else if (s->event == CPU_TRACE_BEGIN) {
 				state = sb_bt_start;
 				add_trace_begin();
+#ifdef CONFIG_XEN
 			} else if (s->event == CPU_DOMAIN_SWITCH) {
-					domain_switch = 1;				
+				domain_switch = 1;
+#endif
 			} else {
 				struct mm_struct * oldmm = mm;
 
@@ -633,21 +646,23 @@ void sync_buffer(int cpu)
 			is_ibs_sample = add_ibs_data(cpu, mm, cpu_mode);
 
 		} else {
+#ifdef CONFIG_XEN
 			if (domain_switch) {
-				cpu_current_domain[cpu] = s->eip;
+				per_cpu(current_domain, cpu) = s->eip;
 				add_domain_switch(s->eip);
 				domain_switch = 0;
-			} else if (!is_ibs_sample) {
-				if (cpu_current_domain[cpu] !-				    COORDINATOR_DOMAIN) {
-					add_sample_entry(s->eip, s->event);
-				}
-				else  if (state >= sb_bt_start &&
-				    !add_sample(mm, s, cpu_mode)) {
-					if (state == sb_bt_start) {
-						state = sb_bt_ignore;
-						atomic_inc(&oprofile_stats.bt_lost_no_mapping);
-					}
+			} else if (is_ibs_sample)
+				;
+			else if (per_cpu(current_domain, cpu) !+				 COORDINATOR_DOMAIN) {
+				add_sample_entry(s->eip, s->event);
+			} else
+#endif
+			if (state >= sb_bt_start &&
+			    !add_sample(mm, s, cpu_mode)) {
+				if (state == sb_bt_start) {
+					state = sb_bt_ignore;
+					atomic_inc(&oprofile_stats.bt_lost_no_mapping);
 				}
 			}
 		}
@@ -656,10 +671,11 @@ void sync_buffer(int cpu)
 	}
 	release_mm(mm);
 
+#ifdef CONFIG_XEN
 	/* We reset domain to COORDINATOR at each CPU switch */
-	if (cpu_current_domain[cpu] != COORDINATOR_DOMAIN) {
+	if (per_cpu(current_domain, cpu) != COORDINATOR_DOMAIN)
 		add_domain_switch(COORDINATOR_DOMAIN);
-	}
+#endif
 
 	mark_done(cpu);
 
--- a/drivers/oprofile/cpu_buffer.c
+++ b/drivers/oprofile/cpu_buffer.c
@@ -38,7 +38,11 @@ static void wq_sync_buffer(void *);
 #define DEFAULT_TIMER_EXPIRE (HZ / 10)
 static int work_enabled;
 
+#ifndef CONFIG_XEN
+#define current_domain COORDINATOR_DOMAIN
+#else
 static int32_t current_domain = COORDINATOR_DOMAIN;
+#endif
 
 void free_cpu_buffers(void)
 {
@@ -202,8 +206,10 @@ static int log_sample(struct oprofile_cp
 		add_code(cpu_buf, (unsigned long)task);
 	}
 
+#ifdef CONFIG_XEN
 	if (pc == IBS_FETCH_CODE || pc == IBS_OP_CODE)
 		add_code(cpu_buf, cpu_mode);
+#endif
 
 	add_sample(cpu_buf, pc, event);
 	return 1;
@@ -284,6 +290,7 @@ void oprofile_add_trace(unsigned long pc
 	add_sample(cpu_buf, pc, 0);
 }
 
+#ifdef CONFIG_XEN
 int oprofile_add_domain_switch(int32_t domain_id)
 {
 	struct oprofile_cpu_buffer * cpu_buf = &cpu_buffer[smp_processor_id()];
@@ -302,6 +309,7 @@ int oprofile_add_domain_switch(int32_t d
 
 	return 1;
 }
+#endif
 
 /*
  * This serves to avoid cpu buffer overflow, and makes sure
--- a/drivers/oprofile/oprof.c
+++ b/drivers/oprofile/oprof.c
@@ -37,6 +37,7 @@ static DECLARE_MUTEX(start_sem);
  */
 static int timer = 0;
 
+#ifdef CONFIG_XEN
 int oprofile_set_active(int active_domains[], unsigned int adomains)
 {
 	int err;
@@ -62,6 +63,7 @@ int oprofile_set_passive(int passive_dom
 	mutex_unlock(&start_mutex);
 	return err;
 }
+#endif
 
 int oprofile_setup(void)
 {
--- a/drivers/oprofile/oprofile_files.c
+++ b/drivers/oprofile/oprofile_files.c
@@ -21,7 +21,11 @@
 #include "oprof.h"
 
 unsigned long fs_buffer_size = 131072;
-unsigned long fs_cpu_buffer_size = 131072;
+#ifndef CONFIG_XEN
+unsigned long fs_cpu_buffer_size = 8192;
+#else
+unsigned long fs_cpu_buffer_size = 32768;
+#endif
 unsigned long fs_buffer_watershed = 32768; /* FIXME: tune */
 
 static ssize_t depth_read(struct file * file, char __user * buf, size_t count,
loff_t * offset)
@@ -124,6 +128,8 @@ static struct file_operations dump_fops 
 	.write		= dump_write,
 };
 
+#ifdef CONFIG_XEN
+
 #define TMPBUFSIZE 512
 
 struct domain_data {
@@ -228,8 +234,8 @@ static DEFINE_DOMAIN_DATA(active);
 
 static int adomain_open(struct inode *inode, struct file *filp)
 {
-    filp->private_data = &active_domains;
-    return 0;
+	filp->private_data = &active_domains;
+	return 0;
 }
 
 static const struct file_operations active_domain_ops = {
@@ -242,8 +248,8 @@ static const struct file_operations acti
 
 static int pdomain_open(struct inode *inode, struct file *filp)
 {
-    filp->private_data = &passive_domains;
-    return 0;
+	filp->private_data = &passive_domains;
+	return 0;
 }
 
 static const struct file_operations passive_domain_ops = {
@@ -252,12 +258,16 @@ static const struct file_operations pass
 	.write		= domain_write,
 };
 
+#endif /* CONFIG_XEN */
+
 void oprofile_create_files(struct super_block * sb, struct dentry * root)
 {
 	oprofilefs_create_file(sb, root, "enable", &enable_fops);
 	oprofilefs_create_file_perm(sb, root, "dump", &dump_fops, 0666);
+#ifdef CONFIG_XEN
 	oprofilefs_create_file(sb, root, "active_domains",
&active_domain_ops);
 	oprofilefs_create_file(sb, root, "passive_domains",
&passive_domain_ops);
+#endif
 	oprofilefs_create_file(sb, root, "buffer", &event_buffer_fops);
 	oprofilefs_create_ulong(sb, root, "buffer_size",
&fs_buffer_size);
 	oprofilefs_create_ulong(sb, root, "buffer_watershed",
&fs_buffer_watershed);
--- a/include/linux/oprofile.h
+++ b/include/linux/oprofile.h
@@ -16,8 +16,9 @@
 #include <linux/types.h>
 #include <linux/spinlock.h>
 #include <asm/atomic.h>
-
+#ifdef CONFIG_XEN
 #include <xen/interface/xenoprof.h>
+#endif
  
 struct super_block;
 struct dentry;
@@ -29,11 +30,12 @@ struct oprofile_operations {
 	/* create any necessary configuration files in the oprofile fs.
 	 * Optional. */
 	int (*create_files)(struct super_block * sb, struct dentry * root);
+#ifdef CONFIG_XEN
 	/* setup active domains with Xen */
 	int (*set_active)(int *active_domains, unsigned int adomains);
-        /* setup passive domains with Xen */
-        int (*set_passive)(int *passive_domains, unsigned int pdomains);
-	
+	/* setup passive domains with Xen */
+	int (*set_passive)(int *passive_domains, unsigned int pdomains);
+#endif
 	/* Do any necessary interrupt setup. Optional. */
 	int (*setup)(void);
 	/* Do any necessary interrupt shutdown. Optional. */
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel