oprofile: backport patches to fix ppc build issues

Fixes:

| operf_utils.cpp: In function 'bool _op_get_event_codes(std::vector*)':
| operf_utils.cpp:151:21: error: 'pfm_initialize' was not declared in this scope
| operf_utils.cpp:151:26: error: 'PFM_SUCCESS' was not declared in this scope
| operf_utils.cpp:166:45: error: 'PFM_PLM3' was not declared in this scope
| operf_utils.cpp:166:55: error: 'PFM_OS_NONE' was not declared in this scope
| operf_utils.cpp:166:72: error: 'pfm_get_os_event_encoding' was not declared in this scope
| operf_utils.cpp:167:14: error: 'PFM_SUCCESS' was not declared in this scope

[YOCTO #3717]

(From OE-Core rev: 121cb96964fe2f374d814bf39036119bd63b9589)

Signed-off-by: Matthew McClintock <msm@freescale.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Matthew McClintock 2013-01-17 20:23:23 +00:00 committed by Richard Purdie
parent f63f387b83
commit 4de6f9b17c
5 changed files with 357 additions and 2 deletions

View File

@ -0,0 +1,49 @@
Upstream-Status: Backport
From 414f4dba2d77f3014755aa58937efb22a4789e9f Mon Sep 17 00:00:00 2001
From: Maynard Johnson <maynardj@us.ibm.com>
Date: Fri, 21 Dec 2012 08:27:37 -0600
Subject: [PATCH] Change configure to look for libpfm4 function first; then
fallback to libpfm3
This change only affects ppc64 architecture, since it's the only
architecture that uses libpfm to obtain the event hex code to pass
to perf_event_open.
There were bugs in libpfm3 pertaining to POWER7 event definitions that
have been fixed in libpfm4. So it's likely that some IBM POWER7 users
may want to install libpfm4 and build oprofile to link with it. For
example, if libpfm4 were installed in /usr/local, the user would invoke
oprofile's configure thusly:
LDFLAGS="-L/usr/local/lib64" CPPFLAGS="-I/usr/local/include" ./configure
But if the user happens to also have libpfm3 already installed in /usr,
then the current order of config tests would result in choosing the libpfm3
library. This logic seems wrong. The configure checking should go from most
recent to older library versions. This patch changes the order of checking
so the libpfm4 library would be found first.
Signed-off-by: Maynard Johnson <maynardj@us.ibm.com>
---
configure.ac | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/configure.ac b/configure.ac
index 3078393..a9b1ee4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -160,8 +160,8 @@ if test "$HAVE_PERF_EVENTS" = "1"; then
arch="`uname -m`"
if test "$arch" = "ppc64" || test "$arch" = "ppc"; then
AC_CHECK_HEADER(perfmon/pfmlib.h,,[AC_MSG_ERROR([pfmlib.h not found; usually provided in papi devel package])])
- AC_CHECK_LIB(pfm,pfm_get_event_name, HAVE_LIBPFM3='1'; HAVE_LIBPFM='1', [
- AC_CHECK_LIB(pfm,pfm_get_os_event_encoding, HAVE_LIBPFM3='0'; HAVE_LIBPFM='1',
+ AC_CHECK_LIB(pfm,pfm_get_os_event_encoding, HAVE_LIBPFM3='0'; HAVE_LIBPFM='1', [
+ AC_CHECK_LIB(pfm, pfm_get_event_name, HAVE_LIBPFM3='1'; HAVE_LIBPFM='1',
[AC_MSG_ERROR([libpfm not found; usually provided in papi devel package])])])
PFM_LIB="-lpfm"
AC_DEFINE_UNQUOTED(HAVE_LIBPFM3, $HAVE_LIBPFM3, [Define to 1 if using libpfm3; 0 if using newer libpfm])
--
1.7.9.7

View File

@ -0,0 +1,163 @@
Upstream-Status: Backport
From ca6d916a6f8f0f8abbb4c9b6a97dd1a1615bb124 Mon Sep 17 00:00:00 2001
From: Maynard Johnson <maynardj@us.ibm.com>
Date: Wed, 5 Dec 2012 10:16:35 -0600
Subject: [PATCH] Fix up configure to handle architectures that do not
implement perf_event_open
This patch fixes the following problems:
1) The configure script allows the user to pass a location to kernel
headers (via --with-kernel option) such that, even if the running
kernel does not have perf_events support, it may be possible to
build operf (e.g., in cross-compile environments). But the message
'This kernel does not have perf_events support; falling back to legacy
oprofile' was being displayed inappropriately in such cases. This
patch changes the configure script so that the "falling back to
legacy oprofile" message will only be displayed if we're running
on a kernel that does not have perf_events support AND the user
did not pass specify the "--with-kernel" option.
2) Some architectures don't even implement the perf_event_open syscall, so the
configure script must do more than checking kernel version and whether or not
perf_event.h is present in order to decide if perf_events is supported.
This patch provides that extra capability.
These problems were reported by Tony Jones <tonyj@suse.com>.
Signed-off-by: Maynard Johnson <maynardj@us.ibm.com>
---
configure.ac | 74 +++++++++++++++++++++++++++++-----------
utils/op_perf_events_checker.c | 6 ++--
2 files changed, 58 insertions(+), 22 deletions(-)
diff --git a/configure.ac b/configure.ac
index 5c3d13d..89336ee 100644
--- a/configure.ac
+++ b/configure.ac
@@ -70,34 +70,66 @@ KERNELDIR=$withval)
dnl Check kernel version for perf_events supported
-AC_MSG_CHECKING([kernel version supports perf_events])
if test "$KERNELDIR" != ""; then
KINC="$KERNELDIR/include"
-fi
-AX_KERNEL_VERSION(2, 6, 31, <=, kernel_has_perf_events_support="yes",
-kernel_has_perf_events_support="no")
-
-if test "$kernel_has_perf_events_support" = "no"; then
- AC_MSG_RESULT([This kernel does not have perf_events support; falling back to legacy oprofile])
+ PERF_EVENT_FLAGS=" -I$KERNELDIR/include"
+ AC_SUBST(PERF_EVENT_FLAGS)
+ PERF_EVENT_H="$KERNELDIR/include/linux/perf_event.h"
else
- AC_MSG_RESULT([This kernel has perf_events support])
+ PERF_EVENT_H="/usr/include/linux/perf_event.h"
fi
-if test "$KERNELDIR" == ""; then
- PERF_EVENT_H="/usr/include/linux/perf_event.h"
+PERF_EVENT_H_EXISTS="no"
+kernel_may_have_perf_events_support="no"
+AX_KERNEL_VERSION(2, 6, 31, <=, kernel_may_have_perf_events_support="yes",
+kernel_has_perf_events_support="no")
+
+dnl The AX_KERNEL_VERSION macro may return kernel_may_have_perf_events_support="yes",
+dnl indicating a partial answer. Some architectures do not implement the Performance
+dnl Events Kernel Subsystem even with kernel versions > 2.6.31 -- i.e., not even
+dnl implementing the perf_event_open syscall to return ENOSYS. So the check below
+dnl will identify and handle such situations.
+
+if test "$kernel_may_have_perf_events_support" = "yes"; then
+ AC_CHECK_HEADER($PERF_EVENT_H,PERF_EVENT_H_EXISTS="yes")
+ AC_MSG_CHECKING([kernel supports perf_events])
+ if test "$PERF_EVENT_H_EXISTS" = "yes"; then
+ rm -f test-for-PERF_EVENT_OPEN
+ AC_LANG_CONFTEST(
+ [AC_LANG_PROGRAM([[#include <linux/perf_event.h>
+ #include <asm/unistd.h>
+ #include <sys/types.h>
+ #include <string.h>
+ ]],
+ [[struct perf_event_attr attr;
+ pid_t pid;
+ memset(&attr, 0, sizeof(attr));
+ attr.size = sizeof(attr);
+ attr.sample_type = PERF_SAMPLE_IP;
+ pid = getpid();
+ syscall(__NR_perf_event_open, &attr, pid, 0, -1, 0);
+ ]])
+ ])
+ $CC conftest.$ac_ext $CFLAGS $LDFLAGS $LIBS $PERF_EVENT_FLAGS -o test-for-PERF_EVENT_OPEN > /dev/null 2>&1
+ if test -f test-for-PERF_EVENT_OPEN; then
+ kernel_has_perf_events_support="yes"
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_RESULT(no)
+ kernel_has_perf_events_support="no"
+ fi
+ else
+ AC_MSG_RESULT(unknown -- perf_event.h not found)
+ fi
else
- PERF_EVENT_H="$KERNELDIR/include/linux/perf_event.h"
+ AC_MSG_RESULT(kernel supports perf_events... no)
+ kernel_has_perf_events_support="no"
fi
-AC_CHECK_HEADER($PERF_EVENT_H,PERF_EVENT_H_EXISTS="yes")
-AM_CONDITIONAL(BUILD_FOR_PERF_EVENT, test -n "$PERF_EVENT_H_EXISTS")
-if test "$PERF_EVENT_H_EXISTS" = "yes"; then
- HAVE_PERF_EVENTS='1'
- if test "$KERNELDIR" != ""; then
- PERF_EVENT_FLAGS=" -I$KERNELDIR/include"
- AC_SUBST(PERF_EVENT_FLAGS)
- fi
+AM_CONDITIONAL(BUILD_FOR_PERF_EVENT, test "$kernel_has_perf_events_support" = "yes")
+if test "$kernel_has_perf_events_support" = "yes"; then
+ HAVE_PERF_EVENTS='1'
AC_MSG_CHECKING([whether PERF_RECORD_MISC_GUEST_KERNEL is defined in perf_event.h])
rm -f test-for-PERF_GUEST
AC_LANG_CONFTEST(
@@ -117,7 +149,9 @@ if test "$PERF_EVENT_H_EXISTS" = "yes"; then
rm -f test-for-PERF_GUEST*
else
HAVE_PERF_EVENTS='0'
+ AC_MSG_RESULT([No perf_events support available; falling back to legacy oprofile])
fi
+
AC_DEFINE_UNQUOTED(HAVE_PERF_EVENTS, $HAVE_PERF_EVENTS, [Kernel support for perf_events exists])
if test "$HAVE_PERF_EVENTS" = "1"; then
@@ -433,7 +467,7 @@ elif test "`getent passwd oprofile 2>/dev/null`" == "" || \
fi
fi
-if test "$PERF_EVENT_H_EXISTS" != "yes" && test "$kernel_has_perf_events_support" = "yes"; then
+if test "$PERF_EVENT_H_EXISTS" != "yes" && test "$kernel_may_have_perf_events_support" = "yes"; then
echo "Warning: perf_event.h not found. Either install the kernel headers package or"
echo "use the --with-kernel option if you want the non-root, single application"
echo "profiling support provided by operf."
diff --git a/utils/op_perf_events_checker.c b/utils/op_perf_events_checker.c
index 519cafa..74a410e 100644
--- a/utils/op_perf_events_checker.c
+++ b/utils/op_perf_events_checker.c
@@ -49,8 +49,10 @@ int main(int argc, char **argv)
}
#if HAVE_PERF_EVENTS
- /* If perf_events syscall is not implemented, the syscall below will fail
- * with ENOSYS (38). If implemented, but the processor type on which this
+ /* Even if the perf_event_open syscall is implemented, the architecture may still
+ * not provide a full implementation of the perf_events subsystem, in which case,
+ * the syscall below will fail with ENOSYS (38). If the perf_events subsystem is
+ * implemented for the architecture, but the processor type on which this
* program is running is not supported by perf_events, the syscall returns
* ENOENT (2).
*/
--
1.7.9.7

View File

@ -0,0 +1,107 @@
Upstream-Status: Backport
From dbe24f5f0d98b1fe5517d2b137b4c59766e536ad Mon Sep 17 00:00:00 2001
From: Maynard Johnson <maynardj@us.ibm.com>
Date: Mon, 19 Nov 2012 15:16:37 -0600
Subject: [PATCH] Handle early perf_events kernel without
PERF_RECORD_MISC_GUEST* macros
In very early versions of perf_events kernel subsystem, the
PERF_RECORD_MISC_GUEST_KERNEL and PERF_RECORD_MISC_GUEST_USER
macros (in perf_event.h) were not yet defined. This patch adds
a configure check to determine when it's OK for source code to refer
to those macros.
This patch also does some minor cleanup of the configure script
help and warning messages relating to the --with-kernel option.
Signed-off-by: Maynard Johnson <maynardj@us.ibm.com>
---
configure.ac | 32 ++++++++++++++++++++++++++------
libperf_events/operf_utils.cpp | 2 ++
2 files changed, 28 insertions(+), 6 deletions(-)
diff --git a/configure.ac b/configure.ac
index 7449854..18d1169 100644
--- a/configure.ac
+++ b/configure.ac
@@ -60,12 +60,12 @@ test "$LD" || AC_ERROR(ld not found)
# --with-kernel for cross compilation
AC_ARG_WITH(kernel,
-[AS_HELP_STRING([--with-kernel=dir], [Path to kernel include directory (...include/linux/perf_event.h) to use.
+[AS_HELP_STRING([--with-kernel=dir], [Path to kernel include directory (e.g. /tmp/linux-xyz) to use.
If this option is not specified, configure will look for kernel header files in the usual installation location
-for a kernel-headers package -- /usr/include. Use this option in cross-compile enviroments
+for a kernel-headers package -- /usr. Use this option in cross-compile enviroments
or in situations where the host system does not support perf_events but you wish to build binaries
-for a target system that does support perf_events. Because of OProfile's use of syscalls, be sure that the
-kernel headers used match the architecture of the intended target system.])],
+for a target system that does support perf_events. Because of OProfile's use of syscalls,
+kernel headers used during build must match the architecture of the intended target system.])],
KERNELDIR=$withval)
@@ -92,10 +92,29 @@ AC_CHECK_HEADER($PERF_EVENT_H,PERF_EVENT_H_EXISTS="yes")
AM_CONDITIONAL(BUILD_FOR_PERF_EVENT, test -n "$PERF_EVENT_H_EXISTS")
if test "$PERF_EVENT_H_EXISTS" = "yes"; then
HAVE_PERF_EVENTS='1'
+
if test "$KERNELDIR" != ""; then
PERF_EVENT_FLAGS=" -I$KERNELDIR/include"
AC_SUBST(PERF_EVENT_FLAGS)
fi
+
+ AC_MSG_CHECKING([whether PERF_RECORD_MISC_GUEST_KERNEL is defined in perf_event.h])
+ rm -f test-for-PERF_GUEST
+ AC_LANG_CONFTEST(
+ [AC_LANG_PROGRAM([[#include <linux/perf_event.h>]],
+ [[unsigned int pr_guest_kern = PERF_RECORD_MISC_GUEST_KERNEL;
+ unsigned int pr_guest_user = PERF_RECORD_MISC_GUEST_USER;]])
+ ])
+ $CC conftest.$ac_ext $CFLAGS $LDFLAGS $LIBS $PERF_EVENT_FLAGS -o test-for-PERF_GUEST > /dev/null 2>&1
+ if test -f test-for-PERF_GUEST; then
+ echo "yes"
+ HAVE_PERF_GUEST_MACROS='1'
+ else
+ echo "no"
+ HAVE_PERF_GUEST_MACROS='0'
+ fi
+ AC_DEFINE_UNQUOTED(HAVE_PERF_GUEST_MACROS, $HAVE_PERF_GUEST_MACROS, [PERF_RECORD_MISC_GUEST_KERNEL is defined in perf_event.h])
+ rm -f test-for-PERF_GUEST*
else
HAVE_PERF_EVENTS='0'
fi
@@ -416,7 +435,8 @@ elif test "`getent passwd oprofile 2>/dev/null`" == "" || \
fi
if test "$PERF_EVENT_H_EXISTS" != "yes" && test "$kernel_has_perf_events_support" = "yes"; then
- echo "Warning: perf_event.h not found. Please install the kernel headers package if you"
- echo " want non-root support built into OProfile."
+ echo "Warning: perf_event.h not found. Either install the kernel headers package or"
+ echo "use the --with-kernel option if you want the non-root, single application"
+ echo "profiling support provided by operf."
fi
diff --git a/libperf_events/operf_utils.cpp b/libperf_events/operf_utils.cpp
index 06cd566..470cfba 100644
--- a/libperf_events/operf_utils.cpp
+++ b/libperf_events/operf_utils.cpp
@@ -732,12 +732,14 @@ static void __handle_sample_event(event_t * event, u64 sample_type)
case PERF_RECORD_MISC_HYPERVISOR:
domain = "hypervisor";
break;
+#if HAVE_PERF_GUEST_MACROS
case PERF_RECORD_MISC_GUEST_KERNEL:
domain = "guest OS";
break;
case PERF_RECORD_MISC_GUEST_USER:
domain = "guest user";
break;
+#endif
default:
domain = "unknown";
break;
--
1.7.9.7

View File

@ -0,0 +1,32 @@
Upstream-Status: Backport
From fa889ea74b6b931e241a8cd57e90edc23cd7ab03 Mon Sep 17 00:00:00 2001
From: William Cohen <wcohen@redhat.com>
Date: Mon, 15 Oct 2012 15:09:55 -0500
Subject: [PATCH] OProfile doesn't build for 32-bit ppc; the operf_utils.cpp
compile fails. Need to be able to build the 32-bit ppc
version of oprofile to provide the 32-bit ppc java support
libraries. The configure only handles the case of ppc64
with perf support.
Signed-off-by: William Cohen <wcohen@redhat.com>
---
configure.ac | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/configure.ac b/configure.ac
index b739133..7449854 100644
--- a/configure.ac
+++ b/configure.ac
@@ -104,7 +104,7 @@ AC_DEFINE_UNQUOTED(HAVE_PERF_EVENTS, $HAVE_PERF_EVENTS, [Kernel support for perf
if test "$HAVE_PERF_EVENTS" = "1"; then
PFM_LIB=
arch="`uname -m`"
- if test "$arch" = "ppc64"; then
+ if test "$arch" = "ppc64" || test "$arch" = "ppc"; then
AC_CHECK_HEADER(perfmon/pfmlib.h,,[AC_MSG_ERROR([pfmlib.h not found; usually provided in papi devel package])])
AC_CHECK_LIB(pfm,pfm_get_event_name, HAVE_LIBPFM3='1'; HAVE_LIBPFM='1', [
AC_CHECK_LIB(pfm,pfm_get_os_event_encoding, HAVE_LIBPFM3='0'; HAVE_LIBPFM='1',
--
1.7.9.7

View File

@ -1,9 +1,13 @@
require oprofile.inc
PR = "${INC_PR}.0"
PR = "${INC_PR}.1"
SRC_URI += "${SOURCEFORGE_MIRROR}/${BPN}/${BPN}-${PV}.tar.gz \
file://0001-Add-rmb-definition-for-AArch64-architecture.patch"
file://0001-Add-rmb-definition-for-AArch64-architecture.patch \
file://0001-OProfile-doesn-t-build-for-32-bit-ppc-the-operf_util.patch \
file://0001-Handle-early-perf_events-kernel-without-PERF_RECORD_.patch \
file://0001-Fix-up-configure-to-handle-architectures-that-do-not.patch \
file://0001-Change-configure-to-look-for-libpfm4-function-first-.patch"
SRC_URI[md5sum] = "6d127023af1dd1cf24e15411229f3cc8"
SRC_URI[sha256sum] = "ab45900fa1a23e5d5badf3c0a55f26c17efe6e184efcf00b371433751fa761bc"