[PATCH 13/14] perf tests: Add test for caching dso file descriptors
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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); + + /* +