Re: [PATCH 2/2] perf tools: add automatic remapping of Android libraries

2014-05-19 Thread Jiri Olsa
On Sat, May 17, 2014 at 01:14:47AM +0200, Stephane Eranian wrote:
> From: Michael Lentine 
> 
> This patch automtically adjusts the path of MMAP records
> associated with Android system libraries. It enables running
> perf reporting tools directly on the Android system natively.

could the changelog have more info about the lib name changes?

SNIP

> +
> + 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) {
> + snprintf(*newfilename, new_length + strlen(apk_path) + 
> 1,
> +  "%s/libs/%s/%s", apk_path, app_abi, libname);
> + } else {
> + snprintf(*newfilename, new_length,
> +  "libs/%s/%s", app_abi, libname);
> + }

missing check for overflowing PATH_MAX for 'new_length' and 'new_length + 
strlen(apk_path) + 1'

> + 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);

missing check for overflowing PATH_MAX for 'new_length'

> +
> + snprintf(*newfilename, new_length,
> + "%s/platforms/%s/arch-%s/usr/lib/%s",
> + ndk, app, arch, libname);
> +
> + return true;
> + }
> + return false;
> +}
> +

SNIP

> + if (android) {
> + char *newfilename_ptr = newfilename;
> + if (replace_android_lib(filename, _ptr))
> + filename = newfilename;

Why is the newfilename_ptr needed? We could pass newfilename directly
to replace_android_lib function

if (replace_android_lib(filename, newfilename))
filename = newfilename;

thanks,
jirka
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH 2/2] perf tools: add automatic remapping of Android libraries

2014-05-19 Thread Jiri Olsa
On Sat, May 17, 2014 at 01:14:47AM +0200, Stephane Eranian wrote:
 From: Michael Lentine mlent...@google.com
 
 This patch automtically adjusts the path of MMAP records
 associated with Android system libraries. It enables running
 perf reporting tools directly on the Android system natively.

could the changelog have more info about the lib name changes?

SNIP

 +
 + 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) {
 + snprintf(*newfilename, new_length + strlen(apk_path) + 
 1,
 +  %s/libs/%s/%s, apk_path, app_abi, libname);
 + } else {
 + snprintf(*newfilename, new_length,
 +  libs/%s/%s, app_abi, libname);
 + }

missing check for overflowing PATH_MAX for 'new_length' and 'new_length + 
strlen(apk_path) + 1'

 + 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);

missing check for overflowing PATH_MAX for 'new_length'

 +
 + snprintf(*newfilename, new_length,
 + %s/platforms/%s/arch-%s/usr/lib/%s,
 + ndk, app, arch, libname);
 +
 + return true;
 + }
 + return false;
 +}
 +

SNIP

 + if (android) {
 + char *newfilename_ptr = newfilename;
 + if (replace_android_lib(filename, newfilename_ptr))
 + filename = newfilename;

Why is the newfilename_ptr needed? We could pass newfilename directly
to replace_android_lib function

if (replace_android_lib(filename, newfilename))
filename = newfilename;

thanks,
jirka
--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 2/2] perf tools: add automatic remapping of Android libraries

2014-05-16 Thread Stephane Eranian
From: Michael Lentine 

This patch automtically adjusts the path of MMAP records
associated with Android system libraries. It enables running
perf reporting tools directly on the Android system natively.

Reviewed-by: Stephane Eranian 
Signed-off-by: Michael Lentine 
---
 tools/perf/util/map.c | 89 ++-
 1 file changed, 88 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c
index ba5f5c0c..1960883 100644
--- a/tools/perf/util/map.c
+++ b/tools/perf/util/map.c
@@ -32,6 +32,86 @@ 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) {
+   snprintf(*newfilename, new_length + strlen(apk_path) + 
1,
+"%s/libs/%s/%s", apk_path, app_abi, libname);
+   } else {
+   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);
+
+   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 +139,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 +156,12 @@ struct map *map__new(struct list_head *dsos__list, u64 
start, u64 len,
filename = newfilename;
}
 
+   if (android) {
+   char *newfilename_ptr = newfilename;
+   if (replace_android_lib(filename, _ptr))
+   filename = newfilename;
+   }
+
if (vdso) {
pgoff = 0;
dso = vdso__dso_findnew(dsos__list);
-- 
1.9.1.423.g4596e3a

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 2/2] perf tools: add automatic remapping of Android libraries

2014-05-16 Thread Stephane Eranian
From: Michael Lentine 

This patch automtically adjusts the path of MMAP records
associated with Android system libraries. It enables running
perf reporting tools directly on the Android system natively.

Reviewed-by: Stephane Eranian 
Signed-off-by: Michael Lentine 
---
 tools/perf/util/map.c | 89 ++-
 1 file changed, 88 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c
index ba5f5c0c..1960883 100644
--- a/tools/perf/util/map.c
+++ b/tools/perf/util/map.c
@@ -32,6 +32,86 @@ 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) {
+   snprintf(*newfilename, new_length + strlen(apk_path) + 
1,
+"%s/libs/%s/%s", apk_path, app_abi, libname);
+   } else {
+   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);
+
+   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 +139,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 +156,12 @@ struct map *map__new(struct list_head *dsos__list, u64 
start, u64 len,
filename = newfilename;
}
 
+   if (android) {
+   char *newfilename_ptr = newfilename;
+   if (replace_android_lib(filename, _ptr))
+   filename = newfilename;
+   }
+
if (vdso) {
pgoff = 0;
dso = vdso__dso_findnew(dsos__list);
-- 
1.9.1.423.g4596e3a

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 2/2] perf tools: add automatic remapping of Android libraries

2014-05-16 Thread Stephane Eranian
From: Michael Lentine mlent...@google.com

This patch automtically adjusts the path of MMAP records
associated with Android system libraries. It enables running
perf reporting tools directly on the Android system natively.

Reviewed-by: Stephane Eranian eran...@google.com
Signed-off-by: Michael Lentine mlent...@google.com
---
 tools/perf/util/map.c | 89 ++-
 1 file changed, 88 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c
index ba5f5c0c..1960883 100644
--- a/tools/perf/util/map.c
+++ b/tools/perf/util/map.c
@@ -32,6 +32,86 @@ 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) {
+   snprintf(*newfilename, new_length + strlen(apk_path) + 
1,
+%s/libs/%s/%s, apk_path, app_abi, libname);
+   } else {
+   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);
+
+   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 +139,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 +156,12 @@ struct map *map__new(struct list_head *dsos__list, u64 
start, u64 len,
filename = newfilename;
}
 
+   if (android) {
+   char *newfilename_ptr = newfilename;
+   if (replace_android_lib(filename, newfilename_ptr))
+   filename = newfilename;
+   }
+
if (vdso) {
pgoff = 0;
dso = vdso__dso_findnew(dsos__list);
-- 
1.9.1.423.g4596e3a

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 2/2] perf tools: add automatic remapping of Android libraries

2014-05-16 Thread Stephane Eranian
From: Michael Lentine mlent...@google.com

This patch automtically adjusts the path of MMAP records
associated with Android system libraries. It enables running
perf reporting tools directly on the Android system natively.

Reviewed-by: Stephane Eranian eran...@google.com
Signed-off-by: Michael Lentine mlent...@google.com
---
 tools/perf/util/map.c | 89 ++-
 1 file changed, 88 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c
index ba5f5c0c..1960883 100644
--- a/tools/perf/util/map.c
+++ b/tools/perf/util/map.c
@@ -32,6 +32,86 @@ 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) {
+   snprintf(*newfilename, new_length + strlen(apk_path) + 
1,
+%s/libs/%s/%s, apk_path, app_abi, libname);
+   } else {
+   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);
+
+   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 +139,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 +156,12 @@ struct map *map__new(struct list_head *dsos__list, u64 
start, u64 len,
filename = newfilename;
}
 
+   if (android) {
+   char *newfilename_ptr = newfilename;
+   if (replace_android_lib(filename, newfilename_ptr))
+   filename = newfilename;
+   }
+
if (vdso) {
pgoff = 0;
dso = vdso__dso_findnew(dsos__list);
-- 
1.9.1.423.g4596e3a

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/