xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Wei Wang2 <wei.wang2@amd.com>
To: "xen-devel@lists.xensource.com" <xen-devel@lists.xensource.com>
Subject: [PATCH 2/2] xenoprofile: Add IBS support
Date: Fri, 30 Jul 2010 15:28:41 +0200	[thread overview]
Message-ID: <201007301528.41379.wei.wang2@amd.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 386 bytes --]

Patch for dom0.

Signed-off-by: Wei Wang <wei.wang2@amd.com>
-- 
AMD GmbH, Germany
Operating System Research Center

Legal Information:
Advanced Micro Devices GmbH
Karl-Hammerschmidt-Str. 34
85609 Dornach b. München

Geschäftsführer: Andrew Bowd, Thomas M. McCoy, Giuliano Meroni
Sitz: Dornach, Gemeinde Aschheim, Landkreis München
Registergericht München, HRB Nr. 43632

[-- Attachment #2: ibs_dom0.patch --]
[-- Type: text/x-diff, Size: 8220 bytes --]

diff --git a/arch/i386/oprofile/op_counter.h b/arch/i386/oprofile/op_counter.h
index 2880b15..11e9c00 100644
--- a/arch/i386/oprofile/op_counter.h
+++ b/arch/i386/oprofile/op_counter.h
@@ -26,4 +26,15 @@ struct op_counter_config {
 
 extern struct op_counter_config counter_config[];
 
+/* AMD IBS configuration */
+struct op_ibs_config {
+    unsigned long op_enabled;
+    unsigned long fetch_enabled;
+    unsigned long max_cnt_fetch;
+    unsigned long max_cnt_op;
+    unsigned long rand_en;
+    unsigned long dispatched_ops;
+};
+
+extern struct op_ibs_config ibs_config;
 #endif /* OP_COUNTER_H */
diff --git a/arch/i386/oprofile/xenoprof.c b/arch/i386/oprofile/xenoprof.c
index cb6ae1e..7341886 100644
--- a/arch/i386/oprofile/xenoprof.c
+++ b/arch/i386/oprofile/xenoprof.c
@@ -27,6 +27,7 @@
 #include "op_counter.h"
 
 static unsigned int num_events = 0;
+static int ibs_caps = 0;
 
 void __init xenoprof_arch_init_counter(struct xenoprof_init *init)
 {
@@ -43,6 +44,7 @@ void xenoprof_arch_counter(void)
 {
 	int i;
 	struct xenoprof_counter counter;
+	struct xenoprof_ibs_counter ibs_counter;
 
 	for (i=0; i<num_events; i++) {
 		counter.ind       = i;
@@ -55,6 +57,17 @@ void xenoprof_arch_counter(void)
 		WARN_ON(HYPERVISOR_xenoprof_op(XENOPROF_counter,
 					       &counter));
 	}
+
+	if (ibs_caps) {
+		ibs_counter.op_enabled = ibs_config.op_enabled;
+		ibs_counter.fetch_enabled = ibs_config.fetch_enabled;
+		ibs_counter.max_cnt_fetch = ibs_config.max_cnt_fetch;
+		ibs_counter.max_cnt_op = ibs_config.max_cnt_op;
+		ibs_counter.rand_en = ibs_config.rand_en;
+		ibs_counter.dispatched_ops = ibs_config.dispatched_ops;
+		WARN_ON(HYPERVISOR_xenoprof_op(XENOPROF_ibs_counter,
+				&ibs_counter));
+	}
 }
 
 void xenoprof_arch_start(void) 
@@ -140,13 +153,16 @@ out:
 }
 
 struct op_counter_config counter_config[OP_MAX_COUNTER];
+struct op_ibs_config ibs_config;
+
+#define IBS_CAPS_OPCNT          (1LL<<4)
 
 int xenoprof_create_files(struct super_block * sb, struct dentry * root)
 {
 	unsigned int i;
+	struct dentry * dir;
 
 	for (i = 0; i < num_events; ++i) {
-		struct dentry * dir;
 		char buf[2];
  
 		snprintf(buf, 2, "%d", i);
@@ -165,6 +181,35 @@ int xenoprof_create_files(struct super_block * sb, struct dentry * root)
 					&counter_config[i].user);
 	}
 
+	/* AMD IBS support */
+	ibs_caps = HYPERVISOR_xenoprof_op(XENOPROF_get_ibs_caps, NULL);
+	if (!ibs_caps)
+		return 0;
+
+	/* setup some reasonable defaults */
+	ibs_config.max_cnt_fetch = 250000;
+	ibs_config.fetch_enabled = 0;
+	ibs_config.max_cnt_op = 250000;
+	ibs_config.op_enabled = 0;
+	ibs_config.dispatched_ops = 0;
+
+	dir = oprofilefs_mkdir(sb, root, "ibs_fetch");
+	oprofilefs_create_ulong(sb, dir, "enable",
+				&ibs_config.fetch_enabled);
+	oprofilefs_create_ulong(sb, dir, "max_count",
+				&ibs_config.max_cnt_fetch);
+	oprofilefs_create_ulong(sb, dir, "rand_enable",
+				&ibs_config.rand_en);
+
+	dir = oprofilefs_mkdir(sb, root, "ibs_op");
+	oprofilefs_create_ulong(sb, dir, "enable",
+				&ibs_config.op_enabled);
+	oprofilefs_create_ulong(sb, dir, "max_count",
+				&ibs_config.max_cnt_op);
+	if (ibs_caps & IBS_CAPS_OPCNT)
+		oprofilefs_create_ulong(sb, dir, "dispatched_ops",
+				&ibs_config.dispatched_ops);
+
 	return 0;
 }
 
diff --git a/drivers/oprofile/buffer_sync.c b/drivers/oprofile/buffer_sync.c
index 1b30909..ec3ef0e 100644
--- a/drivers/oprofile/buffer_sync.c
+++ b/drivers/oprofile/buffer_sync.c
@@ -498,6 +498,67 @@ static void mark_done(int cpu)
 	cpus_clear(marked_cpus);
 }
 
+/* Add IBS samples into event buffer */
+#define IBS_FETCH_SIZE	8
+#define IBS_OP_SIZE		14
+
+static inline struct
+op_sample * get_next_slot(struct oprofile_cpu_buffer * cpu_buf, int next)
+{
+	int pos;
+	pos = cpu_buf->tail_pos + next;
+	if (pos >= cpu_buf->buffer_size)
+		pos = pos - cpu_buf->buffer_size;
+
+	return &cpu_buf->buffer[pos];
+}
+
+static int add_ibs_data(int cpu, struct mm_struct *mm, int cpu_mode)
+{
+	struct oprofile_cpu_buffer * cpu_buf = &cpu_buffer[cpu];
+	struct op_sample * s;
+
+	unsigned long cookie;
+	off_t offset;
+	int size, i, code;
+
+	s = get_next_slot(cpu_buf, 1);
+
+	if (s->eip == IBS_FETCH_CODE)
+		size = IBS_FETCH_SIZE;
+	else if (s->eip == IBS_OP_CODE)
+		size = IBS_OP_SIZE;
+	else
+		return 0;
+
+	code = s->eip;
+	s = get_next_slot(cpu_buf, 2);
+
+	if (mm)
+	{
+		cookie = lookup_dcookie(mm, s->eip, &offset);
+		if (cookie != last_cookie) {
+		add_cookie_switch(cookie);
+		last_cookie = cookie;
+		}
+	}
+	else {
+		offset=s->eip;
+	}
+	add_event_entry(ESCAPE_CODE);
+	add_event_entry(code);
+	add_event_entry(offset);
+
+	/* The first 3 slots are ESCAPE_CODE, code and offset,
+	so here we start from slot 4 */
+
+	for (i = 3; i <= size; ++i) {
+		s = get_next_slot(cpu_buf, i);
+		add_event_entry(s->eip);
+	}
+
+	return size;
+}
 
 /* FIXME: this is not sufficient if we implement syscall barrier backtrace
  * traversal, the code switch to sb_sample_start at first kernel enter/exit
@@ -527,6 +588,7 @@ void sync_buffer(int cpu)
 	sync_buffer_state state = sb_buffer_start;
 	unsigned long available;
 	int domain_switch = 0;
+	int is_ibs_sample = 0;
 
 	mutex_lock(&buffer_mutex);
  
@@ -568,12 +630,14 @@ void sync_buffer(int cpu)
 					cookie = get_exec_dcookie(mm);
 				add_user_ctx_switch(new, cookie);
 			}
+			is_ibs_sample = add_ibs_data(cpu, mm, cpu_mode);
+
 		} else {
 			if (domain_switch) {
 				cpu_current_domain[cpu] = s->eip;
 				add_domain_switch(s->eip);
 				domain_switch = 0;
-			} else {
+			} else if (!is_ibs_sample) {
 				if (cpu_current_domain[cpu] !=
 				    COORDINATOR_DOMAIN) {
 					add_sample_entry(s->eip, s->event);
diff --git a/drivers/oprofile/cpu_buffer.c b/drivers/oprofile/cpu_buffer.c
index 58a9c18..7c6deb5 100644
--- a/drivers/oprofile/cpu_buffer.c
+++ b/drivers/oprofile/cpu_buffer.c
@@ -201,7 +201,10 @@ static int log_sample(struct oprofile_cpu_buffer * cpu_buf, unsigned long pc,
 		cpu_buf->last_task = task;
 		add_code(cpu_buf, (unsigned long)task);
 	}
- 
+
+	if (pc == IBS_FETCH_CODE || pc == IBS_OP_CODE)
+		add_code(cpu_buf, cpu_mode);
+
 	add_sample(cpu_buf, pc, event);
 	return 1;
 }
diff --git a/drivers/oprofile/event_buffer.h b/drivers/oprofile/event_buffer.h
index 6a88788..270868b 100644
--- a/drivers/oprofile/event_buffer.h
+++ b/drivers/oprofile/event_buffer.h
@@ -36,6 +36,8 @@ void wake_up_buffer_waiter(void);
 #define TRACE_END_CODE			9
 #define XEN_ENTER_SWITCH_CODE		10
 #define DOMAIN_SWITCH_CODE		11
+#define IBS_FETCH_CODE			13
+#define IBS_OP_CODE				14
  
 #define INVALID_COOKIE ~0UL
 #define NO_COOKIE 0UL
diff --git a/drivers/oprofile/oprofile_files.c b/drivers/oprofile/oprofile_files.c
index 6719420..bd3afc0 100644
--- a/drivers/oprofile/oprofile_files.c
+++ b/drivers/oprofile/oprofile_files.c
@@ -21,7 +21,7 @@
 #include "oprof.h"
 
 unsigned long fs_buffer_size = 131072;
-unsigned long fs_cpu_buffer_size = 8192;
+unsigned long fs_cpu_buffer_size = 131072;
 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)
diff --git a/drivers/xen/xenoprof/xenoprofile.c b/drivers/xen/xenoprof/xenoprofile.c
diff --git a/include/xen/interface/xenoprof.h b/include/xen/interface/xenoprof.h
index 183078d..451b867 100644
--- a/include/xen/interface/xenoprof.h
+++ b/include/xen/interface/xenoprof.h
@@ -50,7 +50,11 @@
 #define XENOPROF_shutdown           13
 #define XENOPROF_get_buffer         14
 #define XENOPROF_set_backtrace      15
-#define XENOPROF_last_op            15
+/* AMD IBS support */
+#define XENOPROF_get_ibs_caps       16
+#define XENOPROF_ibs_counter        17
+
+#define XENOPROF_last_op            17
 
 #define MAX_OPROF_EVENTS    32
 #define MAX_OPROF_DOMAINS   25
@@ -124,7 +128,16 @@ typedef struct xenoprof_passive {
 } xenoprof_passive_t;
 DEFINE_XEN_GUEST_HANDLE(xenoprof_passive_t);
 
-
+struct xenoprof_ibs_counter {
+    uint64_t op_enabled;
+    uint64_t fetch_enabled;
+    uint64_t max_cnt_fetch;
+    uint64_t max_cnt_op;
+    uint64_t rand_en;
+    uint64_t dispatched_ops;
+};
+typedef struct xenoprof_ibs_counter xenoprof_ibs_counter_t;
+DEFINE_XEN_GUEST_HANDLE(xenoprof_ibs_counter_t);
 #endif /* __XEN_PUBLIC_XENOPROF_H__ */
 
 /*

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

             reply	other threads:[~2010-07-30 13:28 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-07-30 13:28 Wei Wang2 [this message]
2010-08-09 11:41 ` [PATCH 2/2] xenoprofile: Add IBS support Jan Beulich
2010-08-10 12:44   ` Wei Wang2

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=201007301528.41379.wei.wang2@amd.com \
    --to=wei.wang2@amd.com \
    --cc=xen-devel@lists.xensource.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).