lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Tue, 27 May 2014 10:36:44 +0900 From: Namhyung Kim <namhyung@...il.com> To: Jiri Olsa <jolsa@...nel.org> Cc: linux-kernel@...r.kernel.org, Arnaldo Carvalho de Melo <acme@...nel.org>, Corey Ashford <cjashfor@...ux.vnet.ibm.com>, David Ahern <dsahern@...il.com>, Frederic Weisbecker <fweisbec@...il.com>, Ingo Molnar <mingo@...nel.org>, Jean Pihet <jean.pihet@...aro.org>, Paul Mackerras <paulus@...ba.org>, Peter Zijlstra <a.p.zijlstra@...llo.nl> Subject: 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 majordomo@...r.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists