From nobody Tue Sep 9 16:20:07 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1D061C64EC7 for ; Tue, 28 Feb 2023 08:42:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230469AbjB1ImW (ORCPT ); Tue, 28 Feb 2023 03:42:22 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50842 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230311AbjB1ImN (ORCPT ); Tue, 28 Feb 2023 03:42:13 -0500 Received: from mail-pg1-x536.google.com (mail-pg1-x536.google.com [IPv6:2607:f8b0:4864:20::536]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 5E6032BEC7 for ; Tue, 28 Feb 2023 00:42:10 -0800 (PST) Received: by mail-pg1-x536.google.com with SMTP id h31so5153903pgl.6 for ; Tue, 28 Feb 2023 00:42:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=/6XdpHkz8A8bOxvOk1eGAORWD0fU8Q/VwNFknF3nlZE=; b=mWqhXspGGie2v+/qH4efLRdPLhBL9yNjeEj0DmwmCPSWJ5RpzlqS2O8qUH225jkUAl bmVpuSeh+jt7e2gbU343J/lvD2b7ylgYWtQ+MmZdt+X/0Acq9OF6l+ePyjlnc/5WqK0b 80UjTmv12TkEBMbogN2UL6Pn2SCalynD7CFcbB0dKctUTiZ4wKQuJYAV634+28EHa95C xFKEHNpqjCUKyZiy5HwXm1YyKfS13/mqe5OB0L7fRZi7KMoJSXcBJTO4BHKfvQFYigeD vZPVx6nt8f5MczzD+2n2Gqqta5Eeb4AehPe6nGl2qwPsSpN1qErcugXGyZ1pv8CeacUY HZ0Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=/6XdpHkz8A8bOxvOk1eGAORWD0fU8Q/VwNFknF3nlZE=; b=fhHTpqh6dAYe1L3h2Nc35mIWhKxvHwY9ZIPVGjdL5WYlkzbjLC79o3jTMku+jwoWeU 2cZWjp9KIoC3YE2MI4VWYLVIkurxXlXKpi4qxUv+rvuRAGDCquCnuUMCzkjXY7A1umGB LBQgLetlA2Y2xhzLR55MdxTSO+I8XWsUkueEVkMcZxFVetrTUz3RgONOgCtL3y120b/I FrNic1A3mHD4FJPDqUTixrKXT1Ogx72DUnjq9jivFDVCkt/cO95+gCmYU6OD45bSODb4 s2+Aigf6Skthi513n8ZCuh2ctHHmGGgSN5ekLrIbrLJVqLkFqeejnp8xWwhu7ohqhZvK qeiQ== X-Gm-Message-State: AO0yUKXe/B6nUhcdqze6cjjHWCGjgio3aphZeVK7e9vwGCLO0SDv8WuF Pv+jHYvWCT5ke1hRQR7u9aQkBQ== X-Google-Smtp-Source: AK7set+PRP5y4J2uOON7M98lN9JQTTyBpJxYB4d3EKe49ySCFAeA87aonnG+GQu1FJMLh9w7L3CFNQ== X-Received: by 2002:aa7:9d84:0:b0:5e1:255b:6fc4 with SMTP id f4-20020aa79d84000000b005e1255b6fc4mr1848131pfq.30.1677573729648; Tue, 28 Feb 2023 00:42:09 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id u25-20020aa78499000000b005d6fcd8f9desm5681270pfn.94.2023.02.28.00.42.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 00:42:09 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v2 01/14] perf kvm: Refactor overall statistics Date: Tue, 28 Feb 2023 16:41:34 +0800 Message-Id: <20230228084147.106167-2-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230228084147.106167-1-leo.yan@linaro.org> References: <20230228084147.106167-1-leo.yan@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Currently the tool computes overall statistics when sort the results. This patch refactors overall statistics during events processing, therefore, the function update_total_coun() is not needed anymore, an extra benefit is we can de-couple code between the statistics and the sorting. This patch is not expected any functionality changes. Signed-off-by: Leo Yan --- tools/perf/builtin-kvm.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 641e739c717c..0172e5b0d26e 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -278,9 +278,14 @@ static double kvm_event_rel_stddev(int vcpu_id, struct= kvm_event *event) avg_stats(&kvm_stats->stats)); } =20 -static bool update_kvm_event(struct kvm_event *event, int vcpu_id, +static bool update_kvm_event(struct perf_kvm_stat *kvm, + struct kvm_event *event, int vcpu_id, u64 time_diff) { + /* Update overall statistics */ + kvm->total_count++; + kvm->total_time +=3D time_diff; + if (vcpu_id =3D=3D -1) { kvm_update_event_stats(&event->total, time_diff); return true; @@ -399,7 +404,7 @@ static bool handle_end_event(struct perf_kvm_stat *kvm, } } =20 - return update_kvm_event(event, vcpu, time_diff); + return update_kvm_event(kvm, event, vcpu, time_diff); } =20 static @@ -526,15 +531,6 @@ static void insert_to_result(struct rb_root *result, s= truct kvm_event *event, rb_insert_color(&event->rb, result); } =20 -static void -update_total_count(struct perf_kvm_stat *kvm, struct kvm_event *event) -{ - int vcpu =3D kvm->trace_vcpu; - - kvm->total_count +=3D get_event_count(event, vcpu); - kvm->total_time +=3D get_event_time(event, vcpu); -} - static bool event_is_valid(struct kvm_event *event, int vcpu) { return !!get_event_count(event, vcpu); @@ -549,7 +545,6 @@ static void sort_result(struct perf_kvm_stat *kvm) for (i =3D 0; i < EVENTS_CACHE_SIZE; i++) { list_for_each_entry(event, &kvm->kvm_events_cache[i], hash_entry) { if (event_is_valid(event, vcpu)) { - update_total_count(kvm, event); insert_to_result(&kvm->result, event, kvm->compare, vcpu); } --=20 2.34.1 From nobody Tue Sep 9 16:20:07 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D007FC7EE30 for ; Tue, 28 Feb 2023 08:42:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230229AbjB1Imc (ORCPT ); Tue, 28 Feb 2023 03:42:32 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51124 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230143AbjB1ImV (ORCPT ); Tue, 28 Feb 2023 03:42:21 -0500 Received: from mail-pf1-x429.google.com (mail-pf1-x429.google.com [IPv6:2607:f8b0:4864:20::429]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 447922BF1C for ; Tue, 28 Feb 2023 00:42:14 -0800 (PST) Received: by mail-pf1-x429.google.com with SMTP id z11so5193290pfh.4 for ; Tue, 28 Feb 2023 00:42:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=JpZ5nkw8exH6pwfmixa8Q7/xf5HABCQppgg+JZ7ONP0=; b=bkNjJlgsFaniZFnEBrVC/8eR7XRiD8jF4esOwr6DwL9knjpC8TMdYEKIhfajyMVu3J zYst4NnOj0018T6y8H1j3/uDZ231VtuNTDe0bQEvH55eOoBvFbQTxaGV08v3J5UWjuXw MLV03zzeZfla0MLgVNKobMDfXcgKZ2WURiDMFIV2KOGeVYeiDxUUuFT6HZ5g/RGSb5l/ AggEFH6S7y5p2YPcXGMq2fTWCAKJSt5sINcKOHiD89iLHQaVykYp5aXrGgV5jVe+6GNJ O7UAgaia6gWetzD3UqK1pwwAY7TboLjjlun0m+Gg1FT7IvX0hArrtrXeMHllQlC6SIMt eJKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=JpZ5nkw8exH6pwfmixa8Q7/xf5HABCQppgg+JZ7ONP0=; b=lmJ2CCwoPU5abfr/jg8BPN81kfKPn7rFEARE5q87MQvweL+4m3UICq0xUktzzxUfiZ 1V0O6/bCFchrQgBXx9URC2hcc3dep1Xb94tbtRbT/amJob/wa6LZybQSHE2drxI6LuBu fdRnsyzb2Yr9uWBhZzX0BsZApHYerhStS6zl82NznlMp7dQiVCFToyVp4ZThGnanr6RA HP540kJItvVoqZDLqKHdfQHom8d0bmMt/kTGkNYLEt5x20kFMmf2WH65/2LzjzTKRiJV s8bRFxoiI27wG0cBFINBu1GBC/66ZY0I0wVG2jzhn423EYXkYeqXPn7TKdxy03INhgkI 3tBg== X-Gm-Message-State: AO0yUKVQAm23WRiPW5EOmNyZ/z86oZDq9RSQ2Wb0oT8BoxuzRRFp3SYs nruts/AgOTWOtHNGqE82Cu9eyA== X-Google-Smtp-Source: AK7set+wD55KJzTyIXxQ5710IRZ53crBDuVrVE9lHicbaWu3jyLeU6IMpNUa9XCwV4bQmN8bdAnt8w== X-Received: by 2002:a62:1b02:0:b0:5a8:cb5f:94d4 with SMTP id b2-20020a621b02000000b005a8cb5f94d4mr1388359pfb.32.1677573733361; Tue, 28 Feb 2023 00:42:13 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id u25-20020aa78499000000b005d6fcd8f9desm5681270pfn.94.2023.02.28.00.42.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 00:42:12 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v2 02/14] perf kvm: Add pointer to 'perf_kvm_stat' in kvm event Date: Tue, 28 Feb 2023 16:41:35 +0800 Message-Id: <20230228084147.106167-3-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230228084147.106167-1-leo.yan@linaro.org> References: <20230228084147.106167-1-leo.yan@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Sometimes, handling kvm events needs to base on global variables, e.g. when read event counts we need to know the target vcpu ID; the global variables are stored in structure perf_kvm_stat. This patch adds add a 'perf_kvm_stat' pointer in kvm event structure, it is to be used by later refactoring. Signed-off-by: Leo Yan --- tools/perf/builtin-kvm.c | 6 ++++-- tools/perf/util/kvm-stat.h | 5 +++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 0172e5b0d26e..3d2560ec6b37 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -209,7 +209,8 @@ static bool kvm_event_expand(struct kvm_event *event, i= nt vcpu_id) return true; } =20 -static struct kvm_event *kvm_alloc_init_event(struct event_key *key) +static struct kvm_event *kvm_alloc_init_event(struct perf_kvm_stat *kvm, + struct event_key *key) { struct kvm_event *event; =20 @@ -219,6 +220,7 @@ static struct kvm_event *kvm_alloc_init_event(struct ev= ent_key *key) return NULL; } =20 + event->perf_kvm =3D kvm; event->key =3D *key; init_stats(&event->total.stats); return event; @@ -238,7 +240,7 @@ static struct kvm_event *find_create_kvm_event(struct p= erf_kvm_stat *kvm, return event; } =20 - event =3D kvm_alloc_init_event(key); + event =3D kvm_alloc_init_event(kvm, key); if (!event) return NULL; =20 diff --git a/tools/perf/util/kvm-stat.h b/tools/perf/util/kvm-stat.h index 6f0fa05b62b6..40a4b66cfee6 100644 --- a/tools/perf/util/kvm-stat.h +++ b/tools/perf/util/kvm-stat.h @@ -24,10 +24,13 @@ struct kvm_event_stats { struct stats stats; }; =20 +struct perf_kvm_stat; + struct kvm_event { struct list_head hash_entry; struct rb_node rb; =20 + struct perf_kvm_stat *perf_kvm; struct event_key key; =20 struct kvm_event_stats total; @@ -44,8 +47,6 @@ struct kvm_event_key { key_cmp_fun key; }; =20 -struct perf_kvm_stat; - struct child_event_ops { void (*get_key)(struct evsel *evsel, struct perf_sample *sample, --=20 2.34.1 From nobody Tue Sep 9 16:20:07 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id E3556C64EC7 for ; Tue, 28 Feb 2023 08:42:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231140AbjB1Imm (ORCPT ); Tue, 28 Feb 2023 03:42:42 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51376 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230323AbjB1Im2 (ORCPT ); Tue, 28 Feb 2023 03:42:28 -0500 Received: from mail-pl1-x62f.google.com (mail-pl1-x62f.google.com [IPv6:2607:f8b0:4864:20::62f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D7F022B620 for ; Tue, 28 Feb 2023 00:42:17 -0800 (PST) Received: by mail-pl1-x62f.google.com with SMTP id p20so8410858plw.13 for ; Tue, 28 Feb 2023 00:42:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=fdGtU8CdVJ5aQaJfBI2DSk5cEkPEgW68Xd4/KtBW9/E=; b=BkBo2ywe8gf4CHbFN5CKwuhD00EcmhUOUXeqbLRKf8NcE1OOL3wXrn2iyN+hjlvbaI NdIL1eag3/QxSc0ZBddCG4yuqyEUq/T4YTKpSCQb7J8Ow2DHem7y+9MJoWZ5SsRyAt+E GYk0xGZhyGvL0ty5iuKZ4r/abucK/StBGWPMsiTXAWRsBTkrpRNbUXYMT0QLLMljZLNv Uov4g/HjE8doWYVNcQ7VPQje7OMk/1CjuqPZVc5aL7NlQ7009x33WQR0645E/sQfx937 HuiV8vwqqNb36ZsCRKw48lBWQjaaZekS5mch2GxR6N1Okr7lzAYE0nJ5QyG9yjXGsISV vyQw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=fdGtU8CdVJ5aQaJfBI2DSk5cEkPEgW68Xd4/KtBW9/E=; b=oFkpSEFDkoDWOnTC08KPaWc6sCoZm+TuoprWOrUiLzXbWrNMYRE/bLYuYlZUX5fzPo XWBVThmn8ZTOfZMF2RYXEHagiFkMhWMhbbryJmAng9X3xawXbpjxARpmYepUde5SwVHt mNvC0ESKGyy5o2P8IhGFPjwA7P8tDcc/z5fGPq7nsFPFWNRG/T9UKnLEmwIvXqtoYC14 Is9hYbUnZtfYpQqACq8NgXEiy7/RRli2p/Y5SKlTr4/fLdX0r8qht6FfaIaOMyiCSz40 icd/3nS1No6bm+pbZpn6jwqqNB99SSH6s/S+H6KiKOhKUEDlKGY/4rSiQ4TF4MMxMxy5 sOxQ== X-Gm-Message-State: AO0yUKXFdj63BTlm3aisfEf3XJaNWBqDU3ozPCWRbuhUPUiiGoNS/mbW Zl4pfAWL2q147JnA9bv/3DFC6g== X-Google-Smtp-Source: AK7set+w2efZM2htfuJG/ZLh9375b9S2ONF1ObJM9mUf1ngQcyne80DAC7igZpvH5ZcCVVvnEdgL4w== X-Received: by 2002:a05:6a20:4415:b0:cd:8ea8:52e3 with SMTP id ce21-20020a056a20441500b000cd8ea852e3mr3085508pzb.28.1677573737169; Tue, 28 Feb 2023 00:42:17 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id u25-20020aa78499000000b005d6fcd8f9desm5681270pfn.94.2023.02.28.00.42.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 00:42:16 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v2 03/14] perf kvm: Move up metrics helpers Date: Tue, 28 Feb 2023 16:41:36 +0800 Message-Id: <20230228084147.106167-4-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230228084147.106167-1-leo.yan@linaro.org> References: <20230228084147.106167-1-leo.yan@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" This patch moves up the helper functions of event's metrics for later adding code to call them. No any functionality changes, but has a function renaming from compare_kvm_event_{metric}() to cmp_event_{metric}(). Signed-off-by: Leo Yan --- tools/perf/builtin-kvm.c | 72 ++++++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 3d2560ec6b37..62c097a37da9 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -49,6 +49,42 @@ #include #include =20 +#define GET_EVENT_KEY(func, field) \ +static u64 get_event_ ##func(struct kvm_event *event, int vcpu) \ +{ \ + if (vcpu =3D=3D -1) \ + return event->total.field; \ + \ + if (vcpu >=3D event->max_vcpu) \ + return 0; \ + \ + return event->vcpu[vcpu].field; \ +} + +#define COMPARE_EVENT_KEY(func, field) \ +GET_EVENT_KEY(func, field) \ +static int cmp_event_ ## func(struct kvm_event *one, \ + struct kvm_event *two, int vcpu) \ +{ \ + return get_event_ ##func(one, vcpu) > \ + get_event_ ##func(two, vcpu); \ +} + +GET_EVENT_KEY(time, time); +GET_EVENT_KEY(max, stats.max); +GET_EVENT_KEY(min, stats.min); +COMPARE_EVENT_KEY(count, stats.n); +COMPARE_EVENT_KEY(mean, stats.mean); + +#define DEF_SORT_NAME_KEY(name, compare_key) \ + { #name, cmp_event_ ## compare_key } + +static struct kvm_event_key keys[] =3D { + DEF_SORT_NAME_KEY(sample, count), + DEF_SORT_NAME_KEY(time, mean), + { NULL, NULL } +}; + static const char *get_filename_for_perf_kvm(void) { const char *filename; @@ -461,42 +497,6 @@ static bool handle_kvm_event(struct perf_kvm_stat *kvm, return true; } =20 -#define GET_EVENT_KEY(func, field) \ -static u64 get_event_ ##func(struct kvm_event *event, int vcpu) \ -{ \ - if (vcpu =3D=3D -1) \ - return event->total.field; \ - \ - if (vcpu >=3D event->max_vcpu) \ - return 0; \ - \ - return event->vcpu[vcpu].field; \ -} - -#define COMPARE_EVENT_KEY(func, field) \ -GET_EVENT_KEY(func, field) \ -static int compare_kvm_event_ ## func(struct kvm_event *one, \ - struct kvm_event *two, int vcpu)\ -{ \ - return get_event_ ##func(one, vcpu) > \ - get_event_ ##func(two, vcpu); \ -} - -GET_EVENT_KEY(time, time); -COMPARE_EVENT_KEY(count, stats.n); -COMPARE_EVENT_KEY(mean, stats.mean); -GET_EVENT_KEY(max, stats.max); -GET_EVENT_KEY(min, stats.min); - -#define DEF_SORT_NAME_KEY(name, compare_key) \ - { #name, compare_kvm_event_ ## compare_key } - -static struct kvm_event_key keys[] =3D { - DEF_SORT_NAME_KEY(sample, count), - DEF_SORT_NAME_KEY(time, mean), - { NULL, NULL } -}; - static bool select_key(struct perf_kvm_stat *kvm) { int i; --=20 2.34.1 From nobody Tue Sep 9 16:20:07 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id AC1D7C64ED6 for ; Tue, 28 Feb 2023 08:42:50 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231143AbjB1Ims (ORCPT ); Tue, 28 Feb 2023 03:42:48 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51160 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230499AbjB1Ima (ORCPT ); Tue, 28 Feb 2023 03:42:30 -0500 Received: from mail-pg1-x534.google.com (mail-pg1-x534.google.com [IPv6:2607:f8b0:4864:20::534]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 983022BED7 for ; Tue, 28 Feb 2023 00:42:21 -0800 (PST) Received: by mail-pg1-x534.google.com with SMTP id 132so5131452pgh.13 for ; Tue, 28 Feb 2023 00:42:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=aIt7hyoJVmNy/7vg+PJWYd0GZkeRWV7lG6iYd+8Wqps=; b=mS2P4aAtqjsWhcUJddXr23ZsJdr/sh+N0IF0kJbGeCvOX2S9jFSXWRTXzjCaYH5oOe cBtzrnH+LdZBzYFn1ZDiWpdnMFutST9mW4rYGVw8aMLDQRDeghAKpGtA+KIWlxM1Inz6 4jmgEfEMaZYRHMIJ524Hkafcy80SxQc8AvmvBz/ofCWvXKmQJHJOSB85boiZhosuiHNE AvSOY5Tk2mGKZH+W0z8kCgQJRKy/v4hgW+jUDZlxoLW8fUTEzBIktHtK9n1t8mAkHvg9 kgOPOJastla6hp0mZRj4BrtEjLjDTp3NxHnqTRdJcyZFfbIEStS8ELECfgjTlwLSqZpx 4jDg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=aIt7hyoJVmNy/7vg+PJWYd0GZkeRWV7lG6iYd+8Wqps=; b=GI7ehtAXNW7J5iC16sWG5LJk9ema8dGApHfxy1ykashF0w+n/bChj0mJNV4CsHhmRs WEcpdgLlIAwWMksk9u+R6T2PWNNkAZPKgtnQjfEIigFKTMSFC4e9uiyGlEg2OVKUqc0n j5vyh2Nh77BQIN/m0P2UenDicUR7WDY43YiE8wYM/0Z2WMxta4Zi1D86Oj651lFq3q5j yywgT1SyX8JU4r6R+jWrmlbqFXqFsP596VgBd/s8TUI1T4IN3cg8qBj4nt9alsyVPJ2B FSs07hK+LXhtqLt/LIdVQ42M3oezlXXHojywBfXlgKI4sZ1773rparrcym9253skhbqp 9wJw== X-Gm-Message-State: AO0yUKW61iOM6RrAim+KnEn9hwGJZj2CL+NZqwLCsRimv63Tg0Zw6oCw h1Zk0n90MD5/1yFCczLymfyBrg== X-Google-Smtp-Source: AK7set/NrRxAzFchpNLziAy94c5DDBN/Q3U+Nn3NEMEEStq+wEfwWgcLPLfOaCiLBsFaQpTYbXUDZA== X-Received: by 2002:a62:4dc1:0:b0:5dd:3f84:7d32 with SMTP id a184-20020a624dc1000000b005dd3f847d32mr1845280pfb.1.1677573741035; Tue, 28 Feb 2023 00:42:21 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id u25-20020aa78499000000b005d6fcd8f9desm5681270pfn.94.2023.02.28.00.42.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 00:42:20 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v2 04/14] perf kvm: Use subtraction for comparison metrics Date: Tue, 28 Feb 2023 16:41:37 +0800 Message-Id: <20230228084147.106167-5-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230228084147.106167-1-leo.yan@linaro.org> References: <20230228084147.106167-1-leo.yan@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Currently the metrics comparison uses greater operator (>), it returns the boolean value (0 or 1). This patch changes to use subtraction as comparison result, which can be used by histograms sorting. Signed-off-by: Leo Yan --- tools/perf/builtin-kvm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 62c097a37da9..6eec0db2dda6 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -66,7 +66,7 @@ GET_EVENT_KEY(func, field) \ static int cmp_event_ ## func(struct kvm_event *one, \ struct kvm_event *two, int vcpu) \ { \ - return get_event_ ##func(one, vcpu) > \ + return get_event_ ##func(one, vcpu) - \ get_event_ ##func(two, vcpu); \ } =20 @@ -523,7 +523,7 @@ static void insert_to_result(struct rb_root *result, st= ruct kvm_event *event, p =3D container_of(*rb, struct kvm_event, rb); parent =3D *rb; =20 - if (bigger(event, p, vcpu)) + if (bigger(event, p, vcpu) > 0) rb =3D &(*rb)->rb_left; else rb =3D &(*rb)->rb_right; --=20 2.34.1 From nobody Tue Sep 9 16:20:07 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 12B94C64EC7 for ; Tue, 28 Feb 2023 08:42:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230518AbjB1Im5 (ORCPT ); Tue, 28 Feb 2023 03:42:57 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51204 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230486AbjB1Img (ORCPT ); Tue, 28 Feb 2023 03:42:36 -0500 Received: from mail-pf1-x432.google.com (mail-pf1-x432.google.com [IPv6:2607:f8b0:4864:20::432]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9CDB92C674 for ; Tue, 28 Feb 2023 00:42:25 -0800 (PST) Received: by mail-pf1-x432.google.com with SMTP id ce7so5183143pfb.9 for ; Tue, 28 Feb 2023 00:42:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=JA7VJN/YcBA7IE+nNQeWn+LVdWT4KUb0IqvxyHZoo8o=; b=TaKqzF4fkHx5FMQJrc7Qn29J3OPeZcAJPQroEmohQUPT7jJYUmB/Bo6bd1GLmYaM1e nWuwUxt4NKDT6UJ+GLYE347CkDV8/VPmso6YmvyLJl0gWLxTQWVlUOlHyoUutACNJ7SK 9WkIZGUl37Ff166uVCKyhLxwsBULGIvgIUXbVs33/0U09eigKTBx8OOzr5p0ZDKIc4tA l9GYgBuSPKr99Og9saGMRoVIAoyPqjD4l0MhZNICab8KrlOmRZJB//5tTiakQHX83yw7 X+aX1MReDT9UP9Ue3dTxkR0eRg5sAhRYbzNZ7KBjUgk7/ijJiO5qZm7+yCxdlRHGuz67 3FnA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=JA7VJN/YcBA7IE+nNQeWn+LVdWT4KUb0IqvxyHZoo8o=; b=f48EZuzQ7B6p8O8MqqtVi7qxIgxBBj/EyjFk1TFgVmNx9dctHa+Y7s/qf3+kCZODzV u7C+0sZpqWPDcSxRqDWDUO7/XxWawLXDbzxrra6x6zKRESWRJ9+PqOjsCshmdt+xG7KB tlqaT+vcT3QqhUNKF3SJ4AkAVczGG2cX3tMypzn6biJaKqXxJfx3EK3fKVuY/Bfo9OY+ IkaTKDWRsnExrR8gLhwwAkHJt6cRq9EenbAJr99XCgBX+c12G7hVn4KaAEE+4d9pERsT DUHPijVosZxwNAp6gjdrq6nbUebSjHZm01J/Fmi36c9qz9/YMNjFi9zX3sH09SS4qgqu nzJg== X-Gm-Message-State: AO0yUKWy3SGHKQkdVGhsjG4/o4ks0ljYesqoIAbq3SKbWao1KBe/TE50 NfHHDX1ALoVS5t+nWmXZLYN1VA== X-Google-Smtp-Source: AK7set9hVj2auAd83YBjpabCLy1tQrIQZQMd0GDf3YnhJgB0ts2wAbaX4IZy0CNgaRZ4P49Ec06uBQ== X-Received: by 2002:a05:6a00:1:b0:5dc:4b6:b18d with SMTP id h1-20020a056a00000100b005dc04b6b18dmr1350020pfk.26.1677573745013; Tue, 28 Feb 2023 00:42:25 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id u25-20020aa78499000000b005d6fcd8f9desm5681270pfn.94.2023.02.28.00.42.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 00:42:24 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v2 05/14] perf kvm: Introduce histograms data structures Date: Tue, 28 Feb 2023 16:41:38 +0800 Message-Id: <20230228084147.106167-6-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230228084147.106167-1-leo.yan@linaro.org> References: <20230228084147.106167-1-leo.yan@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" This is a preparation to support histograms in perf kvm tool. As first step, this patch defines histograms data structures and initialize them. Signed-off-by: Leo Yan --- tools/perf/builtin-kvm.c | 18 ++++++++++++++++++ tools/perf/util/kvm-stat.h | 1 + 2 files changed, 19 insertions(+) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 6eec0db2dda6..4ae54ba4fdaf 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -85,6 +85,20 @@ static struct kvm_event_key keys[] =3D { { NULL, NULL } }; =20 +struct kvm_hists { + struct hists hists; + struct perf_hpp_list list; +}; + +static struct kvm_hists kvm_hists; + +static int kvm_hists__init(void) +{ + __hists__init(&kvm_hists.hists, &kvm_hists.list); + perf_hpp_list__init(&kvm_hists.list); + return 0; +} + static const char *get_filename_for_perf_kvm(void) { const char *filename; @@ -957,6 +971,8 @@ static int kvm_events_live_report(struct perf_kvm_stat = *kvm) set_term_quiet_input(&save); init_kvm_event_record(kvm); =20 + kvm_hists__init(); + signal(SIGINT, sig_handler); signal(SIGTERM, sig_handler); =20 @@ -1152,6 +1168,8 @@ static int kvm_events_report_vcpu(struct perf_kvm_sta= t *kvm) init_kvm_event_record(kvm); setup_pager(); =20 + kvm_hists__init(); + ret =3D read_events(kvm); if (ret) goto exit; diff --git a/tools/perf/util/kvm-stat.h b/tools/perf/util/kvm-stat.h index 40a4b66cfee6..a3219829c448 100644 --- a/tools/perf/util/kvm-stat.h +++ b/tools/perf/util/kvm-stat.h @@ -5,6 +5,7 @@ #ifdef HAVE_KVM_STAT_SUPPORT =20 #include "tool.h" +#include "sort.h" #include "stat.h" #include "record.h" =20 --=20 2.34.1 From nobody Tue Sep 9 16:20:07 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9A0E0C64EC7 for ; Tue, 28 Feb 2023 08:43:10 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231195AbjB1InJ (ORCPT ); Tue, 28 Feb 2023 03:43:09 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51050 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230393AbjB1Imo (ORCPT ); Tue, 28 Feb 2023 03:42:44 -0500 Received: from mail-pl1-x634.google.com (mail-pl1-x634.google.com [IPv6:2607:f8b0:4864:20::634]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4C38F2BF34 for ; Tue, 28 Feb 2023 00:42:31 -0800 (PST) Received: by mail-pl1-x634.google.com with SMTP id ky4so9653991plb.3 for ; Tue, 28 Feb 2023 00:42:31 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=b0Hu2w1HCV6BLAJH+BUXhSI8OHGX3HrQUpTuSp+vt2M=; b=VHOnJBevYRYSJ1epcLVTVpBcrZ5CmX6c3gwAqRdrBjJvuiaEMfhNnTWH7Jh8HlIyT2 j3qky/eQhLlI+Nlu+qZtgGDDO0g3LHAMQERT66fq6A8bDmQBV0YH/PcfyQFNODGxyjpq vFPveBI3AxMrkUJWiAwV6n1jWroXngXuzZwo3CEFjc9VcHDj4BC9rpxVHZPFuHpkNx6G pqEfSSJrl3MC89ry60or1F6chie+yiVvm64q/NauO59k7dxX5Puly2P32DcwQI4o7QLC NFuYmAyAK58/hJHRFywf+DC1bn5HmS3GMgSmKtSJCe2VAYxXFrbrPPZDR/tO9ryOas/V PDkA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=b0Hu2w1HCV6BLAJH+BUXhSI8OHGX3HrQUpTuSp+vt2M=; b=L05VtWMZ1jXLj8rlyo+ae2Adv8G49LEIOIOys2+t1bVd1kQcjwsPkkgwViV4+yzmuI W40cNH4I5lND2QEkV2vesV4LbvceCbvrJm6/tA/89/avOTuDX974mDdrhnV5qbuP4sv6 +8Hc1leh/mkWba9nT+4kUTKxgooNA+wY9K8eeZXAMCa4buyZQ39G3lfrb1J6u5SDACHj U0jpCUJqE73MwWfNUbjUr/5BAfnggoQqsw8QFxcIVyfZdo/MB3ECkhMdODYUhV+qumGF 8hi9VCZ5eSMNoulnQRQoenipDAFh9W1zt5bn4ndv1j7mDn66mhoYLU5xgsPsQ0Nzfkxo WqBg== X-Gm-Message-State: AO0yUKVbzHoUIxua7HWNsKOijg0x0etVgmmmyjYsRffIfHnIDTY5jT+J 1E7B98+lcNOenwW+n7Lvr55Jpg== X-Google-Smtp-Source: AK7set90FndkZvwZX75PAvXzSK43HcqfjDAThyt8jjik07yQKZSrA0v/pKr4OrDENx9BF8tgALzGqQ== X-Received: by 2002:a05:6a20:6982:b0:cd:bd86:318e with SMTP id t2-20020a056a20698200b000cdbd86318emr3810088pzk.26.1677573748835; Tue, 28 Feb 2023 00:42:28 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id u25-20020aa78499000000b005d6fcd8f9desm5681270pfn.94.2023.02.28.00.42.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 00:42:28 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v2 06/14] perf kvm: Pass argument 'sample' to kvm_alloc_init_event() Date: Tue, 28 Feb 2023 16:41:39 +0800 Message-Id: <20230228084147.106167-7-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230228084147.106167-1-leo.yan@linaro.org> References: <20230228084147.106167-1-leo.yan@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" This patch adds an argument 'sample' for kvm_alloc_init_event(), and its caller functions are updated as well for passing down the 'sample' pointer. This is a preparation change to allow later patch to create histograms entries for kvm event, no any functionality changes. Signed-off-by: Leo Yan --- tools/perf/builtin-kvm.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 4ae54ba4fdaf..779881901a05 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -260,7 +260,8 @@ static bool kvm_event_expand(struct kvm_event *event, i= nt vcpu_id) } =20 static struct kvm_event *kvm_alloc_init_event(struct perf_kvm_stat *kvm, - struct event_key *key) + struct event_key *key, + struct perf_sample *sample __maybe_unused) { struct kvm_event *event; =20 @@ -277,7 +278,8 @@ static struct kvm_event *kvm_alloc_init_event(struct pe= rf_kvm_stat *kvm, } =20 static struct kvm_event *find_create_kvm_event(struct perf_kvm_stat *kvm, - struct event_key *key) + struct event_key *key, + struct perf_sample *sample) { struct kvm_event *event; struct list_head *head; @@ -290,7 +292,7 @@ static struct kvm_event *find_create_kvm_event(struct p= erf_kvm_stat *kvm, return event; } =20 - event =3D kvm_alloc_init_event(kvm, key); + event =3D kvm_alloc_init_event(kvm, key, sample); if (!event) return NULL; =20 @@ -300,15 +302,16 @@ static struct kvm_event *find_create_kvm_event(struct= perf_kvm_stat *kvm, =20 static bool handle_begin_event(struct perf_kvm_stat *kvm, struct vcpu_event_record *vcpu_record, - struct event_key *key, u64 timestamp) + struct event_key *key, + struct perf_sample *sample) { struct kvm_event *event =3D NULL; =20 if (key->key !=3D INVALID_KEY) - event =3D find_create_kvm_event(kvm, key); + event =3D find_create_kvm_event(kvm, key, sample); =20 vcpu_record->last_event =3D event; - vcpu_record->start_time =3D timestamp; + vcpu_record->start_time =3D sample->time; return true; } =20 @@ -375,12 +378,12 @@ static bool is_child_event(struct perf_kvm_stat *kvm, static bool handle_child_event(struct perf_kvm_stat *kvm, struct vcpu_event_record *vcpu_record, struct event_key *key, - struct perf_sample *sample __maybe_unused) + struct perf_sample *sample) { struct kvm_event *event =3D NULL; =20 if (key->key !=3D INVALID_KEY) - event =3D find_create_kvm_event(kvm, key); + event =3D find_create_kvm_event(kvm, key, sample); =20 vcpu_record->last_event =3D event; =20 @@ -429,7 +432,7 @@ static bool handle_end_event(struct perf_kvm_stat *kvm, return true; =20 if (!event) - event =3D find_create_kvm_event(kvm, key); + event =3D find_create_kvm_event(kvm, key, sample); =20 if (!event) return false; @@ -500,7 +503,7 @@ static bool handle_kvm_event(struct perf_kvm_stat *kvm, return true; =20 if (kvm->events_ops->is_begin_event(evsel, sample, &key)) - return handle_begin_event(kvm, vcpu_record, &key, sample->time); + return handle_begin_event(kvm, vcpu_record, &key, sample); =20 if (is_child_event(kvm, evsel, sample, &key)) return handle_child_event(kvm, vcpu_record, &key, sample); --=20 2.34.1 From nobody Tue Sep 9 16:20:07 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D58E7C64ED6 for ; Tue, 28 Feb 2023 08:43:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231147AbjB1InQ (ORCPT ); Tue, 28 Feb 2023 03:43:16 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51536 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230474AbjB1Imv (ORCPT ); Tue, 28 Feb 2023 03:42:51 -0500 Received: from mail-pl1-x633.google.com (mail-pl1-x633.google.com [IPv6:2607:f8b0:4864:20::633]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 86F7B2C679 for ; Tue, 28 Feb 2023 00:42:34 -0800 (PST) Received: by mail-pl1-x633.google.com with SMTP id bh1so9598641plb.11 for ; Tue, 28 Feb 2023 00:42:34 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=JCXvY3VOyromxWZSsh4iONVhiGPWxZ3OU8P5j9wqMDM=; b=mHa3wZ4GywafX9hnclLu9nn5NSKcgATH5FrysR3DIX0jEA8FhX8B2sADMTrve843Ad k8EMMHyMHGDBv7O3yhebbdoecjhSu6Zt9wBWuRRJsF8uKDCx5xFXwlH2N1t6tLpfMP2Z RvSYgr+m8PWRjzTBOF8ymbLHCbnrwyLzziNl/X4z1KLd2WvhvC0UEbQzOnZSZ7VFVyMC kD7k6G8Be4mi8pe5qgH1mNgZEzpKpgtUZtCfmrszQqTEH4Zz4PuqVEL8QkaHMG418wmh 3JUVbtBmA6PLZhWlRKrAagZcaeGzdxyPlxayIrsyzj2Y6fURu9WTcREIrGV5PB80v6UL AXxQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=JCXvY3VOyromxWZSsh4iONVhiGPWxZ3OU8P5j9wqMDM=; b=uQ81zZGmBDl9d90wxzWhsMruvhCybnCeuEim466ojo2ocl5V56V5AJnk2aEqyDJya6 eLIoOuds3R6T4qsYCXHZSd9WM81gWM4ADCeaj1od3dHg507tVP+8d+lIqWgfNJH8aZOs bv3SQ8aX8NZ/cWdmNExnAgCWro4dYRlOVpOClS0uMGxy6hzNK85ODp3RItfDQRtUvYDt a/BD4j2GqPzxLWf+YqqDHTW1Q7PDttBIZPj0UusnKwfs8KgNEIylr8WWMTUAbR8p8qvl sNsA9th3mHAg8+FwMWfHFWq7Ij1hBzO92Y6ulGP/yYkjDlzAfJTiRhzOjMWKtp2Gx665 F1ew== X-Gm-Message-State: AO0yUKXMmWEYhT9ph2rGzzdmDbwgg2/wiR3bt8FgfzEzUKzmX4yBGCNt B5nccT0g0iMfORHoAx+5TqrMRQ== X-Google-Smtp-Source: AK7set9bL9mt87w1xeJDL0pksFC1N7K+o8xP6omLFrYoHQY1VugzdXJ2ybddTxs/ZQzEluFuTRIjdA== X-Received: by 2002:a05:6a20:3d8c:b0:cc:f39:5094 with SMTP id s12-20020a056a203d8c00b000cc0f395094mr3032509pzi.30.1677573752594; Tue, 28 Feb 2023 00:42:32 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id u25-20020aa78499000000b005d6fcd8f9desm5681270pfn.94.2023.02.28.00.42.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 00:42:32 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v2 07/14] perf kvm: Parse address location for samples Date: Tue, 28 Feb 2023 16:41:40 +0800 Message-Id: <20230228084147.106167-8-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230228084147.106167-1-leo.yan@linaro.org> References: <20230228084147.106167-1-leo.yan@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Parse address location for samples and save it into the structure 'perf_kvm_stat', it is to be used by histograms entry. Signed-off-by: Leo Yan --- tools/perf/builtin-kvm.c | 5 +++++ tools/perf/util/kvm-stat.h | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 779881901a05..a9f467926bdd 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -704,6 +704,11 @@ static int process_sample_event(struct perf_tool *tool, if (skip_sample(kvm, sample)) return 0; =20 + if (machine__resolve(machine, &kvm->al, sample) < 0) { + pr_warning("Fail to resolve address location, skip sample.\n"); + return 0; + } + thread =3D machine__findnew_thread(machine, sample->pid, sample->tid); if (thread =3D=3D NULL) { pr_debug("problem processing %d event, skipping it.\n", diff --git a/tools/perf/util/kvm-stat.h b/tools/perf/util/kvm-stat.h index a3219829c448..80d5c5a9ae31 100644 --- a/tools/perf/util/kvm-stat.h +++ b/tools/perf/util/kvm-stat.h @@ -7,6 +7,7 @@ #include "tool.h" #include "sort.h" #include "stat.h" +#include "symbol.h" #include "record.h" =20 struct evsel; @@ -86,6 +87,9 @@ struct perf_kvm_stat { const char *sort_key; int trace_vcpu; =20 + /* Used when process events */ + struct addr_location al; + struct exit_reasons_table *exit_reasons; const char *exit_reasons_isa; =20 --=20 2.34.1 From nobody Tue Sep 9 16:20:07 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9949EC64ED6 for ; Tue, 28 Feb 2023 08:43:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230471AbjB1In0 (ORCPT ); Tue, 28 Feb 2023 03:43:26 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50844 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230517AbjB1Im4 (ORCPT ); Tue, 28 Feb 2023 03:42:56 -0500 Received: from mail-pl1-x62d.google.com (mail-pl1-x62d.google.com [IPv6:2607:f8b0:4864:20::62d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8167B2BEE8 for ; Tue, 28 Feb 2023 00:42:39 -0800 (PST) Received: by mail-pl1-x62d.google.com with SMTP id n6so8246997plf.5 for ; Tue, 28 Feb 2023 00:42:39 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=dkGLzxiRgSOZTh04Z+2xATChlICYHMpA+J8qmtvpz8Q=; b=bYI3H6niPj1M255ceIj/3IHT0DykJl98GQ7A36QcZs2gdOeEfQkaKxZvOUKc/1gD+/ vGVrKLrWCiiOFG7cpM2geG31ZZPs2i5iz0371D/r7edsVv8fauTLbuLrOzr0CyFpxTMA ugl32UO2xsQXRT8oinTxA3rb/fi7Dv78tm5t4xuyas9lNJh9JRmNyW9vdHx3kk52DBmh xXRkyt9adtoMkYaTfAh1LE5OswQstVigdkrdWdSWTsdSvAcEZM9TCcCRZo94kz7xl+Fj UERgC0fkONR3ZrBdeCLMCiQov3rP+imEo4u8Ws6z5dDyy1Y6i65EAR9I4ESz9MPmb4do JyWQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=dkGLzxiRgSOZTh04Z+2xATChlICYHMpA+J8qmtvpz8Q=; b=2OqNJ55hRjLukNKFBPEmHazyQ8fgc166Y5BYsXg39NM9qnyBwM+W4kQ22Wz7bNzDW6 btzqMDA0CtJHedG6pzC5/jTLJgXBcBksjAbsll4xu63XAPqZqBCUbpyJFMsTXeTNJGDb 0gbhTxn/kZZ7f4xKsTScpT/g+dQsZIBhNjGmtKHHf5/H8uWGuDWQkKAxeRO2PIzHlIIt NxnXhrKynEUHmKh05lyC2SgECgVIIa/QjkQSn6AFc/zZWaxibQm3Vsy+ovtzG+/JpQzl IXCXhK6xZBcOQR751Lv+L5Ev72nhtFb5KgHN1QQl2GciPCsD5By8v0Kf7AMutw5SYnx4 mKmQ== X-Gm-Message-State: AO0yUKXYzXdLcUgKqcuVez5Y2gR9W5x+KYfwL//nAipENwprdleDdee/ G4Ap117bR50ByqFZWmN8XavVog== X-Google-Smtp-Source: AK7set/5FuyPzdlCVwH9WJzVClF6Rc53wNebBmKizFH8bU1NrcynmiL1WYW1fw1OalM52ISkFjFbpw== X-Received: by 2002:a05:6a20:54a3:b0:cd:47dc:82b5 with SMTP id i35-20020a056a2054a300b000cd47dc82b5mr3142913pzk.21.1677573756612; Tue, 28 Feb 2023 00:42:36 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id u25-20020aa78499000000b005d6fcd8f9desm5681270pfn.94.2023.02.28.00.42.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 00:42:36 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v2 08/14] perf kvm: Add dimensions for KVM event statistics Date: Tue, 28 Feb 2023 16:41:41 +0800 Message-Id: <20230228084147.106167-9-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230228084147.106167-1-leo.yan@linaro.org> References: <20230228084147.106167-1-leo.yan@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" To support KVM event statistics, this patch firstly registers histograms columns and sorting fields; every column or field has its own format structure, the format structure is dereferenced to access the dimension, finally the dimension provides the comparison callback for sorting result. Signed-off-by: Leo Yan --- tools/perf/builtin-kvm.c | 239 +++++++++++++++++++++++++++++++++++-- tools/perf/util/kvm-stat.h | 2 + 2 files changed, 234 insertions(+), 7 deletions(-) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index a9f467926bdd..da84f5063d4d 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -70,9 +70,9 @@ static int cmp_event_ ## func(struct kvm_event *one, \ get_event_ ##func(two, vcpu); \ } =20 -GET_EVENT_KEY(time, time); -GET_EVENT_KEY(max, stats.max); -GET_EVENT_KEY(min, stats.min); +COMPARE_EVENT_KEY(time, time); +COMPARE_EVENT_KEY(max, stats.max); +COMPARE_EVENT_KEY(min, stats.min); COMPARE_EVENT_KEY(count, stats.n); COMPARE_EVENT_KEY(mean, stats.mean); =20 @@ -90,13 +90,238 @@ struct kvm_hists { struct perf_hpp_list list; }; =20 +struct kvm_dimension { + const char *name; + int64_t (*cmp)(struct perf_hpp_fmt *fmt, struct hist_entry *left, + struct hist_entry *right); +}; + +struct kvm_fmt { + struct perf_hpp_fmt fmt; + struct kvm_dimension *dim; +}; + static struct kvm_hists kvm_hists; =20 -static int kvm_hists__init(void) +static int64_t +empty_cmp(struct perf_hpp_fmt *fmt __maybe_unused, + struct hist_entry *left __maybe_unused, + struct hist_entry *right __maybe_unused) +{ + return 0; +} + +static struct kvm_dimension dim_event =3D { + .name =3D "name", + .cmp =3D empty_cmp, +}; + +#define EV_METRIC_CMP(metric) \ +static int64_t ev_cmp_##metric(struct perf_hpp_fmt *fmt __maybe_unused, \ + struct hist_entry *left, \ + struct hist_entry *right) \ +{ \ + struct kvm_event *event_left; \ + struct kvm_event *event_right; \ + struct perf_kvm_stat *perf_kvm; \ + \ + event_left =3D container_of(left, struct kvm_event, he); \ + event_right =3D container_of(right, struct kvm_event, he); \ + \ + perf_kvm =3D event_left->perf_kvm; \ + return cmp_event_##metric(event_left, event_right, \ + perf_kvm->trace_vcpu); \ +} + +EV_METRIC_CMP(time) +EV_METRIC_CMP(count) +EV_METRIC_CMP(max) +EV_METRIC_CMP(min) +EV_METRIC_CMP(mean) + +static struct kvm_dimension dim_time =3D { + .name =3D "time", + .cmp =3D ev_cmp_time, +}; + +static struct kvm_dimension dim_count =3D { + .name =3D "sample", + .cmp =3D ev_cmp_count, +}; + +static struct kvm_dimension dim_max_time =3D { + .name =3D "max_t", + .cmp =3D ev_cmp_max, +}; + +static struct kvm_dimension dim_min_time =3D { + .name =3D "min_t", + .cmp =3D ev_cmp_min, +}; + +static struct kvm_dimension dim_mean_time =3D { + .name =3D "mean_t", + .cmp =3D ev_cmp_mean, +}; + +static struct kvm_dimension *dimensions[] =3D { + &dim_event, + &dim_time, + &dim_count, + &dim_max_time, + &dim_min_time, + &dim_mean_time, + NULL, +}; + +static bool fmt_equal(struct perf_hpp_fmt *a, struct perf_hpp_fmt *b) +{ + struct kvm_fmt *kvm_fmt_a =3D container_of(a, struct kvm_fmt, fmt); + struct kvm_fmt *kvm_fmt_b =3D container_of(b, struct kvm_fmt, fmt); + + return kvm_fmt_a->dim =3D=3D kvm_fmt_b->dim; +} + +static void fmt_free(struct perf_hpp_fmt *fmt) +{ + struct kvm_fmt *kvm_fmt; + + kvm_fmt =3D container_of(fmt, struct kvm_fmt, fmt); + free(kvm_fmt); +} + +static struct kvm_dimension *get_dimension(const char *name) { + unsigned int i; + + for (i =3D 0; dimensions[i] !=3D NULL; i++) { + if (!strcmp(dimensions[i]->name, name)) + return dimensions[i]; + } + + return NULL; +} + +static struct kvm_fmt *get_format(const char *name) +{ + struct kvm_dimension *dim =3D get_dimension(name); + struct kvm_fmt *kvm_fmt; + struct perf_hpp_fmt *fmt; + + if (!dim) + return NULL; + + kvm_fmt =3D zalloc(sizeof(*kvm_fmt)); + if (!kvm_fmt) + return NULL; + + kvm_fmt->dim =3D dim; + + fmt =3D &kvm_fmt->fmt; + INIT_LIST_HEAD(&fmt->list); + INIT_LIST_HEAD(&fmt->sort_list); + fmt->cmp =3D dim->cmp; + fmt->sort =3D dim->cmp; + fmt->color =3D NULL; + fmt->entry =3D NULL; + fmt->header =3D NULL; + fmt->width =3D NULL; + fmt->collapse =3D dim->cmp; + fmt->equal =3D fmt_equal; + fmt->free =3D fmt_free; + + return kvm_fmt; +} + +static int kvm_hists__init_output(struct perf_hpp_list *hpp_list, char *na= me) +{ + struct kvm_fmt *kvm_fmt =3D get_format(name); + + if (!kvm_fmt) { + reset_dimensions(); + return output_field_add(hpp_list, name); + } + + perf_hpp_list__column_register(hpp_list, &kvm_fmt->fmt); + return 0; +} + +static int kvm_hists__init_sort(struct perf_hpp_list *hpp_list, char *name) +{ + struct kvm_fmt *kvm_fmt =3D get_format(name); + + if (!kvm_fmt) { + reset_dimensions(); + return sort_dimension__add(hpp_list, name, NULL, 0); + } + + perf_hpp_list__register_sort_field(hpp_list, &kvm_fmt->fmt); + return 0; +} + +static int kvm_hpp_list__init(char *list, + struct perf_hpp_list *hpp_list, + int (*fn)(struct perf_hpp_list *hpp_list, + char *name)) +{ + char *tmp, *tok; + int ret; + + if (!list || !fn) + return 0; + + for (tok =3D strtok_r(list, ", ", &tmp); tok; + tok =3D strtok_r(NULL, ", ", &tmp)) { + ret =3D fn(hpp_list, tok); + if (!ret) + continue; + + /* Handle errors */ + if (ret =3D=3D -EINVAL) + pr_err("Invalid field key: '%s'", tok); + else if (ret =3D=3D -ESRCH) + pr_err("Unknown field key: '%s'", tok); + else + pr_err("Fail to initialize for field key: '%s'", tok); + + break; + } + + return ret; +} + +static int kvm_hpp_list__parse(struct perf_hpp_list *hpp_list, + const char *output_, const char *sort_) +{ + char *output =3D output_ ? strdup(output_) : NULL; + char *sort =3D sort_ ? strdup(sort_) : NULL; + int ret; + + ret =3D kvm_hpp_list__init(output, hpp_list, kvm_hists__init_output); + if (ret) + goto out; + + ret =3D kvm_hpp_list__init(sort, hpp_list, kvm_hists__init_sort); + if (ret) + goto out; + + /* Copy sort keys to output fields */ + perf_hpp__setup_output_field(hpp_list); + +out: + free(output); + free(sort); + return ret; +} + +static int kvm_hists__init(struct perf_kvm_stat *kvm) +{ + const char *output_columns =3D "name,sample,time,max_t,min_t,mean_t"; + __hists__init(&kvm_hists.hists, &kvm_hists.list); perf_hpp_list__init(&kvm_hists.list); - return 0; + return kvm_hpp_list__parse(&kvm_hists.list, output_columns, + kvm->sort_key); } =20 static const char *get_filename_for_perf_kvm(void) @@ -979,7 +1204,7 @@ static int kvm_events_live_report(struct perf_kvm_stat= *kvm) set_term_quiet_input(&save); init_kvm_event_record(kvm); =20 - kvm_hists__init(); + kvm_hists__init(kvm); =20 signal(SIGINT, sig_handler); signal(SIGTERM, sig_handler); @@ -1176,7 +1401,7 @@ static int kvm_events_report_vcpu(struct perf_kvm_sta= t *kvm) init_kvm_event_record(kvm); setup_pager(); =20 - kvm_hists__init(); + kvm_hists__init(kvm); =20 ret =3D read_events(kvm); if (ret) diff --git a/tools/perf/util/kvm-stat.h b/tools/perf/util/kvm-stat.h index 80d5c5a9ae31..ca5796959f66 100644 --- a/tools/perf/util/kvm-stat.h +++ b/tools/perf/util/kvm-stat.h @@ -40,6 +40,8 @@ struct kvm_event { #define DEFAULT_VCPU_NUM 8 int max_vcpu; struct kvm_event_stats *vcpu; + + struct hist_entry he; }; =20 typedef int (*key_cmp_fun)(struct kvm_event*, struct kvm_event*, int); --=20 2.34.1 From nobody Tue Sep 9 16:20:07 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 5EEB9C7EE30 for ; Tue, 28 Feb 2023 08:43:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231173AbjB1In3 (ORCPT ); Tue, 28 Feb 2023 03:43:29 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52220 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231161AbjB1Im4 (ORCPT ); Tue, 28 Feb 2023 03:42:56 -0500 Received: from mail-pg1-x534.google.com (mail-pg1-x534.google.com [IPv6:2607:f8b0:4864:20::534]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id BA6D02CC4B for ; Tue, 28 Feb 2023 00:42:40 -0800 (PST) Received: by mail-pg1-x534.google.com with SMTP id 132so5131911pgh.13 for ; Tue, 28 Feb 2023 00:42:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=FKs+rsPj1hm0j71DGE8gonxUEIM8JV3GuGWVFR89M0w=; b=ivB6Lv/xQDSKMmtQeR38o5KccivOcwIKQ0Yyj89c63Lcn2O3y8WITjotVTMqyublB9 RCOYf8yCJC301oV0HocHKLhTzQjUXV9UJ2y6+NdWMFLzvAPqdLqoeKpdKl/P5uftWt/j 7Hmz5aCbIofdizDrvxB2BsHgH+yxPA7XeWcHQSaV5oMw4Ts+sGTSO1sXrlryXKGPKU/n LhOkyC2se+nl2/jbV7YIT3ods2rX5BGcQ+G1bm+1hTZZnqU8MtQ0EdbGQkZ2U8md/FhY JC7WEM9IxQrr91jKFjBe4iqU8ooI97vaJbWhwxefHdjGJj3mBirUrQx2PW80+psPTy4M LLmQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=FKs+rsPj1hm0j71DGE8gonxUEIM8JV3GuGWVFR89M0w=; b=Nwg1Ej8wNyY9PhKzF+bGg0nk+Z/dyYJjsQyW5un3rizSFQbRaD+eoBNkAyZ5ZpbupL zDPDFzNYJx8M1ZeKbttHdtRLAVXgTA5vfdZuN2UAa0qHH3CVGwSE2Jg64V/eAdrF4pfl AnAR8/QIaKZJvKvRORMTVwvFIVrbZnNd7kJB1WtP/Q9CWpK02W6OQ0uBr3e4l5zRGRS/ WQQwOxaKWeOLKJTflkGLmbN0RLgJbDAMirYQMOtLCZj9tco8FkzjsEMBLR5dhn8VJhIV 7XOkFF4wLU8BU6+YRT4KBRA0D04mIgPHKcq2Scq44qXe8ZjAS8AHvPrtc/G4RbyfeAvW m9+g== X-Gm-Message-State: AO0yUKWDG2JYtrwWv7TijFeFW4d/rGyQHtZxlATCeLDGWbj9H1ySKYtq XpkUfjvUy/moxg/o/0hIbmPYcA== X-Google-Smtp-Source: AK7set8tD3J3ir76yLcdhpbI8anvb/Ayk4GpzfJOiOATJ0V3nm7fAj/tUPl/DcX2QqnfUZw9ARBZ/A== X-Received: by 2002:a62:8406:0:b0:5f1:468b:c88 with SMTP id k6-20020a628406000000b005f1468b0c88mr2145899pfd.27.1677573760353; Tue, 28 Feb 2023 00:42:40 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id u25-20020aa78499000000b005d6fcd8f9desm5681270pfn.94.2023.02.28.00.42.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 00:42:39 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v2 09/14] perf kvm: Use histograms list to replace cached list Date: Tue, 28 Feb 2023 16:41:42 +0800 Message-Id: <20230228084147.106167-10-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230228084147.106167-1-leo.yan@linaro.org> References: <20230228084147.106167-1-leo.yan@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" perf kvm tool defines its own cached list which is managed with RB tree, histograms also provide RB tree to manage data entries. Since now we have introduced histograms in the tool, it's not necessary to use the self defined list and we can directly use histograms list to manage KVM events. This patch changes to use histograms list to track KVM events, and it invokes the common function hists__output_resort_cb() to sort result, this also give us flexibility to extend more sorting key words easily. After histograms list supported, the cached list is redundant so remove the relevant code for it. Signed-off-by: Leo Yan --- tools/perf/builtin-kvm.c | 186 +++++++++++++++++++------------------ tools/perf/util/kvm-stat.h | 7 -- 2 files changed, 94 insertions(+), 99 deletions(-) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index da84f5063d4d..32dc697ff707 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -421,44 +421,37 @@ struct vcpu_event_record { struct kvm_event *last_event; }; =20 - -static void init_kvm_event_record(struct perf_kvm_stat *kvm) -{ - unsigned int i; - - for (i =3D 0; i < EVENTS_CACHE_SIZE; i++) - INIT_LIST_HEAD(&kvm->kvm_events_cache[i]); -} - #ifdef HAVE_TIMERFD_SUPPORT -static void clear_events_cache_stats(struct list_head *kvm_events_cache) +static void clear_events_cache_stats(void) { - struct list_head *head; + struct rb_root_cached *root; + struct rb_node *nd; struct kvm_event *event; - unsigned int i; - int j; - - for (i =3D 0; i < EVENTS_CACHE_SIZE; i++) { - head =3D &kvm_events_cache[i]; - list_for_each_entry(event, head, hash_entry) { - /* reset stats for event */ - event->total.time =3D 0; - init_stats(&event->total.stats); - - for (j =3D 0; j < event->max_vcpu; ++j) { - event->vcpu[j].time =3D 0; - init_stats(&event->vcpu[j].stats); - } + int i; + + if (hists__has(&kvm_hists.hists, need_collapse)) + root =3D &kvm_hists.hists.entries_collapsed; + else + root =3D kvm_hists.hists.entries_in; + + for (nd =3D rb_first_cached(root); nd; nd =3D rb_next(nd)) { + struct hist_entry *he; + + he =3D rb_entry(nd, struct hist_entry, rb_node_in); + event =3D container_of(he, struct kvm_event, he); + + /* reset stats for event */ + event->total.time =3D 0; + init_stats(&event->total.stats); + + for (i =3D 0; i < event->max_vcpu; ++i) { + event->vcpu[i].time =3D 0; + init_stats(&event->vcpu[i].stats); } } } #endif =20 -static int kvm_events_hash_fn(u64 key) -{ - return key & (EVENTS_CACHE_SIZE - 1); -} - static bool kvm_event_expand(struct kvm_event *event, int vcpu_id) { int old_max_vcpu =3D event->max_vcpu; @@ -484,21 +477,51 @@ static bool kvm_event_expand(struct kvm_event *event,= int vcpu_id) return true; } =20 +static void *kvm_he_zalloc(size_t size) +{ + struct kvm_event *kvm_ev; + + kvm_ev =3D zalloc(size + sizeof(*kvm_ev)); + if (!kvm_ev) + return NULL; + + return &kvm_ev->he; +} + +static void kvm_he_free(void *he) +{ + struct kvm_event *kvm_ev; + + kvm_ev =3D container_of(he, struct kvm_event, he); + free(kvm_ev); +} + +static struct hist_entry_ops kvm_ev_entry_ops =3D { + .new =3D kvm_he_zalloc, + .free =3D kvm_he_free, +}; + static struct kvm_event *kvm_alloc_init_event(struct perf_kvm_stat *kvm, struct event_key *key, - struct perf_sample *sample __maybe_unused) + struct perf_sample *sample) { struct kvm_event *event; + struct hist_entry *he; =20 - event =3D zalloc(sizeof(*event)); - if (!event) { - pr_err("Not enough memory\n"); + he =3D hists__add_entry_ops(&kvm_hists.hists, &kvm_ev_entry_ops, + &kvm->al, NULL, NULL, NULL, sample, true); + if (he =3D=3D NULL) { + pr_err("Failed to allocate hist entry\n"); return NULL; } =20 + hists__inc_nr_samples(&kvm_hists.hists, 0); + + event =3D container_of(he, struct kvm_event, he); event->perf_kvm =3D kvm; event->key =3D *key; init_stats(&event->total.stats); + return event; } =20 @@ -507,22 +530,26 @@ static struct kvm_event *find_create_kvm_event(struct= perf_kvm_stat *kvm, struct perf_sample *sample) { struct kvm_event *event; - struct list_head *head; + struct rb_root_cached *root; + struct rb_node *nd; =20 BUG_ON(key->key =3D=3D INVALID_KEY); =20 - head =3D &kvm->kvm_events_cache[kvm_events_hash_fn(key->key)]; - list_for_each_entry(event, head, hash_entry) { + if (hists__has(&kvm_hists.hists, need_collapse)) + root =3D &kvm_hists.hists.entries_collapsed; + else + root =3D kvm_hists.hists.entries_in; + + for (nd =3D rb_first_cached(root); nd; nd =3D rb_next(nd)) { + struct hist_entry *he =3D rb_entry(nd, struct hist_entry, + rb_node_in); + + event =3D container_of(he, struct kvm_event, he); if (event->key.key =3D=3D key->key && event->key.info =3D=3D key->info) return event; } =20 - event =3D kvm_alloc_init_event(kvm, key, sample); - if (!event) - return NULL; - - list_add(&event->hash_entry, head); - return event; + return kvm_alloc_init_event(kvm, key, sample); } =20 static bool handle_begin_event(struct perf_kvm_stat *kvm, @@ -754,58 +781,29 @@ static bool select_key(struct perf_kvm_stat *kvm) return false; } =20 -static void insert_to_result(struct rb_root *result, struct kvm_event *eve= nt, - key_cmp_fun bigger, int vcpu) -{ - struct rb_node **rb =3D &result->rb_node; - struct rb_node *parent =3D NULL; - struct kvm_event *p; - - while (*rb) { - p =3D container_of(*rb, struct kvm_event, rb); - parent =3D *rb; - - if (bigger(event, p, vcpu) > 0) - rb =3D &(*rb)->rb_left; - else - rb =3D &(*rb)->rb_right; - } - - rb_link_node(&event->rb, parent, rb); - rb_insert_color(&event->rb, result); -} - static bool event_is_valid(struct kvm_event *event, int vcpu) { return !!get_event_count(event, vcpu); } =20 -static void sort_result(struct perf_kvm_stat *kvm) +static int filter_cb(struct hist_entry *he, void *arg __maybe_unused) { - unsigned int i; - int vcpu =3D kvm->trace_vcpu; struct kvm_event *event; + struct perf_kvm_stat *perf_kvm; =20 - for (i =3D 0; i < EVENTS_CACHE_SIZE; i++) { - list_for_each_entry(event, &kvm->kvm_events_cache[i], hash_entry) { - if (event_is_valid(event, vcpu)) { - insert_to_result(&kvm->result, event, - kvm->compare, vcpu); - } - } - } + event =3D container_of(he, struct kvm_event, he); + perf_kvm =3D event->perf_kvm; + if (!event_is_valid(event, perf_kvm->trace_vcpu)) + he->filtered =3D 1; + else + he->filtered =3D 0; + return 0; } =20 -/* returns left most element of result, and erase it */ -static struct kvm_event *pop_from_result(struct rb_root *result) +static void sort_result(void) { - struct rb_node *node =3D rb_first(result); - - if (!node) - return NULL; - - rb_erase(node, result); - return container_of(node, struct kvm_event, rb); + hists__collapse_resort(&kvm_hists.hists, NULL); + hists__output_resort_cb(&kvm_hists.hists, NULL, filter_cb); } =20 static void print_vcpu_info(struct perf_kvm_stat *kvm) @@ -848,6 +846,7 @@ static void print_result(struct perf_kvm_stat *kvm) char decode[decode_str_len]; struct kvm_event *event; int vcpu =3D kvm->trace_vcpu; + struct rb_node *nd; =20 if (kvm->live) { puts(CONSOLE_CLEAR); @@ -866,9 +865,15 @@ static void print_result(struct perf_kvm_stat *kvm) pr_info("%16s ", "Avg time"); pr_info("\n\n"); =20 - while ((event =3D pop_from_result(&kvm->result))) { + for (nd =3D rb_first_cached(&kvm_hists.hists.entries); nd; nd =3D rb_next= (nd)) { + struct hist_entry *he; u64 ecount, etime, max, min; =20 + he =3D rb_entry(nd, struct hist_entry, rb_node); + if (he->filtered) + continue; + + event =3D container_of(he, struct kvm_event, he); ecount =3D get_event_count(event, vcpu); etime =3D get_event_time(event, vcpu); max =3D get_event_max(event, vcpu); @@ -1142,11 +1147,11 @@ static int perf_kvm__handle_timerfd(struct perf_kvm= _stat *kvm) pr_debug("Missed timer beats: %" PRIu64 "\n", c-1); =20 /* update display */ - sort_result(kvm); + sort_result(); print_result(kvm); =20 /* reset counts */ - clear_events_cache_stats(kvm->kvm_events_cache); + clear_events_cache_stats(); kvm->total_count =3D 0; kvm->total_time =3D 0; kvm->lost_events =3D 0; @@ -1202,8 +1207,6 @@ static int kvm_events_live_report(struct perf_kvm_sta= t *kvm) } =20 set_term_quiet_input(&save); - init_kvm_event_record(kvm); - kvm_hists__init(kvm); =20 signal(SIGINT, sig_handler); @@ -1250,7 +1253,7 @@ static int kvm_events_live_report(struct perf_kvm_sta= t *kvm) evlist__disable(kvm->evlist); =20 if (err =3D=3D 0) { - sort_result(kvm); + sort_result(); print_result(kvm); } =20 @@ -1398,7 +1401,6 @@ static int kvm_events_report_vcpu(struct perf_kvm_sta= t *kvm) if (!register_kvm_events_ops(kvm)) goto exit; =20 - init_kvm_event_record(kvm); setup_pager(); =20 kvm_hists__init(kvm); @@ -1407,7 +1409,7 @@ static int kvm_events_report_vcpu(struct perf_kvm_sta= t *kvm) if (ret) goto exit; =20 - sort_result(kvm); + sort_result(); print_result(kvm); =20 exit: diff --git a/tools/perf/util/kvm-stat.h b/tools/perf/util/kvm-stat.h index ca5796959f66..c38d320c7cbe 100644 --- a/tools/perf/util/kvm-stat.h +++ b/tools/perf/util/kvm-stat.h @@ -30,7 +30,6 @@ struct perf_kvm_stat; =20 struct kvm_event { struct list_head hash_entry; - struct rb_node rb; =20 struct perf_kvm_stat *perf_kvm; struct event_key key; @@ -75,9 +74,6 @@ struct exit_reasons_table { const char *reason; }; =20 -#define EVENTS_BITS 12 -#define EVENTS_CACHE_SIZE (1UL << EVENTS_BITS) - struct perf_kvm_stat { struct perf_tool tool; struct record_opts opts; @@ -97,7 +93,6 @@ struct perf_kvm_stat { =20 struct kvm_events_ops *events_ops; key_cmp_fun compare; - struct list_head kvm_events_cache[EVENTS_CACHE_SIZE]; =20 u64 total_time; u64 total_count; @@ -106,8 +101,6 @@ struct perf_kvm_stat { =20 struct intlist *pid_list; =20 - struct rb_root result; - int timerfd; unsigned int display_time; bool live; --=20 2.34.1 From nobody Tue Sep 9 16:20:07 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 28E0FC7EE30 for ; Tue, 28 Feb 2023 08:43:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230311AbjB1Inr (ORCPT ); Tue, 28 Feb 2023 03:43:47 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:52646 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230490AbjB1InH (ORCPT ); Tue, 28 Feb 2023 03:43:07 -0500 Received: from mail-pf1-x429.google.com (mail-pf1-x429.google.com [IPv6:2607:f8b0:4864:20::429]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EE16D2B2AD for ; Tue, 28 Feb 2023 00:42:45 -0800 (PST) Received: by mail-pf1-x429.google.com with SMTP id a7so5181156pfx.10 for ; Tue, 28 Feb 2023 00:42:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=hjL18aIBPgYfHqrjofZNutkN8+DYauLGt6A7ZGJ8B24=; b=R7n+tvnkno2FYxYX3IUx7j3vvWvMtUuuapv0NKmYlu3yZjFjX/5C6/LyuT0LTuUdns DY3nDRyac832UHNLvQISEgrD4151zxnCMptuaLtHNdNh59pfo1j1rza4k1LoiPxtA9Wu wyHeIZgVDsKuLScYJFS03xJLHlZ6eNyTjn/dgHwvulh8ye7XJXcCjPp16UDWV0edkmFv YTeEeQKWc2J/aMUr6PRonHF04Scm6rTAeHr8mHfQWP0XFvMuJ8E389sKJj+aoRce+mYb eInH34QcOaIdIN2PWDewKbQEH6qE8VuvC3IjoLYsTyOhpnMO7rsoa597L076WyQF3vVZ lzhQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=hjL18aIBPgYfHqrjofZNutkN8+DYauLGt6A7ZGJ8B24=; b=BLFPpKlh2IGAjpdtbalMr75UazreGPescpAEXJ/23XcdHPmNv1E1SYNSObS6jVSU0t T7T9SRbaHoWlkFXvz8moJlcviuShvC1RvdIibHhCl1Izy8CXl7FMUau9CpUog5fJX8xu o88o/2RN4GuSNEtG+Fu5qJUdcbwsaM0IlAgisaia8btchR7yEwYeUI1GtbCvmDyvmVDR x2kRMMQttMu+b+qzGBu0Ud0peXC5aTfCdNpIkidYxWEK9FTwth6OTy6U/WY/S6SFN+R+ 7E+55dMWgcLw6/ZZr4+8pFj7GRYKmoKh7Qqil6YA4E0qgAsGJqX5xxZOnizUYVu8WeJ4 ssBw== X-Gm-Message-State: AO0yUKVRVbyBBjLdfS6iOTEM8Cr43Cnaa4Ey578JzJh1Fw0geBuLm7m7 ghFA9SfFkxS/VKDYAthIyhivag== X-Google-Smtp-Source: AK7set+8S/+rOVRikEOYR1B+03WN24sCAuRM5Dbx9Z7KZB8NYY4ehla2JBwO/GaD/BoCrAZnhnVxIQ== X-Received: by 2002:aa7:9acc:0:b0:600:cc40:258c with SMTP id x12-20020aa79acc000000b00600cc40258cmr1689839pfp.10.1677573764099; Tue, 28 Feb 2023 00:42:44 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id u25-20020aa78499000000b005d6fcd8f9desm5681270pfn.94.2023.02.28.00.42.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 00:42:43 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v2 10/14] perf kvm: Polish sorting key Date: Tue, 28 Feb 2023 16:41:43 +0800 Message-Id: <20230228084147.106167-11-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230228084147.106167-1-leo.yan@linaro.org> References: <20230228084147.106167-1-leo.yan@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Since histograms supports sorting, the tool doesn't need to maintain the mapping between the sorting keys and the corresponding comparison callbacks, therefore, this patch removes structure kvm_event_key. But we still need to validate the sorting key, this patch uses an array for sorting keys and renames function select_key() to is_valid_key() to validate the sorting key passed by user. Signed-off-by: Leo Yan --- tools/perf/builtin-kvm.c | 27 +++++++++------------------ tools/perf/util/kvm-stat.h | 8 -------- 2 files changed, 9 insertions(+), 26 deletions(-) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 32dc697ff707..741ba65bf092 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -76,15 +76,6 @@ COMPARE_EVENT_KEY(min, stats.min); COMPARE_EVENT_KEY(count, stats.n); COMPARE_EVENT_KEY(mean, stats.mean); =20 -#define DEF_SORT_NAME_KEY(name, compare_key) \ - { #name, cmp_event_ ## compare_key } - -static struct kvm_event_key keys[] =3D { - DEF_SORT_NAME_KEY(sample, count), - DEF_SORT_NAME_KEY(time, mean), - { NULL, NULL } -}; - struct kvm_hists { struct hists hists; struct perf_hpp_list list; @@ -766,18 +757,18 @@ static bool handle_kvm_event(struct perf_kvm_stat *kv= m, return true; } =20 -static bool select_key(struct perf_kvm_stat *kvm) +static bool is_valid_key(struct perf_kvm_stat *kvm) { + const char *key_array[] =3D { + "sample", "time", "max_t", "min_t", "mean_t", + }; int i; =20 - for (i =3D 0; keys[i].name; i++) { - if (!strcmp(keys[i].name, kvm->sort_key)) { - kvm->compare =3D keys[i].key; + for (i =3D 0; ARRAY_SIZE(key_array); i++) + if (!strcmp(key_array[i], kvm->sort_key)) return true; - } - } =20 - pr_err("Unknown compare key:%s\n", kvm->sort_key); + pr_err("Unsupported key: %s\n", kvm->sort_key); return false; } =20 @@ -1201,7 +1192,7 @@ static int kvm_events_live_report(struct perf_kvm_sta= t *kvm) return ret; =20 if (!verify_vcpu(kvm->trace_vcpu) || - !select_key(kvm) || + !is_valid_key(kvm) || !register_kvm_events_ops(kvm)) { goto out; } @@ -1395,7 +1386,7 @@ static int kvm_events_report_vcpu(struct perf_kvm_sta= t *kvm) if (!verify_vcpu(vcpu)) goto exit; =20 - if (!select_key(kvm)) + if (!is_valid_key(kvm)) goto exit; =20 if (!register_kvm_events_ops(kvm)) diff --git a/tools/perf/util/kvm-stat.h b/tools/perf/util/kvm-stat.h index c38d320c7cbe..a8e919ca59f4 100644 --- a/tools/perf/util/kvm-stat.h +++ b/tools/perf/util/kvm-stat.h @@ -43,13 +43,6 @@ struct kvm_event { struct hist_entry he; }; =20 -typedef int (*key_cmp_fun)(struct kvm_event*, struct kvm_event*, int); - -struct kvm_event_key { - const char *name; - key_cmp_fun key; -}; - struct child_event_ops { void (*get_key)(struct evsel *evsel, struct perf_sample *sample, @@ -92,7 +85,6 @@ struct perf_kvm_stat { const char *exit_reasons_isa; =20 struct kvm_events_ops *events_ops; - key_cmp_fun compare; =20 u64 total_time; u64 total_count; --=20 2.34.1 From nobody Tue Sep 9 16:20:07 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2AF8CC64EC7 for ; Tue, 28 Feb 2023 08:43:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231232AbjB1Inx (ORCPT ); Tue, 28 Feb 2023 03:43:53 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50842 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231199AbjB1InO (ORCPT ); Tue, 28 Feb 2023 03:43:14 -0500 Received: from mail-pj1-x1031.google.com (mail-pj1-x1031.google.com [IPv6:2607:f8b0:4864:20::1031]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id F3D442CC41 for ; Tue, 28 Feb 2023 00:42:50 -0800 (PST) Received: by mail-pj1-x1031.google.com with SMTP id oj5so5023113pjb.5 for ; Tue, 28 Feb 2023 00:42:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=OfT+QNOxQJmHazP6lqFky4KrZI/iD3/8HshJqJUPAo0=; b=iuxzl/3ycUirKWW7g7rP9l+Ew/AxwyvOiKcKab9PtFO2ZLRmobAnn1PvPdA/c/K9dK VHInkL1PSTRV+9Jos31sv+D92sFAsaJsoswIwTSjVWzM1XwXt+7y9jV1l7WM5ZFOJny4 MPalqbfrrxEBBJtk+E+eRFXtFZKHSEf0f2FU7QOQC4RywMC1y5BuYczdwmh5/RpJRq0+ 4f/VaxfYu27xdyWJ2vsKVmOMLpnmyaQYztlxXqqET6uZvDXGJbJD5YLSBmZE7h80HPyB bTWJ9n9yGc9PYjY8JyHRMr/lroAtIYBwuetuZ07aLHVttnjOWsn78PJRfl01bc8E5yxr zcPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=OfT+QNOxQJmHazP6lqFky4KrZI/iD3/8HshJqJUPAo0=; b=c0h11rjHkonga5KJ0qCYjCv94voUJpBgxrwoVFq5LLotO25+lLqNO+PMbwAQO1zvgo wsclvQL5nVFmMaBhXty2VNQAtkitVwdSY9drvLIdBtiBJ8wNJiRCUloYNHO4BeF5vRqu NA65fNtKQFrgPXGYySRtBsNTHX9jOExctS56zcy/FG9v454fD/FIFIITJVct0Xw+GgXn RR1sBRyXETBrTVcWcRLIlgzX7Grt+zlkMuMx62S/7s3K/rvywz+W6eemWdm37QrCvAkI 0zhygwqukn4oaA65l5CTqLtCdNrBX3cuE7E45m8USJ2199JJgtsu98cHwNs9hr/beuvq ehbg== X-Gm-Message-State: AO0yUKXrGnIHOuYabtaxKdPxKfZxIBMcI3tXeJsYC/vu5ajBa8QAyZ3W s3O8ABuXUDyOeh2ERR5EJpH8tQ== X-Google-Smtp-Source: AK7set/dX2kNPLCqWPn/PwI3Svm6TNlA5iuUHw00BsINNLtGytVxSoBawKidocpjcD8+cs7VQwTR1w== X-Received: by 2002:a05:6a20:3d91:b0:cd:3f04:6452 with SMTP id s17-20020a056a203d9100b000cd3f046452mr3218142pzi.49.1677573768163; Tue, 28 Feb 2023 00:42:48 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id u25-20020aa78499000000b005d6fcd8f9desm5681270pfn.94.2023.02.28.00.42.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 00:42:47 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v2 11/14] perf kvm: Support printing attributions for dimensions Date: Tue, 28 Feb 2023 16:41:44 +0800 Message-Id: <20230228084147.106167-12-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230228084147.106167-1-leo.yan@linaro.org> References: <20230228084147.106167-1-leo.yan@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" This patch adds header, entry callback and width for every dimension, thus in TUI mode the tool can print items with the defined attributions. Signed-off-by: Leo Yan --- tools/perf/builtin-kvm.c | 105 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 102 insertions(+), 3 deletions(-) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 741ba65bf092..a56d0983c585 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -83,8 +83,12 @@ struct kvm_hists { =20 struct kvm_dimension { const char *name; + const char *header; + int width; int64_t (*cmp)(struct perf_hpp_fmt *fmt, struct hist_entry *left, struct hist_entry *right); + int (*entry)(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp, + struct hist_entry *he); }; =20 struct kvm_fmt { @@ -102,9 +106,32 @@ empty_cmp(struct perf_hpp_fmt *fmt __maybe_unused, return 0; } =20 +static int fmt_width(struct perf_hpp_fmt *fmt, + struct perf_hpp *hpp __maybe_unused, + struct hists *hists __maybe_unused); + +static int ev_name_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp, + struct hist_entry *he) +{ + struct kvm_event *event; + int width =3D fmt_width(fmt, hpp, he->hists); + char decode[decode_str_len]; + struct perf_kvm_stat *perf_kvm; + + event =3D container_of(he, struct kvm_event, he); + + perf_kvm =3D event->perf_kvm; + perf_kvm->events_ops->decode_key(perf_kvm, &event->key, decode); + + return scnprintf(hpp->buf, hpp->size, "%*s", width, decode); +} + static struct kvm_dimension dim_event =3D { + .header =3D "Event name", .name =3D "name", .cmp =3D empty_cmp, + .entry =3D ev_name_entry, + .width =3D 40, }; =20 #define EV_METRIC_CMP(metric) \ @@ -130,29 +157,77 @@ EV_METRIC_CMP(max) EV_METRIC_CMP(min) EV_METRIC_CMP(mean) =20 +#define EV_METRIC_ENTRY(metric) \ +static int ev_entry_##metric(struct perf_hpp_fmt *fmt, \ + struct perf_hpp *hpp, \ + struct hist_entry *he) \ +{ \ + struct kvm_event *event; \ + int width =3D fmt_width(fmt, hpp, he->hists); \ + struct perf_kvm_stat *perf_kvm; \ + \ + event =3D container_of(he, struct kvm_event, he); \ + perf_kvm =3D event->perf_kvm; \ + return scnprintf(hpp->buf, hpp->size, "%*lu", width, \ + get_event_##metric(event, perf_kvm->trace_vcpu)); \ +} + +EV_METRIC_ENTRY(time) +EV_METRIC_ENTRY(count) +EV_METRIC_ENTRY(max) +EV_METRIC_ENTRY(min) + static struct kvm_dimension dim_time =3D { + .header =3D "Time (ns)", .name =3D "time", .cmp =3D ev_cmp_time, + .entry =3D ev_entry_time, + .width =3D 12, }; =20 static struct kvm_dimension dim_count =3D { + .header =3D "Samples", .name =3D "sample", .cmp =3D ev_cmp_count, + .entry =3D ev_entry_count, + .width =3D 12, }; =20 static struct kvm_dimension dim_max_time =3D { + .header =3D "Max Time (ns)", .name =3D "max_t", .cmp =3D ev_cmp_max, + .entry =3D ev_entry_max, + .width =3D 14, }; =20 static struct kvm_dimension dim_min_time =3D { + .header =3D "Min Time (ns)", .name =3D "min_t", .cmp =3D ev_cmp_min, + .entry =3D ev_entry_min, + .width =3D 14, }; =20 +static int ev_entry_mean(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp, + struct hist_entry *he) +{ + struct kvm_event *event; + int width =3D fmt_width(fmt, hpp, he->hists); + struct perf_kvm_stat *perf_kvm; + + event =3D container_of(he, struct kvm_event, he); + perf_kvm =3D event->perf_kvm; + return scnprintf(hpp->buf, hpp->size, "%*lu", width, + get_event_mean(event, perf_kvm->trace_vcpu)); +} + static struct kvm_dimension dim_mean_time =3D { + .header =3D "Mean Time (ns)", .name =3D "mean_t", .cmp =3D ev_cmp_mean, + .entry =3D ev_entry_mean, + .width =3D 14, }; =20 static struct kvm_dimension *dimensions[] =3D { @@ -165,6 +240,30 @@ static struct kvm_dimension *dimensions[] =3D { NULL, }; =20 +static int fmt_width(struct perf_hpp_fmt *fmt, + struct perf_hpp *hpp __maybe_unused, + struct hists *hists __maybe_unused) +{ + struct kvm_fmt *kvm_fmt; + + kvm_fmt =3D container_of(fmt, struct kvm_fmt, fmt); + return kvm_fmt->dim->width; +} + +static int fmt_header(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp, + struct hists *hists, int line __maybe_unused, + int *span __maybe_unused) +{ + struct kvm_fmt *kvm_fmt; + struct kvm_dimension *dim; + int width =3D fmt_width(fmt, hpp, hists); + + kvm_fmt =3D container_of(fmt, struct kvm_fmt, fmt); + dim =3D kvm_fmt->dim; + + return scnprintf(hpp->buf, hpp->size, "%*s", width, dim->header); +} + static bool fmt_equal(struct perf_hpp_fmt *a, struct perf_hpp_fmt *b) { struct kvm_fmt *kvm_fmt_a =3D container_of(a, struct kvm_fmt, fmt); @@ -214,9 +313,9 @@ static struct kvm_fmt *get_format(const char *name) fmt->cmp =3D dim->cmp; fmt->sort =3D dim->cmp; fmt->color =3D NULL; - fmt->entry =3D NULL; - fmt->header =3D NULL; - fmt->width =3D NULL; + fmt->entry =3D dim->entry; + fmt->header =3D fmt_header; + fmt->width =3D fmt_width; fmt->collapse =3D dim->cmp; fmt->equal =3D fmt_equal; fmt->free =3D fmt_free; --=20 2.34.1 From nobody Tue Sep 9 16:20:07 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 47E73C64ED6 for ; Tue, 28 Feb 2023 08:43:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231239AbjB1In5 (ORCPT ); Tue, 28 Feb 2023 03:43:57 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51982 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231204AbjB1InQ (ORCPT ); Tue, 28 Feb 2023 03:43:16 -0500 Received: from mail-pg1-x533.google.com (mail-pg1-x533.google.com [IPv6:2607:f8b0:4864:20::533]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 05BF32D49 for ; Tue, 28 Feb 2023 00:42:54 -0800 (PST) Received: by mail-pg1-x533.google.com with SMTP id q23so5153122pgt.7 for ; Tue, 28 Feb 2023 00:42:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=7NEkdhqDMouB1zUi5eCnhcHJNUH+bFnGQLi//L7nojk=; b=kcEEzMreNl5FMq37xbdP6dRx4NwX0NDL58nbB1jomIOINWboKLHQkKTqlslCT1PKlo 2FFWmbcq25EQ3syarFxQv7IaNshtqYLMOUaw5NIXbMOwwW9EtX/Xe7U2i09irAcpTBRU hx+lNzaMHrzdM9q6fPMbgX3RARRzthBFnlD6EHQwMzGqLyVLZZ4xTbobNVvNBO4TBicm AjHd3b+sO4BKrlxoTj2TqlDQEwIATeF6HIy91NdFJHiPWHg6iVfEdWX9D0HTwkE/smRr pJm++pf+UorDUGzrQpiJMg4KECv6apmPUQLPmQMdngvsvrWNIT+mBaz68FzTJtGbCt15 JmdQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=7NEkdhqDMouB1zUi5eCnhcHJNUH+bFnGQLi//L7nojk=; b=uBvsiI4TPFQxPZoKi7qF5i2zQaxIVNiM5HW1p3kTh1GBJkadkgxWABtHi/Ll/EpdiH Kppm/xKX2bbUz/u+VNlF6/ePJ8nMKB2vDmTG42f1nFLA1q2TIlbv5TbM2HgtUxbKbDAu qhpiTPLTNmT6rZMV/Yc5z3O0KHaOEn4PnUG79M+s3W7+OpWC5cf+qLG8z8KvQSsKUTQ3 L7bMuRITGKR7XGPcy7wkOez92Xq2sAUscYASo/g2gh9fyJyE+Bg7kNI5WsFQP3k7vQye UNF5YI9huypBTwM3oejTQ/kRYcc4MLq9FWib49mdMTKyNOPETZJNRulSuMAwm7uKhVt9 n+tQ== X-Gm-Message-State: AO0yUKXrByhaaBlpFGhiYlL2kAqLwUPS2TbaKwzhlsF1/ZSYVM4EV2aH M7/e74fqQF1fnx5lUqMMX2N7D1IH0Ni0rUCRr9E= X-Google-Smtp-Source: AK7set/mr+InGhXG/QfaNvdNf6pAsaSnQCzdQB0XMxb8WqE7V6YlHo1I2iTS5O2hKkBpmg2m8befAw== X-Received: by 2002:a62:5214:0:b0:5e5:a473:9498 with SMTP id g20-20020a625214000000b005e5a4739498mr1749717pfb.27.1677573771970; Tue, 28 Feb 2023 00:42:51 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id u25-20020aa78499000000b005d6fcd8f9desm5681270pfn.94.2023.02.28.00.42.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 00:42:51 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v2 12/14] perf kvm: Add dimensions for percentages Date: Tue, 28 Feb 2023 16:41:45 +0800 Message-Id: <20230228084147.106167-13-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230228084147.106167-1-leo.yan@linaro.org> References: <20230228084147.106167-1-leo.yan@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add dimensions for count and time percentages, it would useful for user to review percentage statistics. Signed-off-by: Leo Yan --- tools/perf/builtin-kvm.c | 98 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 97 insertions(+), 1 deletion(-) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index a56d0983c585..5b1b2042dfed 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -230,10 +230,105 @@ static struct kvm_dimension dim_mean_time =3D { .width =3D 14, }; =20 +#define PERC_STR(__s, __v) \ +({ \ + scnprintf(__s, sizeof(__s), "%.2F%%", __v); \ + __s; \ +}) + +static double percent(u64 st, u64 tot) +{ + return tot ? 100. * (double) st / (double) tot : 0; +} + +#define EV_METRIC_PERCENT(metric) \ +static int ev_percent_##metric(struct hist_entry *he) \ +{ \ + struct kvm_event *event; \ + struct perf_kvm_stat *perf_kvm; \ + \ + event =3D container_of(he, struct kvm_event, he); \ + perf_kvm =3D event->perf_kvm; \ + \ + return percent(get_event_##metric(event, perf_kvm->trace_vcpu), \ + perf_kvm->total_##metric); \ +} + +EV_METRIC_PERCENT(time) +EV_METRIC_PERCENT(count) + +static int ev_entry_time_precent(struct perf_hpp_fmt *fmt, + struct perf_hpp *hpp, + struct hist_entry *he) +{ + int width =3D fmt_width(fmt, hpp, he->hists); + double per; + char buf[10]; + + per =3D ev_percent_time(he); + return scnprintf(hpp->buf, hpp->size, "%*s", width, PERC_STR(buf, per)); +} + +static int64_t +ev_cmp_time_precent(struct perf_hpp_fmt *fmt __maybe_unused, + struct hist_entry *left, struct hist_entry *right) +{ + double per_left; + double per_right; + + per_left =3D ev_percent_time(left); + per_right =3D ev_percent_time(right); + + return per_left - per_right; +} + +static struct kvm_dimension dim_time_percent =3D { + .header =3D "Time%", + .name =3D "percent_time", + .cmp =3D ev_cmp_time_precent, + .entry =3D ev_entry_time_precent, + .width =3D 12, +}; + +static int ev_entry_count_precent(struct perf_hpp_fmt *fmt, + struct perf_hpp *hpp, + struct hist_entry *he) +{ + int width =3D fmt_width(fmt, hpp, he->hists); + double per; + char buf[10]; + + per =3D ev_percent_count(he); + return scnprintf(hpp->buf, hpp->size, "%*s", width, PERC_STR(buf, per)); +} + +static int64_t +ev_cmp_count_precent(struct perf_hpp_fmt *fmt __maybe_unused, + struct hist_entry *left, struct hist_entry *right) +{ + double per_left; + double per_right; + + per_left =3D ev_percent_count(left); + per_right =3D ev_percent_count(right); + + return per_left - per_right; +} + +static struct kvm_dimension dim_count_percent =3D { + .header =3D "Sample%", + .name =3D "percent_sample", + .cmp =3D ev_cmp_count_precent, + .entry =3D ev_entry_count_precent, + .width =3D 12, +}; + static struct kvm_dimension *dimensions[] =3D { &dim_event, &dim_time, + &dim_time_percent, &dim_count, + &dim_count_percent, &dim_max_time, &dim_min_time, &dim_mean_time, @@ -406,7 +501,8 @@ static int kvm_hpp_list__parse(struct perf_hpp_list *hp= p_list, =20 static int kvm_hists__init(struct perf_kvm_stat *kvm) { - const char *output_columns =3D "name,sample,time,max_t,min_t,mean_t"; + const char *output_columns =3D "name,sample,percent_sample," + "time,percent_time,max_t,min_t,mean_t"; =20 __hists__init(&kvm_hists.hists, &kvm_hists.list); perf_hpp_list__init(&kvm_hists.list); --=20 2.34.1 From nobody Tue Sep 9 16:20:07 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 57A38C64ED6 for ; Tue, 28 Feb 2023 08:44:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231246AbjB1IoB (ORCPT ); Tue, 28 Feb 2023 03:44:01 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51568 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230483AbjB1InS (ORCPT ); Tue, 28 Feb 2023 03:43:18 -0500 Received: from mail-pg1-x529.google.com (mail-pg1-x529.google.com [IPv6:2607:f8b0:4864:20::529]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EC37955B9 for ; Tue, 28 Feb 2023 00:42:56 -0800 (PST) Received: by mail-pg1-x529.google.com with SMTP id h31so5155040pgl.6 for ; Tue, 28 Feb 2023 00:42:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=vDkwPaQEOTBzYzqPisJaEh7NsOd42gLqOAC1p2FbXvM=; b=z0IOKzTGAOai7e0Qt1kuE+D6nfuSe1gjosV9N/N2vspuxUAw0dq8gc87/A25m5HAvT KMnd9uEEwYS8+gtjLxRE+ZZShmPuyc8ZFgfMwLjRLShNHYjImqo0+y7PNGt25GZBAClN BTLY/phrQFIpqGxuS07MiwHdJpbdyD+3R4mKL0MiK1KNypYhrF31TKNBwd1YRC+FExn4 x429KCKCfQQ4FzDvatEs5kbDGvjkPMlHBfLrj2imZ6TdfLY9dXjOGkDTBLir4mJxUd/G QllzUIEiZ9xg73nJBcCFO0CThPRg4qkYwaQT6PwffRbf932eBKpMZJUNxLgvzL95f0ci wL/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=vDkwPaQEOTBzYzqPisJaEh7NsOd42gLqOAC1p2FbXvM=; b=mP4JO6g/ib4oO4P3NzBJ+z2wCqFVY6xZCRjeIfL++EPNyOI5RHDCcrxLc+V9bg/PHa TU9RJhbFZBSBWBRz2Bi3MdBebUfY9rC8kPJGH8qe7JLYZ/DHvp5tWEj8XKAe+vyyx16F QMi3Y0gnGMN3AbWF7shXLSPeC0hANypnsEWaD+i43CpNCE01RNbVfsOTjlIKjWtGTXM4 vxWnCUa54ajXHQDvPZuy1Dk/FNgCxAC1/YzWzmojDRqH6DNkAgzQSkLqLsvUH00vXd// T/ip3MzuPDGYw95jEkNyDVHvqnOA5WtSi/11+SwKcx6uz9z85VVBwn3trcHNKrthIZjv ro9A== X-Gm-Message-State: AO0yUKXNHPbVV4LoYFhVa4Z6dIzaVu/oMnNTdzU8ton9yPQGNtt4Tuv+ RbBw8DlIc7ADb+Us6IuVOTCFcQ== X-Google-Smtp-Source: AK7set/rxO0nwUO7JSO1wNCD6d8xQsZaroriXGmPDEuas0CBh0KK+mcRu9/2OFxUyS/vViRS5h1YkQ== X-Received: by 2002:a62:6586:0:b0:5a8:5e6d:28d7 with SMTP id z128-20020a626586000000b005a85e6d28d7mr1968099pfb.0.1677573776087; Tue, 28 Feb 2023 00:42:56 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id u25-20020aa78499000000b005d6fcd8f9desm5681270pfn.94.2023.02.28.00.42.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 00:42:55 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v2 13/14] perf kvm: Add TUI mode for stat report Date: Tue, 28 Feb 2023 16:41:46 +0800 Message-Id: <20230228084147.106167-14-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230228084147.106167-1-leo.yan@linaro.org> References: <20230228084147.106167-1-leo.yan@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Since we have supported histograms list and prepared the dimensions in the tool, this patch adds TUI mode for stat report. It also adds UI progress for sorting for better user experience. Signed-off-by: Leo Yan Reviewed-by: James Clark --- tools/perf/builtin-kvm.c | 110 ++++++++++++++++++++++++++++++++++++- tools/perf/util/kvm-stat.h | 1 + 2 files changed, 109 insertions(+), 2 deletions(-) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 5b1b2042dfed..b0be59577779 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -23,6 +23,8 @@ #include "util/data.h" #include "util/ordered-events.h" #include "util/kvm-stat.h" +#include "ui/browsers/hists.h" +#include "ui/progress.h" #include "ui/ui.h" #include "util/string2.h" =20 @@ -506,10 +508,98 @@ static int kvm_hists__init(struct perf_kvm_stat *kvm) =20 __hists__init(&kvm_hists.hists, &kvm_hists.list); perf_hpp_list__init(&kvm_hists.list); + kvm_hists.list.nr_header_lines =3D 1; return kvm_hpp_list__parse(&kvm_hists.list, output_columns, kvm->sort_key); } =20 +static int kvm_browser__title(struct hist_browser *browser, + char *buf, size_t size) +{ + scnprintf(buf, size, "KVM event statistics (%lu entries)", + browser->nr_non_filtered_entries); + return 0; +} + +static struct hist_browser* +perf_kvm_browser__new(struct hists *hists) +{ + struct hist_browser *browser =3D hist_browser__new(hists); + + if (browser) + browser->title =3D kvm_browser__title; + + return browser; +} + +static void print_result(struct perf_kvm_stat *kvm); + +#ifdef HAVE_SLANG_SUPPORT +static void kvm_browser__update_nr_entries(struct hist_browser *hb) +{ + struct rb_node *nd =3D rb_first_cached(&hb->hists->entries); + u64 nr_entries =3D 0; + + for (; nd; nd =3D rb_next(nd)) { + struct hist_entry *he =3D rb_entry(nd, struct hist_entry, + rb_node); + + if (!he->filtered) + nr_entries++; + } + + hb->nr_non_filtered_entries =3D nr_entries; +} + +static int kvm__hists_browse(struct hists *hists) +{ + struct hist_browser *browser; + int key =3D -1; + + browser =3D perf_kvm_browser__new(hists); + if (browser =3D=3D NULL) + return -1; + + /* reset abort key so that it can get Ctrl-C as a key */ + SLang_reset_tty(); + SLang_init_tty(0, 0, 0); + + kvm_browser__update_nr_entries(browser); + + while (1) { + key =3D hist_browser__run(browser, "? - help", true, 0); + + switch (key) { + case 'q': + goto out; + default: + break; + } + } + +out: + hist_browser__delete(browser); + return 0; +} + +static void kvm_display(struct perf_kvm_stat *kvm) +{ + if (!use_browser) + print_result(kvm); + else + kvm__hists_browse(&kvm_hists.hists); +} + +#else + +static void kvm_display(struct perf_kvm_stat *kvm) +{ + use_browser =3D 0; + print_result(kvm); +} + +#endif /* HAVE_SLANG_SUPPORT */ + static const char *get_filename_for_perf_kvm(void) { const char *filename; @@ -988,8 +1078,12 @@ static int filter_cb(struct hist_entry *he, void *arg= __maybe_unused) =20 static void sort_result(void) { + struct ui_progress prog; + + ui_progress__init(&prog, kvm_hists.hists.nr_entries, "Sorting..."); hists__collapse_resort(&kvm_hists.hists, NULL); hists__output_resort_cb(&kvm_hists.hists, NULL, filter_cb); + ui_progress__finish(); } =20 static void print_vcpu_info(struct perf_kvm_stat *kvm) @@ -1587,7 +1681,14 @@ static int kvm_events_report_vcpu(struct perf_kvm_st= at *kvm) if (!register_kvm_events_ops(kvm)) goto exit; =20 - setup_pager(); + if (kvm->use_stdio) { + use_browser =3D 0; + setup_pager(); + } else { + use_browser =3D 1; + } + + setup_browser(false); =20 kvm_hists__init(kvm); =20 @@ -1596,7 +1697,7 @@ static int kvm_events_report_vcpu(struct perf_kvm_sta= t *kvm) goto exit; =20 sort_result(); - print_result(kvm); + kvm_display(kvm); =20 exit: return ret; @@ -1703,6 +1804,7 @@ kvm_events_report(struct perf_kvm_stat *kvm, int argc= , const char **argv) OPT_STRING('p', "pid", &kvm->opts.target.pid, "pid", "analyze events only for given process id(s)"), OPT_BOOLEAN('f', "force", &kvm->force, "don't complain, do it"), + OPT_BOOLEAN(0, "stdio", &kvm->use_stdio, "use the stdio interface"), OPT_END() }; =20 @@ -1720,6 +1822,10 @@ kvm_events_report(struct perf_kvm_stat *kvm, int arg= c, const char **argv) kvm_events_report_options); } =20 +#ifndef HAVE_SLANG_SUPPORT + kvm.use_stdio =3D true; +#endif + if (!kvm->opts.target.pid) kvm->opts.target.system_wide =3D true; =20 diff --git a/tools/perf/util/kvm-stat.h b/tools/perf/util/kvm-stat.h index a8e919ca59f4..b66eb4e8c547 100644 --- a/tools/perf/util/kvm-stat.h +++ b/tools/perf/util/kvm-stat.h @@ -97,6 +97,7 @@ struct perf_kvm_stat { unsigned int display_time; bool live; bool force; + bool use_stdio; }; =20 struct kvm_reg_events_ops { --=20 2.34.1 From nobody Tue Sep 9 16:20:07 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id C53E8C64EC7 for ; Tue, 28 Feb 2023 08:44:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231255AbjB1IoK (ORCPT ); Tue, 28 Feb 2023 03:44:10 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51092 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231151AbjB1InX (ORCPT ); Tue, 28 Feb 2023 03:43:23 -0500 Received: from mail-pf1-x430.google.com (mail-pf1-x430.google.com [IPv6:2607:f8b0:4864:20::430]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6918813537 for ; Tue, 28 Feb 2023 00:43:00 -0800 (PST) Received: by mail-pf1-x430.google.com with SMTP id u20so5189250pfm.7 for ; Tue, 28 Feb 2023 00:43:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=QcYnfVUhbZn9a7DJQxPts8NFnTbESI3ZdIxOG6ZSYi4=; b=rSgvDtF/wwjYXMC8nd8jl02NHDbmTcn0gvXseij+B77jqtsUvpDDcxJb5MVqkBHL1l 1HVCqWtP3q9PkFZPRmKYXrWxev+8EAvtQFkcxqAQ4IT8I7hyeI5949yw4uhTm/kDJkRZ RVOLBobVsBtlVilhO8rkT0bbF87WI6wL2OTrUW/nTzFUDKdtncuOwR2U2QepXvUCPy79 qejTQRoq2MKcuDAgCrykXjfhcNnk8LMulDiwcxGaMINgNePoRpkz9txc8oE5jUQR8y85 pgqUu0UloLIm00IdnbYBkO1TCxDVmB1JSz5iwTEPfjLaLMEBzvfr55wd0jcXiuRjb5Ms GKCw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=QcYnfVUhbZn9a7DJQxPts8NFnTbESI3ZdIxOG6ZSYi4=; b=suh7bHWQ7eEo7gMMfbRHzamMfOhtF4IYIVMz1bES1EMbeujri1uVAg+fl7ILCgdCpZ dBbiE4QukJBtX74LBx/ErGuJWyo4n7oU3NMywFqustOJayU1kJ6UJT8iqW/tzzzZV1uO LqOaCnEHQ1uWsHdApBx8ggle9uy+ybB8K6Kb/qTLSTNMbRGTUb/yR41NsEboKRx4yWp7 +r8RTcfeU7YnPTQzL4MjZgzYTFWzvfGsYb6LqKPm2/en2BqqbUm3brPXntUSA8Uy7PGu yhYaUiga5BKYaiqITRMqXFi5zBM+qrichCRhmURcj+i12O585gNVxDSMrmJ2o1yMQhyh T74w== X-Gm-Message-State: AO0yUKX7L6Oyb/qjZlAjOx8icU1fVb2nc0n3ZNI6i5XT2siwG+w5ko3H LGzytqXuk1sgSlJ0Ydblv0fJNA== X-Google-Smtp-Source: AK7set95msG1/6Sh9v+FITXHpNA20OgLeQT3mg9oPI6viuFokojuKa/LaXMD2mJYpxmReRbXZ1LarQ== X-Received: by 2002:a62:1808:0:b0:575:b783:b6b3 with SMTP id 8-20020a621808000000b00575b783b6b3mr1778268pfy.28.1677573780039; Tue, 28 Feb 2023 00:43:00 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id u25-20020aa78499000000b005d6fcd8f9desm5681270pfn.94.2023.02.28.00.42.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 00:42:59 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v2 14/14] perf kvm: Update documentation to reflect new changes Date: Tue, 28 Feb 2023 16:41:47 +0800 Message-Id: <20230228084147.106167-15-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230228084147.106167-1-leo.yan@linaro.org> References: <20230228084147.106167-1-leo.yan@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Update documentation for new sorting and option '--stdio'. Signed-off-by: Leo Yan --- tools/perf/Documentation/perf-kvm.txt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tools/perf/Documentation/perf-kvm.txt b/tools/perf/Documentati= on/perf-kvm.txt index 2ad3f5d9f72b..b66be66fe836 100644 --- a/tools/perf/Documentation/perf-kvm.txt +++ b/tools/perf/Documentation/perf-kvm.txt @@ -58,7 +58,7 @@ There are a couple of variants of perf kvm: events. =20 'perf kvm stat report' reports statistical data which includes events - handled time, samples, and so on. + handled sample, percent_sample, time, percent_time, max_t, min_t, mean_t. =20 'perf kvm stat live' reports statistical data in a live mode (similar to record + report but with statistical data updated live at a given display @@ -82,6 +82,8 @@ OPTIONS :GMEXAMPLESUBCMD: top include::guest-files.txt[] =20 +--stdio:: Use the stdio interface. + -v:: --verbose:: Be more verbose (show counter open errors, etc). @@ -97,7 +99,10 @@ STAT REPORT OPTIONS -k:: --key=3D:: Sorting key. Possible values: sample (default, sort by samples - number), time (sort by average time). + number), percent_sample (sort by sample percentage), time + (sort by average time), precent_time (sort by time percentage), + max_t (sort by maximum time), min_t (sort by minimum time), mean_t + (sort by mean time). -p:: --pid=3D:: Analyze events only for given process ID(s) (comma separated list). --=20 2.34.1