Received: by 2002:ac0:8c9a:0:0:0:0:0 with SMTP id r26csp2883949ima; Sun, 3 Feb 2019 08:43:17 -0800 (PST) X-Google-Smtp-Source: ALg8bN6VpO4G5IVHbWxlD/YboB9z09eRRXR6nCPFtIEOqe5KAAMue0owXye8JWu95yT31NUdgboJ X-Received: by 2002:a17:902:b093:: with SMTP id p19mr48062271plr.135.1549212197003; Sun, 03 Feb 2019 08:43:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1549212196; cv=none; d=google.com; s=arc-20160816; b=RHBQ73nJrb4QXdaKJKWBrfRM3mTf7qlhm91aB31ml89Qhn4I25JZSii0+gJ5cYrH4I Ehu0GDx5wnLU4xu+BjcK5ODe+gy3+Sx0lTH3xa9BO3O7ZvpQYXc7JMCFXkmN+GOFM0Sv Ewr40cmUc9IOhoUC1kQmlx8AruHHgSe1wT6XKvmlpG21p7OXheJUwrleNj6myHEPf4Yx eBDuKkA+Ys2+OSSrAoHJaRiOazu/2FlcYy12xqI94R8ZzYzZDLC1w7YSkGfzOkczz9kL YtP2blWPNUuC93zfKNM44ZF29mSdZFClY+XnfrQOpXDsYmsBXWF/DBHrowDERJagArcy nW+A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from; bh=os70HE2UaoiY9HAjm+6eFLUbthUfKzL6DbVRPGwJN3c=; b=kwY9GeerpBp9BuMaezes2gDyu8sMzFGK7HJXmlV/hhn4MCRKZ4BxieRRnY42qUdwU9 1fV3nK3PcwN4Q7+his1y6XZ4f43LGKbN434DS88L1AVaKYwO/rb0BGXZPqpQGHgEF4Rl 976MoBG7OlxfXdBVkr/xK+fmvbHPziMPaKTCWMctivwECYXDaY53j7I4WHQJnFJqdzAd doIVP5b+kt2KusKY1NEF6YvYNcKMxiapT5OGNBX6ckDjnlx/DCa5E4afDfa6j1P9WV3k 2JGnK8CBAkZiVPGklchOW1nAoRwhUzcuaMYdkApGa/Xo3gB09AMBRU9BK75v9yF8qVTW WjOw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j91si14240811pld.395.2019.02.03.08.43.01; Sun, 03 Feb 2019 08:43:16 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728505AbfBCPas (ORCPT + 99 others); Sun, 3 Feb 2019 10:30:48 -0500 Received: from mx1.redhat.com ([209.132.183.28]:50978 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728266AbfBCPar (ORCPT ); Sun, 3 Feb 2019 10:30:47 -0500 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 93C1919D32D; Sun, 3 Feb 2019 15:30:46 +0000 (UTC) Received: from krava.redhat.com (ovpn-204-46.brq.redhat.com [10.40.204.46]) by smtp.corp.redhat.com (Postfix) with ESMTP id 274525C238; Sun, 3 Feb 2019 15:30:43 +0000 (UTC) From: Jiri Olsa To: Arnaldo Carvalho de Melo Cc: lkml , Ingo Molnar , Namhyung Kim , Alexander Shishkin , Peter Zijlstra , Adrian Hunter , Andi Kleen , Stephane Eranian , Alexey Budankov Subject: [PATCH 08/14] perf data: Add directory support Date: Sun, 3 Feb 2019 16:30:12 +0100 Message-Id: <20190203153018.9650-9-jolsa@kernel.org> In-Reply-To: <20190203153018.9650-1-jolsa@kernel.org> References: <20190203153018.9650-1-jolsa@kernel.org> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Sun, 03 Feb 2019 15:30:46 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Adding support to have directory as perf.data. The caller needs to set 'struct perf_data::is_dir flag and the path will be treated as directory. The 'struct perf_data::file' is initialized and open as 'path/header' file. Adding check to direcory interface functions to check on is_dir flag. Link: http://lkml.kernel.org/n/tip-pvot1aywiem9epgqpfi1agaj@git.kernel.org Signed-off-by: Jiri Olsa --- tools/perf/util/data.c | 39 +++++++++++++++++++++++++++++++++++++-- tools/perf/util/data.h | 6 ++++++ 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/tools/perf/util/data.c b/tools/perf/util/data.c index 7c37b67fbc3c..59c052454fac 100644 --- a/tools/perf/util/data.c +++ b/tools/perf/util/data.c @@ -34,6 +34,9 @@ int perf_data__create_dir(struct perf_data *data, int nr) struct perf_data_file *files = NULL; int i, ret = -1; + if (WARN_ON(!data->is_dir)) + return -EINVAL; + files = malloc(nr * sizeof(*files)); if (!files) return -ENOMEM; @@ -61,7 +64,6 @@ int perf_data__create_dir(struct perf_data *data, int nr) return ret; } -__maybe_unused static int perf_data__open_dir(struct perf_data *data) { struct perf_data_file *files = NULL; @@ -70,6 +72,9 @@ static int perf_data__open_dir(struct perf_data *data) DIR *dir; int nr = 0; + if (WARN_ON(!data->is_dir)) + return -EINVAL; + dir = opendir(data->path); if (!dir) return -EINVAL; @@ -159,6 +164,16 @@ static int check_backup(struct perf_data *data) return 0; } +static bool is_dir(struct perf_data *data) +{ + struct stat st; + + if (stat(data->path, &st)) + return false; + + return (st.st_mode & S_IFMT) == S_IFDIR; +} + static int open_file_read(struct perf_data *data) { struct stat st; @@ -240,6 +255,22 @@ static int open_file_dup(struct perf_data *data) return open_file(data); } +static int open_dir(struct perf_data *data) +{ + if (perf_data__is_write(data)) { + if (mkdir(data->path, S_IRWXU) < 0) + return -1; + } else { + if (perf_data__open_dir(data)) + return -1; + } + + if (asprintf(&data->file.path, "%s/header", data->path) < 0) + return -ENOMEM; + + return open_file(data); +} + int perf_data__open(struct perf_data *data) { if (check_pipe(data)) @@ -251,7 +282,11 @@ int perf_data__open(struct perf_data *data) if (check_backup(data)) return -1; - return open_file_dup(data); + if (perf_data__is_read(data)) + data->is_dir = is_dir(data); + + return perf_data__is_dir(data) ? + open_dir(data) : open_file_dup(data); } void perf_data__close(struct perf_data *data) diff --git a/tools/perf/util/data.h b/tools/perf/util/data.h index 3b4115dc777f..a1edf7e03a71 100644 --- a/tools/perf/util/data.h +++ b/tools/perf/util/data.h @@ -19,6 +19,7 @@ struct perf_data { const char *path; struct perf_data_file file; bool is_pipe; + bool is_dir; bool force; enum perf_data_mode mode; @@ -43,6 +44,11 @@ static inline int perf_data__is_pipe(struct perf_data *data) return data->is_pipe; } +static inline bool perf_data__is_dir(struct perf_data *data) +{ + return data->is_dir; +} + static inline int perf_data__fd(struct perf_data *data) { return data->file.fd; -- 2.17.2