[PATCH 13/14] perf tests: Add test for caching dso file descriptors

2014-06-12 Thread Jiri Olsa
Adding test that setup test_dso_data__fd_limit and test
dso data file descriptors are cached appropriately.

Acked-by: Namhyung Kim 
Cc: Arnaldo Carvalho de Melo 
Cc: Corey Ashford 
Cc: David Ahern 
Cc: Frederic Weisbecker 
Cc: Ingo Molnar 
Cc: Jean Pihet 
Cc: Namhyung Kim 
Cc: Paul Mackerras 
Cc: Peter Zijlstra 
Link: 
http://lkml.kernel.org/r/1401892622-30848-13-git-send-email-jo...@kernel.org
Signed-off-by: Jiri Olsa 
---
 tools/perf/tests/builtin-test.c |   6 +-
 tools/perf/tests/dso-data.c | 135 +++-
 tools/perf/tests/tests.h|   1 +
 3 files changed, 138 insertions(+), 4 deletions(-)

diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
index 9677a5c..b8a6358 100644
--- a/tools/perf/tests/builtin-test.c
+++ b/tools/perf/tests/builtin-test.c
@@ -52,10 +52,14 @@ static struct test {
.func = test__pmu,
},
{
-   .desc = "Test dso data interface",
+   .desc = "Test dso data read",
.func = test__dso_data,
},
{
+   .desc = "Test dso data cache",
+   .func = test__dso_data_cache,
+   },
+   {
.desc = "roundtrip evsel->name check",
.func = test__perf_evsel__roundtrip_name_test,
},
diff --git a/tools/perf/tests/dso-data.c b/tools/perf/tests/dso-data.c
index 7384381..2d30014 100644
--- a/tools/perf/tests/dso-data.c
+++ b/tools/perf/tests/dso-data.c
@@ -1,11 +1,12 @@
-#include "util.h"
-
 #include 
 #include 
 #include 
 #include 
 #include 
-
+#include 
+#include 
+#include 
+#include "util.h"
 #include "machine.h"
 #include "symbol.h"
 #include "tests.h"
@@ -154,3 +155,131 @@ int test__dso_data(void)
unlink(file);
return 0;
 }
+
+static long open_files_cnt(void)
+{
+   char path[PATH_MAX];
+   struct dirent *dent;
+   DIR *dir;
+   long nr = 0;
+
+   scnprintf(path, PATH_MAX, "%s/self/fd", procfs__mountpoint());
+   pr_debug("fd path: %s\n", path);
+
+   dir = opendir(path);
+   TEST_ASSERT_VAL("failed to open fd directory", dir);
+
+   while ((dent = readdir(dir)) != NULL) {
+   if (!strcmp(dent->d_name, ".") ||
+   !strcmp(dent->d_name, ".."))
+   continue;
+
+   nr++;
+   }
+
+   closedir(dir);
+   return nr - 1;
+}
+
+static struct dso **dsos;
+
+static int dsos__create(int cnt, int size)
+{
+   int i;
+
+   dsos = malloc(sizeof(dsos) * cnt);
+   TEST_ASSERT_VAL("failed to alloc dsos array", dsos);
+
+   for (i = 0; i < cnt; i++) {
+   char *file;
+
+   file = test_file(size);
+   TEST_ASSERT_VAL("failed to get dso file", file);
+
+   dsos[i] = dso__new(file);
+   TEST_ASSERT_VAL("failed to get dso", dsos[i]);
+   }
+
+   return 0;
+}
+
+static void dsos__delete(int cnt)
+{
+   int i;
+
+   for (i = 0; i < cnt; i++) {
+   struct dso *dso = dsos[i];
+
+   unlink(dso->name);
+   dso__delete(dso);
+   }
+
+   free(dsos);
+}
+
+static int set_fd_limit(int n)
+{
+   struct rlimit rlim;
+
+   if (getrlimit(RLIMIT_NOFILE, ))
+   return -1;
+
+   pr_debug("file limit %ld, new %d\n", (long) rlim.rlim_cur, n);
+
+   rlim.rlim_cur = n;
+   return setrlimit(RLIMIT_NOFILE, );
+}
+
+int test__dso_data_cache(void)
+{
+   struct machine machine;
+   long nr_end, nr = open_files_cnt();
+   int dso_cnt, limit, i, fd;
+
+   memset(, 0, sizeof(machine));
+
+   /* set as system limit */
+   limit = nr * 4;
+   TEST_ASSERT_VAL("failed to set file limit", !set_fd_limit(limit));
+
+   /* and this is now our dso open FDs limit + 1 extra */
+   dso_cnt = limit / 2 + 1;
+   TEST_ASSERT_VAL("failed to create dsos\n",
+   !dsos__create(dso_cnt, TEST_FILE_SIZE));
+
+   for (i = 0; i < (dso_cnt - 1); i++) {
+   struct dso *dso = dsos[i];
+
+   /*
+* Open dsos via dso__data_fd or dso__data_read_offset.
+* Both opens the data file and keep it open.
+*/
+   if (i % 2) {
+   fd = dso__data_fd(dso, );
+   TEST_ASSERT_VAL("failed to get fd", fd > 0);
+   } else {
+   #define BUFSIZE 10
+   u8 buf[BUFSIZE];
+   ssize_t n;
+
+   n = dso__data_read_offset(dso, , 0, buf, 
BUFSIZE);
+   TEST_ASSERT_VAL("failed to read dso", n == BUFSIZE);
+   }
+   }
+
+   /* open +1 dso over the allowed limit */
+   fd = dso__data_fd(dsos[i], );
+   TEST_ASSERT_VAL("failed to get fd", fd > 0);
+
+   /* should force the first one to be closed */
+   TEST_ASSERT_VAL("failed to close dsos[0]", dsos[0]->data.fd == -1);
+
+   

[PATCH 13/14] perf tests: Add test for caching dso file descriptors

2014-06-12 Thread Jiri Olsa
Adding test that setup test_dso_data__fd_limit and test
dso data file descriptors are cached appropriately.

Acked-by: Namhyung Kim namhy...@kernel.org
Cc: Arnaldo Carvalho de Melo a...@kernel.org
Cc: Corey Ashford cjash...@linux.vnet.ibm.com
Cc: David Ahern dsah...@gmail.com
Cc: Frederic Weisbecker fweis...@gmail.com
Cc: Ingo Molnar mi...@kernel.org
Cc: Jean Pihet jean.pi...@linaro.org
Cc: Namhyung Kim namhy...@kernel.org
Cc: Paul Mackerras pau...@samba.org
Cc: Peter Zijlstra a.p.zijls...@chello.nl
Link: 
http://lkml.kernel.org/r/1401892622-30848-13-git-send-email-jo...@kernel.org
Signed-off-by: Jiri Olsa jo...@kernel.org
---
 tools/perf/tests/builtin-test.c |   6 +-
 tools/perf/tests/dso-data.c | 135 +++-
 tools/perf/tests/tests.h|   1 +
 3 files changed, 138 insertions(+), 4 deletions(-)

diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
index 9677a5c..b8a6358 100644
--- a/tools/perf/tests/builtin-test.c
+++ b/tools/perf/tests/builtin-test.c
@@ -52,10 +52,14 @@ static struct test {
.func = test__pmu,
},
{
-   .desc = Test dso data interface,
+   .desc = Test dso data read,
.func = test__dso_data,
},
{
+   .desc = Test dso data cache,
+   .func = test__dso_data_cache,
+   },
+   {
.desc = roundtrip evsel-name check,
.func = test__perf_evsel__roundtrip_name_test,
},
diff --git a/tools/perf/tests/dso-data.c b/tools/perf/tests/dso-data.c
index 7384381..2d30014 100644
--- a/tools/perf/tests/dso-data.c
+++ b/tools/perf/tests/dso-data.c
@@ -1,11 +1,12 @@
-#include util.h
-
 #include stdlib.h
 #include linux/types.h
 #include sys/stat.h
 #include fcntl.h
 #include string.h
-
+#include sys/time.h
+#include sys/resource.h
+#include api/fs/fs.h
+#include util.h
 #include machine.h
 #include symbol.h
 #include tests.h
@@ -154,3 +155,131 @@ int test__dso_data(void)
unlink(file);
return 0;
 }
+
+static long open_files_cnt(void)
+{
+   char path[PATH_MAX];
+   struct dirent *dent;
+   DIR *dir;
+   long nr = 0;
+
+   scnprintf(path, PATH_MAX, %s/self/fd, procfs__mountpoint());
+   pr_debug(fd path: %s\n, path);
+
+   dir = opendir(path);
+   TEST_ASSERT_VAL(failed to open fd directory, dir);
+
+   while ((dent = readdir(dir)) != NULL) {
+   if (!strcmp(dent-d_name, .) ||
+   !strcmp(dent-d_name, ..))
+   continue;
+
+   nr++;
+   }
+
+   closedir(dir);
+   return nr - 1;
+}
+
+static struct dso **dsos;
+
+static int dsos__create(int cnt, int size)
+{
+   int i;
+
+   dsos = malloc(sizeof(dsos) * cnt);
+   TEST_ASSERT_VAL(failed to alloc dsos array, dsos);
+
+   for (i = 0; i  cnt; i++) {
+   char *file;
+
+   file = test_file(size);
+   TEST_ASSERT_VAL(failed to get dso file, file);
+
+   dsos[i] = dso__new(file);
+   TEST_ASSERT_VAL(failed to get dso, dsos[i]);
+   }
+
+   return 0;
+}
+
+static void dsos__delete(int cnt)
+{
+   int i;
+
+   for (i = 0; i  cnt; i++) {
+   struct dso *dso = dsos[i];
+
+   unlink(dso-name);
+   dso__delete(dso);
+   }
+
+   free(dsos);
+}
+
+static int set_fd_limit(int n)
+{
+   struct rlimit rlim;
+
+   if (getrlimit(RLIMIT_NOFILE, rlim))
+   return -1;
+
+   pr_debug(file limit %ld, new %d\n, (long) rlim.rlim_cur, n);
+
+   rlim.rlim_cur = n;
+   return setrlimit(RLIMIT_NOFILE, rlim);
+}
+
+int test__dso_data_cache(void)
+{
+   struct machine machine;
+   long nr_end, nr = open_files_cnt();
+   int dso_cnt, limit, i, fd;
+
+   memset(machine, 0, sizeof(machine));
+
+   /* set as system limit */
+   limit = nr * 4;
+   TEST_ASSERT_VAL(failed to set file limit, !set_fd_limit(limit));
+
+   /* and this is now our dso open FDs limit + 1 extra */
+   dso_cnt = limit / 2 + 1;
+   TEST_ASSERT_VAL(failed to create dsos\n,
+   !dsos__create(dso_cnt, TEST_FILE_SIZE));
+
+   for (i = 0; i  (dso_cnt - 1); i++) {
+   struct dso *dso = dsos[i];
+
+   /*
+* Open dsos via dso__data_fd or dso__data_read_offset.
+* Both opens the data file and keep it open.
+*/
+   if (i % 2) {
+   fd = dso__data_fd(dso, machine);
+   TEST_ASSERT_VAL(failed to get fd, fd  0);
+   } else {
+   #define BUFSIZE 10
+   u8 buf[BUFSIZE];
+   ssize_t n;
+
+   n = dso__data_read_offset(dso, machine, 0, buf, 
BUFSIZE);
+   TEST_ASSERT_VAL(failed to read dso, n == BUFSIZE);
+   }
+   }
+
+   /* open +1 

Re: [PATCH 13/14] perf tests: Add test for caching dso file descriptors

2014-05-30 Thread Jiri Olsa
On Fri, May 30, 2014 at 11:11:20AM +0900, Namhyung Kim wrote:
> Hi Jiri,
> 
> On Thu, 29 May 2014 10:37:32 +0200, Jiri Olsa wrote:
> > On Thu, May 29, 2014 at 09:06:05AM +0900, Namhyung Kim wrote:
> >> On Tue, 27 May 2014 09:54:36 +0200, Jiri Olsa wrote:
> >> > On Tue, May 27, 2014 at 10:36:44AM +0900, Namhyung Kim wrote:
> >> >> On Thu, 15 May 2014 19:23:34 +0200, Jiri Olsa wrote:
> >> >> > Adding test that setup test_dso_data__fd_limit and test
> >> >> > dso data file descriptors are cached appropriately.
> >> >> 
> >> >> [SNIP]
> >> >> > +static long open_files_cnt(void)
> >> >> > +{
> >> >> > + char path[PATH_MAX];
> >> >> > + struct dirent *dent;
> >> >> > + DIR *dir;
> >> >> > + long nr = 0;
> >> >> > + int n;
> >> >> > +
> >> >> > + n = scnprintf(path, PATH_MAX, "%s/self/fd", 
> >> >> > procfs__mountpoint());
> >> >> > + TEST_ASSERT_VAL("couldn't get fd path", n < PATH_MAX);
> >> >> 
> >> >> Looks like an unnecessary check since the scnprintf() cannot return more
> >> >> than (or equal to) PATH_MAX.
> >> >
> >> > once it's equal it's bad.. as the man says:
> >> > "return value of size or more means that the output was  truncated"
> >> 
> >> Did you see "sn"printf?
> >
> > yes, I just double checked.. jirka
> 
> Please see "scn"printf then. :)  It does something like below..
> 
>   i = snprintf(buf, size, ...);
>   return (i >= size) ? : size - 1 : i;

aaargh... ok ;-)

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 13/14] perf tests: Add test for caching dso file descriptors

2014-05-30 Thread Jiri Olsa
On Fri, May 30, 2014 at 11:11:20AM +0900, Namhyung Kim wrote:
 Hi Jiri,
 
 On Thu, 29 May 2014 10:37:32 +0200, Jiri Olsa wrote:
  On Thu, May 29, 2014 at 09:06:05AM +0900, Namhyung Kim wrote:
  On Tue, 27 May 2014 09:54:36 +0200, Jiri Olsa wrote:
   On Tue, May 27, 2014 at 10:36:44AM +0900, Namhyung Kim wrote:
   On Thu, 15 May 2014 19:23:34 +0200, Jiri Olsa wrote:
Adding test that setup test_dso_data__fd_limit and test
dso data file descriptors are cached appropriately.
   
   [SNIP]
+static long open_files_cnt(void)
+{
+ char path[PATH_MAX];
+ struct dirent *dent;
+ DIR *dir;
+ long nr = 0;
+ int n;
+
+ n = scnprintf(path, PATH_MAX, %s/self/fd, 
procfs__mountpoint());
+ TEST_ASSERT_VAL(couldn't get fd path, n  PATH_MAX);
   
   Looks like an unnecessary check since the scnprintf() cannot return more
   than (or equal to) PATH_MAX.
  
   once it's equal it's bad.. as the man says:
   return value of size or more means that the output was  truncated
  
  Did you see snprintf?
 
  yes, I just double checked.. jirka
 
 Please see scnprintf then. :)  It does something like below..
 
   i = snprintf(buf, size, ...);
   return (i = size) ? : size - 1 : i;

aaargh... ok ;-)

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 13/14] perf tests: Add test for caching dso file descriptors

2014-05-29 Thread Namhyung Kim
Hi Jiri,

On Thu, 29 May 2014 10:37:32 +0200, Jiri Olsa wrote:
> On Thu, May 29, 2014 at 09:06:05AM +0900, Namhyung Kim wrote:
>> On Tue, 27 May 2014 09:54:36 +0200, Jiri Olsa wrote:
>> > On Tue, May 27, 2014 at 10:36:44AM +0900, Namhyung Kim wrote:
>> >> On Thu, 15 May 2014 19:23:34 +0200, Jiri Olsa wrote:
>> >> > Adding test that setup test_dso_data__fd_limit and test
>> >> > dso data file descriptors are cached appropriately.
>> >> 
>> >> [SNIP]
>> >> > +static long open_files_cnt(void)
>> >> > +{
>> >> > +   char path[PATH_MAX];
>> >> > +   struct dirent *dent;
>> >> > +   DIR *dir;
>> >> > +   long nr = 0;
>> >> > +   int n;
>> >> > +
>> >> > +   n = scnprintf(path, PATH_MAX, "%s/self/fd", 
>> >> > procfs__mountpoint());
>> >> > +   TEST_ASSERT_VAL("couldn't get fd path", n < PATH_MAX);
>> >> 
>> >> Looks like an unnecessary check since the scnprintf() cannot return more
>> >> than (or equal to) PATH_MAX.
>> >
>> > once it's equal it's bad.. as the man says:
>> > "return value of size or more means that the output was  truncated"
>> 
>> Did you see "sn"printf?
>
> yes, I just double checked.. jirka

Please see "scn"printf then. :)  It does something like below..

  i = snprintf(buf, size, ...);
  return (i >= size) ? : size - 1 : i;


Thanks,
Namhyung
--
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 13/14] perf tests: Add test for caching dso file descriptors

2014-05-29 Thread Jiri Olsa
On Thu, May 29, 2014 at 09:06:05AM +0900, Namhyung Kim wrote:
> On Tue, 27 May 2014 09:54:36 +0200, Jiri Olsa wrote:
> > On Tue, May 27, 2014 at 10:36:44AM +0900, Namhyung Kim wrote:
> >> On Thu, 15 May 2014 19:23:34 +0200, Jiri Olsa wrote:
> >> > Adding test that setup test_dso_data__fd_limit and test
> >> > dso data file descriptors are cached appropriately.
> >> 
> >> [SNIP]
> >> > +static long open_files_cnt(void)
> >> > +{
> >> > +char path[PATH_MAX];
> >> > +struct dirent *dent;
> >> > +DIR *dir;
> >> > +long nr = 0;
> >> > +int n;
> >> > +
> >> > +n = scnprintf(path, PATH_MAX, "%s/self/fd", 
> >> > procfs__mountpoint());
> >> > +TEST_ASSERT_VAL("couldn't get fd path", n < PATH_MAX);
> >> 
> >> Looks like an unnecessary check since the scnprintf() cannot return more
> >> than (or equal to) PATH_MAX.
> >
> > once it's equal it's bad.. as the man says:
> > "return value of size or more means that the output was  truncated"
> 
> Did you see "sn"printf?

yes, I just double checked.. 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 13/14] perf tests: Add test for caching dso file descriptors

2014-05-29 Thread Jiri Olsa
On Thu, May 29, 2014 at 09:06:05AM +0900, Namhyung Kim wrote:
 On Tue, 27 May 2014 09:54:36 +0200, Jiri Olsa wrote:
  On Tue, May 27, 2014 at 10:36:44AM +0900, Namhyung Kim wrote:
  On Thu, 15 May 2014 19:23:34 +0200, Jiri Olsa wrote:
   Adding test that setup test_dso_data__fd_limit and test
   dso data file descriptors are cached appropriately.
  
  [SNIP]
   +static long open_files_cnt(void)
   +{
   +char path[PATH_MAX];
   +struct dirent *dent;
   +DIR *dir;
   +long nr = 0;
   +int n;
   +
   +n = scnprintf(path, PATH_MAX, %s/self/fd, 
   procfs__mountpoint());
   +TEST_ASSERT_VAL(couldn't get fd path, n  PATH_MAX);
  
  Looks like an unnecessary check since the scnprintf() cannot return more
  than (or equal to) PATH_MAX.
 
  once it's equal it's bad.. as the man says:
  return value of size or more means that the output was  truncated
 
 Did you see snprintf?

yes, I just double checked.. 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 13/14] perf tests: Add test for caching dso file descriptors

2014-05-29 Thread Namhyung Kim
Hi Jiri,

On Thu, 29 May 2014 10:37:32 +0200, Jiri Olsa wrote:
 On Thu, May 29, 2014 at 09:06:05AM +0900, Namhyung Kim wrote:
 On Tue, 27 May 2014 09:54:36 +0200, Jiri Olsa wrote:
  On Tue, May 27, 2014 at 10:36:44AM +0900, Namhyung Kim wrote:
  On Thu, 15 May 2014 19:23:34 +0200, Jiri Olsa wrote:
   Adding test that setup test_dso_data__fd_limit and test
   dso data file descriptors are cached appropriately.
  
  [SNIP]
   +static long open_files_cnt(void)
   +{
   +   char path[PATH_MAX];
   +   struct dirent *dent;
   +   DIR *dir;
   +   long nr = 0;
   +   int n;
   +
   +   n = scnprintf(path, PATH_MAX, %s/self/fd, 
   procfs__mountpoint());
   +   TEST_ASSERT_VAL(couldn't get fd path, n  PATH_MAX);
  
  Looks like an unnecessary check since the scnprintf() cannot return more
  than (or equal to) PATH_MAX.
 
  once it's equal it's bad.. as the man says:
  return value of size or more means that the output was  truncated
 
 Did you see snprintf?

 yes, I just double checked.. jirka

Please see scnprintf then. :)  It does something like below..

  i = snprintf(buf, size, ...);
  return (i = size) ? : size - 1 : i;


Thanks,
Namhyung
--
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 13/14] perf tests: Add test for caching dso file descriptors

2014-05-28 Thread Namhyung Kim
On Tue, 27 May 2014 09:54:36 +0200, Jiri Olsa wrote:
> On Tue, May 27, 2014 at 10:36:44AM +0900, Namhyung Kim wrote:
>> On Thu, 15 May 2014 19:23:34 +0200, Jiri Olsa wrote:
>> > Adding test that setup test_dso_data__fd_limit and test
>> > dso data file descriptors are cached appropriately.
>> 
>> [SNIP]
>> > +static long open_files_cnt(void)
>> > +{
>> > +  char path[PATH_MAX];
>> > +  struct dirent *dent;
>> > +  DIR *dir;
>> > +  long nr = 0;
>> > +  int n;
>> > +
>> > +  n = scnprintf(path, PATH_MAX, "%s/self/fd", procfs__mountpoint());
>> > +  TEST_ASSERT_VAL("couldn't get fd path", n < PATH_MAX);
>> 
>> Looks like an unnecessary check since the scnprintf() cannot return more
>> than (or equal to) PATH_MAX.
>
> once it's equal it's bad.. as the man says:
> "return value of size or more means that the output was  truncated"

Did you see "sn"printf?

Thanks,
Namhyung
--
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 13/14] perf tests: Add test for caching dso file descriptors

2014-05-28 Thread Namhyung Kim
On Tue, 27 May 2014 09:54:36 +0200, Jiri Olsa wrote:
 On Tue, May 27, 2014 at 10:36:44AM +0900, Namhyung Kim wrote:
 On Thu, 15 May 2014 19:23:34 +0200, Jiri Olsa wrote:
  Adding test that setup test_dso_data__fd_limit and test
  dso data file descriptors are cached appropriately.
 
 [SNIP]
  +static long open_files_cnt(void)
  +{
  +  char path[PATH_MAX];
  +  struct dirent *dent;
  +  DIR *dir;
  +  long nr = 0;
  +  int n;
  +
  +  n = scnprintf(path, PATH_MAX, %s/self/fd, procfs__mountpoint());
  +  TEST_ASSERT_VAL(couldn't get fd path, n  PATH_MAX);
 
 Looks like an unnecessary check since the scnprintf() cannot return more
 than (or equal to) PATH_MAX.

 once it's equal it's bad.. as the man says:
 return value of size or more means that the output was  truncated

Did you see snprintf?

Thanks,
Namhyung
--
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 13/14] perf tests: Add test for caching dso file descriptors

2014-05-27 Thread Jiri Olsa
On Tue, May 27, 2014 at 10:36:44AM +0900, Namhyung Kim wrote:
> On Thu, 15 May 2014 19:23:34 +0200, Jiri Olsa wrote:
> > Adding test that setup test_dso_data__fd_limit and test
> > dso data file descriptors are cached appropriately.
> 
> [SNIP]
> > +static long open_files_cnt(void)
> > +{
> > +   char path[PATH_MAX];
> > +   struct dirent *dent;
> > +   DIR *dir;
> > +   long nr = 0;
> > +   int n;
> > +
> > +   n = scnprintf(path, PATH_MAX, "%s/self/fd", procfs__mountpoint());
> > +   TEST_ASSERT_VAL("couldn't get fd path", n < PATH_MAX);
> 
> Looks like an unnecessary check since the scnprintf() cannot return more
> than (or equal to) PATH_MAX.

once it's equal it's bad.. as the man says:
"return value of size or more means that the output was  truncated"

I'll fix the rest you found

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 13/14] perf tests: Add test for caching dso file descriptors

2014-05-27 Thread Jiri Olsa
On Tue, May 27, 2014 at 10:36:44AM +0900, Namhyung Kim wrote:
 On Thu, 15 May 2014 19:23:34 +0200, Jiri Olsa wrote:
  Adding test that setup test_dso_data__fd_limit and test
  dso data file descriptors are cached appropriately.
 
 [SNIP]
  +static long open_files_cnt(void)
  +{
  +   char path[PATH_MAX];
  +   struct dirent *dent;
  +   DIR *dir;
  +   long nr = 0;
  +   int n;
  +
  +   n = scnprintf(path, PATH_MAX, %s/self/fd, procfs__mountpoint());
  +   TEST_ASSERT_VAL(couldn't get fd path, n  PATH_MAX);
 
 Looks like an unnecessary check since the scnprintf() cannot return more
 than (or equal to) PATH_MAX.

once it's equal it's bad.. as the man says:
return value of size or more means that the output was  truncated

I'll fix the rest you found

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 13/14] perf tests: Add test for caching dso file descriptors

2014-05-26 Thread Namhyung Kim
On Thu, 15 May 2014 19:23:34 +0200, Jiri Olsa wrote:
> Adding test that setup test_dso_data__fd_limit and test
> dso data file descriptors are cached appropriately.

[SNIP]
> +static long open_files_cnt(void)
> +{
> + char path[PATH_MAX];
> + struct dirent *dent;
> + DIR *dir;
> + long nr = 0;
> + int n;
> +
> + n = scnprintf(path, PATH_MAX, "%s/self/fd", procfs__mountpoint());
> + TEST_ASSERT_VAL("couldn't get fd path", n < PATH_MAX);

Looks like an unnecessary check since the scnprintf() cannot return more
than (or equal to) PATH_MAX.

> +
> + pr_debug("fd path: %s\n", path);
> +
> + dir = opendir(path);
> + TEST_ASSERT_VAL("failed to open fd directory", dir);
> +
> + while ((dent = readdir(dir)) != NULL) {
> + if (!strcmp(dent->d_name, ".") ||
> + !strcmp(dent->d_name, ".."))
> + continue;
> +
> + nr++;
> + }
> +
> + closedir(dir);
> + return nr - 1;
> +}

[SNIP]
> +static int set_fd_limit(int n)
> +{
> + struct rlimit rlim;
> +
> + if (getrlimit(RLIMIT_NOFILE, ))
> + return -1;
> +
> + pr_debug("file limit %ld, new %d\n", (long) rlim.rlim_cur, n);
> +
> + rlim.rlim_cur = n;
> + return setrlimit(RLIMIT_NOFILE, );
> +}
> +
> +int test__dso_data_cache(void)
> +{
> + struct machine machine;
> + long nr = open_files_cnt();
> +#define BUFSIZE 10
> + u8 buf[BUFSIZE];
> + ssize_t n;
> + int fd;
> +
> + memset(, 0, sizeof(machine));
> +
> + /* Make sure we are able to open 3 fds anyway */
> + TEST_ASSERT_VAL("failed to set file limit",
> + !set_fd_limit((nr + 6)));

3 or 6?

> +
> + /*
> +  * Test scenario:
> +  * - create 3 dso objects
> +  * - set the limit of opened data file descriptors to 2
> +  * - open/close dsos data fds and check for proper
> +  *   handling of the dso data cache
> +  */
> +
> + test_dso_data__fd_limit = 3;

2 or 3?

> +
> + TEST_ASSERT_VAL("failed to create dsos\n", 
> !dsos__create(TEST_FILE_SIZE));
> +
> + /* open dso_0 */
> + fd = dso__data_fd(dso_0, );
> + TEST_ASSERT_VAL("failed to get fd", fd > 0);
> +
> + n = dso__data_read_offset(dso_0, , 0, buf, BUFSIZE);
> + TEST_ASSERT_VAL("failed to read dso", n == BUFSIZE);
> +
> + /*
> +  * Close dso_0 data with cache = true,

What does it mean by 'cache = true'?


> +  * dso_0 should remain open.
> +  */
> + dso__data_close(dso_0);
> + TEST_ASSERT_VAL("failed to not close dso", dso_0->data.fd != -1);
> +
> + /* open dso_1 */
> + n = dso__data_read_offset(dso_1, , 0, buf, BUFSIZE);
> + TEST_ASSERT_VAL("failed to read dso", n == BUFSIZE);
> +
> + /*
> +  * Close dso_1 data with cache = true,
> +  * dso_0 and dso_1 should remain open.
> +  */
> + dso__data_close(dso_1);
> + TEST_ASSERT_VAL("failed to not close dso", dso_0->data.fd != -1);
> + TEST_ASSERT_VAL("failed to not close dso", dso_1->data.fd != -1);
> +
> + /* open dso_2 */
> + fd = dso__data_fd(dso_2, );
> + TEST_ASSERT_VAL("failed to get fd", fd > 0);
> +
> + /*
> +  * Close dso_1 data with cache = true,

You meant dso_2 right? :)

Thanks,
Namhyung


> +  * dso_0 should get closed now
> +  */
> + dso__data_close(dso_2);
> + TEST_ASSERT_VAL("failed to close dso_0", dso_0->data.fd == -1);
> +
> + /* reopen dso_0 */
> + fd = dso__data_fd(dso_0, );
> + TEST_ASSERT_VAL("failed to get fd", fd > 0);
> +
> + /*
> +  * Close dso_0 data with cache = true,
> +  * dso_1 should get closed now.
> +  */
> + dso__data_close(dso_0);
> + TEST_ASSERT_VAL("failed to close dso_1", dso_1->data.fd == -1);
> +
> + /* reopen dso_1 */
> + n = dso__data_read_offset(dso_1, , 0, buf, BUFSIZE);
> + TEST_ASSERT_VAL("failed to read dso", n == BUFSIZE);
> +
> + /*
> +  * Close dso_1 data with cache = true,
> +  * dso_2 should get closed now.
> +  */
> + dso__data_close(dso_1);
> + TEST_ASSERT_VAL("failed to close dso_2", dso_2->data.fd == -1);
> +
> + /* dso_0 remains open */
> + TEST_ASSERT_VAL("failed to keep open dso_0", dso_0->data.fd >= 0);
> +
> + /* cleanup everything */
> + dsos__delete();
> +
> + pr_debug("nr start %ld, nr stop %ld\n", nr, open_files_cnt());
> +
> + /* Make sure we did not leak any file descriptor. */
> + TEST_ASSERT_VAL("failed leadking files", nr == open_files_cnt());
> + return 0;
> +}
> diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h
> index a9d7cb0..61e12b6 100644
> --- a/tools/perf/tests/tests.h
> +++ b/tools/perf/tests/tests.h
> @@ -28,6 +28,7 @@ int test__syscall_open_tp_fields(void);
>  int test__pmu(void);
>  int test__attr(void);
>  int test__dso_data(void);
> +int test__dso_data_cache(void);
>  int test__parse_events(void);
>  int test__hists_link(void);
>  int test__python_use(void);
--
To unsubscribe 

Re: [PATCH 13/14] perf tests: Add test for caching dso file descriptors

2014-05-26 Thread Namhyung Kim
On Thu, 15 May 2014 19:23:34 +0200, Jiri Olsa wrote:
 Adding test that setup test_dso_data__fd_limit and test
 dso data file descriptors are cached appropriately.

[SNIP]
 +static long open_files_cnt(void)
 +{
 + char path[PATH_MAX];
 + struct dirent *dent;
 + DIR *dir;
 + long nr = 0;
 + int n;
 +
 + n = scnprintf(path, PATH_MAX, %s/self/fd, procfs__mountpoint());
 + TEST_ASSERT_VAL(couldn't get fd path, n  PATH_MAX);

Looks like an unnecessary check since the scnprintf() cannot return more
than (or equal to) PATH_MAX.

 +
 + pr_debug(fd path: %s\n, path);
 +
 + dir = opendir(path);
 + TEST_ASSERT_VAL(failed to open fd directory, dir);
 +
 + while ((dent = readdir(dir)) != NULL) {
 + if (!strcmp(dent-d_name, .) ||
 + !strcmp(dent-d_name, ..))
 + continue;
 +
 + nr++;
 + }
 +
 + closedir(dir);
 + return nr - 1;
 +}

[SNIP]
 +static int set_fd_limit(int n)
 +{
 + struct rlimit rlim;
 +
 + if (getrlimit(RLIMIT_NOFILE, rlim))
 + return -1;
 +
 + pr_debug(file limit %ld, new %d\n, (long) rlim.rlim_cur, n);
 +
 + rlim.rlim_cur = n;
 + return setrlimit(RLIMIT_NOFILE, rlim);
 +}
 +
 +int test__dso_data_cache(void)
 +{
 + struct machine machine;
 + long nr = open_files_cnt();
 +#define BUFSIZE 10
 + u8 buf[BUFSIZE];
 + ssize_t n;
 + int fd;
 +
 + memset(machine, 0, sizeof(machine));
 +
 + /* Make sure we are able to open 3 fds anyway */
 + TEST_ASSERT_VAL(failed to set file limit,
 + !set_fd_limit((nr + 6)));

3 or 6?

 +
 + /*
 +  * Test scenario:
 +  * - create 3 dso objects
 +  * - set the limit of opened data file descriptors to 2
 +  * - open/close dsos data fds and check for proper
 +  *   handling of the dso data cache
 +  */
 +
 + test_dso_data__fd_limit = 3;

2 or 3?

 +
 + TEST_ASSERT_VAL(failed to create dsos\n, 
 !dsos__create(TEST_FILE_SIZE));
 +
 + /* open dso_0 */
 + fd = dso__data_fd(dso_0, machine);
 + TEST_ASSERT_VAL(failed to get fd, fd  0);
 +
 + n = dso__data_read_offset(dso_0, machine, 0, buf, BUFSIZE);
 + TEST_ASSERT_VAL(failed to read dso, n == BUFSIZE);
 +
 + /*
 +  * Close dso_0 data with cache = true,

What does it mean by 'cache = true'?


 +  * dso_0 should remain open.
 +  */
 + dso__data_close(dso_0);
 + TEST_ASSERT_VAL(failed to not close dso, dso_0-data.fd != -1);
 +
 + /* open dso_1 */
 + n = dso__data_read_offset(dso_1, machine, 0, buf, BUFSIZE);
 + TEST_ASSERT_VAL(failed to read dso, n == BUFSIZE);
 +
 + /*
 +  * Close dso_1 data with cache = true,
 +  * dso_0 and dso_1 should remain open.
 +  */
 + dso__data_close(dso_1);
 + TEST_ASSERT_VAL(failed to not close dso, dso_0-data.fd != -1);
 + TEST_ASSERT_VAL(failed to not close dso, dso_1-data.fd != -1);
 +
 + /* open dso_2 */
 + fd = dso__data_fd(dso_2, machine);
 + TEST_ASSERT_VAL(failed to get fd, fd  0);
 +
 + /*
 +  * Close dso_1 data with cache = true,

You meant dso_2 right? :)

Thanks,
Namhyung


 +  * dso_0 should get closed now
 +  */
 + dso__data_close(dso_2);
 + TEST_ASSERT_VAL(failed to close dso_0, dso_0-data.fd == -1);
 +
 + /* reopen dso_0 */
 + fd = dso__data_fd(dso_0, machine);
 + TEST_ASSERT_VAL(failed to get fd, fd  0);
 +
 + /*
 +  * Close dso_0 data with cache = true,
 +  * dso_1 should get closed now.
 +  */
 + dso__data_close(dso_0);
 + TEST_ASSERT_VAL(failed to close dso_1, dso_1-data.fd == -1);
 +
 + /* reopen dso_1 */
 + n = dso__data_read_offset(dso_1, machine, 0, buf, BUFSIZE);
 + TEST_ASSERT_VAL(failed to read dso, n == BUFSIZE);
 +
 + /*
 +  * Close dso_1 data with cache = true,
 +  * dso_2 should get closed now.
 +  */
 + dso__data_close(dso_1);
 + TEST_ASSERT_VAL(failed to close dso_2, dso_2-data.fd == -1);
 +
 + /* dso_0 remains open */
 + TEST_ASSERT_VAL(failed to keep open dso_0, dso_0-data.fd = 0);
 +
 + /* cleanup everything */
 + dsos__delete();
 +
 + pr_debug(nr start %ld, nr stop %ld\n, nr, open_files_cnt());
 +
 + /* Make sure we did not leak any file descriptor. */
 + TEST_ASSERT_VAL(failed leadking files, nr == open_files_cnt());
 + return 0;
 +}
 diff --git a/tools/perf/tests/tests.h b/tools/perf/tests/tests.h
 index a9d7cb0..61e12b6 100644
 --- a/tools/perf/tests/tests.h
 +++ b/tools/perf/tests/tests.h
 @@ -28,6 +28,7 @@ int test__syscall_open_tp_fields(void);
  int test__pmu(void);
  int test__attr(void);
  int test__dso_data(void);
 +int test__dso_data_cache(void);
  int test__parse_events(void);
  int test__hists_link(void);
  int test__python_use(void);
--
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  

[PATCH 13/14] perf tests: Add test for caching dso file descriptors

2014-05-15 Thread Jiri Olsa
Adding test that setup test_dso_data__fd_limit and test
dso data file descriptors are cached appropriately.

Cc: Arnaldo Carvalho de Melo 
Cc: Corey Ashford 
Cc: David Ahern 
Cc: Frederic Weisbecker 
Cc: Ingo Molnar 
Cc: Jean Pihet 
Cc: Namhyung Kim 
Cc: Paul Mackerras 
Cc: Peter Zijlstra 
Signed-off-by: Jiri Olsa 
---
 tools/perf/tests/builtin-test.c |   6 +-
 tools/perf/tests/dso-data.c | 180 +++-
 tools/perf/tests/tests.h|   1 +
 3 files changed, 183 insertions(+), 4 deletions(-)

diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
index fe46f3e..c4d581a 100644
--- a/tools/perf/tests/builtin-test.c
+++ b/tools/perf/tests/builtin-test.c
@@ -52,10 +52,14 @@ static struct test {
.func = test__pmu,
},
{
-   .desc = "Test dso data interface",
+   .desc = "Test dso data read",
.func = test__dso_data,
},
{
+   .desc = "Test dso data cache",
+   .func = test__dso_data_cache,
+   },
+   {
.desc = "roundtrip evsel->name check",
.func = test__perf_evsel__roundtrip_name_test,
},
diff --git a/tools/perf/tests/dso-data.c b/tools/perf/tests/dso-data.c
index f5c8743..84ab939 100644
--- a/tools/perf/tests/dso-data.c
+++ b/tools/perf/tests/dso-data.c
@@ -1,11 +1,12 @@
-#include "util.h"
-
 #include 
 #include 
 #include 
 #include 
 #include 
-
+#include 
+#include 
+#include 
+#include "util.h"
 #include "machine.h"
 #include "symbol.h"
 #include "tests.h"
@@ -154,3 +155,176 @@ int test__dso_data(void)
unlink(file);
return 0;
 }
+
+static long open_files_cnt(void)
+{
+   char path[PATH_MAX];
+   struct dirent *dent;
+   DIR *dir;
+   long nr = 0;
+   int n;
+
+   n = scnprintf(path, PATH_MAX, "%s/self/fd", procfs__mountpoint());
+   TEST_ASSERT_VAL("couldn't get fd path", n < PATH_MAX);
+
+   pr_debug("fd path: %s\n", path);
+
+   dir = opendir(path);
+   TEST_ASSERT_VAL("failed to open fd directory", dir);
+
+   while ((dent = readdir(dir)) != NULL) {
+   if (!strcmp(dent->d_name, ".") ||
+   !strcmp(dent->d_name, ".."))
+   continue;
+
+   nr++;
+   }
+
+   closedir(dir);
+   return nr - 1;
+}
+
+static struct dso *dsos[3];
+#define dso_0 (dsos[0])
+#define dso_1 (dsos[1])
+#define dso_2 (dsos[2])
+
+static int dsos__create(int size)
+{
+   int i;
+
+   for (i = 0; i < 3; i++) {
+   char *file;
+
+   file = test_file(size);
+   TEST_ASSERT_VAL("failed to get dso file", file);
+
+   dsos[i] = dso__new((const char *)file);
+   TEST_ASSERT_VAL("failed to get dso", dsos[i]);
+   }
+
+   return 0;
+}
+
+static void dsos__delete(void)
+{
+   int i;
+
+   for (i = 0; i < 3; i++) {
+   struct dso *dso = dsos[i];
+   unlink(dso->name);
+   dso__delete(dso);
+   }
+}
+
+static int set_fd_limit(int n)
+{
+   struct rlimit rlim;
+
+   if (getrlimit(RLIMIT_NOFILE, ))
+   return -1;
+
+   pr_debug("file limit %ld, new %d\n", (long) rlim.rlim_cur, n);
+
+   rlim.rlim_cur = n;
+   return setrlimit(RLIMIT_NOFILE, );
+}
+
+int test__dso_data_cache(void)
+{
+   struct machine machine;
+   long nr = open_files_cnt();
+#define BUFSIZE 10
+   u8 buf[BUFSIZE];
+   ssize_t n;
+   int fd;
+
+   memset(, 0, sizeof(machine));
+
+   /* Make sure we are able to open 3 fds anyway */
+   TEST_ASSERT_VAL("failed to set file limit",
+   !set_fd_limit((nr + 6)));
+
+   /*
+* Test scenario:
+* - create 3 dso objects
+* - set the limit of opened data file descriptors to 2
+* - open/close dsos data fds and check for proper
+*   handling of the dso data cache
+*/
+
+   test_dso_data__fd_limit = 3;
+
+   TEST_ASSERT_VAL("failed to create dsos\n", 
!dsos__create(TEST_FILE_SIZE));
+
+   /* open dso_0 */
+   fd = dso__data_fd(dso_0, );
+   TEST_ASSERT_VAL("failed to get fd", fd > 0);
+
+   n = dso__data_read_offset(dso_0, , 0, buf, BUFSIZE);
+   TEST_ASSERT_VAL("failed to read dso", n == BUFSIZE);
+
+   /*
+* Close dso_0 data with cache = true,
+* dso_0 should remain open.
+*/
+   dso__data_close(dso_0);
+   TEST_ASSERT_VAL("failed to not close dso", dso_0->data.fd != -1);
+
+   /* open dso_1 */
+   n = dso__data_read_offset(dso_1, , 0, buf, BUFSIZE);
+   TEST_ASSERT_VAL("failed to read dso", n == BUFSIZE);
+
+   /*
+* Close dso_1 data with cache = true,
+* dso_0 and dso_1 should remain open.
+*/
+   dso__data_close(dso_1);
+   TEST_ASSERT_VAL("failed to not close dso", dso_0->data.fd != -1);
+   TEST_ASSERT_VAL("failed to not 

[PATCH 13/14] perf tests: Add test for caching dso file descriptors

2014-05-15 Thread Jiri Olsa
Adding test that setup test_dso_data__fd_limit and test
dso data file descriptors are cached appropriately.

Cc: Arnaldo Carvalho de Melo a...@kernel.org
Cc: Corey Ashford cjash...@linux.vnet.ibm.com
Cc: David Ahern dsah...@gmail.com
Cc: Frederic Weisbecker fweis...@gmail.com
Cc: Ingo Molnar mi...@kernel.org
Cc: Jean Pihet jean.pi...@linaro.org
Cc: Namhyung Kim namhy...@kernel.org
Cc: Paul Mackerras pau...@samba.org
Cc: Peter Zijlstra a.p.zijls...@chello.nl
Signed-off-by: Jiri Olsa jo...@kernel.org
---
 tools/perf/tests/builtin-test.c |   6 +-
 tools/perf/tests/dso-data.c | 180 +++-
 tools/perf/tests/tests.h|   1 +
 3 files changed, 183 insertions(+), 4 deletions(-)

diff --git a/tools/perf/tests/builtin-test.c b/tools/perf/tests/builtin-test.c
index fe46f3e..c4d581a 100644
--- a/tools/perf/tests/builtin-test.c
+++ b/tools/perf/tests/builtin-test.c
@@ -52,10 +52,14 @@ static struct test {
.func = test__pmu,
},
{
-   .desc = Test dso data interface,
+   .desc = Test dso data read,
.func = test__dso_data,
},
{
+   .desc = Test dso data cache,
+   .func = test__dso_data_cache,
+   },
+   {
.desc = roundtrip evsel-name check,
.func = test__perf_evsel__roundtrip_name_test,
},
diff --git a/tools/perf/tests/dso-data.c b/tools/perf/tests/dso-data.c
index f5c8743..84ab939 100644
--- a/tools/perf/tests/dso-data.c
+++ b/tools/perf/tests/dso-data.c
@@ -1,11 +1,12 @@
-#include util.h
-
 #include stdlib.h
 #include linux/types.h
 #include sys/stat.h
 #include fcntl.h
 #include string.h
-
+#include sys/time.h
+#include sys/resource.h
+#include api/fs/fs.h
+#include util.h
 #include machine.h
 #include symbol.h
 #include tests.h
@@ -154,3 +155,176 @@ int test__dso_data(void)
unlink(file);
return 0;
 }
+
+static long open_files_cnt(void)
+{
+   char path[PATH_MAX];
+   struct dirent *dent;
+   DIR *dir;
+   long nr = 0;
+   int n;
+
+   n = scnprintf(path, PATH_MAX, %s/self/fd, procfs__mountpoint());
+   TEST_ASSERT_VAL(couldn't get fd path, n  PATH_MAX);
+
+   pr_debug(fd path: %s\n, path);
+
+   dir = opendir(path);
+   TEST_ASSERT_VAL(failed to open fd directory, dir);
+
+   while ((dent = readdir(dir)) != NULL) {
+   if (!strcmp(dent-d_name, .) ||
+   !strcmp(dent-d_name, ..))
+   continue;
+
+   nr++;
+   }
+
+   closedir(dir);
+   return nr - 1;
+}
+
+static struct dso *dsos[3];
+#define dso_0 (dsos[0])
+#define dso_1 (dsos[1])
+#define dso_2 (dsos[2])
+
+static int dsos__create(int size)
+{
+   int i;
+
+   for (i = 0; i  3; i++) {
+   char *file;
+
+   file = test_file(size);
+   TEST_ASSERT_VAL(failed to get dso file, file);
+
+   dsos[i] = dso__new((const char *)file);
+   TEST_ASSERT_VAL(failed to get dso, dsos[i]);
+   }
+
+   return 0;
+}
+
+static void dsos__delete(void)
+{
+   int i;
+
+   for (i = 0; i  3; i++) {
+   struct dso *dso = dsos[i];
+   unlink(dso-name);
+   dso__delete(dso);
+   }
+}
+
+static int set_fd_limit(int n)
+{
+   struct rlimit rlim;
+
+   if (getrlimit(RLIMIT_NOFILE, rlim))
+   return -1;
+
+   pr_debug(file limit %ld, new %d\n, (long) rlim.rlim_cur, n);
+
+   rlim.rlim_cur = n;
+   return setrlimit(RLIMIT_NOFILE, rlim);
+}
+
+int test__dso_data_cache(void)
+{
+   struct machine machine;
+   long nr = open_files_cnt();
+#define BUFSIZE 10
+   u8 buf[BUFSIZE];
+   ssize_t n;
+   int fd;
+
+   memset(machine, 0, sizeof(machine));
+
+   /* Make sure we are able to open 3 fds anyway */
+   TEST_ASSERT_VAL(failed to set file limit,
+   !set_fd_limit((nr + 6)));
+
+   /*
+* Test scenario:
+* - create 3 dso objects
+* - set the limit of opened data file descriptors to 2
+* - open/close dsos data fds and check for proper
+*   handling of the dso data cache
+*/
+
+   test_dso_data__fd_limit = 3;
+
+   TEST_ASSERT_VAL(failed to create dsos\n, 
!dsos__create(TEST_FILE_SIZE));
+
+   /* open dso_0 */
+   fd = dso__data_fd(dso_0, machine);
+   TEST_ASSERT_VAL(failed to get fd, fd  0);
+
+   n = dso__data_read_offset(dso_0, machine, 0, buf, BUFSIZE);
+   TEST_ASSERT_VAL(failed to read dso, n == BUFSIZE);
+
+   /*
+* Close dso_0 data with cache = true,
+* dso_0 should remain open.
+*/
+   dso__data_close(dso_0);
+   TEST_ASSERT_VAL(failed to not close dso, dso_0-data.fd != -1);
+
+   /* open dso_1 */
+   n = dso__data_read_offset(dso_1, machine, 0, buf, BUFSIZE);
+   TEST_ASSERT_VAL(failed to read dso, n == BUFSIZE);
+
+   /*
+