Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp440815pxv; Wed, 30 Jun 2021 09:02:45 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxx3EIKpQ1nD44f8iWQIKoB+gNiCUPfvnkcirWrPp8bWlnlvTRbc8tA9JGYcQSruD86PdrV X-Received: by 2002:a17:907:214b:: with SMTP id rk11mr21853668ejb.16.1625068965413; Wed, 30 Jun 2021 09:02:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1625068965; cv=none; d=google.com; s=arc-20160816; b=sp6ps2pMZlOZz6BngT2Pp7HTccL3uyO0j3RqobnGj5Y14HbaMXA9a/+S5BKaMu+96H T8RjiRqbOe17RhPYNm9tGTm5jiFatkXL9HIEFexb39Uwc6FvXt4Y4azVweiq/re+GVEs ZR3ZqggriKbns7v1pIAHXLS9VoshTPGwhY77L9nUE61pnIdmlO2ac9TfDrFVn4qNLyvd ftUiXPuOKq4Q/VXWTTVIa7+qc4ShGrwlKziZrljweY+VVXy+ooIiAFgMVnuogOAgnaPF EBlUqPMSCYOJ+PaDDx9E3eOqARKmv7qbBwBJy8TlJ7yVABN/ofYIE63x2QxDEz3MuMzl Qtxg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=JGc/emJzNwbj3jupoZV+uGrXKhhgGYBOchv9rfzzaJ0=; b=QmOao0klQjccOCXuVz89Pt/Sq22F4uzI+7y0In/VJvZj3Jbn+YniV3qYJjVW/z/+XI IFODIiIzp1Ke1UpUVqauhgG0aNvazYbrOBQzl40LAMUIm864jIiT7bKwgrR5IfZi8PFg puiCq3cxQ1x5R+npYvoAoYW77gKdpVG6hgZhLjXMlYakBmfeTa3k/YdgHj10n2jjyRHK m6YVgzQjBxtOa55y2t88jA3jiGk8lJRk0qG9ujJT7BMSeh8rkiUszRgY3g4ibXkhffi8 +v4K+KLa6eQKLhmj4FNGwqcm1s1egI3SWpBehohDTC+txoDmQepcF0oH5gccycfCBo5O x0hg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id y9si12405070eda.254.2021.06.30.09.02.20; Wed, 30 Jun 2021 09:02:45 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235986AbhF3QB7 (ORCPT + 99 others); Wed, 30 Jun 2021 12:01:59 -0400 Received: from mga01.intel.com ([192.55.52.88]:4069 "EHLO mga01.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235947AbhF3QBj (ORCPT ); Wed, 30 Jun 2021 12:01:39 -0400 X-IronPort-AV: E=McAfee;i="6200,9189,10031"; a="230016075" X-IronPort-AV: E=Sophos;i="5.83,312,1616482800"; d="scan'208";a="230016075" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Jun 2021 08:56:12 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.83,312,1616482800"; d="scan'208";a="559099889" Received: from nntpat99-84.inn.intel.com ([10.125.99.84]) by fmsmga001.fm.intel.com with ESMTP; 30 Jun 2021 08:56:08 -0700 From: Alexey Bayduraev To: Arnaldo Carvalho de Melo Cc: Jiri Olsa , Namhyung Kim , Alexander Shishkin , Peter Zijlstra , Ingo Molnar , linux-kernel , Andi Kleen , Adrian Hunter , Alexander Antonov , Alexei Budankov , Riccardo Mancini Subject: [PATCH v8 20/22] perf session: Load data directory files for analysis Date: Wed, 30 Jun 2021 18:54:59 +0300 Message-Id: X-Mailer: git-send-email 2.19.0 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Load data directory files and provide basic raw dump and aggregated analysis support of data directories in report mode, still with no memory consumption optimizations. Design and implementation are based on the prototype [1], [2]. [1] git clone https://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git -b perf/record_threads [2] https://lore.kernel.org/lkml/20180913125450.21342-1-jolsa@kernel.org/ Suggested-by: Jiri Olsa Acked-by: Namhyung Kim Signed-off-by: Alexey Bayduraev --- tools/perf/util/session.c | 129 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index a4296dfd6554..b11a502c22a3 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c @@ -65,6 +65,7 @@ struct reader_state { u64 data_size; u64 head; bool eof; + u64 size; }; enum { @@ -2323,6 +2324,7 @@ reader__read_event(struct reader *rd, struct perf_session *session, if (skip) size += skip; + st->size += size; st->head += size; st->file_pos += size; @@ -2422,6 +2424,130 @@ static int __perf_session__process_events(struct perf_session *session) return err; } +/* + * This function reads, merge and process directory data. + * It assumens the version 1 of directory data, where each + * data file holds per-cpu data, already sorted by kernel. + */ +static int __perf_session__process_dir_events(struct perf_session *session) +{ + struct perf_data *data = session->data; + struct perf_tool *tool = session->tool; + int i, ret = 0, readers = 1; + struct ui_progress prog; + u64 total_size = perf_data__size(session->data); + struct reader *rd; + + perf_tool__fill_defaults(tool); + + ui_progress__init_size(&prog, total_size, "Sorting events..."); + + for (i = 0; i < data->dir.nr; i++) { + if (data->dir.files[i].size) + readers++; + } + + rd = session->readers = zalloc(readers * sizeof(struct reader)); + if (!rd) + return -ENOMEM; + session->nr_readers = readers; + readers = 0; + + rd[readers] = (struct reader) { + .fd = perf_data__fd(session->data), + .path = session->data->file.path, + .data_size = session->header.data_size, + .data_offset = session->header.data_offset, + .in_place_update = session->data->in_place_update, + }; + ret = reader__init(&rd[readers], NULL); + if (ret) + goto out_err; + ret = reader__mmap(&rd[readers], session); + if (ret != READER_OK) { + if (ret == READER_EOF) + ret = -EINVAL; + goto out_err; + } + readers++; + + for (i = 0; i < data->dir.nr; i++) { + if (data->dir.files[i].size) { + rd[readers] = (struct reader) { + .fd = data->dir.files[i].fd, + .path = data->dir.files[i].path, + .data_size = data->dir.files[i].size, + .data_offset = 0, + .in_place_update = session->data->in_place_update, + }; + ret = reader__init(&rd[readers], NULL); + if (ret) + goto out_err; + ret = reader__mmap(&rd[readers], session); + if (ret != READER_OK) { + if (ret == READER_EOF) + ret = -EINVAL; + goto out_err; + } + readers++; + } + } + + i = 0; + + while ((ret >= 0) && readers) { + if (session_done()) + return 0; + + if (rd[i].state.eof) { + i = (i + 1) % session->nr_readers; + continue; + } + + ret = reader__read_event(&rd[i], session, &prog); + if (ret < 0) + break; + if (ret == READER_EOF) { + ret = reader__mmap(&rd[i], session); + if (ret < 0) + goto out_err; + if (ret == READER_EOF) + readers--; + } + + /* + * Processing 10MBs of data from each reader in sequence, + * because that's the way the ordered events sorting works + * most efficiently. + */ + if (rd[i].state.size >= 10*1024*1024) { + rd[i].state.size = 0; + i = (i + 1) % session->nr_readers; + } + } + + ret = ordered_events__flush(&session->ordered_events, OE_FLUSH__FINAL); + if (ret) + goto out_err; + + ret = perf_session__flush_thread_stacks(session); +out_err: + ui_progress__finish(); + + if (!tool->no_warn) + perf_session__warn_about_errors(session); + + /* + * We may switching perf.data output, make ordered_events + * reusable. + */ + ordered_events__reinit(&session->ordered_events); + + session->one_mmap = false; + + return ret; +} + int perf_session__process_events(struct perf_session *session) { if (perf_session__register_idle_thread(session) < 0) @@ -2430,6 +2556,9 @@ int perf_session__process_events(struct perf_session *session) if (perf_data__is_pipe(session->data)) return __perf_session__process_pipe_events(session); + if (perf_data__is_dir(session->data)) + return __perf_session__process_dir_events(session); + return __perf_session__process_events(session); } -- 2.19.0