public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/2] perf tools: improve perf support on Android
@ 2014-05-20  9:48 Stephane Eranian
  2014-05-20  9:48 ` [PATCH v2 1/2] perf tools: add cat as fallback pager Stephane Eranian
  2014-05-20  9:48 ` [PATCH v2 2/2] perf tools: add automatic remapping of Android libraries Stephane Eranian
  0 siblings, 2 replies; 5+ messages in thread
From: Stephane Eranian @ 2014-05-20  9:48 UTC (permalink / raw)
  To: linux-kernel
  Cc: peterz, mingo, acme, jolsa, namhyung, dsahern, Michael Lentine

From: Michael Lentine <mlentine@google.com>

This short series of patches allow for the execution of perf natively
on the android devices.

The following changes are implemented:

 - Have cat be the default page. Android does not have less or more pager.
   this is a generic change which cleans up the code a bit

 - Remap library paths to allow for data reporting on a linux pc with data
   collected from an android device.


In V2, we address the feedback from LKML. Use explicit path
for less pager. Document Android system libraries better.

Signed-off-by: Michael Lentine <mlentine@google.com>

Michael Lentine (2):
  perf tools: add a fallback for pager to use cat if less does not exist.
  perf tools: add automatic remapping of Android libraries

 tools/perf/util/map.c   | 89 ++++++++++++++++++++++++++++++++++++++++++++++++-
 tools/perf/util/pager.c | 12 +++----
 2 files changed, 94 insertions(+), 7 deletions(-)

-- 
1.9.1.423.g4596e3a


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2 1/2] perf tools: add cat as fallback pager
  2014-05-20  9:48 [PATCH v2 0/2] perf tools: improve perf support on Android Stephane Eranian
@ 2014-05-20  9:48 ` Stephane Eranian
  2014-05-22 12:24   ` [tip:perf/core] perf tools: Add " tip-bot for Michael Lentine
  2014-05-20  9:48 ` [PATCH v2 2/2] perf tools: add automatic remapping of Android libraries Stephane Eranian
  1 sibling, 1 reply; 5+ messages in thread
From: Stephane Eranian @ 2014-05-20  9:48 UTC (permalink / raw)
  To: linux-kernel
  Cc: peterz, mingo, acme, jolsa, namhyung, dsahern, Michael Lentine

From: Michael Lentine <mlentine@google.com>

This patch adds a fallback to cat for the pager. This is useful
on environmnents, such as Android, where less does not exist.
It is better to default to cat than to abort.

Reviewed-by: Stephane Eranian <eranian@google.com>
Signed-off-by: Michael Lentine <mlentine@google.com>
---
 tools/perf/util/pager.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/tools/perf/util/pager.c b/tools/perf/util/pager.c
index 3322b84..31ee02d 100644
--- a/tools/perf/util/pager.c
+++ b/tools/perf/util/pager.c
@@ -57,13 +57,13 @@ void setup_pager(void)
 	}
 	if (!pager)
 		pager = getenv("PAGER");
-	if (!pager) {
-		if (!access("/usr/bin/pager", X_OK))
-			pager = "/usr/bin/pager";
-	}
+	if (!(pager || access("/usr/bin/pager", X_OK)))
+		pager = "/usr/bin/pager";
+	if (!(pager || access("/usr/bin/less", X_OK)))
+		pager = "/usr/bin/less";
 	if (!pager)
-		pager = "less";
-	else if (!*pager || !strcmp(pager, "cat"))
+		pager = "cat";
+	if (!*pager || !strcmp(pager, "cat"))
 		return;
 
 	spawned_pager = 1; /* means we are emitting to terminal */
-- 
1.9.1.423.g4596e3a


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v2 2/2] perf tools: add automatic remapping of Android libraries
  2014-05-20  9:48 [PATCH v2 0/2] perf tools: improve perf support on Android Stephane Eranian
  2014-05-20  9:48 ` [PATCH v2 1/2] perf tools: add cat as fallback pager Stephane Eranian
@ 2014-05-20  9:48 ` Stephane Eranian
  2014-05-22 12:24   ` [tip:perf/core] perf tools: Add " tip-bot for Michael Lentine
  1 sibling, 1 reply; 5+ messages in thread
From: Stephane Eranian @ 2014-05-20  9:48 UTC (permalink / raw)
  To: linux-kernel
  Cc: peterz, mingo, acme, jolsa, namhyung, dsahern, Michael Lentine

From: Michael Lentine <mlentine@google.com>

This patch automtically adjusts the path of MMAP records
associated with Android system libraries. 

The Android system is organized with system libraries found in
/system/lib and user libraries in /data/app-lib. On the host system
(not running Android), system libraries can be found in the downloaded
NDK directory under ${NDK_ROOT}/platforms/${APP_PLATFORM}/arch-${ARCH}/usr/lib
and the user libraries are installed under libs/${APP_ABI} within
the apk build directory. This patch makes running the reporting
tools possible on the host system using the libraries from the NDK.

Reviewed-by: Stephane Eranian <eranian@google.com>
Signed-off-by: Michael Lentine <mlentine@google.com>
---
 tools/perf/util/map.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 94 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c
index ba5f5c0c..e1974e7 100644
--- a/tools/perf/util/map.c
+++ b/tools/perf/util/map.c
@@ -32,6 +32,93 @@ static inline int is_no_dso_memory(const char *filename)
 	       !strcmp(filename, "[heap]");
 }
 
+static inline int is_android_lib(const char *filename)
+{
+	return !strncmp(filename, "/data/app-lib", 13) ||
+	       !strncmp(filename, "/system/lib", 11);
+}
+
+static inline bool replace_android_lib(const char *filename, char *newfilename)
+{
+	const char *libname;
+	char *app_abi;
+	size_t app_abi_length, new_length;
+	size_t lib_length = 0;
+
+	libname  = strrchr(filename, '/');
+	if (libname)
+		lib_length = strlen(libname);
+
+	app_abi = getenv("APP_ABI");
+	if (!app_abi)
+		return false;
+
+	app_abi_length = strlen(app_abi);
+
+	if (!strncmp(filename, "/data/app-lib", 13)) {
+		char *apk_path;
+
+		if (!app_abi_length)
+			return false;
+
+		new_length = 7 + app_abi_length + lib_length;
+
+		apk_path = getenv("APK_PATH");
+		if(apk_path) {
+			new_length += strlen(apk_path) + 1;
+			if(new_length > PATH_MAX)
+				return false;
+			snprintf(newfilename, new_length,
+				 "%s/libs/%s/%s", apk_path, app_abi, libname);
+		} else {
+			if(new_length > PATH_MAX)
+				return false;
+			snprintf(newfilename, new_length,
+				 "libs/%s/%s", app_abi, libname);
+		}
+		return true;
+	}
+
+	if (!strncmp(filename, "/system/lib/", 11)) {
+		char *ndk, *app;
+		const char *arch;
+		size_t ndk_length;
+		size_t app_length;
+
+		ndk = getenv("NDK_ROOT");
+		app = getenv("APP_PLATFORM");
+
+		if (!(ndk && app))
+			return false;
+
+		ndk_length = strlen(ndk);
+		app_length = strlen(app);
+
+		if (!(ndk_length && app_length && app_abi_length))
+			return false;
+
+		arch = !strncmp(app_abi, "arm", 3) ? "arm" :
+		       !strncmp(app_abi, "mips", 4) ? "mips" :
+		       !strncmp(app_abi, "x86", 3) ? "x86" : NULL;
+
+		if (!arch)
+			return false;
+
+		new_length = 27 + ndk_length +
+			     app_length + lib_length
+			   + strlen(arch);
+
+		if(new_length > PATH_MAX)
+			return false;
+		snprintf(newfilename, new_length,
+			"%s/platforms/%s/arch-%s/usr/lib/%s",
+			ndk, app, arch, libname);
+
+		return true;
+	}
+	return false;
+}
+
 void map__init(struct map *map, enum map_type type,
 	       u64 start, u64 end, u64 pgoff, struct dso *dso)
 {
@@ -59,8 +146,9 @@ struct map *map__new(struct list_head *dsos__list, u64 start, u64 len,
 	if (map != NULL) {
 		char newfilename[PATH_MAX];
 		struct dso *dso;
-		int anon, no_dso, vdso;
+		int anon, no_dso, vdso, android;
 
+		android = is_android_lib(filename);
 		anon = is_anon_memory(filename);
 		vdso = is_vdso_map(filename);
 		no_dso = is_no_dso_memory(filename);
@@ -75,6 +163,11 @@ struct map *map__new(struct list_head *dsos__list, u64 start, u64 len,
 			filename = newfilename;
 		}
 
+		if (android) {
+			if (replace_android_lib(filename, newfilename))
+				filename = newfilename;
+		}
+
 		if (vdso) {
 			pgoff = 0;
 			dso = vdso__dso_findnew(dsos__list);
-- 
1.9.1.423.g4596e3a


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [tip:perf/core] perf tools: Add cat as fallback pager
  2014-05-20  9:48 ` [PATCH v2 1/2] perf tools: add cat as fallback pager Stephane Eranian
@ 2014-05-22 12:24   ` tip-bot for Michael Lentine
  0 siblings, 0 replies; 5+ messages in thread
From: tip-bot for Michael Lentine @ 2014-05-22 12:24 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, eranian, hpa, mingo, jolsa, mlentine, tglx

Commit-ID:  21cfc5e10395eba795c0610cf3cf7f0a4f6f33ff
Gitweb:     http://git.kernel.org/tip/21cfc5e10395eba795c0610cf3cf7f0a4f6f33ff
Author:     Michael Lentine <mlentine@google.com>
AuthorDate: Tue, 20 May 2014 11:48:49 +0200
Committer:  Jiri Olsa <jolsa@kernel.org>
CommitDate: Wed, 21 May 2014 11:48:33 +0200

perf tools: Add cat as fallback pager

This patch adds a fallback to cat for the pager. This is useful
on environments, such as Android, where less does not exist.
It is better to default to cat than to abort.

Signed-off-by: Michael Lentine <mlentine@google.com>
Reviewed-by: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1400579330-5043-2-git-send-email-eranian@google.com
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/pager.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/tools/perf/util/pager.c b/tools/perf/util/pager.c
index 3322b84..31ee02d 100644
--- a/tools/perf/util/pager.c
+++ b/tools/perf/util/pager.c
@@ -57,13 +57,13 @@ void setup_pager(void)
 	}
 	if (!pager)
 		pager = getenv("PAGER");
-	if (!pager) {
-		if (!access("/usr/bin/pager", X_OK))
-			pager = "/usr/bin/pager";
-	}
+	if (!(pager || access("/usr/bin/pager", X_OK)))
+		pager = "/usr/bin/pager";
+	if (!(pager || access("/usr/bin/less", X_OK)))
+		pager = "/usr/bin/less";
 	if (!pager)
-		pager = "less";
-	else if (!*pager || !strcmp(pager, "cat"))
+		pager = "cat";
+	if (!*pager || !strcmp(pager, "cat"))
 		return;
 
 	spawned_pager = 1; /* means we are emitting to terminal */

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [tip:perf/core] perf tools: Add automatic remapping of Android libraries
  2014-05-20  9:48 ` [PATCH v2 2/2] perf tools: add automatic remapping of Android libraries Stephane Eranian
@ 2014-05-22 12:24   ` tip-bot for Michael Lentine
  0 siblings, 0 replies; 5+ messages in thread
From: tip-bot for Michael Lentine @ 2014-05-22 12:24 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: linux-kernel, eranian, hpa, mingo, jolsa, mlentine, tglx

Commit-ID:  eca8183699964579ca8a0b8d116bd1f4da0136f7
Gitweb:     http://git.kernel.org/tip/eca8183699964579ca8a0b8d116bd1f4da0136f7
Author:     Michael Lentine <mlentine@google.com>
AuthorDate: Tue, 20 May 2014 11:48:50 +0200
Committer:  Jiri Olsa <jolsa@kernel.org>
CommitDate: Wed, 21 May 2014 15:03:25 +0200

perf tools: Add automatic remapping of Android libraries

This patch automatically adjusts the path of MMAP records
associated with Android system libraries.

The Android system is organized with system libraries found in
/system/lib and user libraries in /data/app-lib. On the host system
(not running Android), system libraries can be found in the downloaded
NDK directory under ${NDK_ROOT}/platforms/${APP_PLATFORM}/arch-${ARCH}/usr/lib
and the user libraries are installed under libs/${APP_ABI} within
the apk build directory. This patch makes running the reporting
tools possible on the host system using the libraries from the NDK.

Signed-off-by: Michael Lentine <mlentine@google.com>
Reviewed-by: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1400579330-5043-3-git-send-email-eranian@google.com
[ fixed 'space required before the open parenthesis' checkpatch.pl errors ]
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/map.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 94 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c
index ba5f5c0c..8ccbb32 100644
--- a/tools/perf/util/map.c
+++ b/tools/perf/util/map.c
@@ -32,6 +32,93 @@ static inline int is_no_dso_memory(const char *filename)
 	       !strcmp(filename, "[heap]");
 }
 
+static inline int is_android_lib(const char *filename)
+{
+	return !strncmp(filename, "/data/app-lib", 13) ||
+	       !strncmp(filename, "/system/lib", 11);
+}
+
+static inline bool replace_android_lib(const char *filename, char *newfilename)
+{
+	const char *libname;
+	char *app_abi;
+	size_t app_abi_length, new_length;
+	size_t lib_length = 0;
+
+	libname  = strrchr(filename, '/');
+	if (libname)
+		lib_length = strlen(libname);
+
+	app_abi = getenv("APP_ABI");
+	if (!app_abi)
+		return false;
+
+	app_abi_length = strlen(app_abi);
+
+	if (!strncmp(filename, "/data/app-lib", 13)) {
+		char *apk_path;
+
+		if (!app_abi_length)
+			return false;
+
+		new_length = 7 + app_abi_length + lib_length;
+
+		apk_path = getenv("APK_PATH");
+		if (apk_path) {
+			new_length += strlen(apk_path) + 1;
+			if (new_length > PATH_MAX)
+				return false;
+			snprintf(newfilename, new_length,
+				 "%s/libs/%s/%s", apk_path, app_abi, libname);
+		} else {
+			if (new_length > PATH_MAX)
+				return false;
+			snprintf(newfilename, new_length,
+				 "libs/%s/%s", app_abi, libname);
+		}
+		return true;
+	}
+
+	if (!strncmp(filename, "/system/lib/", 11)) {
+		char *ndk, *app;
+		const char *arch;
+		size_t ndk_length;
+		size_t app_length;
+
+		ndk = getenv("NDK_ROOT");
+		app = getenv("APP_PLATFORM");
+
+		if (!(ndk && app))
+			return false;
+
+		ndk_length = strlen(ndk);
+		app_length = strlen(app);
+
+		if (!(ndk_length && app_length && app_abi_length))
+			return false;
+
+		arch = !strncmp(app_abi, "arm", 3) ? "arm" :
+		       !strncmp(app_abi, "mips", 4) ? "mips" :
+		       !strncmp(app_abi, "x86", 3) ? "x86" : NULL;
+
+		if (!arch)
+			return false;
+
+		new_length = 27 + ndk_length +
+			     app_length + lib_length
+			   + strlen(arch);
+
+		if (new_length > PATH_MAX)
+			return false;
+		snprintf(newfilename, new_length,
+			"%s/platforms/%s/arch-%s/usr/lib/%s",
+			ndk, app, arch, libname);
+
+		return true;
+	}
+	return false;
+}
+
 void map__init(struct map *map, enum map_type type,
 	       u64 start, u64 end, u64 pgoff, struct dso *dso)
 {
@@ -59,8 +146,9 @@ struct map *map__new(struct list_head *dsos__list, u64 start, u64 len,
 	if (map != NULL) {
 		char newfilename[PATH_MAX];
 		struct dso *dso;
-		int anon, no_dso, vdso;
+		int anon, no_dso, vdso, android;
 
+		android = is_android_lib(filename);
 		anon = is_anon_memory(filename);
 		vdso = is_vdso_map(filename);
 		no_dso = is_no_dso_memory(filename);
@@ -75,6 +163,11 @@ struct map *map__new(struct list_head *dsos__list, u64 start, u64 len,
 			filename = newfilename;
 		}
 
+		if (android) {
+			if (replace_android_lib(filename, newfilename))
+				filename = newfilename;
+		}
+
 		if (vdso) {
 			pgoff = 0;
 			dso = vdso__dso_findnew(dsos__list);

^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2014-05-22 12:24 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-05-20  9:48 [PATCH v2 0/2] perf tools: improve perf support on Android Stephane Eranian
2014-05-20  9:48 ` [PATCH v2 1/2] perf tools: add cat as fallback pager Stephane Eranian
2014-05-22 12:24   ` [tip:perf/core] perf tools: Add " tip-bot for Michael Lentine
2014-05-20  9:48 ` [PATCH v2 2/2] perf tools: add automatic remapping of Android libraries Stephane Eranian
2014-05-22 12:24   ` [tip:perf/core] perf tools: Add " tip-bot for Michael Lentine

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox