From nobody Wed Sep 10 02:40:10 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 594B1C64ED6 for ; Tue, 28 Feb 2023 11:53:07 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231724AbjB1LxF (ORCPT ); Tue, 28 Feb 2023 06:53:05 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47528 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231675AbjB1Lw7 (ORCPT ); Tue, 28 Feb 2023 06:52:59 -0500 Received: from mail-pj1-x1029.google.com (mail-pj1-x1029.google.com [IPv6:2607:f8b0:4864:20::1029]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 08D9F35AC for ; Tue, 28 Feb 2023 03:52:54 -0800 (PST) Received: by mail-pj1-x1029.google.com with SMTP id cp7-20020a17090afb8700b0023756229427so13424980pjb.1 for ; Tue, 28 Feb 2023 03:52: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=EfFwm9/whD1jR/5n6DKKR8V6Fa945UAISwsDPx5HLJU=; b=wbv7ziCPJxqwbDWQhst1eW5b1dBwhJRXlbUxZezytqOmUHFMzhW4NWpoKafXASCkB7 GeL34Pgb3wfWJ4NsX4UEzTCvdzr1siXmUfB6y/EEOatKrLTXlNU5SfvkOn3FpKOiu/aD V45usGfgtn3wBdgEvXtjuBhRoxgFMxUg5GOiu5PjvkAKB1D3nOt3CWnnY7BLvA7q3J99 oT+Gxgu2CygU46jOjfUzF0oGUmHrPSIIReBlomRNOf4lQ38cm3BrPqUijxow22PbVzWk MByhiEjCTg/yEzg2k4+gB4WRlaOIsMNSuGYqYBbc2+jDfaVDvh6+AbXKx2qWsyXzVShL Zttg== 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=EfFwm9/whD1jR/5n6DKKR8V6Fa945UAISwsDPx5HLJU=; b=F7cSI7dshZKf8Km4z2lXKmhy3VVkqdfjP2ppbiswbRSMMY3CFiuq5+jrMwJtmZxL0h GJdouKweVvBqDb+2MBLSo596jaQHaOVPkpDPrA9n/wROHVH21EGo/LdEbBYZlHo2lb13 4tt+Yx6Gg++DzGxWSyjLeQT8pFdfmBoUlmrlH2nePfPw3FaRFuOC9LWNQpFDACHM9jM+ z+kJr3NlvhhVQVwbc6d2kAMIRzcAz72a/kqUaGICGnQrAGzb3qbZBrWFVMzS2tO7K3ta 9oUwiPQNOF75CHR4whkKch3pCD4kOHUZNhe4Wy/dBp/XdNE5XB7PAyG0ycxnVk3rYoRZ fZbg== X-Gm-Message-State: AO0yUKVCyw40NWoa338JeTDC4AcmrwBOhbgSnvtihbRUFZeUTbNp1GsN tk1P+xv1EHV/z+cJbkeoaTm8nQ== X-Google-Smtp-Source: AK7set+RyVPlxna1uVA+l/uQXFZn+/+JbDCj4AjboMdynOdSiXT5U81AqAlc4WUVIXEChAlTf+gDLg== X-Received: by 2002:a17:90b:4a83:b0:235:9d0c:6e3f with SMTP id lp3-20020a17090b4a8300b002359d0c6e3fmr2884941pjb.31.1677585174069; Tue, 28 Feb 2023 03:52:54 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id gk8-20020a17090b118800b002339491ead6sm7922317pjb.5.2023.02.28.03.52.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 03:52:53 -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 , James Clark , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v3 01/14] perf kvm: Refactor overall statistics Date: Tue, 28 Feb 2023 19:51:12 +0800 Message-Id: <20230228115125.144172-2-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230228115125.144172-1-leo.yan@linaro.org> References: <20230228115125.144172-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 Reviewed-by: James Clark --- 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 Wed Sep 10 02:40:10 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 47447C7EE2E for ; Tue, 28 Feb 2023 11:53:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231682AbjB1LxK (ORCPT ); Tue, 28 Feb 2023 06:53:10 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47582 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230160AbjB1LxC (ORCPT ); Tue, 28 Feb 2023 06:53:02 -0500 Received: from mail-pj1-x1029.google.com (mail-pj1-x1029.google.com [IPv6:2607:f8b0:4864:20::1029]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B292A4217 for ; Tue, 28 Feb 2023 03:52:59 -0800 (PST) Received: by mail-pj1-x1029.google.com with SMTP id qa18-20020a17090b4fd200b0023750b675f5so13370224pjb.3 for ; Tue, 28 Feb 2023 03:52:59 -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=uN7zwUTTarFdEEyI4xavpEstkRipyyWqLXdanEnFXps=; b=wEOZZ9u5LCTPZQy4HE9U8wHkT/7PQDW8KhdkurYABU3ChAPtXh8/R+oNAkSiy5wRIA paW/5AIubz1Uo62EB+KO4YpDcmphpyxEGC+2YWqrxO8u6JfbLfQbTFYAsEHcrMT3ultE sD/ZezHJpwZT69eIGjHGgo6YRjTCW29BpQ8ci9wNJEIf5+jegRkchbrzFEu7oIJqblBI NdZgARLUml0ARuz5OObX4Pjl4h+aDZu0sgLd0LUzvNaNCbVRgHboiCZlp61sNLfiyadV 4GBMVG7R+c5o8TaZegumSMxx7V13xIHwdkXTvlI7IUzROwMgqfd9/pBCRw9tOh7aLu+s 9dug== 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=uN7zwUTTarFdEEyI4xavpEstkRipyyWqLXdanEnFXps=; b=4peWJTOrbc4Ldb3xBHzaJ6mZ/uHzabTE43IBAJ+TI3mnkEaed2XjPsElfwYlLB93BJ 1Q5Fuui3PzavEhMdN2JapwuYfa1Of8s7it8rrCYf4cNWal3hZB5cO1d5uymXNhCcQ/uo FKYamti4GfTq8W2ceAkvPJFP4hU4HHLUQyVrpMolnGL2LIXIKfIj4vgyu4k3kYWjoidH QrPS7AzIF/zy7akmJBbTJlvooy87GjpQqR4oUhPtPKcZiLWn1xBq/4qGKs3G2G2HWx+h pv5gpNfembWDJikByxZ4pxndGUvOp3oPEQ535I56mWexCzJd+/5TtTLwd3ftUIts15AT Mx2w== X-Gm-Message-State: AO0yUKW9E3/6LrzBGFcrtWmOchBxrPQeZooyZ051xVowMTMTaMUDmW/W j91VMmZsgwCzulzXouxebpNdnw== X-Google-Smtp-Source: AK7set/B6c1iXV5EOT/x23Mgl2KM/qOAmTQcGVrgnuWmGKIhMWFWcJ3ME015ZGXyzumi/HdZe3OMpw== X-Received: by 2002:a17:90b:3841:b0:237:5c37:d99c with SMTP id nl1-20020a17090b384100b002375c37d99cmr2962374pjb.21.1677585178945; Tue, 28 Feb 2023 03:52:58 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id gk8-20020a17090b118800b002339491ead6sm7922317pjb.5.2023.02.28.03.52.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 03:52:58 -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 , James Clark , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v3 02/14] perf kvm: Add pointer to 'perf_kvm_stat' in kvm event Date: Tue, 28 Feb 2023 19:51:13 +0800 Message-Id: <20230228115125.144172-3-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230228115125.144172-1-leo.yan@linaro.org> References: <20230228115125.144172-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 Reviewed-by: James Clark --- 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 Wed Sep 10 02:40:10 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 72800C64EC7 for ; Tue, 28 Feb 2023 11:53:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231738AbjB1LxO (ORCPT ); Tue, 28 Feb 2023 06:53:14 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47870 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231717AbjB1LxH (ORCPT ); Tue, 28 Feb 2023 06:53:07 -0500 Received: from mail-pj1-x1029.google.com (mail-pj1-x1029.google.com [IPv6:2607:f8b0:4864:20::1029]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 44D6FB761 for ; Tue, 28 Feb 2023 03:53:04 -0800 (PST) Received: by mail-pj1-x1029.google.com with SMTP id m8-20020a17090a4d8800b002377bced051so13453277pjh.0 for ; Tue, 28 Feb 2023 03:53:04 -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=F9P/WNNNsLKtkXIlBizDtRA5HEUxXu0PrB/8N0zALdo=; b=xtZQMpff+QWOaUFLpccpEDYz77bqJRqchLzhWGNtquHoPoTdhJMYdmUdKMNjw99h5n GtCXH4AwJaDvBj6Ma6yRRSsYOemJR92n5ViC2aLfr0zNW0fFS40b2yM7GTUE/qnSu6tJ xdbcxjp8KaTuB1P5l4NDtZvUbQQg7Dd9ZxNiIq4RDSgNQajlQowMV4kz6VaOpt71wZNS 8Sf/LqhBKZt0ec/HQ+XZaJDGYvweeKfGg6FKAIuA18sTrrzCl0IWTW93S4fDy1EGvMbM yFK8176oqXcdXQSvEiKZsV84iNpgLKDCkae1wHeU11kgtmUxsaD32k0nf2tZqfNM3z3Q mNnA== 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=F9P/WNNNsLKtkXIlBizDtRA5HEUxXu0PrB/8N0zALdo=; b=pNOU6bPxtzY+EtwuCLdvKjF377WCMbIzv3XrKKAZgaGNP2nSLZjN9aegdMkqDZcXqZ Qh7Xw9YcQrP5HnDKx6fQGzq93nxtzhXlgQTexgDlB2+7Zph8iMlqWC/zJRdtpob8/6E+ qEGVqAqHvMlpypYoeG7hiLg9+XBWn0o0pko9a8dfs+vJr5U2FT4McePxR1sRLyTarM2O hVqQ6VQBdv1MsASWLFUf2jvO03glubZL3CVSDosGdYiiz/sI8mnI7q8T6MjjSpT0Yvyv 8dlTF3klGwOhokPgMbcNYd6Ee5rHddGrKufpZgUU+idSIle10R4GdgLptgCp55I6GHbV u9zg== X-Gm-Message-State: AO0yUKXDrgBQUBBjtSFtVg/oNICvXLVHzZiAhdfluiPfjK3V+kS4KrNw 2yK03Na2qcvY3VVmWq+mYfc7XA== X-Google-Smtp-Source: AK7set+X+RCd9I9e6CQ52iQO/JLj9MHi60/nh04ESMcdfp+lHvPzHe4IllOmeh0Ov3U7ZxYhmxAm0w== X-Received: by 2002:a17:90a:190f:b0:233:c9e7:c885 with SMTP id 15-20020a17090a190f00b00233c9e7c885mr2915100pjg.36.1677585184107; Tue, 28 Feb 2023 03:53:04 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id gk8-20020a17090b118800b002339491ead6sm7922317pjb.5.2023.02.28.03.52.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 03:53:03 -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 , James Clark , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v3 03/14] perf kvm: Move up metrics helpers Date: Tue, 28 Feb 2023 19:51:14 +0800 Message-Id: <20230228115125.144172-4-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230228115125.144172-1-leo.yan@linaro.org> References: <20230228115125.144172-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 Reviewed-by: James Clark --- 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 Wed Sep 10 02:40:10 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 D25BEC64ED6 for ; Tue, 28 Feb 2023 11:53:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230161AbjB1Lxg (ORCPT ); Tue, 28 Feb 2023 06:53:36 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48824 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231757AbjB1LxZ (ORCPT ); Tue, 28 Feb 2023 06:53:25 -0500 Received: from mail-pj1-x102b.google.com (mail-pj1-x102b.google.com [IPv6:2607:f8b0:4864:20::102b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8BD4BAD0C for ; Tue, 28 Feb 2023 03:53:12 -0800 (PST) Received: by mail-pj1-x102b.google.com with SMTP id h17-20020a17090aea9100b0023739b10792so9327691pjz.1 for ; Tue, 28 Feb 2023 03:53:12 -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=2qPpo+oY5O/BDs1mflsxepNoS0s2AHA0SFXfRV7gRd8=; b=F3Hrc/dfyL0SKl06Ta0DkwHwNwoxHmWJmtRuhfp5yyuirCSi58Gzt888BoXwIuXIKf bFzgdYXA8OdQqqNdX1QX3kMMh6YJh2eraYUjs4/qfJsdBZVQpdAh2PL+tzILFLefP+oF 7BltMZOxlXNvPLWStyZOIEhieBIBKRnvs7A/kEHgEEHo79iajV+2z8nBy7Xpi6cxJsvu DjLUF3yoPppRoC01f+vns8ySHQegP1FzSLylCw4cUMBPq1JsAiOs5pgwhpFG0W/86L0K bDN9Sfp5/ggcYEUd3fvxSqySIcOHH1dT+BkpvS2OVSL/ZxQBJUUJE7/6b3XEq2cSAyEP HfDg== 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=2qPpo+oY5O/BDs1mflsxepNoS0s2AHA0SFXfRV7gRd8=; b=PffApDO2cQAzxJL0d8/EJr00TwQvIfP3xSzH8vF/j8s6+lVL+tTRIoN3zIJtFVOPe1 WkruIKwhcezXGc6H6Uw4zkaaEVzBdyB6sdVvfHbAbfsLKtqfTpeA4ZUVMC8MSfnFuVBW 66DC4ARRZSRpHHsehkXaMXn5/dMxeO9ndUI3evWdmZPVnMZIU29H1RLZ1MTH183JrSV7 e6W2bSOhTFQ/y68ifBaL5QmoCt4PS+Cz1s+pH2KDToDPE4GQo8QkBPKcTmbR5un/H/u9 M4MAPPmUQXhzVtTtzd/DmCVkVvhDBc2rAk/rsjkaFTotwu2e1HGsIDhzfUPGZvGhWByK boeA== X-Gm-Message-State: AO0yUKWS2aqQzgC7qN14OPUlYkXjeDdhK4IWqCC+xcgLctxAx8j2GAC0 9Nl60Fqugi2ckTqL814ZvZ88dg== X-Google-Smtp-Source: AK7set9026OmaeUu0M+xNbPPNjFxI4ilA39NBi+Ll60xREmie+Hu2gD4zYvnLJ3vn4JhBb1BmqJGnw== X-Received: by 2002:a17:90a:1d1:b0:234:d78:9b4c with SMTP id 17-20020a17090a01d100b002340d789b4cmr2981089pjd.18.1677585192166; Tue, 28 Feb 2023 03:53:12 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id gk8-20020a17090b118800b002339491ead6sm7922317pjb.5.2023.02.28.03.53.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 03:53:11 -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 , James Clark , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v3 04/14] perf kvm: Use subtraction for comparison metrics Date: Tue, 28 Feb 2023 19:51:15 +0800 Message-Id: <20230228115125.144172-5-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230228115125.144172-1-leo.yan@linaro.org> References: <20230228115125.144172-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 Reviewed-by: James Clark --- 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 Wed Sep 10 02:40:10 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 D60B4C64ED6 for ; Tue, 28 Feb 2023 11:53:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229561AbjB1Lxr (ORCPT ); Tue, 28 Feb 2023 06:53:47 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48792 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231750AbjB1Lxc (ORCPT ); Tue, 28 Feb 2023 06:53:32 -0500 Received: from mail-pj1-x1033.google.com (mail-pj1-x1033.google.com [IPv6:2607:f8b0:4864:20::1033]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E84B221954 for ; Tue, 28 Feb 2023 03:53:17 -0800 (PST) Received: by mail-pj1-x1033.google.com with SMTP id c23so9507479pjo.4 for ; Tue, 28 Feb 2023 03:53: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=JejwbkE0SW/Fq6/DugwFIOqvWMBBxjg6ekVlYn5zaW0=; b=JrXFg3xf10Yfn2iwMT0Gay/nRRy2177rQRMSOe3akRXKr5DvA+LXtueqlg2sQyOmtB fICl8x4NDS8jdeiiYc168J+7nrC/yMRax/u/Z+NMcKI8pte6dX/ueMclSlJXr9nBIhHa hlwO/AHxu+a3C1GwC/IUAzCrV5BGkkQsEfK5XgaJAhGpZcSv09IPqTlzyjf5QljvvDfE hu73XDRYmx/Umf3ss3e6K6mRpVUN2WY7niotltge0C1Pe1/zIn2O+Py2nsVpys6rO9VV WtY1nUHXooRvKdyaheo2zAMFdhDkZdVOcC5zPT0Lb4yGtVgygCz/dsbKpsaq5COmxr4B DLRw== 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=JejwbkE0SW/Fq6/DugwFIOqvWMBBxjg6ekVlYn5zaW0=; b=rMGmpnIMM37/NyiPu6HbDoRaBDYNk6LeR7Dt/XDVdgl50vElDh2FUpALzGKg8YKVMi d/wzMkmmA2D37UhsTTjvMxW9e57dGd0EdLO67Tor4CTcwEfBqi/QD2/6KbQqT8n/1Wuv VqpYSz/bAEDP4002yKNANtNu+DJveiIAjV3N87XOaiMhaGLAB+TB1PIb+js1Y+UTO5MR KG+/Jy21QC+990Vq5IQ98K8NDUpCTwwzS+c1opjBo65tPLYvZZVaui9x7VHsMZpLJCNL VllYLuvw6k0vBEdNnSze4z7Vtui5R1qwWjRU+BljgQI0MVqgg+VGZa8nlUHqVpzUtbaQ W4XQ== X-Gm-Message-State: AO0yUKV05U1fylsZXKmyj9Y/FG9/8ALfgUTbXAiD4LI/cQf5L0FD5kd9 0ua/7jppvofPKHSvE2lJM8cFmQ== X-Google-Smtp-Source: AK7set+OhY2iyERAW9jX8ez1+PG+4kZtkEX/evSCTeN9uyVDyxih01bY2TtUYP9nVnAgScKdtpmacA== X-Received: by 2002:a17:90a:19de:b0:233:ca14:6ae8 with SMTP id 30-20020a17090a19de00b00233ca146ae8mr2899553pjj.45.1677585197539; Tue, 28 Feb 2023 03:53:17 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id gk8-20020a17090b118800b002339491ead6sm7922317pjb.5.2023.02.28.03.53.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 03:53:17 -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 , James Clark , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v3 05/14] perf kvm: Introduce histograms data structures Date: Tue, 28 Feb 2023 19:51:16 +0800 Message-Id: <20230228115125.144172-6-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230228115125.144172-1-leo.yan@linaro.org> References: <20230228115125.144172-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 Reviewed-by: James Clark --- 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 Wed Sep 10 02:40:10 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 8ED78C64ED6 for ; Tue, 28 Feb 2023 11:53:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230089AbjB1Lx4 (ORCPT ); Tue, 28 Feb 2023 06:53:56 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48962 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231134AbjB1Lxr (ORCPT ); Tue, 28 Feb 2023 06:53:47 -0500 Received: from mail-pl1-x631.google.com (mail-pl1-x631.google.com [IPv6:2607:f8b0:4864:20::631]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 79A31113C7 for ; Tue, 28 Feb 2023 03:53:23 -0800 (PST) Received: by mail-pl1-x631.google.com with SMTP id i5so8422041pla.2 for ; Tue, 28 Feb 2023 03:53:23 -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=ZIJRxgs2DKmjVAUdCuR1p8WFkclPBjAv6BB5zEl99zk=; b=KDCS8+cGYK+wyovEBj9oQdHlUEcysmGYjckcSBhaGYNVH2G3FZO+OW331XJrU6n+nR QQZ/PJbbmQ9LUvqUoKWzXkzP2MpaS+6yay3aDnDlh3r8hwpiABqwJTbi0++nS/UiK9lH yftRx/079adiiX7zPZpxKElp9gLE75C7890sxyZNf0eLAKD+h7S4yXLIsTm0QlNGI74d o79sBtStg0pFWoB3yvdwJ3z2FR+i732ngUf0OYsU0NnL8mtbjUfYvLt60hgmpTk18oQX deL3hABczKCEMPkbu+EdAnsEgNAiF8hM+DWsNxbI7mNqmVzS1gvgLKYIi6/t7X/i6m29 WJwQ== 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=ZIJRxgs2DKmjVAUdCuR1p8WFkclPBjAv6BB5zEl99zk=; b=HFai1KC20bjc/+rV4VcKdvPlQlC2BK/sZYDYAIWMK3pgZ+YdX77aEr+1eh4ZHTMxIm tUbMJCJnN26nbg6rO6RXLJ58MuXciN0zOQLdtAPIDC8m+oqX3Mj99TM0psFsC+iYWhWO fVXoZRUBxZrNKJ6KCYOFszOpC/tQvdDRpA9Tvq62Tvpmp/TMl1bOPd6r0WTEWLJZ5kLd uKwVQy3Z4isk55t9UqD/6hmRkVbr9wvxJn8X/Cdbj5OaC6/JXIsm2DLmwlxVAj70E/LK LPlAdS3kix5ctFeQt99dFXL5LZYaNxggAAmrd90trz8yIal/JfDia0fYrd7IYFXFvmX4 a7pQ== X-Gm-Message-State: AO0yUKUNDLtJZST+z7+rghZiiC+azzWAja+5FCeNNjzlHY7wERBq7pwE ygFTjNZM+wNs16/XsUNttsIvug== X-Google-Smtp-Source: AK7set+MWGmqM+uSXAg8BTkRV1oFwsyK3KJamoKhnqXGJp8v1+71rxGRvEyuvi2E+Uv/aJCtCE3OTg== X-Received: by 2002:a17:90b:1b4b:b0:237:401c:9bd5 with SMTP id nv11-20020a17090b1b4b00b00237401c9bd5mr3018117pjb.46.1677585202677; Tue, 28 Feb 2023 03:53:22 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id gk8-20020a17090b118800b002339491ead6sm7922317pjb.5.2023.02.28.03.53.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 03:53:22 -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 , James Clark , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v3 06/14] perf kvm: Pass argument 'sample' to kvm_alloc_init_event() Date: Tue, 28 Feb 2023 19:51:17 +0800 Message-Id: <20230228115125.144172-7-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230228115125.144172-1-leo.yan@linaro.org> References: <20230228115125.144172-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 Reviewed-by: James Clark --- 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 Wed Sep 10 02:40:10 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 47376C64EC7 for ; Tue, 28 Feb 2023 11:54:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231150AbjB1LyA (ORCPT ); Tue, 28 Feb 2023 06:54:00 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48760 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231407AbjB1Lx4 (ORCPT ); Tue, 28 Feb 2023 06:53:56 -0500 Received: from mail-pj1-x102b.google.com (mail-pj1-x102b.google.com [IPv6:2607:f8b0:4864:20::102b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 27FC91B571 for ; Tue, 28 Feb 2023 03:53:35 -0800 (PST) Received: by mail-pj1-x102b.google.com with SMTP id oj5so5553179pjb.5 for ; Tue, 28 Feb 2023 03:53:35 -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=dV9q9AQ7PpikYhUvBV5aI2kpk7FdoFpdqjCf8IW8jGw=; b=bCcgKbxuDOTflQKpoQhNx01CaIPNoYsiLM9Ib/2v90GsIsckcYB9ufRIPxmbyEXCKf qRMUwfQTsYit5fncJpmA3lwmlhki1UH51NQXi9Idyd9SQVNXxHWRPtfu3IyWgGOBBB2o 7CbqDr3twqzrQ5UDaiiq3vucmOjVD1LCHlQqhwVIMLNsVsVLvNeUWxTkmcI3Utt+ydTe 4L9Z2TysgigWiYg5G+32ZAdszy8K2yoIHSDpaInj5cCQYjoC1qOUqFEAj4tyjlRKMDNZ 5Eeb5bD7P4u4s48MsDLNSBoH5Jv1gTgwOmRNJ5gwmsmQYL+qQ78CAaNne7xY9uKGcK3S IK2A== 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=dV9q9AQ7PpikYhUvBV5aI2kpk7FdoFpdqjCf8IW8jGw=; b=Io5Z8uRGuu1qi3ibj3++wtioYPfyQ26rVoBxHCXItR+bhHh76SnGteT8weOVLaQyVw 20vA4A3lZIMrdzoOWVcuVXzb///wIEEcRqmj/zBGpTmyiJ41eHPcHYLB781Ckfh8EJ9W KIXdd4+wetQ5t5moMWuzpWGT3xX0FuP+jFDPHynVqhTkOHr3YfBjAE+kawy0HbL2mnOF fXsQafPmaaSNchoJ85lvpZ/oJ1RGG6T/bqssk2PU+WdqwkC1ndAnxf9fgvIJNPydqMqo oLhB/ln/f2MY89qHrpFYodoxedE3odE3Qzoih7SOthqz3gkIE4lzouiBW6T7QdtpaQgf cUfg== X-Gm-Message-State: AO0yUKUFEgKtUFX11IZFEETVXXsD8ZBsOmM2NWYOpZ9arI4zzMyxpB2M TygFD+BwrLAd49QE/pr7Qq7VNw== X-Google-Smtp-Source: AK7set93eWAJkgjHhW+UMztvbrVGCIilaOO8+EZEgmfBkfUxiVw5qkcsFtxCKI/KkVzq55wdoXqCNQ== X-Received: by 2002:a17:90a:850a:b0:238:b70:b94 with SMTP id l10-20020a17090a850a00b002380b700b94mr3194461pjn.11.1677585208190; Tue, 28 Feb 2023 03:53:28 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id gk8-20020a17090b118800b002339491ead6sm7922317pjb.5.2023.02.28.03.53.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 03:53:27 -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 , James Clark , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v3 07/14] perf kvm: Parse address location for samples Date: Tue, 28 Feb 2023 19:51:18 +0800 Message-Id: <20230228115125.144172-8-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230228115125.144172-1-leo.yan@linaro.org> References: <20230228115125.144172-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 Reviewed-by: James Clark --- 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 Wed Sep 10 02:40:10 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 5B3A2C64EC7 for ; Tue, 28 Feb 2023 11:54:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231597AbjB1LyQ (ORCPT ); Tue, 28 Feb 2023 06:54:16 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49734 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231752AbjB1LyA (ORCPT ); Tue, 28 Feb 2023 06:54:00 -0500 Received: from mail-pj1-x1033.google.com (mail-pj1-x1033.google.com [IPv6:2607:f8b0:4864:20::1033]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 321F27EFC for ; Tue, 28 Feb 2023 03:53:38 -0800 (PST) Received: by mail-pj1-x1033.google.com with SMTP id l1so9537479pjt.2 for ; Tue, 28 Feb 2023 03:53:38 -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=M2xCb/oEyzcp4qtsL3947itLAsP3SbvEWCZbAE33tzU=; b=IWYP1xAkztIZ6AqO0ZBuNiznxf1fHNFRFseUcnkPI3CehSovVTUmS9X2zT8JV8zn0l qs1CH2hxzS0oQ90OxKSPeX/5TEzC0h4c42cOXMMGaXRHmCVMEztdJqMYLLw5JcKVKIy7 Qh6zOBglygfDACTaFiM49m6xBJtGhEEz07ODhU2B+WYdAPZ1ttoYBvKyUbYK+/wEJ49+ ngKYFQ7YjA6lAcb76C9vWqXl/Jb9EL5GOiqe//OwBrnIt98x4AxlbjUhxL+vK4q/i5H8 J9dCekv8Y7cDxL8r/VbBxmdNFSDGr30LoZ6NXuGM77WaGLcX2HpbLa1GZMRPObq+hFWB 0D3g== 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=M2xCb/oEyzcp4qtsL3947itLAsP3SbvEWCZbAE33tzU=; b=JGRNCgNZCC8YtiSWCCbOiplD2D/YIUKiFtp7tLYYz9aslW8ZVpBGDZr6ePBSf0MCT6 htBuVG2mvKwerLv0V88vdCYYwgrTM2eFfFAgTQUgB2DBiAdVVpK0qhIqIzt3JXgkwAL2 E/v5+3HvouU2QO1BkgCBGGPOqMViSUyDYUEkQkN8iNmrASc6SNFYzMi8nGZcg13QMRtP mYLuGVHSAMPgJXtEkgOKy+72nx5MmfTGdV3azkv7GMhZwRkdcgUIkjSweG/s5VS2g8gu PuEF47mb9R+G3rgumREVaAC1oRrzUj0I9Da9zSlPL9WaqJOt8z5HfUIvKiuY4yqTczO5 StEw== X-Gm-Message-State: AO0yUKUoWiU4l6rE1zWnlAkTF9CscVXQBhUdIMgHwfvxwHzoZ6ymbfL1 FiamJFYj3r+5WbEDM8HJw2Uhdw== X-Google-Smtp-Source: AK7set/jtma5R6pf9geqmiVFwRL6WGqy7cm88X6UGo3Pd/zgJ15+xtN5FmsN7UUy2fLdyvCq0XeAxA== X-Received: by 2002:a17:90b:38d0:b0:234:a88e:d67e with SMTP id nn16-20020a17090b38d000b00234a88ed67emr2934935pjb.34.1677585213423; Tue, 28 Feb 2023 03:53:33 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id gk8-20020a17090b118800b002339491ead6sm7922317pjb.5.2023.02.28.03.53.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 03:53:33 -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 , James Clark , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v3 08/14] perf kvm: Add dimensions for KVM event statistics Date: Tue, 28 Feb 2023 19:51:19 +0800 Message-Id: <20230228115125.144172-9-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230228115125.144172-1-leo.yan@linaro.org> References: <20230228115125.144172-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 Reviewed-by: James Clark --- 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 Wed Sep 10 02:40:10 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 0EE26C64ED6 for ; Tue, 28 Feb 2023 11:54:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231770AbjB1Ly3 (ORCPT ); Tue, 28 Feb 2023 06:54:29 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49624 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231591AbjB1LyN (ORCPT ); Tue, 28 Feb 2023 06:54:13 -0500 Received: from mail-pl1-x635.google.com (mail-pl1-x635.google.com [IPv6:2607:f8b0:4864:20::635]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DBE5721A2E for ; Tue, 28 Feb 2023 03:53:47 -0800 (PST) Received: by mail-pl1-x635.google.com with SMTP id bh1so10081117plb.11 for ; Tue, 28 Feb 2023 03:53:47 -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=Go6hF74oM9whxRdOC2jPPk3Baai7a+bxN4rdxUN/CiI=; b=IvzC3IakH+fK1BEQY63uauxpg+WVe9tccSJZyqnanc8BdCUkMFp0ZaYBuhrVxevXbX q0MCshvratVLASORVQqJPpy430sKHn7c7fsiVCWGB+PApiQTxglljCZbYVv9n1uvmFpJ R98GIQFCc67bmNH5zXHW0JIkZLptBhHu2871M5vfJN6paXVTLpBtfAsipCkANwM1kKhD jT3Q3Be15bxpqKRPADv/Zz7dI+J5CDlOZ/J4XMtWR4/N7htWMGVeMTZw2VaUpt3GGLp6 zqxeYzWXsTZtKOeUBEtTShQ/vn63ptOxp0YCQixjAG2IFjDyVGkJJn6Z1Xw6M+bXaUOT b1BQ== 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=Go6hF74oM9whxRdOC2jPPk3Baai7a+bxN4rdxUN/CiI=; b=p/Ls7QXOxsMYweQyu42W/3gjP8Zy1R1jLpSif8njLahiloXj9X8OBQfP3RHCnKpQT7 UYojtNRCLtzOo5EojSZRIThFIWu3b6S7frP8Sv6BMLTr+9VEp9BfwX5/E+A6R07+Xu+Q KNm9efSf7CVvGDmwnxBEh3O0iki+EYNj4IY2/rlyycLrzRqAo20N1jw03dk0mU/JgFff PoQOgf7l6C1msjn7dF9af6UUMcEpYHtnap5BSrYJGqC9kzqxHq5IwKjrH3Txh/q7uC79 CvoaG1w9togayX90o11nkLBi6wpuF9x6C9Vu1+Svn3zzT7SWJMDlnEU2aXZwWxiuX3+B FiQQ== X-Gm-Message-State: AO0yUKXKNxYYAPLSUYnTyD0mtuNls+hDDmwYreHOjwKySiJ+P9mcamF5 MDeTJu8K77mA1UK1Aec3m6xpayaNlYU8Pjsix7A= X-Google-Smtp-Source: AK7set97q+9fn1H9imEIK6nqwOZzi3tMPnplmhMOltAnQ8lhJoiuIPLqkzAcHnD7StS5kdFHxmktuw== X-Received: by 2002:a17:90a:3e05:b0:237:2045:5198 with SMTP id j5-20020a17090a3e0500b0023720455198mr2995551pjc.36.1677585218806; Tue, 28 Feb 2023 03:53:38 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id gk8-20020a17090b118800b002339491ead6sm7922317pjb.5.2023.02.28.03.53.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 03:53:38 -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 , James Clark , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v3 09/14] perf kvm: Use histograms list to replace cached list Date: Tue, 28 Feb 2023 19:51:20 +0800 Message-Id: <20230228115125.144172-10-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230228115125.144172-1-leo.yan@linaro.org> References: <20230228115125.144172-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 Reviewed-by: James Clark --- 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 Wed Sep 10 02:40:10 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 0BC05C64ED6 for ; Tue, 28 Feb 2023 11:54:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231775AbjB1Lyg (ORCPT ); Tue, 28 Feb 2023 06:54:36 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50054 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231492AbjB1LyQ (ORCPT ); Tue, 28 Feb 2023 06:54:16 -0500 Received: from mail-pl1-x62c.google.com (mail-pl1-x62c.google.com [IPv6:2607:f8b0:4864:20::62c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 02A0921954 for ; Tue, 28 Feb 2023 03:53:49 -0800 (PST) Received: by mail-pl1-x62c.google.com with SMTP id v11so6585592plz.8 for ; Tue, 28 Feb 2023 03:53:48 -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=IVA/SliggfFjyn1LtlyRDRM3jLle/ZCLsZr9XDCOvr4=; b=cwaSdMK2MosBJmFPQ/Yz+X8w6vJQFeqlpKXTuMEkpAbwdsXVZsA7aI9Bhr6MdaA7ik hHlobYafFhEA+RyhWqM+V4zoFeZKGAT2UcQ09SiYl/FlQSx6mKbybsaZdSig9uwdcJpM 7MPEggnnLXmeXb0lcSRAIOgGmlfHkhHadZPHKyUn+oYbvGWQ3eY4nfAcX476IOkhZRbY ofIKbDfUSF5Cf0j8RvOWoqwVVr0d49FzCSl2X8AEfhXlyxy5rGI5SqdR1/iTpPJUkNB6 ogH+kBsvzFOTzngsOyan8MTDivDFF12j/5HSIIzLGpBqT+tk68Ibg/ZzZ+58gujFILMR lBoQ== 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=IVA/SliggfFjyn1LtlyRDRM3jLle/ZCLsZr9XDCOvr4=; b=geJYv3JDmOITPbQzb/h2e6A/v87RPvt8yhKRwVRDllsfHuAVF71LfqKzdPGfSk7c1I Wz8QCU5UXshdMOcHRjWP8YJkvMDparN2AIxTGdBoeb61OpsKOZn364mPu8hRnH1wvv3g XRCKraZvzFBAQqHAgB5cEz5wQCNXQHWt5Q6XVHGlI7G9CWio6N8JEQ/vyM2+SXI032DQ U4aGiyLU59RkM70ZdV6BNTRgjd6RUFIEJuc6q694guvguGj/oy3XbKLmLo4g9P4W1kwE J65wqU7gmwTH3rsNOuYYzZo3bJIr2o/JCjIkJAkS2ETVMgByCS6eH+4q5OSR52H4tugc bd4g== X-Gm-Message-State: AO0yUKXESw5TWG8xfADlIYwynS7AMoBYXM0vujZ6syX2jN6daETxOYxE Cn0Egr0kgFKZ37KawPBL1GfNGQ== X-Google-Smtp-Source: AK7set8h4tOy6A4rKkBURR6cbLmv7aSoNCG38/0VHxDX58D/uxKiVvPifngHERVeFiT0t8a3gvMnBA== X-Received: by 2002:a17:90a:345:b0:236:75d3:fedc with SMTP id 5-20020a17090a034500b0023675d3fedcmr3063340pjf.8.1677585223568; Tue, 28 Feb 2023 03:53:43 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id gk8-20020a17090b118800b002339491ead6sm7922317pjb.5.2023.02.28.03.53.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 03:53: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 , James Clark , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v3 10/14] perf kvm: Polish sorting key Date: Tue, 28 Feb 2023 19:51:21 +0800 Message-Id: <20230228115125.144172-11-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230228115125.144172-1-leo.yan@linaro.org> References: <20230228115125.144172-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 Reviewed-by: James Clark --- 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 Wed Sep 10 02:40:10 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 AEBBFC64ED6 for ; Tue, 28 Feb 2023 11:54:40 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231156AbjB1Lyj (ORCPT ); Tue, 28 Feb 2023 06:54:39 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50416 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231489AbjB1LyU (ORCPT ); Tue, 28 Feb 2023 06:54:20 -0500 Received: from mail-pl1-x62a.google.com (mail-pl1-x62a.google.com [IPv6:2607:f8b0:4864:20::62a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A4C53CA26 for ; Tue, 28 Feb 2023 03:53:52 -0800 (PST) Received: by mail-pl1-x62a.google.com with SMTP id bh1so10081542plb.11 for ; Tue, 28 Feb 2023 03:53:52 -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=l9iPZ6kED2sgejRw3aZIhHru7u/PrSSNmL2hmgbo2xU=; b=yUDll5J7GnGcIkqj+lEUDzHzv7O+vN8nlDbM8MjOlM/hfuXTefjK6nhrzsPfuA8/oo MvE/RHMgcpiXTBNBx9zskzB73Q0vMeoAgYlq8MGR43HX4FShbmbAw/+X4ESDdvC6HboR 8AJw+jQb8gc1Nk8d2obBd10Cn037XWKUt5kaJZDgjVgcRQR80H5h3W58ZmDuWniGSriG j2kn1F2XgImdIuQTGCx19zNRoGxBPTo7GG6Fhy9/1MierflfeHbJvotFCN1jZ48LUk+H HmB7XffVKPIMBOeYy+XgVs2+Ulsxc46DsJGyQTlKnj7XGA5pA93QIjwBTpz8NQQP+RS/ dCeQ== 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=l9iPZ6kED2sgejRw3aZIhHru7u/PrSSNmL2hmgbo2xU=; b=1OPQVRMbp5CoihbHdAYxh0m7YnJi8fpZqPzFNeMkOpvRLH+04yDCuEUlFGv/83QUHJ 5j+VQY6/mRO99C9bpoabxJ5QLJzTvg5Z7L7g/VN6KdWfw6PdPF1Xguq4WnuWG+BFGf95 F/XZaJuxo2qNWMMX5sq0huNayozDIJJja81oXrAHah7w0JgjBk1N+grLSgkievDaNBfC 94GW6HJ8i0kbvhEkEmfkq6a6QHY7i1IIOSPDfUv6+S/EOJdahJmI9XI5TcrZf5Ajr1cP UfPQTCe1HeRRZAAtbpphd5ylAno3bDiQy7EmrXcsXBwUx08i2Sc6EMrOK/U5DGiDsAK4 pZzw== X-Gm-Message-State: AO0yUKXjk9UQUJ1eYOsZfeinZjxdFM2gG/5FgAMnXbX+daFpblCvQuRi PXVpiCz5qyC4KVKzUSSDHl39yw== X-Google-Smtp-Source: AK7set+Pv0C8P12Xd85/1MPiNULsnUZK5TQAgCpz5ZENyf617uBKO/UEeuVN2jBWAVgvJDmSEwxadg== X-Received: by 2002:a17:90a:1959:b0:237:659a:a44d with SMTP id 25-20020a17090a195900b00237659aa44dmr3103998pjh.9.1677585228471; Tue, 28 Feb 2023 03:53:48 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id gk8-20020a17090b118800b002339491ead6sm7922317pjb.5.2023.02.28.03.53.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 03:53:48 -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 , James Clark , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v3 11/14] perf kvm: Support printing attributions for dimensions Date: Tue, 28 Feb 2023 19:51:22 +0800 Message-Id: <20230228115125.144172-12-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230228115125.144172-1-leo.yan@linaro.org> References: <20230228115125.144172-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 Reviewed-by: James Clark --- 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 Wed Sep 10 02:40:10 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 05BC9C64ED6 for ; Tue, 28 Feb 2023 11:54:45 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231214AbjB1Lyn (ORCPT ); Tue, 28 Feb 2023 06:54:43 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50472 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229533AbjB1LyX (ORCPT ); Tue, 28 Feb 2023 06:54:23 -0500 Received: from mail-pl1-x635.google.com (mail-pl1-x635.google.com [IPv6:2607:f8b0:4864:20::635]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id ED60E35B1 for ; Tue, 28 Feb 2023 03:53:54 -0800 (PST) Received: by mail-pl1-x635.google.com with SMTP id i10so10095683plr.9 for ; Tue, 28 Feb 2023 03:53: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=owO6RMSXMhELaAiCDQfYtj1K3jFcb8cutoYS8UegXjk=; b=ITgM8j1GNblZluoCqcj6FUwDHNTxwKsb1LYP1MNGuaxh5G+XqwLEIsI4/pwROkU+I8 8p5oBFu7V/VHOX6pMAjvbKB79L7Blhmrs/36PnPgRJYQrhv/QxikWDsg8TedlTxYMiWh /Zk9N3ZeLqXIXOxRejXRBAdpvCr7s0aW0/vBUAroM+dL8txrhE/hpHyTN9bqgEQg9etH de03ZvVRY3lLYt2aBgusTebVc4FVjtAbaIZa9qOE7GVT8/yv6aajd/x0YCYpSoGUwLR0 lKMU2vI2TEMxS7JM2iE5UrZY77+RxfM5kEGLjzTN5GHOJC+pXAjS3qgMJSMXp9tatkFs pN7Q== 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=owO6RMSXMhELaAiCDQfYtj1K3jFcb8cutoYS8UegXjk=; b=OJWizj8MhBzVON4AGvS+fC3+HKxoRMcalBkNGvnTg4O7EKX2f7CuHVIvqvYIzFXYdj mA19I/M3PjcdAZQX4eOqvqezMqb7hMhHdd9MyYhDxOoBJK2auYouIjUJqGboCj27urSP 4w8sB28arPGIVG6Vsp0TievpJH62Nk7ZnYamPTINDF+wtJZxhXMMSZvGe2Xo2Fa4QtlD P7nABAtWWrI2liVreYNdixco3fnAkM4QCDQCHFNq/GaIyytvjKOOeETU8AP5ErSoeUFu 6VW1mcWvLcsHE0rOsy3cO+MkxEcYHalEGweVW7SNdFVzbtK9GNWotcx9p5mXNAVmHU0d 4VGg== X-Gm-Message-State: AO0yUKWQ4Tt0pVG7efZt/sSLSVDj1fY3pR/iUMSSIdcj9mWKDgP0+zlq NJgX1GArQDXRCoQH/lNrnUV4eg== X-Google-Smtp-Source: AK7set8DtAIgce991bpJ51nCnfZYsOa3okIXdYADpriVE9RxYoxKWUHTjjKquyTj/2m7RtgRDvpzTg== X-Received: by 2002:a17:90b:4b4a:b0:22b:fd93:7286 with SMTP id mi10-20020a17090b4b4a00b0022bfd937286mr3107411pjb.4.1677585233710; Tue, 28 Feb 2023 03:53:53 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id gk8-20020a17090b118800b002339491ead6sm7922317pjb.5.2023.02.28.03.53.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 03:53:53 -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 , James Clark , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v3 12/14] perf kvm: Add dimensions for percentages Date: Tue, 28 Feb 2023 19:51:23 +0800 Message-Id: <20230228115125.144172-13-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230228115125.144172-1-leo.yan@linaro.org> References: <20230228115125.144172-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 Reviewed-by: James Clark --- 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 Wed Sep 10 02:40:10 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 D9148C64EC7 for ; Tue, 28 Feb 2023 11:54:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231444AbjB1Lyz (ORCPT ); Tue, 28 Feb 2023 06:54:55 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50612 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231751AbjB1Ly1 (ORCPT ); Tue, 28 Feb 2023 06:54:27 -0500 Received: from mail-pl1-x62a.google.com (mail-pl1-x62a.google.com [IPv6:2607:f8b0:4864:20::62a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 17C7F2ED49 for ; Tue, 28 Feb 2023 03:54:00 -0800 (PST) Received: by mail-pl1-x62a.google.com with SMTP id bh1so10082005plb.11 for ; Tue, 28 Feb 2023 03:54: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=vka5hEENrebUCtUQDb6QxOdSux5yvJVVDFWdnRM5OH4=; b=LuZN489tRCN6oK6BA+OsNGUWh56v5Mf9d78DHFd78kk4livA+xYsmWrdVv49UUpn1W VDZ9iHiS6gbWdr+J9JTbKUy4skmvI3o1eKVMfIVl/uIgPra9JkhN7TnJQBZjxYT3cW66 u90d88y0FiEFFWK2dspKPXlPB43l9PJwjsjO+gfjDGKAdHOpwR6AxxZBkGgtMvnoWsZQ QvSc3AGsydj1JNVd7yMUo66yv6MyP5+azpSJX4NKARZEvkuVvS0rFRQVEtAnQEyy8sqy sJVO91uM09OE/vmMkrQhNtfHiACI5QZhXiRSI0MHPVYu2qZVvxdxLNR/jAlREbMnA9eh 2MZA== 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=vka5hEENrebUCtUQDb6QxOdSux5yvJVVDFWdnRM5OH4=; b=w1KIXOSdLVrR9yGnOJiqr+ctNz1pfIcERuhbX5K4EC+h3LkVMEgPPLvGmxbFk2XuFs YMSFRBZ5EztyLJ04knZMIuDz+w7oFTlkOLX9WEKEJuY67GFhh9nvcTYsW1/p5nQHUi4S zq7SHVuZkHG+GZ076+5flMkho+ZoMu4J5+BFuvEHuMyoCdFUS5PVEp5z4jdyKHWbNeyB xjbjocEcj+VeOa2ZbXDfSdrNMnesqLdvBpv0TZuM0eQ1/fOhP1z3IZBzNZ9K7DFcU+jJ cEJaZKGBQro2ojYw1xyB/AWVl8F+eu8OLAaeyXPOiGDrujt77ciOv6J9zHvF2hfHDZru 9X9Q== X-Gm-Message-State: AO0yUKXeK05rMA6LbrZosmDYjByTa4uc8Sr84kXdxULhFzU7dDHZsZck LsOVK2ZZIbkw24ABLnVov0ZuIA== X-Google-Smtp-Source: AK7set/UxcCdfdy+rKYFpJnGmvaiW97qDLRdiDoLdkxviklh7ZLYAXzDQj6HzM7yoJh0UXkSYROsnQ== X-Received: by 2002:a17:90b:1d92:b0:237:c5cc:15bf with SMTP id pf18-20020a17090b1d9200b00237c5cc15bfmr3118153pjb.13.1677585238615; Tue, 28 Feb 2023 03:53:58 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id gk8-20020a17090b118800b002339491ead6sm7922317pjb.5.2023.02.28.03.53.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 03:53:58 -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 , James Clark , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v3 13/14] perf kvm: Add TUI mode for stat report Date: Tue, 28 Feb 2023 19:51:24 +0800 Message-Id: <20230228115125.144172-14-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230228115125.144172-1-leo.yan@linaro.org> References: <20230228115125.144172-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 --- 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..56ad3346ba08 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 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_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 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 Wed Sep 10 02:40:10 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 0082BC64EC7 for ; Tue, 28 Feb 2023 11:55:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231373AbjB1Ly7 (ORCPT ); Tue, 28 Feb 2023 06:54:59 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49976 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229629AbjB1Ly3 (ORCPT ); Tue, 28 Feb 2023 06:54:29 -0500 Received: from mail-pl1-x630.google.com (mail-pl1-x630.google.com [IPv6:2607:f8b0:4864:20::630]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 14E412FCE3 for ; Tue, 28 Feb 2023 03:54:05 -0800 (PST) Received: by mail-pl1-x630.google.com with SMTP id v11so6586528plz.8 for ; Tue, 28 Feb 2023 03:54:05 -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=t1yEtOA/S7kgzfPudB0ZivwtY0/Ec+bbW+dtSNwunWQ=; b=EqufZcgTJuLYFCdWec9ozeE+yvyIhPMiuWZG7A6k0XGyy0ERBAWTIzjZhxq9j+V+yP gc5sA3f3W834DFB3va31cNbRSXdkcxDha0CQU5S1eZRzCnYiZxlcvZUdd/dXd2+6Ox/5 8J3tbO/DccOBS9rheXfOoucs3x1nmTzTFIvPluFqJOuEnYh44+jyzaubuPwdyWZmKrkE vGeoaOKP/c/+wB6Ou11XBQ6TRtWplZ7o0UO774BrRjzzMon9NFcRhijfarq4npF5IE1g 36lsOVNKKaFuSQhOXsvAbVB6cKZDz2pT64VVXGuyw1m1Lp1X+cuPyyCCbIMkBtlXPcyz BCvw== 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=t1yEtOA/S7kgzfPudB0ZivwtY0/Ec+bbW+dtSNwunWQ=; b=H53KbUa4mN8beqWQ+fATZdbT/RQUmKVbL4tOsalx8rFVsSWdeyHNZk9RJvPqEILDbG J85f2274J9JzPxOfxK6dQ4G9KvxkYYtLj16tU8RmuM9HAl8KgcaBwf78fq64Yx+a8t3m lwqLrJatWN2J4YLGW5a+oSu2iSBfiIYDBl5V5BRx1Kjr8ukv/Lb0N4cYmEg0EF+hd6Ch IYggJvgvPfC+0imRQSQHNMxpXJlWRf9gEkzYU9bjGGygVY3WAXqt6Uz86m/87BgTkVUg G2P85EiwrTUhMDjHLNw7s6jok8tbFiQWZzJAug/NHfzRE3Z/ilKmWV2oEWSjoK54KL1W OYTA== X-Gm-Message-State: AO0yUKXDkb7wmy2t7kdIZPNT2Uhso4bMofv7my6WDRb78uzknCWNiY9D Pdsbd1fPphwscHlvBy8uSEUGGA== X-Google-Smtp-Source: AK7set/3ey40Ufas0DbtaGkjaVGCapd2bs4uVJuNf5++vCCnnGrtEoZlpBjYWG9kNrPFvlVjwMA/jA== X-Received: by 2002:a17:90b:4a85:b0:234:9715:fe9a with SMTP id lp5-20020a17090b4a8500b002349715fe9amr2785028pjb.43.1677585244013; Tue, 28 Feb 2023 03:54:04 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id gk8-20020a17090b118800b002339491ead6sm7922317pjb.5.2023.02.28.03.53.58 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 28 Feb 2023 03:54:03 -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 , James Clark , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v3 14/14] perf kvm: Update documentation to reflect new changes Date: Tue, 28 Feb 2023 19:51:25 +0800 Message-Id: <20230228115125.144172-15-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230228115125.144172-1-leo.yan@linaro.org> References: <20230228115125.144172-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 Reviewed-by: James Clark --- 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