lkml.org 
[lkml]   [2014]   [Jun]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:perf/core] perf tools: Allow to close dso fd in case of open failure
    Commit-ID:  a08cae03f430b971afa508a32662dc476d42d8cb
    Gitweb: http://git.kernel.org/tip/a08cae03f430b971afa508a32662dc476d42d8cb
    Author: Jiri Olsa <jolsa@kernel.org>
    AuthorDate: Wed, 7 May 2014 21:35:02 +0200
    Committer: Jiri Olsa <jolsa@kernel.org>
    CommitDate: Thu, 12 Jun 2014 16:53:21 +0200

    perf tools: Allow to close dso fd in case of open failure

    Adding do_open function that tries to close opened
    dso objects in case we fail to open the dso due to
    to crossing the allowed RLIMIT_NOFILE limit.

    Acked-by: Namhyung Kim <namhyung@kernel.org>
    Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
    Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
    Cc: David Ahern <dsahern@gmail.com>
    Cc: Frederic Weisbecker <fweisbec@gmail.com>
    Cc: Ingo Molnar <mingo@kernel.org>
    Cc: Jean Pihet <jean.pihet@linaro.org>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Paul Mackerras <paulus@samba.org>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Link: http://lkml.kernel.org/r/1401892622-30848-9-git-send-email-jolsa@kernel.org
    Signed-off-by: Jiri Olsa <jolsa@kernel.org>
    ---
    tools/perf/util/dso.c | 23 ++++++++++++++++++++++-
    1 file changed, 22 insertions(+), 1 deletion(-)

    diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c
    index db63438..c30752c 100644
    --- a/tools/perf/util/dso.c
    +++ b/tools/perf/util/dso.c
    @@ -159,6 +159,27 @@ static void dso__list_del(struct dso *dso)
    dso__data_open_cnt--;
    }

    +static void close_first_dso(void);
    +
    +static int do_open(char *name)
    +{
    + int fd;
    +
    + do {
    + fd = open(name, O_RDONLY);
    + if (fd >= 0)
    + return fd;
    +
    + pr_debug("dso open failed, mmap: %s\n", strerror(errno));
    + if (!dso__data_open_cnt || errno != EMFILE)
    + break;
    +
    + close_first_dso();
    + } while (1);
    +
    + return -1;
    +}
    +
    static int __open_dso(struct dso *dso, struct machine *machine)
    {
    int fd;
    @@ -177,7 +198,7 @@ static int __open_dso(struct dso *dso, struct machine *machine)
    return -EINVAL;
    }

    - fd = open(name, O_RDONLY);
    + fd = do_open(name);
    free(name);
    return fd;
    }

    \
     
     \ /
      Last update: 2014-06-13 09:01    [W:4.930 / U:0.488 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site