mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Robert Richter <robert.richter@amd.com>
To: Ingo Molnar <mingo@elte.hu>
Cc: LKML <linux-kernel@vger.kernel.org>,
	oprofile-list <oprofile-list@lists.sourceforge.net>,
	Robert Richter <robert.richter@amd.com>
Subject: [PATCH 23/23] x86/oprofile: introduce oprofile_add_data64()
Date: Fri, 12 Jun 2009 14:35:40 +0200	[thread overview]
Message-ID: <1244810140-20595-24-git-send-email-robert.richter@amd.com> (raw)
In-Reply-To: <1244810140-20595-1-git-send-email-robert.richter@amd.com>

The IBS implemention writes 64 bit register values to the cpu buffer
by writing two 32 values using oprofile_add_data(). This patch
introduces oprofile_add_data64() to write a single 64 bit value to the
buffer.

Signed-off-by: Robert Richter <robert.richter@amd.com>
---
 arch/x86/oprofile/op_model_amd.c |   27 +++++++++------------------
 drivers/oprofile/cpu_buffer.c    |   15 +++++++++++++++
 include/linux/oprofile.h         |    1 +
 3 files changed, 25 insertions(+), 18 deletions(-)

diff --git a/arch/x86/oprofile/op_model_amd.c b/arch/x86/oprofile/op_model_amd.c
index 6493ef7..cc93046 100644
--- a/arch/x86/oprofile/op_model_amd.c
+++ b/arch/x86/oprofile/op_model_amd.c
@@ -140,13 +140,10 @@ op_amd_handle_ibs(struct pt_regs * const regs,
 			rdmsrl(MSR_AMD64_IBSFETCHLINAD, val);
 			oprofile_write_reserve(&entry, regs, val,
 					       IBS_FETCH_CODE, IBS_FETCH_SIZE);
-			oprofile_add_data(&entry, (u32)val);
-			oprofile_add_data(&entry, (u32)(val >> 32));
-			oprofile_add_data(&entry, (u32)ctl);
-			oprofile_add_data(&entry, (u32)(ctl >> 32));
+			oprofile_add_data64(&entry, val);
+			oprofile_add_data64(&entry, ctl);
 			rdmsrl(MSR_AMD64_IBSFETCHPHYSAD, val);
-			oprofile_add_data(&entry, (u32)val);
-			oprofile_add_data(&entry, (u32)(val >> 32));
+			oprofile_add_data64(&entry, val);
 			oprofile_write_commit(&entry);
 
 			/* reenable the IRQ */
@@ -162,23 +159,17 @@ op_amd_handle_ibs(struct pt_regs * const regs,
 			rdmsrl(MSR_AMD64_IBSOPRIP, val);
 			oprofile_write_reserve(&entry, regs, val,
 					       IBS_OP_CODE, IBS_OP_SIZE);
-			oprofile_add_data(&entry, (u32)val);
-			oprofile_add_data(&entry, (u32)(val >> 32));
+			oprofile_add_data64(&entry, val);
 			rdmsrl(MSR_AMD64_IBSOPDATA, val);
-			oprofile_add_data(&entry, (u32)val);
-			oprofile_add_data(&entry, (u32)(val >> 32));
+			oprofile_add_data64(&entry, val);
 			rdmsrl(MSR_AMD64_IBSOPDATA2, val);
-			oprofile_add_data(&entry, (u32)val);
-			oprofile_add_data(&entry, (u32)(val >> 32));
+			oprofile_add_data64(&entry, val);
 			rdmsrl(MSR_AMD64_IBSOPDATA3, val);
-			oprofile_add_data(&entry, (u32)val);
-			oprofile_add_data(&entry, (u32)(val >> 32));
+			oprofile_add_data64(&entry, val);
 			rdmsrl(MSR_AMD64_IBSDCLINAD, val);
-			oprofile_add_data(&entry, (u32)val);
-			oprofile_add_data(&entry, (u32)(val >> 32));
+			oprofile_add_data64(&entry, val);
 			rdmsrl(MSR_AMD64_IBSDCPHYSAD, val);
-			oprofile_add_data(&entry, (u32)val);
-			oprofile_add_data(&entry, (u32)(val >> 32));
+			oprofile_add_data64(&entry, val);
 			oprofile_write_commit(&entry);
 
 			/* reenable the IRQ */
diff --git a/drivers/oprofile/cpu_buffer.c b/drivers/oprofile/cpu_buffer.c
index 50640cc..a7aae24 100644
--- a/drivers/oprofile/cpu_buffer.c
+++ b/drivers/oprofile/cpu_buffer.c
@@ -406,6 +406,21 @@ int oprofile_add_data(struct op_entry *entry, unsigned long val)
 	return op_cpu_buffer_add_data(entry, val);
 }
 
+int oprofile_add_data64(struct op_entry *entry, u64 val)
+{
+	if (!entry->event)
+		return 0;
+	if (op_cpu_buffer_get_size(entry) < 2)
+		/*
+		 * the function returns 0 to indicate a too small
+		 * buffer, even if there is some space left
+		 */
+		return 0;
+	if (!op_cpu_buffer_add_data(entry, (u32)val))
+		return 0;
+	return op_cpu_buffer_add_data(entry, (u32)(val >> 32));
+}
+
 int oprofile_write_commit(struct op_entry *entry)
 {
 	if (!entry->event)
diff --git a/include/linux/oprofile.h b/include/linux/oprofile.h
index dbbe2db..d68d2ed 100644
--- a/include/linux/oprofile.h
+++ b/include/linux/oprofile.h
@@ -179,6 +179,7 @@ void oprofile_write_reserve(struct op_entry *entry,
 			    struct pt_regs * const regs,
 			    unsigned long pc, int code, int size);
 int oprofile_add_data(struct op_entry *entry, unsigned long val);
+int oprofile_add_data64(struct op_entry *entry, u64 val);
 int oprofile_write_commit(struct op_entry *entry);
 
 #endif /* OPROFILE_H */
-- 
1.6.3.1



      parent reply	other threads:[~2009-06-12 13:06 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-06-12 12:35 [PATCH 0/23] updates for oprofile Robert Richter
2009-06-12 12:35 ` [PATCH 01/23] Revert "oprofile: discover counters for op ppro too" Robert Richter
2009-06-12 12:35 ` [PATCH 02/23] x86/oprofile: moving arch_perfmon counter setup to op_x86_model_spec.init Robert Richter
2009-06-12 19:24   ` [PATCH] x86/oprofile: fix initialization of arch_perfmon for core_i7 Robert Richter
2009-06-12 12:35 ` [PATCH 03/23] x86/oprofile: minor style changes in struct op_x86_model_spec Robert Richter
2009-06-12 12:35 ` [PATCH 04/23] oprofile: remove irq_flags in struct op_entry Robert Richter
2009-06-12 12:35 ` [PATCH 05/23] oprofile: remove obselete include headers Robert Richter
2009-06-12 12:35 ` [PATCH 06/23] x86/oprofile: remove #ifdefs in ibs functions Robert Richter
2009-06-12 12:35 ` [PATCH 07/23] x86/oprofile: simplify AMD cpu init code Robert Richter
2009-06-12 12:35 ` [PATCH 08/23] x86/oprofile: move common macros to op_x86_model.h Robert Richter
2009-06-12 12:35 ` [PATCH 09/23] x86/oprofile: remove MSR macros for AMD cpus Robert Richter
2009-06-12 12:35 ` [PATCH 10/23] x86/oprofile: remove MSR macros for ppro cpus Robert Richter
2009-06-12 12:35 ` [PATCH 11/23] x86/oprofile: remove MSR macros for p4 cpus Robert Richter
2009-06-12 12:35 ` [PATCH 12/23] x86/oprofile: fix and cleanup CTRL_SET_* macros Robert Richter
2009-06-12 12:35 ` [PATCH 13/23] x86/oprofile: remove unused macros for AMD virtualization profiling Robert Richter
2009-06-12 12:35 ` [PATCH 14/23] x86/oprofile: pass the model to setup_ctrs() functions Robert Richter
2009-06-12 12:35 ` [PATCH 15/23] x86/oprofile: replace macros to calculate control register Robert Richter
2009-06-12 12:35 ` [PATCH 16/23] x86/oprofile: replace CTR_OVERFLOWED macros Robert Richter
2009-06-12 12:35 ` [PATCH 17/23] x86/oprofile: replace CTRL_SET_*ACTIVE macros Robert Richter
2009-06-12 12:35 ` [PATCH 18/23] x86/oprofile: replace CTR*_IS_RESERVED macros Robert Richter
2009-06-12 12:35 ` [PATCH 19/23] x86/oprofile: use 64 bit wrmsr functions Robert Richter
2009-06-22  7:49   ` Andi Kleen
2009-06-22  8:07     ` Andi Kleen
2009-06-12 12:35 ` [PATCH 20/23] x86/oprofile: use 64 bit values to save MSR states Robert Richter
2009-06-12 12:35 ` [PATCH 21/23] x86/oprofile: remove some local variables in MSR save/restore functions Robert Richter
2009-06-12 12:35 ` [PATCH 22/23] x86/oprofile: use 64 bit values in IBS functions Robert Richter
2009-06-12 12:35 ` Robert Richter [this message]

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=1244810140-20595-24-git-send-email-robert.richter@amd.com \
    --to=robert.richter@amd.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=oprofile-list@lists.sourceforge.net \
    /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

Powered by JetHome