perf tools: Allow to reset open files counter
authorJiri Olsa <jolsa@kernel.org>
Tue, 28 Jun 2016 11:29:02 +0000 (13:29 +0200)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 30 Jun 2016 21:27:44 +0000 (18:27 -0300)
I hit a bug when running test suite without forking
each test (-F option):

  $ perf test -F dso
   8: Test dso data read                                       : Ok
   9: Test dso data cache                                      : FAILED!
  10: Test dso data reopen                                     : FAILED!

The reason the session file limit is set just once for
perf process so we need to reset it for each test,
otherwise wrong limit is taken into account.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Tested-by: Nilay Vaish <nilayvaish@gmail.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1467113345-12669-2-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/tests/dso-data.c
tools/perf/util/dso.c
tools/perf/util/dso.h

index 8cf0d9e189a8bea36c02c965d74e216d29409089..13725e09ba22447ed97b498e6751a34c2a027cbf 100644 (file)
@@ -251,6 +251,9 @@ int test__dso_data_cache(int subtest __maybe_unused)
        long nr_end, nr = open_files_cnt();
        int dso_cnt, limit, i, fd;
 
+       /* Rest the internal dso open counter limit. */
+       reset_fd_limit();
+
        memset(&machine, 0, sizeof(machine));
 
        /* set as system limit */
@@ -312,6 +315,9 @@ int test__dso_data_reopen(int subtest __maybe_unused)
 #define dso_1 (dsos[1])
 #define dso_2 (dsos[2])
 
+       /* Rest the internal dso open counter limit. */
+       reset_fd_limit();
+
        memset(&machine, 0, sizeof(machine));
 
        /*
index 5d286f5d7906798a6ffe1e5e91b8a52bf4bc1973..e1de6cc4863e89f3b1979140eb9b0a0e7b3402e5 100644 (file)
@@ -442,17 +442,27 @@ static rlim_t get_fd_limit(void)
        return limit;
 }
 
-static bool may_cache_fd(void)
+static rlim_t fd_limit;
+
+/*
+ * Used only by tests/dso-data.c to reset the environment
+ * for tests. I dont expect we should change this during
+ * standard runtime.
+ */
+void reset_fd_limit(void)
 {
-       static rlim_t limit;
+       fd_limit = 0;
+}
 
-       if (!limit)
-               limit = get_fd_limit();
+static bool may_cache_fd(void)
+{
+       if (!fd_limit)
+               fd_limit = get_fd_limit();
 
-       if (limit == RLIM_INFINITY)
+       if (fd_limit == RLIM_INFINITY)
                return true;
 
-       return limit > (rlim_t) dso__data_open_cnt;
+       return fd_limit > (rlim_t) dso__data_open_cnt;
 }
 
 /*
index 76d79d070e21e5e41ca31172d6b779b90586f734..a571f24895caa81e84266baee6c7b477016ec22c 100644 (file)
@@ -360,4 +360,6 @@ enum dso_type dso__type(struct dso *dso, struct machine *machine);
 
 int dso__strerror_load(struct dso *dso, char *buf, size_t buflen);
 
+void reset_fd_limit(void);
+
 #endif /* __PERF_DSO */