From nobody Mon Sep 8 06:49:16 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 363CFC7EE23 for ; Sun, 26 Feb 2023 04:21:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229708AbjBZEVQ (ORCPT ); Sat, 25 Feb 2023 23:21:16 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44824 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229661AbjBZEVL (ORCPT ); Sat, 25 Feb 2023 23:21:11 -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 89155BDFD for ; Sat, 25 Feb 2023 20:21:10 -0800 (PST) Received: by mail-pl1-x62a.google.com with SMTP id i5so1843504pla.2 for ; Sat, 25 Feb 2023 20:21:10 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=/6XdpHkz8A8bOxvOk1eGAORWD0fU8Q/VwNFknF3nlZE=; b=oFoLR3FiLT+h5TvDFl1GMv2yCpurUwpbMglbpeM+aHbUkBo57SGlAj4ysITb90pRAD RJ3V9S1eBxSMEfVi/I8ve+chS48IInvz4zhBCxbkjhk8ePeevlcGnhvHL7H2qkgvfGn6 QOp+r2aLbM3gavUNPxXcV0yFWFpzC7632yZ5mcjdf4XgPapjcE/kFIO/pAFNYVQ/q+Fo qO6r1ooid1B+V8U0sm33s/nYeARnc+J2yWtxGa/ydAXudiqdHBjSN8Juwj5OohtDRMOU l47QGgZktZHueXcz4NmSS7ZJCan5UhNlTweSj1pBbKPuMRG9sYhGQlRL8ULigehujOwK sUXw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=/6XdpHkz8A8bOxvOk1eGAORWD0fU8Q/VwNFknF3nlZE=; b=ugFOOF2zHq86tAw7q6jYfF6hFMZNiyyoYA8klBKMOs9jwG38Jp6lSPsAuu1Gaz9UgC 6L/cN9L3GWLeM3GSrd5fGglxbishniRJgbz9NOvhOHPteMKmMgG3urRVDVT4JYMUYDYx Ur4wJgxwCUfO5hquULmnCsmHYnr9e/MR37aEiGbhHzi+91aOIy5/fP055fJLdULXRZnl RKSSoIO8JZzYge+n6TXhJ/QxjCsxP8rJTKqqe/UCfjDesOcwgnuFgS/z0cSW6yv4Uzir hJ1dIaykc1Fdx2hvfnlB93ktbGwYJyp1NKi8W9HFdYQc6Il5kx3/3cdUZqRaLhK16lWO YqLQ== X-Gm-Message-State: AO0yUKU8T1tuxtnkfkaGWchHivjZ5dhZWhX5u2JRJ52NIONtbO44ujTV zoo2rVbKXUOr0y8DK1jC6HP91Q== X-Google-Smtp-Source: AK7set8d6gnX4LOmAYlzfD6ivuYo2gNNIR2DBnedvHEhU0G6tEEigiU79oAzkXZ6JvBQnI3lBRKSQQ== X-Received: by 2002:a17:902:f903:b0:19d:7a4:4073 with SMTP id kw3-20020a170902f90300b0019d07a44073mr259328plb.59.1677385269877; Sat, 25 Feb 2023 20:21:09 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id jj2-20020a170903048200b0019aaab3f9d7sm1976036plb.113.2023.02.25.20.21.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 25 Feb 2023 20:21:09 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v1 01/14] perf kvm: Refactor overall statistics Date: Sun, 26 Feb 2023 12:20:40 +0800 Message-Id: <20230226042053.1492409-2-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230226042053.1492409-1-leo.yan@linaro.org> References: <20230226042053.1492409-1-leo.yan@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Currently the tool computes overall statistics when sort the results. This patch refactors overall statistics during events processing, therefore, the function update_total_coun() is not needed anymore, an extra benefit is we can de-couple code between the statistics and the sorting. This patch is not expected any functionality changes. Signed-off-by: Leo Yan --- tools/perf/builtin-kvm.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 641e739c717c..0172e5b0d26e 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -278,9 +278,14 @@ static double kvm_event_rel_stddev(int vcpu_id, struct= kvm_event *event) avg_stats(&kvm_stats->stats)); } =20 -static bool update_kvm_event(struct kvm_event *event, int vcpu_id, +static bool update_kvm_event(struct perf_kvm_stat *kvm, + struct kvm_event *event, int vcpu_id, u64 time_diff) { + /* Update overall statistics */ + kvm->total_count++; + kvm->total_time +=3D time_diff; + if (vcpu_id =3D=3D -1) { kvm_update_event_stats(&event->total, time_diff); return true; @@ -399,7 +404,7 @@ static bool handle_end_event(struct perf_kvm_stat *kvm, } } =20 - return update_kvm_event(event, vcpu, time_diff); + return update_kvm_event(kvm, event, vcpu, time_diff); } =20 static @@ -526,15 +531,6 @@ static void insert_to_result(struct rb_root *result, s= truct kvm_event *event, rb_insert_color(&event->rb, result); } =20 -static void -update_total_count(struct perf_kvm_stat *kvm, struct kvm_event *event) -{ - int vcpu =3D kvm->trace_vcpu; - - kvm->total_count +=3D get_event_count(event, vcpu); - kvm->total_time +=3D get_event_time(event, vcpu); -} - static bool event_is_valid(struct kvm_event *event, int vcpu) { return !!get_event_count(event, vcpu); @@ -549,7 +545,6 @@ static void sort_result(struct perf_kvm_stat *kvm) for (i =3D 0; i < EVENTS_CACHE_SIZE; i++) { list_for_each_entry(event, &kvm->kvm_events_cache[i], hash_entry) { if (event_is_valid(event, vcpu)) { - update_total_count(kvm, event); insert_to_result(&kvm->result, event, kvm->compare, vcpu); } --=20 2.34.1 From nobody Mon Sep 8 06:49:16 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 DF4F4C64ED6 for ; Sun, 26 Feb 2023 04:21:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229757AbjBZEVV (ORCPT ); Sat, 25 Feb 2023 23:21:21 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44856 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229681AbjBZEVP (ORCPT ); Sat, 25 Feb 2023 23:21:15 -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 36AAEC643 for ; Sat, 25 Feb 2023 20:21:14 -0800 (PST) Received: by mail-pj1-x1029.google.com with SMTP id kb15so2954300pjb.1 for ; Sat, 25 Feb 2023 20:21:14 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=JpZ5nkw8exH6pwfmixa8Q7/xf5HABCQppgg+JZ7ONP0=; b=hK6xtK0P+jdDy+P5lKMWHE4668MH19RL3AO3pqibo0WUV5zMY4MaoRrYR2uxTjfVjG Pha2OP+A0X8Q5sqoQZj0EpFZS9fKVPCzOJwI/6JUIebAngQCEd14aJ1u3yDpqzFO3CpG e1CoMW6O7S/jJrpkvCSxFbWz1Uyo8KBclfAVgSpD86+lOpoSVlFnXJF72E2UPwy5QVIm MCbqV/JrqyPCNZhGZkGcb77JK0UQ+JsgJfNPZex+AuUQgdnjY5sICBtSBsa7Av6vSZUn IfiT1+GVe79nfFRDw50GGsJGluI/FFYPUvvgEEv8/mVYpgd+/Jhm0AgNXJ2nzWJJjFSR /jDg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=JpZ5nkw8exH6pwfmixa8Q7/xf5HABCQppgg+JZ7ONP0=; b=YVumJ8XTfNO5ElSzJ8vYHBev5DxpCnoz6HBM3ZbVcTjXc+ytCkXnWnIZVhkO4JwVuU tiShOv4alNSRSaLWR+LmPs0LasnSWHioVUgMPunckCFbIW5F8PwFGWh+JYPDSPEDCThB wiGUGTOKQIEqQmCLonfBK1D20Fu07oAHV2GjqiDd0QyvB0/RluYPIWHBkDVWOWn0RrZc 8aAtwqBF2bm1BLrNXXCPz0nxdAFMOEgrEc7czpOrJavq0q8aDkdCuXjaC+oo2673Dklw q0ynTLoaWyplrQYZfJG1vKpCTjLG8M87o+n5ctfDpYNOt/SOnB0zxpKvYIgVAedeJqU0 Ce2Q== X-Gm-Message-State: AO0yUKWaS95jRGvLgKWy2rRkXWkGk171h0PmNc7Wtb++gIxmJo3nvbjs Tww2nRAENvCxub+0Q1JSwns+OQ== X-Google-Smtp-Source: AK7set8Rw6G5gGFspCo7/rafoJ5m63fbiew7+V0e7kuxuc5Ui/qx5oWz4YB7Gu918mbOFbH9wgXNEA== X-Received: by 2002:a17:903:2347:b0:19b:64bb:d546 with SMTP id c7-20020a170903234700b0019b64bbd546mr4820182plh.18.1677385273638; Sat, 25 Feb 2023 20:21:13 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id jj2-20020a170903048200b0019aaab3f9d7sm1976036plb.113.2023.02.25.20.21.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 25 Feb 2023 20:21:13 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v1 02/14] perf kvm: Add pointer to 'perf_kvm_stat' in kvm event Date: Sun, 26 Feb 2023 12:20:41 +0800 Message-Id: <20230226042053.1492409-3-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230226042053.1492409-1-leo.yan@linaro.org> References: <20230226042053.1492409-1-leo.yan@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Sometimes, handling kvm events needs to base on global variables, e.g. when read event counts we need to know the target vcpu ID; the global variables are stored in structure perf_kvm_stat. This patch adds add a 'perf_kvm_stat' pointer in kvm event structure, it is to be used by later refactoring. Signed-off-by: Leo Yan --- tools/perf/builtin-kvm.c | 6 ++++-- tools/perf/util/kvm-stat.h | 5 +++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 0172e5b0d26e..3d2560ec6b37 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -209,7 +209,8 @@ static bool kvm_event_expand(struct kvm_event *event, i= nt vcpu_id) return true; } =20 -static struct kvm_event *kvm_alloc_init_event(struct event_key *key) +static struct kvm_event *kvm_alloc_init_event(struct perf_kvm_stat *kvm, + struct event_key *key) { struct kvm_event *event; =20 @@ -219,6 +220,7 @@ static struct kvm_event *kvm_alloc_init_event(struct ev= ent_key *key) return NULL; } =20 + event->perf_kvm =3D kvm; event->key =3D *key; init_stats(&event->total.stats); return event; @@ -238,7 +240,7 @@ static struct kvm_event *find_create_kvm_event(struct p= erf_kvm_stat *kvm, return event; } =20 - event =3D kvm_alloc_init_event(key); + event =3D kvm_alloc_init_event(kvm, key); if (!event) return NULL; =20 diff --git a/tools/perf/util/kvm-stat.h b/tools/perf/util/kvm-stat.h index 6f0fa05b62b6..40a4b66cfee6 100644 --- a/tools/perf/util/kvm-stat.h +++ b/tools/perf/util/kvm-stat.h @@ -24,10 +24,13 @@ struct kvm_event_stats { struct stats stats; }; =20 +struct perf_kvm_stat; + struct kvm_event { struct list_head hash_entry; struct rb_node rb; =20 + struct perf_kvm_stat *perf_kvm; struct event_key key; =20 struct kvm_event_stats total; @@ -44,8 +47,6 @@ struct kvm_event_key { key_cmp_fun key; }; =20 -struct perf_kvm_stat; - struct child_event_ops { void (*get_key)(struct evsel *evsel, struct perf_sample *sample, --=20 2.34.1 From nobody Mon Sep 8 06:49:16 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 01BD8C6FA8E for ; Sun, 26 Feb 2023 04:21:49 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229649AbjBZEVr (ORCPT ); Sat, 25 Feb 2023 23:21:47 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45030 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229749AbjBZEVU (ORCPT ); Sat, 25 Feb 2023 23:21:20 -0500 Received: from mail-pj1-x102e.google.com (mail-pj1-x102e.google.com [IPv6:2607:f8b0:4864:20::102e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2A271D506 for ; Sat, 25 Feb 2023 20:21:18 -0800 (PST) Received: by mail-pj1-x102e.google.com with SMTP id l1so2948340pjt.2 for ; Sat, 25 Feb 2023 20:21:18 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=fdGtU8CdVJ5aQaJfBI2DSk5cEkPEgW68Xd4/KtBW9/E=; b=VjxdWvAIfc1gAme/swteXdbpUmEZxEL6e7VSNv9Znpl+9QVpRe25OZxU3211okGiUW LG1A2ET4g/nr5TshBejSK1ExgS+BNGh1zHczpvQyYWZ07A9+n/8xRb2G084kmAU8OM9X OwKvNNwVhO5Nx+buk9mrduSPetSxVw0ZkaFWDECybAp+CXI0wSc13AyznTJXOkMCacyI 97Bycukn1Nexk7j7GOW1fKkC2XFfC8nRBXa1InSOya1MIQB1wbQdcTfcdn9aikk7tCBF WGgaGt+i/bwSY5YxdMZ11hPHRILFYLvBZXS/R6GDMAUvzQhdRTuo46iMHdovDnwh5APs 4FSg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=fdGtU8CdVJ5aQaJfBI2DSk5cEkPEgW68Xd4/KtBW9/E=; b=sBmY7RJuu+hGbUm4tPXY2tvuj78AbHcKms0swpBMIanMHRjrOBHTLrQf7ENcnvccy1 lduPhy4OHn9EiXSPhx7LJFntMbzwx86cnQAf8lbEWxOrAQeV8aHGSXsCja8LKXAZ2SsK RKIaMNm9Hyor86036WZ52SQtwYOekLCH7bKyMUYdmtH/lZ16Lt/8GF+dygtzIc0ULHmn 26Qn2pWzwvk+qpaQklV6EahYZ2//oMOftVVYlc18bc+mTF2fauu+LqchGO0sEzxJLXNI kY0MDoOV36L46MLneLW5NgZpvn8xPBHztaMm2H6THqtWZnJ0lwqcIoma3D8qMxEVcPsZ jOHw== X-Gm-Message-State: AO0yUKX/JrJzNmlGEgzqdlVknWSwJUNrkh7jbaCOMc1tQ8/Yd/v11JJL mxvHebf7JtKgen3OIFtFKMT916drtkh5C7IhAZjNpw== X-Google-Smtp-Source: AK7set/9mSOtpCIVqQgW3czbPioSQE/zJy9l2G4KrL6S20vznCy8d2bS0ATvkuamMHO6L8bnbN5aZQ== X-Received: by 2002:a17:903:32cf:b0:19a:9686:ea8b with SMTP id i15-20020a17090332cf00b0019a9686ea8bmr23988286plr.28.1677385277500; Sat, 25 Feb 2023 20:21:17 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id jj2-20020a170903048200b0019aaab3f9d7sm1976036plb.113.2023.02.25.20.21.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 25 Feb 2023 20:21: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 , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v1 03/14] perf kvm: Move up metrics helpers Date: Sun, 26 Feb 2023 12:20:42 +0800 Message-Id: <20230226042053.1492409-4-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230226042053.1492409-1-leo.yan@linaro.org> References: <20230226042053.1492409-1-leo.yan@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" This patch moves up the helper functions of event's metrics for later adding code to call them. No any functionality changes, but has a function renaming from compare_kvm_event_{metric}() to cmp_event_{metric}(). Signed-off-by: Leo Yan --- tools/perf/builtin-kvm.c | 72 ++++++++++++++++++++-------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 3d2560ec6b37..62c097a37da9 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -49,6 +49,42 @@ #include #include =20 +#define GET_EVENT_KEY(func, field) \ +static u64 get_event_ ##func(struct kvm_event *event, int vcpu) \ +{ \ + if (vcpu =3D=3D -1) \ + return event->total.field; \ + \ + if (vcpu >=3D event->max_vcpu) \ + return 0; \ + \ + return event->vcpu[vcpu].field; \ +} + +#define COMPARE_EVENT_KEY(func, field) \ +GET_EVENT_KEY(func, field) \ +static int cmp_event_ ## func(struct kvm_event *one, \ + struct kvm_event *two, int vcpu) \ +{ \ + return get_event_ ##func(one, vcpu) > \ + get_event_ ##func(two, vcpu); \ +} + +GET_EVENT_KEY(time, time); +GET_EVENT_KEY(max, stats.max); +GET_EVENT_KEY(min, stats.min); +COMPARE_EVENT_KEY(count, stats.n); +COMPARE_EVENT_KEY(mean, stats.mean); + +#define DEF_SORT_NAME_KEY(name, compare_key) \ + { #name, cmp_event_ ## compare_key } + +static struct kvm_event_key keys[] =3D { + DEF_SORT_NAME_KEY(sample, count), + DEF_SORT_NAME_KEY(time, mean), + { NULL, NULL } +}; + static const char *get_filename_for_perf_kvm(void) { const char *filename; @@ -461,42 +497,6 @@ static bool handle_kvm_event(struct perf_kvm_stat *kvm, return true; } =20 -#define GET_EVENT_KEY(func, field) \ -static u64 get_event_ ##func(struct kvm_event *event, int vcpu) \ -{ \ - if (vcpu =3D=3D -1) \ - return event->total.field; \ - \ - if (vcpu >=3D event->max_vcpu) \ - return 0; \ - \ - return event->vcpu[vcpu].field; \ -} - -#define COMPARE_EVENT_KEY(func, field) \ -GET_EVENT_KEY(func, field) \ -static int compare_kvm_event_ ## func(struct kvm_event *one, \ - struct kvm_event *two, int vcpu)\ -{ \ - return get_event_ ##func(one, vcpu) > \ - get_event_ ##func(two, vcpu); \ -} - -GET_EVENT_KEY(time, time); -COMPARE_EVENT_KEY(count, stats.n); -COMPARE_EVENT_KEY(mean, stats.mean); -GET_EVENT_KEY(max, stats.max); -GET_EVENT_KEY(min, stats.min); - -#define DEF_SORT_NAME_KEY(name, compare_key) \ - { #name, compare_kvm_event_ ## compare_key } - -static struct kvm_event_key keys[] =3D { - DEF_SORT_NAME_KEY(sample, count), - DEF_SORT_NAME_KEY(time, mean), - { NULL, NULL } -}; - static bool select_key(struct perf_kvm_stat *kvm) { int i; --=20 2.34.1 From nobody Mon Sep 8 06:49:16 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 5AC0FC6FA8E for ; Sun, 26 Feb 2023 04:22:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229800AbjBZEVx (ORCPT ); Sat, 25 Feb 2023 23:21:53 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45048 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229801AbjBZEVY (ORCPT ); Sat, 25 Feb 2023 23:21:24 -0500 Received: from mail-pl1-x632.google.com (mail-pl1-x632.google.com [IPv6:2607:f8b0:4864:20::632]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DBDEACA04 for ; Sat, 25 Feb 2023 20:21:21 -0800 (PST) Received: by mail-pl1-x632.google.com with SMTP id ky4so3555044plb.3 for ; Sat, 25 Feb 2023 20:21:21 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=aIt7hyoJVmNy/7vg+PJWYd0GZkeRWV7lG6iYd+8Wqps=; b=QLCZOXZA8bJOvg/e431jWcUuatC2M0BATcQlATzrxK/OSsLRVFfdDyj1Eeien+oMt9 6/+coTMUrO1gUQZbBlgoa1XDp/TxsSqW1AMGKb1+24q8M7IC43f8GITQ1D0PeK4ZGkTm vBjiMeFkdDt0DSZOzhHfzpehFxRRM+3xlsXQcS4n1gmM0YHTbu7geqhO20FWcfuzt6ed b1RjfsSpBz4ZerZq5To3SCcuJCDyuz87hWAedKW2Y0/HX7w7aLhz+/72RXBOWSVpP272 EYem2JG8n4ZCGTHUgNyZ1x/Eo93Ty9tepoF5PP47tIE4cdiE2x5cJ3dY36Pmeg5nmSIn 4+8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=aIt7hyoJVmNy/7vg+PJWYd0GZkeRWV7lG6iYd+8Wqps=; b=kqo4wydjqp+FutuaTSEzJHmH63yQJjrSqoeyuLHK6RzeF/nlybuSdw+09LQuTU5Ug3 u5oQRiLKHJ+SZ2DhaizTxju9/Ffn13uNWadgC4r0nsdyGUe8W5rNQ1UaVjvAzhL5ZLw4 0EnOIWAIE6d+VFgz8s1e9t94VmzSf1nwDveAdE3yXHY4oWCOYyHsHCfMhDtsjIm6Q0/w uevNEQEJZHgqAenTtISXcKX3R/5VcFLltKTz7xPMjK5KzZ19MkW/hbNTm5UmvnxA24ti KTIqldHrem3sA03ferkKPBjTFrn7MA6fgHUWv0l0WcXwAHb1daJEajBc9hXThJyAG7Nl KrXQ== X-Gm-Message-State: AO0yUKVEe5nUhM1qrDOaeZ9cckIKnHF6x3OQSrM2a0VXKxAcOep068UX ITUZNfGNxkxcWJ3+8hN6Vc0OmA== X-Google-Smtp-Source: AK7set8NFJnLKgBe2EBgoB7Mof6k4BnAkRsqRlxzF43EeTJawxXOGdih/wiXHA78FRAElhuOG0bPEw== X-Received: by 2002:a17:902:db10:b0:19c:dbce:dce8 with SMTP id m16-20020a170902db1000b0019cdbcedce8mr6942908plx.15.1677385281289; Sat, 25 Feb 2023 20:21:21 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id jj2-20020a170903048200b0019aaab3f9d7sm1976036plb.113.2023.02.25.20.21.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 25 Feb 2023 20:21:20 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v1 04/14] perf kvm: Use subtraction for comparison metrics Date: Sun, 26 Feb 2023 12:20:43 +0800 Message-Id: <20230226042053.1492409-5-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230226042053.1492409-1-leo.yan@linaro.org> References: <20230226042053.1492409-1-leo.yan@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Currently the metrics comparison uses greater operator (>), it returns the boolean value (0 or 1). This patch changes to use subtraction as comparison result, which can be used by histograms sorting. Signed-off-by: Leo Yan --- tools/perf/builtin-kvm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 62c097a37da9..6eec0db2dda6 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -66,7 +66,7 @@ GET_EVENT_KEY(func, field) \ static int cmp_event_ ## func(struct kvm_event *one, \ struct kvm_event *two, int vcpu) \ { \ - return get_event_ ##func(one, vcpu) > \ + return get_event_ ##func(one, vcpu) - \ get_event_ ##func(two, vcpu); \ } =20 @@ -523,7 +523,7 @@ static void insert_to_result(struct rb_root *result, st= ruct kvm_event *event, p =3D container_of(*rb, struct kvm_event, rb); parent =3D *rb; =20 - if (bigger(event, p, vcpu)) + if (bigger(event, p, vcpu) > 0) rb =3D &(*rb)->rb_left; else rb =3D &(*rb)->rb_right; --=20 2.34.1 From nobody Mon Sep 8 06:49:16 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 0868BC7EE30 for ; Sun, 26 Feb 2023 04:22:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229739AbjBZEWT (ORCPT ); Sat, 25 Feb 2023 23:22:19 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45580 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229931AbjBZEVg (ORCPT ); Sat, 25 Feb 2023 23:21:36 -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 B1835EB4A for ; Sat, 25 Feb 2023 20:21:25 -0800 (PST) Received: by mail-pl1-x62a.google.com with SMTP id z2so3504060plf.12 for ; Sat, 25 Feb 2023 20:21:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=JA7VJN/YcBA7IE+nNQeWn+LVdWT4KUb0IqvxyHZoo8o=; b=yphIfzPv05IfIc6/1JjUPJ2e4gRqh66jjIcuDpczDTonK4ArNDx4y+So9iG0FMtm+/ fwWtRRUmcMe1HVG0qrTS8NjNGGMnRU9KhkbxYie5RvfCuq7/FgRvvmaJzxwydmMkjVzu UnbD24ww//iKoNLFEDWeX4KsWPKo4L3T05BneHWWd5BqF+AWwutZPpmnBmKMHojrRPmB 3VFlySGh9zIo3/PNDaXbHTEjGeb1AlwlxtwACkBH6vGUKuLwkSlxdpN1B6TP/nsPqkyW qoWK9BoM5ZaMZggeuyCqYR+kDHIyZn/Z6sfAlqzH/yJfPDC6k7RYPGElCxaxc3g+dVXk GRhw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=JA7VJN/YcBA7IE+nNQeWn+LVdWT4KUb0IqvxyHZoo8o=; b=PGfF+GIPCNwjw4e0RUZrlJUQsje5LYEAimE44YE2dfNpp5UttBf1ckYs3yr21VqQlI Ddyl6rXiNSIClmB+mBGlHSgbYfhkuGi+P7PJ3sD1A4gQrSoHaFNz7t4YLRv32v4LHT4j su+JeB/c8OmWD0DLtFEqmyPEJmD2Ev6TmHG4pHgbvlSmwrvkYKj/uJnjFFC8I62lzPg5 8WMxVLQzVVQY7jcK+M0s0k7E+OzDt7Hvf/csLwLztdUJkFfFK0U5GaAlpFiAnlYrq0TI 6SrZqTn/ln4xqzWO5FuyNBFR8B8W+GO98sk5QvjWJFKgE/W7OvvrpUGQm5sFMnmcbZKs 6YxQ== X-Gm-Message-State: AO0yUKXGIL1tNu6CnQl5ocuRPDT9FyyiJtj+1t2SsCBDhHYnl7vldmO3 SX83/ZLdupVC0MXTb1WGXdZTHA== X-Google-Smtp-Source: AK7set8vNeV+3T/sIVqYTTFSdekoL/MKxMsPS57H24aP7VTKLtxQw18XhaGNJw89YOrVjSHLRaRg1A== X-Received: by 2002:a17:903:2283:b0:19a:ae30:3a42 with SMTP id b3-20020a170903228300b0019aae303a42mr5383543plh.21.1677385285179; Sat, 25 Feb 2023 20:21:25 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id jj2-20020a170903048200b0019aaab3f9d7sm1976036plb.113.2023.02.25.20.21.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 25 Feb 2023 20:21:24 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v1 05/14] perf kvm: Introduce histograms data structures Date: Sun, 26 Feb 2023 12:20:44 +0800 Message-Id: <20230226042053.1492409-6-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230226042053.1492409-1-leo.yan@linaro.org> References: <20230226042053.1492409-1-leo.yan@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" This is a preparation to support histograms in perf kvm tool. As first step, this patch defines histograms data structures and initialize them. Signed-off-by: Leo Yan --- tools/perf/builtin-kvm.c | 18 ++++++++++++++++++ tools/perf/util/kvm-stat.h | 1 + 2 files changed, 19 insertions(+) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 6eec0db2dda6..4ae54ba4fdaf 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -85,6 +85,20 @@ static struct kvm_event_key keys[] =3D { { NULL, NULL } }; =20 +struct kvm_hists { + struct hists hists; + struct perf_hpp_list list; +}; + +static struct kvm_hists kvm_hists; + +static int kvm_hists__init(void) +{ + __hists__init(&kvm_hists.hists, &kvm_hists.list); + perf_hpp_list__init(&kvm_hists.list); + return 0; +} + static const char *get_filename_for_perf_kvm(void) { const char *filename; @@ -957,6 +971,8 @@ static int kvm_events_live_report(struct perf_kvm_stat = *kvm) set_term_quiet_input(&save); init_kvm_event_record(kvm); =20 + kvm_hists__init(); + signal(SIGINT, sig_handler); signal(SIGTERM, sig_handler); =20 @@ -1152,6 +1168,8 @@ static int kvm_events_report_vcpu(struct perf_kvm_sta= t *kvm) init_kvm_event_record(kvm); setup_pager(); =20 + kvm_hists__init(); + ret =3D read_events(kvm); if (ret) goto exit; diff --git a/tools/perf/util/kvm-stat.h b/tools/perf/util/kvm-stat.h index 40a4b66cfee6..a3219829c448 100644 --- a/tools/perf/util/kvm-stat.h +++ b/tools/perf/util/kvm-stat.h @@ -5,6 +5,7 @@ #ifdef HAVE_KVM_STAT_SUPPORT =20 #include "tool.h" +#include "sort.h" #include "stat.h" #include "record.h" =20 --=20 2.34.1 From nobody Mon Sep 8 06:49:16 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 E4536C7EE23 for ; Sun, 26 Feb 2023 04:22:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229512AbjBZEWX (ORCPT ); Sat, 25 Feb 2023 23:22:23 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45702 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229959AbjBZEVm (ORCPT ); Sat, 25 Feb 2023 23:21:42 -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 ABAD9E04C for ; Sat, 25 Feb 2023 20:21:29 -0800 (PST) Received: by mail-pl1-x62c.google.com with SMTP id p20so2316562plw.13 for ; Sat, 25 Feb 2023 20:21:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=b0Hu2w1HCV6BLAJH+BUXhSI8OHGX3HrQUpTuSp+vt2M=; b=du6tVr4cyHV9cIUuzZPA2mgvK3Yj70mmmSOE0beA5v6GpWHF6NBKXa19txUG3uYjcJ 3T6S0RTvBKqN3MDtZO/7rIekMG6UVd7VB3Usc4Po8lLhpX6c/apvcVfXKByrbjUBszaN GxFKZqElik0a9SnwiYGmbz+pHRrfeUidxxWp13LQJDxcda45mr22lCMMBoT8RMFvDBjV EDM50sA31l9H8keZyN3jRUNWMbN+Uxg/tlbq07lpYPvphyOG/g0RwFpvDSGK/8ydMSbC 7iVnPsOj6L7lGsqWvGEgJE2N7/8qD4bZ/Qny/CiI6+W9KcXtaVsz5akUq+lLSwSQ5p+v kJfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=b0Hu2w1HCV6BLAJH+BUXhSI8OHGX3HrQUpTuSp+vt2M=; b=MV7RB1VZAFISr53a4UxoYutB8OMidfTFdGQ4zBmwcAJRYFZxRV+crojYnraV5AuZlq BaUxwcW7ZVzPn5H2Mk40XnfLXUAzpxLWrBk+d1yicC9+i+b8pKx+4k60eNG+Z+RGdwYf UY0xkeXmLLdFHfOHxgIpdIpGxRmI16l6KJHkrJRCLDOgq/K238Ef6ybzth9g0wK9RBVS dBCcIqDoWQ4S/vI9eLBfFyCdo6dTtT7UArXt9qu4Tdozmo87T8xERAwv2hy2qwsPDdzp zob4MXz+1y3SF253o0g+LeFBjdojn1MVEs8ls9OJc+pGQq1fm6o6alDrBEvtIv3ikBBV EHGg== X-Gm-Message-State: AO0yUKUc3yuht4VCsZNpBqOnv4uMf7KqkepW4p6R32VF3oyBZT4TnAuV Uwj942nx0G3NZGzDZEMFQehigg== X-Google-Smtp-Source: AK7set9beEmEDB/Jyu8tUwOhN/WaoDy7GuCqVAjAUV+73N3trUgVDT0HjMUgu/dtF3HNPJ1muq3xGw== X-Received: by 2002:a17:902:d4c3:b0:19c:17d1:28a4 with SMTP id o3-20020a170902d4c300b0019c17d128a4mr25077299plg.67.1677385288941; Sat, 25 Feb 2023 20:21:28 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id jj2-20020a170903048200b0019aaab3f9d7sm1976036plb.113.2023.02.25.20.21.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 25 Feb 2023 20:21:28 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v1 06/14] perf kvm: Pass argument 'sample' to kvm_alloc_init_event() Date: Sun, 26 Feb 2023 12:20:45 +0800 Message-Id: <20230226042053.1492409-7-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230226042053.1492409-1-leo.yan@linaro.org> References: <20230226042053.1492409-1-leo.yan@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" This patch adds an argument 'sample' for kvm_alloc_init_event(), and its caller functions are updated as well for passing down the 'sample' pointer. This is a preparation change to allow later patch to create histograms entries for kvm event, no any functionality changes. Signed-off-by: Leo Yan --- tools/perf/builtin-kvm.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 4ae54ba4fdaf..779881901a05 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -260,7 +260,8 @@ static bool kvm_event_expand(struct kvm_event *event, i= nt vcpu_id) } =20 static struct kvm_event *kvm_alloc_init_event(struct perf_kvm_stat *kvm, - struct event_key *key) + struct event_key *key, + struct perf_sample *sample __maybe_unused) { struct kvm_event *event; =20 @@ -277,7 +278,8 @@ static struct kvm_event *kvm_alloc_init_event(struct pe= rf_kvm_stat *kvm, } =20 static struct kvm_event *find_create_kvm_event(struct perf_kvm_stat *kvm, - struct event_key *key) + struct event_key *key, + struct perf_sample *sample) { struct kvm_event *event; struct list_head *head; @@ -290,7 +292,7 @@ static struct kvm_event *find_create_kvm_event(struct p= erf_kvm_stat *kvm, return event; } =20 - event =3D kvm_alloc_init_event(kvm, key); + event =3D kvm_alloc_init_event(kvm, key, sample); if (!event) return NULL; =20 @@ -300,15 +302,16 @@ static struct kvm_event *find_create_kvm_event(struct= perf_kvm_stat *kvm, =20 static bool handle_begin_event(struct perf_kvm_stat *kvm, struct vcpu_event_record *vcpu_record, - struct event_key *key, u64 timestamp) + struct event_key *key, + struct perf_sample *sample) { struct kvm_event *event =3D NULL; =20 if (key->key !=3D INVALID_KEY) - event =3D find_create_kvm_event(kvm, key); + event =3D find_create_kvm_event(kvm, key, sample); =20 vcpu_record->last_event =3D event; - vcpu_record->start_time =3D timestamp; + vcpu_record->start_time =3D sample->time; return true; } =20 @@ -375,12 +378,12 @@ static bool is_child_event(struct perf_kvm_stat *kvm, static bool handle_child_event(struct perf_kvm_stat *kvm, struct vcpu_event_record *vcpu_record, struct event_key *key, - struct perf_sample *sample __maybe_unused) + struct perf_sample *sample) { struct kvm_event *event =3D NULL; =20 if (key->key !=3D INVALID_KEY) - event =3D find_create_kvm_event(kvm, key); + event =3D find_create_kvm_event(kvm, key, sample); =20 vcpu_record->last_event =3D event; =20 @@ -429,7 +432,7 @@ static bool handle_end_event(struct perf_kvm_stat *kvm, return true; =20 if (!event) - event =3D find_create_kvm_event(kvm, key); + event =3D find_create_kvm_event(kvm, key, sample); =20 if (!event) return false; @@ -500,7 +503,7 @@ static bool handle_kvm_event(struct perf_kvm_stat *kvm, return true; =20 if (kvm->events_ops->is_begin_event(evsel, sample, &key)) - return handle_begin_event(kvm, vcpu_record, &key, sample->time); + return handle_begin_event(kvm, vcpu_record, &key, sample); =20 if (is_child_event(kvm, evsel, sample, &key)) return handle_child_event(kvm, vcpu_record, &key, sample); --=20 2.34.1 From nobody Mon Sep 8 06:49:16 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 0804CC64ED6 for ; Sun, 26 Feb 2023 04:22:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229728AbjBZEW3 (ORCPT ); Sat, 25 Feb 2023 23:22:29 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45912 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229650AbjBZEVu (ORCPT ); Sat, 25 Feb 2023 23:21:50 -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 70C75D33C for ; Sat, 25 Feb 2023 20:21:33 -0800 (PST) Received: by mail-pl1-x630.google.com with SMTP id h8so232803plf.10 for ; Sat, 25 Feb 2023 20:21:33 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=JCXvY3VOyromxWZSsh4iONVhiGPWxZ3OU8P5j9wqMDM=; b=DaNxzuvhNXQ4wLJCYxYJ+wm5GTMCmnmX7mKLaXKDpQ/55+I+7Uan/JFCiCyRt25vc9 wN0dRrC09xps5a0nKV6Yxww+EuFZuq178G7Eh/kj7U2GBoZTCFQ4U9iuyb/hWEq0VizP 5CFx+8zCFmcfZhizaPIS5ChS8G2rbUatvmxq2er3inqcRB6kb18KJKz6+2ISDgouLrZD SjNrXh2mP0TXtK15gpllKaDJaTfA3CNou4LYFtAmygJODh8aA9QTsY1GlW7+43DOQhr9 6b3B08uFMqKIMnVa4VUL4blCAutgcB8gqWd23/bLXyLGSAlyABo0wNOFcgHpRsq8j+o3 blPg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=JCXvY3VOyromxWZSsh4iONVhiGPWxZ3OU8P5j9wqMDM=; b=DpDk6x79jq6PXEmsY1Ojj5pLwYYJuEQytFW7C7Emj/pc+GdybXKqLM4uRD0aXIFMhD nEem6uASAo6eEAOPpILePwTtXz4+HCtwcBM+WRsfGqVKWaQhsuJhPIjPpqy1DSeRXosl cgtXvJAAoMtEUpKazo+aDfmwWZgb9Z85+HieWkMDm8KxWuFgF5wMOyl2cj9m/7S08JEQ 6PiGOdwxm9nj5XAUllIoDH7QGDggvV9rDExd1xDLdhHiGXjUhZhK+59u6PkHQBcANBp4 NWtmvL6cq24KLtjG3v9CpOZUrIJ7QePnnQVFV1sMTWBhAh5OR2PtfIkZUdc6aQjtPsaR boTg== X-Gm-Message-State: AO0yUKWzyD7xB2IMHSY7O4gbhGzZLtmoQVYcBuHcRt9iqFuy56v7lwuQ EBekI7weVajn7GRfmuCm1td4lw== X-Google-Smtp-Source: AK7set+V2MihlpZmRYi8DJrjsaU7OadR3+v1rZvW4ZJkAo+N6PyadTQpdQRpaf47UjZPBy76vzH15w== X-Received: by 2002:a17:903:2347:b0:19a:9859:be26 with SMTP id c7-20020a170903234700b0019a9859be26mr4289506plh.22.1677385292839; Sat, 25 Feb 2023 20:21:32 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id jj2-20020a170903048200b0019aaab3f9d7sm1976036plb.113.2023.02.25.20.21.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 25 Feb 2023 20:21:32 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v1 07/14] perf kvm: Parse address location for samples Date: Sun, 26 Feb 2023 12:20:46 +0800 Message-Id: <20230226042053.1492409-8-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230226042053.1492409-1-leo.yan@linaro.org> References: <20230226042053.1492409-1-leo.yan@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Parse address location for samples and save it into the structure 'perf_kvm_stat', it is to be used by histograms entry. Signed-off-by: Leo Yan --- tools/perf/builtin-kvm.c | 5 +++++ tools/perf/util/kvm-stat.h | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 779881901a05..a9f467926bdd 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -704,6 +704,11 @@ static int process_sample_event(struct perf_tool *tool, if (skip_sample(kvm, sample)) return 0; =20 + if (machine__resolve(machine, &kvm->al, sample) < 0) { + pr_warning("Fail to resolve address location, skip sample.\n"); + return 0; + } + thread =3D machine__findnew_thread(machine, sample->pid, sample->tid); if (thread =3D=3D NULL) { pr_debug("problem processing %d event, skipping it.\n", diff --git a/tools/perf/util/kvm-stat.h b/tools/perf/util/kvm-stat.h index a3219829c448..80d5c5a9ae31 100644 --- a/tools/perf/util/kvm-stat.h +++ b/tools/perf/util/kvm-stat.h @@ -7,6 +7,7 @@ #include "tool.h" #include "sort.h" #include "stat.h" +#include "symbol.h" #include "record.h" =20 struct evsel; @@ -86,6 +87,9 @@ struct perf_kvm_stat { const char *sort_key; int trace_vcpu; =20 + /* Used when process events */ + struct addr_location al; + struct exit_reasons_table *exit_reasons; const char *exit_reasons_isa; =20 --=20 2.34.1 From nobody Mon Sep 8 06:49:16 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 18A5BC7EE30 for ; Sun, 26 Feb 2023 04:22:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229663AbjBZEWe (ORCPT ); Sat, 25 Feb 2023 23:22:34 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45100 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229825AbjBZEVz (ORCPT ); Sat, 25 Feb 2023 23:21:55 -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 0A869F746 for ; Sat, 25 Feb 2023 20:21:37 -0800 (PST) Received: by mail-pj1-x1029.google.com with SMTP id kb15so2954651pjb.1 for ; Sat, 25 Feb 2023 20:21:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=dkGLzxiRgSOZTh04Z+2xATChlICYHMpA+J8qmtvpz8Q=; b=Gx+ufAE8jtAIOrUrcwqcWqNzeaceHXeJlSzjgx87+Bne7Il2nH/9IukXpJKr1GGC8M sSfXXu93Tun7DMhxRDh+M67NQnJK1QOf7jI2OZ1ZgeSO+CURNv/nUGhkoOLsfotB8syl kajZawm/ayOyRSkagX7Dm1S56bBUVGA43NhHTpWkWAy7K0x+l4WLDkrYDl2U8EKIBevT 3bS5uIBnpqmm3bKmvSma19iMULRzixS2Z4ClfHuNBkY2rw5bLYyAsunMLPYZUfYjqqr1 IXf29fJh3O+7bpzUA6ah1Zpxwk/1GErFRcMUSCW1KVInRxbGRolSukXn/qA5ypq35j6Q Mkfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=dkGLzxiRgSOZTh04Z+2xATChlICYHMpA+J8qmtvpz8Q=; b=eq8lTZm8BDinJZGS+jWJWBOojJft8xgItjIMg7GrZOzxjqfiW8DpKDttDbLMCYnXW6 K0TrpL9baduXTffwN7oVDUHqAOcsex/NatR1p77PIWtqckOMY26KY2fQTD7ZCiASRnTu v5DOtOS62kKPcnpJZz739nbg3Ni1zFHi228U8+mG9AVkvqF3AMVAP85CygcxBiRiWLYe XWnnQvG6sBMHVVk9b4N5sysYJi81SKkVojX+OoEA5SkP4bnWE7JXbqS37eHqsXKpJy/E pEcWODFp33PVZhh911oUJQiy5w0Znzrbb2AhlE5UUappPMYkXav4hLEo+jV3iFKxjKlr 463Q== X-Gm-Message-State: AO0yUKWI0A5oiPWD86TzRSNeaa1AoDiRFmixwIucEcrsdjQu3SfVV3g/ xIUGHFDG9dvw/Q4MIhX9WAYONYTLIjHOJHdmuIeuVA== X-Google-Smtp-Source: AK7set9tPXCSroY3Z66GoPjqesDuAAXpPlDWP7McALN4p8riEugtM9Cq77GI6hQz5kLlhme5Uy6fxQ== X-Received: by 2002:a17:902:c40b:b0:19c:e3dd:db3c with SMTP id k11-20020a170902c40b00b0019ce3dddb3cmr5358292plk.20.1677385296665; Sat, 25 Feb 2023 20:21:36 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id jj2-20020a170903048200b0019aaab3f9d7sm1976036plb.113.2023.02.25.20.21.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 25 Feb 2023 20:21:36 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v1 08/14] perf kvm: Add dimensions for KVM event statistics Date: Sun, 26 Feb 2023 12:20:47 +0800 Message-Id: <20230226042053.1492409-9-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230226042053.1492409-1-leo.yan@linaro.org> References: <20230226042053.1492409-1-leo.yan@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" To support KVM event statistics, this patch firstly registers histograms columns and sorting fields; every column or field has its own format structure, the format structure is dereferenced to access the dimension, finally the dimension provides the comparison callback for sorting result. Signed-off-by: Leo Yan --- tools/perf/builtin-kvm.c | 239 +++++++++++++++++++++++++++++++++++-- tools/perf/util/kvm-stat.h | 2 + 2 files changed, 234 insertions(+), 7 deletions(-) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index a9f467926bdd..da84f5063d4d 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -70,9 +70,9 @@ static int cmp_event_ ## func(struct kvm_event *one, \ get_event_ ##func(two, vcpu); \ } =20 -GET_EVENT_KEY(time, time); -GET_EVENT_KEY(max, stats.max); -GET_EVENT_KEY(min, stats.min); +COMPARE_EVENT_KEY(time, time); +COMPARE_EVENT_KEY(max, stats.max); +COMPARE_EVENT_KEY(min, stats.min); COMPARE_EVENT_KEY(count, stats.n); COMPARE_EVENT_KEY(mean, stats.mean); =20 @@ -90,13 +90,238 @@ struct kvm_hists { struct perf_hpp_list list; }; =20 +struct kvm_dimension { + const char *name; + int64_t (*cmp)(struct perf_hpp_fmt *fmt, struct hist_entry *left, + struct hist_entry *right); +}; + +struct kvm_fmt { + struct perf_hpp_fmt fmt; + struct kvm_dimension *dim; +}; + static struct kvm_hists kvm_hists; =20 -static int kvm_hists__init(void) +static int64_t +empty_cmp(struct perf_hpp_fmt *fmt __maybe_unused, + struct hist_entry *left __maybe_unused, + struct hist_entry *right __maybe_unused) +{ + return 0; +} + +static struct kvm_dimension dim_event =3D { + .name =3D "name", + .cmp =3D empty_cmp, +}; + +#define EV_METRIC_CMP(metric) \ +static int64_t ev_cmp_##metric(struct perf_hpp_fmt *fmt __maybe_unused, \ + struct hist_entry *left, \ + struct hist_entry *right) \ +{ \ + struct kvm_event *event_left; \ + struct kvm_event *event_right; \ + struct perf_kvm_stat *perf_kvm; \ + \ + event_left =3D container_of(left, struct kvm_event, he); \ + event_right =3D container_of(right, struct kvm_event, he); \ + \ + perf_kvm =3D event_left->perf_kvm; \ + return cmp_event_##metric(event_left, event_right, \ + perf_kvm->trace_vcpu); \ +} + +EV_METRIC_CMP(time) +EV_METRIC_CMP(count) +EV_METRIC_CMP(max) +EV_METRIC_CMP(min) +EV_METRIC_CMP(mean) + +static struct kvm_dimension dim_time =3D { + .name =3D "time", + .cmp =3D ev_cmp_time, +}; + +static struct kvm_dimension dim_count =3D { + .name =3D "sample", + .cmp =3D ev_cmp_count, +}; + +static struct kvm_dimension dim_max_time =3D { + .name =3D "max_t", + .cmp =3D ev_cmp_max, +}; + +static struct kvm_dimension dim_min_time =3D { + .name =3D "min_t", + .cmp =3D ev_cmp_min, +}; + +static struct kvm_dimension dim_mean_time =3D { + .name =3D "mean_t", + .cmp =3D ev_cmp_mean, +}; + +static struct kvm_dimension *dimensions[] =3D { + &dim_event, + &dim_time, + &dim_count, + &dim_max_time, + &dim_min_time, + &dim_mean_time, + NULL, +}; + +static bool fmt_equal(struct perf_hpp_fmt *a, struct perf_hpp_fmt *b) +{ + struct kvm_fmt *kvm_fmt_a =3D container_of(a, struct kvm_fmt, fmt); + struct kvm_fmt *kvm_fmt_b =3D container_of(b, struct kvm_fmt, fmt); + + return kvm_fmt_a->dim =3D=3D kvm_fmt_b->dim; +} + +static void fmt_free(struct perf_hpp_fmt *fmt) +{ + struct kvm_fmt *kvm_fmt; + + kvm_fmt =3D container_of(fmt, struct kvm_fmt, fmt); + free(kvm_fmt); +} + +static struct kvm_dimension *get_dimension(const char *name) { + unsigned int i; + + for (i =3D 0; dimensions[i] !=3D NULL; i++) { + if (!strcmp(dimensions[i]->name, name)) + return dimensions[i]; + } + + return NULL; +} + +static struct kvm_fmt *get_format(const char *name) +{ + struct kvm_dimension *dim =3D get_dimension(name); + struct kvm_fmt *kvm_fmt; + struct perf_hpp_fmt *fmt; + + if (!dim) + return NULL; + + kvm_fmt =3D zalloc(sizeof(*kvm_fmt)); + if (!kvm_fmt) + return NULL; + + kvm_fmt->dim =3D dim; + + fmt =3D &kvm_fmt->fmt; + INIT_LIST_HEAD(&fmt->list); + INIT_LIST_HEAD(&fmt->sort_list); + fmt->cmp =3D dim->cmp; + fmt->sort =3D dim->cmp; + fmt->color =3D NULL; + fmt->entry =3D NULL; + fmt->header =3D NULL; + fmt->width =3D NULL; + fmt->collapse =3D dim->cmp; + fmt->equal =3D fmt_equal; + fmt->free =3D fmt_free; + + return kvm_fmt; +} + +static int kvm_hists__init_output(struct perf_hpp_list *hpp_list, char *na= me) +{ + struct kvm_fmt *kvm_fmt =3D get_format(name); + + if (!kvm_fmt) { + reset_dimensions(); + return output_field_add(hpp_list, name); + } + + perf_hpp_list__column_register(hpp_list, &kvm_fmt->fmt); + return 0; +} + +static int kvm_hists__init_sort(struct perf_hpp_list *hpp_list, char *name) +{ + struct kvm_fmt *kvm_fmt =3D get_format(name); + + if (!kvm_fmt) { + reset_dimensions(); + return sort_dimension__add(hpp_list, name, NULL, 0); + } + + perf_hpp_list__register_sort_field(hpp_list, &kvm_fmt->fmt); + return 0; +} + +static int kvm_hpp_list__init(char *list, + struct perf_hpp_list *hpp_list, + int (*fn)(struct perf_hpp_list *hpp_list, + char *name)) +{ + char *tmp, *tok; + int ret; + + if (!list || !fn) + return 0; + + for (tok =3D strtok_r(list, ", ", &tmp); tok; + tok =3D strtok_r(NULL, ", ", &tmp)) { + ret =3D fn(hpp_list, tok); + if (!ret) + continue; + + /* Handle errors */ + if (ret =3D=3D -EINVAL) + pr_err("Invalid field key: '%s'", tok); + else if (ret =3D=3D -ESRCH) + pr_err("Unknown field key: '%s'", tok); + else + pr_err("Fail to initialize for field key: '%s'", tok); + + break; + } + + return ret; +} + +static int kvm_hpp_list__parse(struct perf_hpp_list *hpp_list, + const char *output_, const char *sort_) +{ + char *output =3D output_ ? strdup(output_) : NULL; + char *sort =3D sort_ ? strdup(sort_) : NULL; + int ret; + + ret =3D kvm_hpp_list__init(output, hpp_list, kvm_hists__init_output); + if (ret) + goto out; + + ret =3D kvm_hpp_list__init(sort, hpp_list, kvm_hists__init_sort); + if (ret) + goto out; + + /* Copy sort keys to output fields */ + perf_hpp__setup_output_field(hpp_list); + +out: + free(output); + free(sort); + return ret; +} + +static int kvm_hists__init(struct perf_kvm_stat *kvm) +{ + const char *output_columns =3D "name,sample,time,max_t,min_t,mean_t"; + __hists__init(&kvm_hists.hists, &kvm_hists.list); perf_hpp_list__init(&kvm_hists.list); - return 0; + return kvm_hpp_list__parse(&kvm_hists.list, output_columns, + kvm->sort_key); } =20 static const char *get_filename_for_perf_kvm(void) @@ -979,7 +1204,7 @@ static int kvm_events_live_report(struct perf_kvm_stat= *kvm) set_term_quiet_input(&save); init_kvm_event_record(kvm); =20 - kvm_hists__init(); + kvm_hists__init(kvm); =20 signal(SIGINT, sig_handler); signal(SIGTERM, sig_handler); @@ -1176,7 +1401,7 @@ static int kvm_events_report_vcpu(struct perf_kvm_sta= t *kvm) init_kvm_event_record(kvm); setup_pager(); =20 - kvm_hists__init(); + kvm_hists__init(kvm); =20 ret =3D read_events(kvm); if (ret) diff --git a/tools/perf/util/kvm-stat.h b/tools/perf/util/kvm-stat.h index 80d5c5a9ae31..ca5796959f66 100644 --- a/tools/perf/util/kvm-stat.h +++ b/tools/perf/util/kvm-stat.h @@ -40,6 +40,8 @@ struct kvm_event { #define DEFAULT_VCPU_NUM 8 int max_vcpu; struct kvm_event_stats *vcpu; + + struct hist_entry he; }; =20 typedef int (*key_cmp_fun)(struct kvm_event*, struct kvm_event*, int); --=20 2.34.1 From nobody Mon Sep 8 06:49:16 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 39A52C7EE2F for ; Sun, 26 Feb 2023 04:22:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229893AbjBZEWi (ORCPT ); Sat, 25 Feb 2023 23:22:38 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46282 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229786AbjBZEV7 (ORCPT ); Sat, 25 Feb 2023 23:21:59 -0500 Received: from mail-pj1-x102a.google.com (mail-pj1-x102a.google.com [IPv6:2607:f8b0:4864:20::102a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6396BEF83 for ; Sat, 25 Feb 2023 20:21:41 -0800 (PST) Received: by mail-pj1-x102a.google.com with SMTP id h17-20020a17090aea9100b0023739b10792so3114132pjz.1 for ; Sat, 25 Feb 2023 20:21:41 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=FKs+rsPj1hm0j71DGE8gonxUEIM8JV3GuGWVFR89M0w=; b=gkBmxZMdgES2pWq4PK7G0Xut5H3TEo8CPuhuOcv9GItaB8VA1sr0Iem9snET2rkqK/ cU+5/NhRtqG98TXt306wm4HCT2MldnpVrMM/+KWT+wINUhmutTs6vt3LgK/XoOC3mSMi yhHD5ffFfQtByp2ChfZWaADO3hMnZIp6ZpCpM2O3qCu5+Q3xze5lnSR9yq4y2FVt4Z8L OpCtTaLBUDmRtjG5tmIhPmABTOwQiGhzNdyQ4vAX/L8N9H4/izsZJH0xFvSWRpFQVdck T2MEfodj2R2KT0MHMKFpBhbttj5bUIPzxGmEzY7AJ1spTi4tjoXE6DlAOCyuCZFzoudQ zOsg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=FKs+rsPj1hm0j71DGE8gonxUEIM8JV3GuGWVFR89M0w=; b=4V1ODq32rAt3rfuEDYN5gunoqx+0ZqGJCO4jGzG82r4pWal/sAxBD1mk3EX3/7fOMR xR80D9mGXJGVjwu6hnaL19THIp2phlZxqatEWut5frWNNeEMoCTG8cgiPpxjvWeZxC+t bL5Y3gIPuVDdQ5TS7jWfNFsXYHPTbQkNR/IDhNEuoidedxXVd1fLFVvUBaZwjv2be+h4 L78kGIzeaMiAzIWW68zgZIOSrHS12csXsCdH5XI8ZC0Gvv8kVPvgADDdMkIU3T6XQngh +XXrJXdl2fbSbo+4E7BqinaBK52QV6ySCrbuJUIpBF85sGjl7JnKyvtjS9/kV7kTnTPo qbZA== X-Gm-Message-State: AO0yUKXUQhM88DKZhOpvADKMai+K5Y8LIJs/9I8/1NdnHWA+Jz0f/Uil yhp8MF71uw/RQRkJU+eM3qemZA== X-Google-Smtp-Source: AK7set9sXImH/nVCNJSSIFb+ahIzHiOu6Nc6cDFhAH6SEe2R5qiIgShD77gYYzBTymEDpcxR5SS2sA== X-Received: by 2002:a17:902:e5ce:b0:19d:14c:e590 with SMTP id u14-20020a170902e5ce00b0019d014ce590mr2353262plf.9.1677385300638; Sat, 25 Feb 2023 20:21:40 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id jj2-20020a170903048200b0019aaab3f9d7sm1976036plb.113.2023.02.25.20.21.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 25 Feb 2023 20:21:40 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v1 09/14] perf kvm: Use histograms list to replace cached list Date: Sun, 26 Feb 2023 12:20:48 +0800 Message-Id: <20230226042053.1492409-10-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230226042053.1492409-1-leo.yan@linaro.org> References: <20230226042053.1492409-1-leo.yan@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" perf kvm tool defines its own cached list which is managed with RB tree, histograms also provide RB tree to manage data entries. Since now we have introduced histograms in the tool, it's not necessary to use the self defined list and we can directly use histograms list to manage KVM events. This patch changes to use histograms list to track KVM events, and it invokes the common function hists__output_resort_cb() to sort result, this also give us flexibility to extend more sorting key words easily. After histograms list supported, the cached list is redundant so remove the relevant code for it. Signed-off-by: Leo Yan --- tools/perf/builtin-kvm.c | 186 +++++++++++++++++++------------------ tools/perf/util/kvm-stat.h | 7 -- 2 files changed, 94 insertions(+), 99 deletions(-) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index da84f5063d4d..32dc697ff707 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -421,44 +421,37 @@ struct vcpu_event_record { struct kvm_event *last_event; }; =20 - -static void init_kvm_event_record(struct perf_kvm_stat *kvm) -{ - unsigned int i; - - for (i =3D 0; i < EVENTS_CACHE_SIZE; i++) - INIT_LIST_HEAD(&kvm->kvm_events_cache[i]); -} - #ifdef HAVE_TIMERFD_SUPPORT -static void clear_events_cache_stats(struct list_head *kvm_events_cache) +static void clear_events_cache_stats(void) { - struct list_head *head; + struct rb_root_cached *root; + struct rb_node *nd; struct kvm_event *event; - unsigned int i; - int j; - - for (i =3D 0; i < EVENTS_CACHE_SIZE; i++) { - head =3D &kvm_events_cache[i]; - list_for_each_entry(event, head, hash_entry) { - /* reset stats for event */ - event->total.time =3D 0; - init_stats(&event->total.stats); - - for (j =3D 0; j < event->max_vcpu; ++j) { - event->vcpu[j].time =3D 0; - init_stats(&event->vcpu[j].stats); - } + int i; + + if (hists__has(&kvm_hists.hists, need_collapse)) + root =3D &kvm_hists.hists.entries_collapsed; + else + root =3D kvm_hists.hists.entries_in; + + for (nd =3D rb_first_cached(root); nd; nd =3D rb_next(nd)) { + struct hist_entry *he; + + he =3D rb_entry(nd, struct hist_entry, rb_node_in); + event =3D container_of(he, struct kvm_event, he); + + /* reset stats for event */ + event->total.time =3D 0; + init_stats(&event->total.stats); + + for (i =3D 0; i < event->max_vcpu; ++i) { + event->vcpu[i].time =3D 0; + init_stats(&event->vcpu[i].stats); } } } #endif =20 -static int kvm_events_hash_fn(u64 key) -{ - return key & (EVENTS_CACHE_SIZE - 1); -} - static bool kvm_event_expand(struct kvm_event *event, int vcpu_id) { int old_max_vcpu =3D event->max_vcpu; @@ -484,21 +477,51 @@ static bool kvm_event_expand(struct kvm_event *event,= int vcpu_id) return true; } =20 +static void *kvm_he_zalloc(size_t size) +{ + struct kvm_event *kvm_ev; + + kvm_ev =3D zalloc(size + sizeof(*kvm_ev)); + if (!kvm_ev) + return NULL; + + return &kvm_ev->he; +} + +static void kvm_he_free(void *he) +{ + struct kvm_event *kvm_ev; + + kvm_ev =3D container_of(he, struct kvm_event, he); + free(kvm_ev); +} + +static struct hist_entry_ops kvm_ev_entry_ops =3D { + .new =3D kvm_he_zalloc, + .free =3D kvm_he_free, +}; + static struct kvm_event *kvm_alloc_init_event(struct perf_kvm_stat *kvm, struct event_key *key, - struct perf_sample *sample __maybe_unused) + struct perf_sample *sample) { struct kvm_event *event; + struct hist_entry *he; =20 - event =3D zalloc(sizeof(*event)); - if (!event) { - pr_err("Not enough memory\n"); + he =3D hists__add_entry_ops(&kvm_hists.hists, &kvm_ev_entry_ops, + &kvm->al, NULL, NULL, NULL, sample, true); + if (he =3D=3D NULL) { + pr_err("Failed to allocate hist entry\n"); return NULL; } =20 + hists__inc_nr_samples(&kvm_hists.hists, 0); + + event =3D container_of(he, struct kvm_event, he); event->perf_kvm =3D kvm; event->key =3D *key; init_stats(&event->total.stats); + return event; } =20 @@ -507,22 +530,26 @@ static struct kvm_event *find_create_kvm_event(struct= perf_kvm_stat *kvm, struct perf_sample *sample) { struct kvm_event *event; - struct list_head *head; + struct rb_root_cached *root; + struct rb_node *nd; =20 BUG_ON(key->key =3D=3D INVALID_KEY); =20 - head =3D &kvm->kvm_events_cache[kvm_events_hash_fn(key->key)]; - list_for_each_entry(event, head, hash_entry) { + if (hists__has(&kvm_hists.hists, need_collapse)) + root =3D &kvm_hists.hists.entries_collapsed; + else + root =3D kvm_hists.hists.entries_in; + + for (nd =3D rb_first_cached(root); nd; nd =3D rb_next(nd)) { + struct hist_entry *he =3D rb_entry(nd, struct hist_entry, + rb_node_in); + + event =3D container_of(he, struct kvm_event, he); if (event->key.key =3D=3D key->key && event->key.info =3D=3D key->info) return event; } =20 - event =3D kvm_alloc_init_event(kvm, key, sample); - if (!event) - return NULL; - - list_add(&event->hash_entry, head); - return event; + return kvm_alloc_init_event(kvm, key, sample); } =20 static bool handle_begin_event(struct perf_kvm_stat *kvm, @@ -754,58 +781,29 @@ static bool select_key(struct perf_kvm_stat *kvm) return false; } =20 -static void insert_to_result(struct rb_root *result, struct kvm_event *eve= nt, - key_cmp_fun bigger, int vcpu) -{ - struct rb_node **rb =3D &result->rb_node; - struct rb_node *parent =3D NULL; - struct kvm_event *p; - - while (*rb) { - p =3D container_of(*rb, struct kvm_event, rb); - parent =3D *rb; - - if (bigger(event, p, vcpu) > 0) - rb =3D &(*rb)->rb_left; - else - rb =3D &(*rb)->rb_right; - } - - rb_link_node(&event->rb, parent, rb); - rb_insert_color(&event->rb, result); -} - static bool event_is_valid(struct kvm_event *event, int vcpu) { return !!get_event_count(event, vcpu); } =20 -static void sort_result(struct perf_kvm_stat *kvm) +static int filter_cb(struct hist_entry *he, void *arg __maybe_unused) { - unsigned int i; - int vcpu =3D kvm->trace_vcpu; struct kvm_event *event; + struct perf_kvm_stat *perf_kvm; =20 - for (i =3D 0; i < EVENTS_CACHE_SIZE; i++) { - list_for_each_entry(event, &kvm->kvm_events_cache[i], hash_entry) { - if (event_is_valid(event, vcpu)) { - insert_to_result(&kvm->result, event, - kvm->compare, vcpu); - } - } - } + event =3D container_of(he, struct kvm_event, he); + perf_kvm =3D event->perf_kvm; + if (!event_is_valid(event, perf_kvm->trace_vcpu)) + he->filtered =3D 1; + else + he->filtered =3D 0; + return 0; } =20 -/* returns left most element of result, and erase it */ -static struct kvm_event *pop_from_result(struct rb_root *result) +static void sort_result(void) { - struct rb_node *node =3D rb_first(result); - - if (!node) - return NULL; - - rb_erase(node, result); - return container_of(node, struct kvm_event, rb); + hists__collapse_resort(&kvm_hists.hists, NULL); + hists__output_resort_cb(&kvm_hists.hists, NULL, filter_cb); } =20 static void print_vcpu_info(struct perf_kvm_stat *kvm) @@ -848,6 +846,7 @@ static void print_result(struct perf_kvm_stat *kvm) char decode[decode_str_len]; struct kvm_event *event; int vcpu =3D kvm->trace_vcpu; + struct rb_node *nd; =20 if (kvm->live) { puts(CONSOLE_CLEAR); @@ -866,9 +865,15 @@ static void print_result(struct perf_kvm_stat *kvm) pr_info("%16s ", "Avg time"); pr_info("\n\n"); =20 - while ((event =3D pop_from_result(&kvm->result))) { + for (nd =3D rb_first_cached(&kvm_hists.hists.entries); nd; nd =3D rb_next= (nd)) { + struct hist_entry *he; u64 ecount, etime, max, min; =20 + he =3D rb_entry(nd, struct hist_entry, rb_node); + if (he->filtered) + continue; + + event =3D container_of(he, struct kvm_event, he); ecount =3D get_event_count(event, vcpu); etime =3D get_event_time(event, vcpu); max =3D get_event_max(event, vcpu); @@ -1142,11 +1147,11 @@ static int perf_kvm__handle_timerfd(struct perf_kvm= _stat *kvm) pr_debug("Missed timer beats: %" PRIu64 "\n", c-1); =20 /* update display */ - sort_result(kvm); + sort_result(); print_result(kvm); =20 /* reset counts */ - clear_events_cache_stats(kvm->kvm_events_cache); + clear_events_cache_stats(); kvm->total_count =3D 0; kvm->total_time =3D 0; kvm->lost_events =3D 0; @@ -1202,8 +1207,6 @@ static int kvm_events_live_report(struct perf_kvm_sta= t *kvm) } =20 set_term_quiet_input(&save); - init_kvm_event_record(kvm); - kvm_hists__init(kvm); =20 signal(SIGINT, sig_handler); @@ -1250,7 +1253,7 @@ static int kvm_events_live_report(struct perf_kvm_sta= t *kvm) evlist__disable(kvm->evlist); =20 if (err =3D=3D 0) { - sort_result(kvm); + sort_result(); print_result(kvm); } =20 @@ -1398,7 +1401,6 @@ static int kvm_events_report_vcpu(struct perf_kvm_sta= t *kvm) if (!register_kvm_events_ops(kvm)) goto exit; =20 - init_kvm_event_record(kvm); setup_pager(); =20 kvm_hists__init(kvm); @@ -1407,7 +1409,7 @@ static int kvm_events_report_vcpu(struct perf_kvm_sta= t *kvm) if (ret) goto exit; =20 - sort_result(kvm); + sort_result(); print_result(kvm); =20 exit: diff --git a/tools/perf/util/kvm-stat.h b/tools/perf/util/kvm-stat.h index ca5796959f66..c38d320c7cbe 100644 --- a/tools/perf/util/kvm-stat.h +++ b/tools/perf/util/kvm-stat.h @@ -30,7 +30,6 @@ struct perf_kvm_stat; =20 struct kvm_event { struct list_head hash_entry; - struct rb_node rb; =20 struct perf_kvm_stat *perf_kvm; struct event_key key; @@ -75,9 +74,6 @@ struct exit_reasons_table { const char *reason; }; =20 -#define EVENTS_BITS 12 -#define EVENTS_CACHE_SIZE (1UL << EVENTS_BITS) - struct perf_kvm_stat { struct perf_tool tool; struct record_opts opts; @@ -97,7 +93,6 @@ struct perf_kvm_stat { =20 struct kvm_events_ops *events_ops; key_cmp_fun compare; - struct list_head kvm_events_cache[EVENTS_CACHE_SIZE]; =20 u64 total_time; u64 total_count; @@ -106,8 +101,6 @@ struct perf_kvm_stat { =20 struct intlist *pid_list; =20 - struct rb_root result; - int timerfd; unsigned int display_time; bool live; --=20 2.34.1 From nobody Mon Sep 8 06:49:16 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 4B950C7EE32 for ; Sun, 26 Feb 2023 04:22:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229946AbjBZEWl (ORCPT ); Sat, 25 Feb 2023 23:22:41 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45528 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229884AbjBZEWC (ORCPT ); Sat, 25 Feb 2023 23:22:02 -0500 Received: from mail-pj1-x102c.google.com (mail-pj1-x102c.google.com [IPv6:2607:f8b0:4864:20::102c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 50D54C15C for ; Sat, 25 Feb 2023 20:21:45 -0800 (PST) Received: by mail-pj1-x102c.google.com with SMTP id nw10-20020a17090b254a00b00233d7314c1cso6822608pjb.5 for ; Sat, 25 Feb 2023 20:21:45 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=hjL18aIBPgYfHqrjofZNutkN8+DYauLGt6A7ZGJ8B24=; b=iAaSKRQm+FOLvfH3xW+UZRCqNcZ9ZcCC8SZ8qSTMKlHcTHAaMlDYLbjYMQI4Dyye3X G9cxLmKM1zzFzw051kf7KT3cbqPkYAW39t5Bb/f7RPOkTK/yftpgxGJO7tq6x/dUiDM3 5R5iKeqB1r2qOmmRBeGqRkI7hqDrAUDBLyMouI9ej3wvbtCIWcVCGSbzNigTtvia0Veb Hq80ibcu4nd7uYc87D7L1JNs8iLnu2HGojw2ntSiYl6G6TjWPE8HCigkivvT1+FHcZGi pPi5sttWl7Ly0A6bv3y09aAHyqcwMdKJAM7PYIjgATI/fbeDL8jmffXEIcUylSFpGHxg /V/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=hjL18aIBPgYfHqrjofZNutkN8+DYauLGt6A7ZGJ8B24=; b=XaB+Iwd4nXQpLqJiJLDK8BegYS5yYposqemhMgmGS18olWC25K7NkQTFrdY5Dhr902 z1Mm+yIzENtzRH75kAVzzeWFOT1ED77AinYC/S9/8+TQPOiE8hDh2hVMpcZHTcq/sqqr y8MawMiY4Uirfmw/Dhg9HU/9UvT2Z9OexMtaAQeSRkVxnnSMFUMVv4NGzjDwX6cM2XDw vimJh2t9+SUocScotAZE/bdT+9DMqtCqaXrUKMUxAJC//LrjX/TU4asVcVlppzRbrO1m jQTpynOQjXD7wB2w/2uSvH2HWd1WWxcV/eHwt1N05/K+labTWhTxV3J4WxWI8ReUiBbo zGug== X-Gm-Message-State: AO0yUKUFoCY6/hiSTqA4VKCJHGwHmzA03RJktIED7V5qbt5bgGARm1gj lBlUB4TrXuiFuEedxXqG1FJ1lg== X-Google-Smtp-Source: AK7set+zoFK1SCKVui96RRRLxSG0gaoeA6zB+Fc0bS/v6wmVQjR7GUCqIPAc9QYpF/28rlrpRfkY2Q== X-Received: by 2002:a17:902:dac6:b0:19b:c491:21be with SMTP id q6-20020a170902dac600b0019bc49121bemr24672072plx.64.1677385304682; Sat, 25 Feb 2023 20:21:44 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id jj2-20020a170903048200b0019aaab3f9d7sm1976036plb.113.2023.02.25.20.21.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 25 Feb 2023 20:21:44 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v1 10/14] perf kvm: Polish sorting key Date: Sun, 26 Feb 2023 12:20:49 +0800 Message-Id: <20230226042053.1492409-11-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230226042053.1492409-1-leo.yan@linaro.org> References: <20230226042053.1492409-1-leo.yan@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Since histograms supports sorting, the tool doesn't need to maintain the mapping between the sorting keys and the corresponding comparison callbacks, therefore, this patch removes structure kvm_event_key. But we still need to validate the sorting key, this patch uses an array for sorting keys and renames function select_key() to is_valid_key() to validate the sorting key passed by user. Signed-off-by: Leo Yan --- tools/perf/builtin-kvm.c | 27 +++++++++------------------ tools/perf/util/kvm-stat.h | 8 -------- 2 files changed, 9 insertions(+), 26 deletions(-) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 32dc697ff707..741ba65bf092 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -76,15 +76,6 @@ COMPARE_EVENT_KEY(min, stats.min); COMPARE_EVENT_KEY(count, stats.n); COMPARE_EVENT_KEY(mean, stats.mean); =20 -#define DEF_SORT_NAME_KEY(name, compare_key) \ - { #name, cmp_event_ ## compare_key } - -static struct kvm_event_key keys[] =3D { - DEF_SORT_NAME_KEY(sample, count), - DEF_SORT_NAME_KEY(time, mean), - { NULL, NULL } -}; - struct kvm_hists { struct hists hists; struct perf_hpp_list list; @@ -766,18 +757,18 @@ static bool handle_kvm_event(struct perf_kvm_stat *kv= m, return true; } =20 -static bool select_key(struct perf_kvm_stat *kvm) +static bool is_valid_key(struct perf_kvm_stat *kvm) { + const char *key_array[] =3D { + "sample", "time", "max_t", "min_t", "mean_t", + }; int i; =20 - for (i =3D 0; keys[i].name; i++) { - if (!strcmp(keys[i].name, kvm->sort_key)) { - kvm->compare =3D keys[i].key; + for (i =3D 0; ARRAY_SIZE(key_array); i++) + if (!strcmp(key_array[i], kvm->sort_key)) return true; - } - } =20 - pr_err("Unknown compare key:%s\n", kvm->sort_key); + pr_err("Unsupported key: %s\n", kvm->sort_key); return false; } =20 @@ -1201,7 +1192,7 @@ static int kvm_events_live_report(struct perf_kvm_sta= t *kvm) return ret; =20 if (!verify_vcpu(kvm->trace_vcpu) || - !select_key(kvm) || + !is_valid_key(kvm) || !register_kvm_events_ops(kvm)) { goto out; } @@ -1395,7 +1386,7 @@ static int kvm_events_report_vcpu(struct perf_kvm_sta= t *kvm) if (!verify_vcpu(vcpu)) goto exit; =20 - if (!select_key(kvm)) + if (!is_valid_key(kvm)) goto exit; =20 if (!register_kvm_events_ops(kvm)) diff --git a/tools/perf/util/kvm-stat.h b/tools/perf/util/kvm-stat.h index c38d320c7cbe..a8e919ca59f4 100644 --- a/tools/perf/util/kvm-stat.h +++ b/tools/perf/util/kvm-stat.h @@ -43,13 +43,6 @@ struct kvm_event { struct hist_entry he; }; =20 -typedef int (*key_cmp_fun)(struct kvm_event*, struct kvm_event*, int); - -struct kvm_event_key { - const char *name; - key_cmp_fun key; -}; - struct child_event_ops { void (*get_key)(struct evsel *evsel, struct perf_sample *sample, @@ -92,7 +85,6 @@ struct perf_kvm_stat { const char *exit_reasons_isa; =20 struct kvm_events_ops *events_ops; - key_cmp_fun compare; =20 u64 total_time; u64 total_count; --=20 2.34.1 From nobody Mon Sep 8 06:49:16 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 5887DC6FA8E for ; Sun, 26 Feb 2023 04:23:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229718AbjBZEWy (ORCPT ); Sat, 25 Feb 2023 23:22:54 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46448 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229925AbjBZEWG (ORCPT ); Sat, 25 Feb 2023 23:22:06 -0500 Received: from mail-pj1-x1036.google.com (mail-pj1-x1036.google.com [IPv6:2607:f8b0:4864:20::1036]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 77C2DE39F for ; Sat, 25 Feb 2023 20:21:49 -0800 (PST) Received: by mail-pj1-x1036.google.com with SMTP id gi3-20020a17090b110300b0023762f642dcso3070803pjb.4 for ; Sat, 25 Feb 2023 20:21:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=OfT+QNOxQJmHazP6lqFky4KrZI/iD3/8HshJqJUPAo0=; b=qptnsxVeddCZzP54pGIw/EKkorQ3BUbeevNbGhdcaMLpijxTPMJi50KWHZftsfuYK6 Gv8h/QGhDjIqG6Fg97YhgGVaoVaFpVCf3TC++qJYSiOHUkZyrT/t8xy0V1ibvLZTg1WS RlkEdeeHGxp9QgwI/5hMjkP0D1ZMbdmNlzgV/+Oro/B54uu37MSZ7m2iiOQdD9KI2XRS 2OrxxEIkBlTWtTk/GK4beifpBISUsQlDDuwOMyMNjYKqx2qDaLfQusp8FsY3LX78iZr+ ba5D4di5hlfNNXMB6aHRP5OWUgzUIcOkCGecJ/2CzPWaNTiYzQaIZvWmKjh59hEStboC Jd5g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=OfT+QNOxQJmHazP6lqFky4KrZI/iD3/8HshJqJUPAo0=; b=ExoOncLZ4QHycAJ/pYXaC7bpneUFSHRbb/oYG2b5QJBsNWVdFNwQZCTVdMESh0eNK+ Y+ilXkShEww7aMghUrIKyKFiI7lwHPp6j3kpnJFljzJg7sRN6peEa1CB8pbJzq4JMHvy y/pB94BJki7OE0z44tmhPDxngo2E10GzYBCSGSeAVD8hRN3AXgTXu0MAwMg2HfR6B/SM 51vGZIc26pyGQib1hNDu9vrMgg5vMhHWmui/9O3r/7O6EmT0NkDJ2r1XofgibMl0JeRZ VrcphtXXzU4KV+JkRafjg1l2+2HGNtQDmmmhAWXk78lInfkGzrIcCRdoBDFQu9XEom3O p6vQ== X-Gm-Message-State: AO0yUKXAyWRbgfNHflW+UGzKvuX3EEAS1OrBNAXJAX6sVfb0L9mdcGy0 7GUZn2MqEKO1krpYAbd0OGqVmw== X-Google-Smtp-Source: AK7set+BDOEJ2XnrDX5dG1tyW64g3EQGqYSORZmc7omU5rhotsinTSK1VmmCR2hr/yBZbp25Ahf4Qg== X-Received: by 2002:a17:903:22cc:b0:19a:a6ec:6721 with SMTP id y12-20020a17090322cc00b0019aa6ec6721mr25044023plg.16.1677385308551; Sat, 25 Feb 2023 20:21:48 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id jj2-20020a170903048200b0019aaab3f9d7sm1976036plb.113.2023.02.25.20.21.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 25 Feb 2023 20:21: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 , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v1 11/14] perf kvm: Support printing attributions for dimensions Date: Sun, 26 Feb 2023 12:20:50 +0800 Message-Id: <20230226042053.1492409-12-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230226042053.1492409-1-leo.yan@linaro.org> References: <20230226042053.1492409-1-leo.yan@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" This patch adds header, entry callback and width for every dimension, thus in TUI mode the tool can print items with the defined attributions. Signed-off-by: Leo Yan --- tools/perf/builtin-kvm.c | 105 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 102 insertions(+), 3 deletions(-) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 741ba65bf092..a56d0983c585 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -83,8 +83,12 @@ struct kvm_hists { =20 struct kvm_dimension { const char *name; + const char *header; + int width; int64_t (*cmp)(struct perf_hpp_fmt *fmt, struct hist_entry *left, struct hist_entry *right); + int (*entry)(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp, + struct hist_entry *he); }; =20 struct kvm_fmt { @@ -102,9 +106,32 @@ empty_cmp(struct perf_hpp_fmt *fmt __maybe_unused, return 0; } =20 +static int fmt_width(struct perf_hpp_fmt *fmt, + struct perf_hpp *hpp __maybe_unused, + struct hists *hists __maybe_unused); + +static int ev_name_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp, + struct hist_entry *he) +{ + struct kvm_event *event; + int width =3D fmt_width(fmt, hpp, he->hists); + char decode[decode_str_len]; + struct perf_kvm_stat *perf_kvm; + + event =3D container_of(he, struct kvm_event, he); + + perf_kvm =3D event->perf_kvm; + perf_kvm->events_ops->decode_key(perf_kvm, &event->key, decode); + + return scnprintf(hpp->buf, hpp->size, "%*s", width, decode); +} + static struct kvm_dimension dim_event =3D { + .header =3D "Event name", .name =3D "name", .cmp =3D empty_cmp, + .entry =3D ev_name_entry, + .width =3D 40, }; =20 #define EV_METRIC_CMP(metric) \ @@ -130,29 +157,77 @@ EV_METRIC_CMP(max) EV_METRIC_CMP(min) EV_METRIC_CMP(mean) =20 +#define EV_METRIC_ENTRY(metric) \ +static int ev_entry_##metric(struct perf_hpp_fmt *fmt, \ + struct perf_hpp *hpp, \ + struct hist_entry *he) \ +{ \ + struct kvm_event *event; \ + int width =3D fmt_width(fmt, hpp, he->hists); \ + struct perf_kvm_stat *perf_kvm; \ + \ + event =3D container_of(he, struct kvm_event, he); \ + perf_kvm =3D event->perf_kvm; \ + return scnprintf(hpp->buf, hpp->size, "%*lu", width, \ + get_event_##metric(event, perf_kvm->trace_vcpu)); \ +} + +EV_METRIC_ENTRY(time) +EV_METRIC_ENTRY(count) +EV_METRIC_ENTRY(max) +EV_METRIC_ENTRY(min) + static struct kvm_dimension dim_time =3D { + .header =3D "Time (ns)", .name =3D "time", .cmp =3D ev_cmp_time, + .entry =3D ev_entry_time, + .width =3D 12, }; =20 static struct kvm_dimension dim_count =3D { + .header =3D "Samples", .name =3D "sample", .cmp =3D ev_cmp_count, + .entry =3D ev_entry_count, + .width =3D 12, }; =20 static struct kvm_dimension dim_max_time =3D { + .header =3D "Max Time (ns)", .name =3D "max_t", .cmp =3D ev_cmp_max, + .entry =3D ev_entry_max, + .width =3D 14, }; =20 static struct kvm_dimension dim_min_time =3D { + .header =3D "Min Time (ns)", .name =3D "min_t", .cmp =3D ev_cmp_min, + .entry =3D ev_entry_min, + .width =3D 14, }; =20 +static int ev_entry_mean(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp, + struct hist_entry *he) +{ + struct kvm_event *event; + int width =3D fmt_width(fmt, hpp, he->hists); + struct perf_kvm_stat *perf_kvm; + + event =3D container_of(he, struct kvm_event, he); + perf_kvm =3D event->perf_kvm; + return scnprintf(hpp->buf, hpp->size, "%*lu", width, + get_event_mean(event, perf_kvm->trace_vcpu)); +} + static struct kvm_dimension dim_mean_time =3D { + .header =3D "Mean Time (ns)", .name =3D "mean_t", .cmp =3D ev_cmp_mean, + .entry =3D ev_entry_mean, + .width =3D 14, }; =20 static struct kvm_dimension *dimensions[] =3D { @@ -165,6 +240,30 @@ static struct kvm_dimension *dimensions[] =3D { NULL, }; =20 +static int fmt_width(struct perf_hpp_fmt *fmt, + struct perf_hpp *hpp __maybe_unused, + struct hists *hists __maybe_unused) +{ + struct kvm_fmt *kvm_fmt; + + kvm_fmt =3D container_of(fmt, struct kvm_fmt, fmt); + return kvm_fmt->dim->width; +} + +static int fmt_header(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp, + struct hists *hists, int line __maybe_unused, + int *span __maybe_unused) +{ + struct kvm_fmt *kvm_fmt; + struct kvm_dimension *dim; + int width =3D fmt_width(fmt, hpp, hists); + + kvm_fmt =3D container_of(fmt, struct kvm_fmt, fmt); + dim =3D kvm_fmt->dim; + + return scnprintf(hpp->buf, hpp->size, "%*s", width, dim->header); +} + static bool fmt_equal(struct perf_hpp_fmt *a, struct perf_hpp_fmt *b) { struct kvm_fmt *kvm_fmt_a =3D container_of(a, struct kvm_fmt, fmt); @@ -214,9 +313,9 @@ static struct kvm_fmt *get_format(const char *name) fmt->cmp =3D dim->cmp; fmt->sort =3D dim->cmp; fmt->color =3D NULL; - fmt->entry =3D NULL; - fmt->header =3D NULL; - fmt->width =3D NULL; + fmt->entry =3D dim->entry; + fmt->header =3D fmt_header; + fmt->width =3D fmt_width; fmt->collapse =3D dim->cmp; fmt->equal =3D fmt_equal; fmt->free =3D fmt_free; --=20 2.34.1 From nobody Mon Sep 8 06:49:16 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 BA300C6FA8E for ; Sun, 26 Feb 2023 04:23:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229816AbjBZEX0 (ORCPT ); Sat, 25 Feb 2023 23:23:26 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46618 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230028AbjBZEWL (ORCPT ); Sat, 25 Feb 2023 23:22:11 -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 1A18713D5D for ; Sat, 25 Feb 2023 20:21:56 -0800 (PST) Received: by mail-pl1-x630.google.com with SMTP id l15so3564156pls.1 for ; Sat, 25 Feb 2023 20:21:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=7NEkdhqDMouB1zUi5eCnhcHJNUH+bFnGQLi//L7nojk=; b=rutgprXkcCVQHOHCa7qujzCTs/ZmwgPeBYglbDY1OzBhRd7fX0ULgHQ+m4xp/gJYBv Jhta71b2jIcoP8N4zkn8Enn6l7iI56wdtUQ5v/FGE56afGr9+uI6pSqOkqSDfhOjRFoQ kWcpjvZD5ljh/d7nwh5YdNN267zs3knak0z59rW2R1RqCedbTLIn8el6vS5HKPWjbU2j CGTQaBj8wYOSKN5qxIj1XUqb09I0oseoiToRG8LLN4D9rvh7uCRnb+MrNIEozkLVDjla 8P8hyex7pt1WeKBa9ZOpgH5tMBRSvAfOYNDQjE975DjStVCL8fTCfElvaRx/b4X0Bta4 4O9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=7NEkdhqDMouB1zUi5eCnhcHJNUH+bFnGQLi//L7nojk=; b=RfFal+wXV+8Jf2ogii91xCHTkmtJSPYcM125+KwVPs73GrqU+a62DVhxJ9uY1zx0dN gtNfAybBArDd6fSLBPtUzFcJ6UzLg+mRZRI2DG+Inpw8lQhCwUivyhi1RgIn+AmHywe/ LiRKyqfVRqvgHeiXEFwvQO8ZbDKjLewPXjNVbG+LK+GlYQ4mfBibZchQrYS4qYU2PV+X LNf5W/Hkmmvhj5cR/we4EBPLAbaxFPUUhC35tM72Ech/9oDj/bmyRCr1QHo09OMq/mv8 EZGtN0wiUV0ulKVl/1n6jIxvIk0kH5zk3uhoR4MYzw0WmQUuBrvPSVqBz/A8xvz8/mcs ptYg== X-Gm-Message-State: AO0yUKUGthSsVUmUhkdc/+xkd2XJNnn1F6RyCLAYkDTaenO8BIYd7JWk 6x66Lc78ablIhGCgmWId9ptyAA== X-Google-Smtp-Source: AK7set+xUHmsZA49mTitD/+OxCt6JFCx6tqse954NH5qz7xYCmY/uNS3na/e9vIESrj6Z185SkCMcw== X-Received: by 2002:a17:902:e883:b0:19a:d7d8:a080 with SMTP id w3-20020a170902e88300b0019ad7d8a080mr25758344plg.22.1677385312286; Sat, 25 Feb 2023 20:21:52 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id jj2-20020a170903048200b0019aaab3f9d7sm1976036plb.113.2023.02.25.20.21.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 25 Feb 2023 20:21:51 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v1 12/14] perf kvm: Add dimensions for percentages Date: Sun, 26 Feb 2023 12:20:51 +0800 Message-Id: <20230226042053.1492409-13-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230226042053.1492409-1-leo.yan@linaro.org> References: <20230226042053.1492409-1-leo.yan@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add dimensions for count and time percentages, it would useful for user to review percentage statistics. Signed-off-by: Leo Yan --- tools/perf/builtin-kvm.c | 98 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 97 insertions(+), 1 deletion(-) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index a56d0983c585..5b1b2042dfed 100644 --- a/tools/perf/builtin-kvm.c +++ b/tools/perf/builtin-kvm.c @@ -230,10 +230,105 @@ static struct kvm_dimension dim_mean_time =3D { .width =3D 14, }; =20 +#define PERC_STR(__s, __v) \ +({ \ + scnprintf(__s, sizeof(__s), "%.2F%%", __v); \ + __s; \ +}) + +static double percent(u64 st, u64 tot) +{ + return tot ? 100. * (double) st / (double) tot : 0; +} + +#define EV_METRIC_PERCENT(metric) \ +static int ev_percent_##metric(struct hist_entry *he) \ +{ \ + struct kvm_event *event; \ + struct perf_kvm_stat *perf_kvm; \ + \ + event =3D container_of(he, struct kvm_event, he); \ + perf_kvm =3D event->perf_kvm; \ + \ + return percent(get_event_##metric(event, perf_kvm->trace_vcpu), \ + perf_kvm->total_##metric); \ +} + +EV_METRIC_PERCENT(time) +EV_METRIC_PERCENT(count) + +static int ev_entry_time_precent(struct perf_hpp_fmt *fmt, + struct perf_hpp *hpp, + struct hist_entry *he) +{ + int width =3D fmt_width(fmt, hpp, he->hists); + double per; + char buf[10]; + + per =3D ev_percent_time(he); + return scnprintf(hpp->buf, hpp->size, "%*s", width, PERC_STR(buf, per)); +} + +static int64_t +ev_cmp_time_precent(struct perf_hpp_fmt *fmt __maybe_unused, + struct hist_entry *left, struct hist_entry *right) +{ + double per_left; + double per_right; + + per_left =3D ev_percent_time(left); + per_right =3D ev_percent_time(right); + + return per_left - per_right; +} + +static struct kvm_dimension dim_time_percent =3D { + .header =3D "Time%", + .name =3D "percent_time", + .cmp =3D ev_cmp_time_precent, + .entry =3D ev_entry_time_precent, + .width =3D 12, +}; + +static int ev_entry_count_precent(struct perf_hpp_fmt *fmt, + struct perf_hpp *hpp, + struct hist_entry *he) +{ + int width =3D fmt_width(fmt, hpp, he->hists); + double per; + char buf[10]; + + per =3D ev_percent_count(he); + return scnprintf(hpp->buf, hpp->size, "%*s", width, PERC_STR(buf, per)); +} + +static int64_t +ev_cmp_count_precent(struct perf_hpp_fmt *fmt __maybe_unused, + struct hist_entry *left, struct hist_entry *right) +{ + double per_left; + double per_right; + + per_left =3D ev_percent_count(left); + per_right =3D ev_percent_count(right); + + return per_left - per_right; +} + +static struct kvm_dimension dim_count_percent =3D { + .header =3D "Sample%", + .name =3D "percent_sample", + .cmp =3D ev_cmp_count_precent, + .entry =3D ev_entry_count_precent, + .width =3D 12, +}; + static struct kvm_dimension *dimensions[] =3D { &dim_event, &dim_time, + &dim_time_percent, &dim_count, + &dim_count_percent, &dim_max_time, &dim_min_time, &dim_mean_time, @@ -406,7 +501,8 @@ static int kvm_hpp_list__parse(struct perf_hpp_list *hp= p_list, =20 static int kvm_hists__init(struct perf_kvm_stat *kvm) { - const char *output_columns =3D "name,sample,time,max_t,min_t,mean_t"; + const char *output_columns =3D "name,sample,percent_sample," + "time,percent_time,max_t,min_t,mean_t"; =20 __hists__init(&kvm_hists.hists, &kvm_hists.list); perf_hpp_list__init(&kvm_hists.list); --=20 2.34.1 From nobody Mon Sep 8 06:49:16 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 E3B06C7EE2F for ; Sun, 26 Feb 2023 04:23:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230028AbjBZEXk (ORCPT ); Sat, 25 Feb 2023 23:23:40 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46810 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229775AbjBZEWS (ORCPT ); Sat, 25 Feb 2023 23:22:18 -0500 Received: from mail-pj1-x1032.google.com (mail-pj1-x1032.google.com [IPv6:2607:f8b0:4864:20::1032]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 38BC113DCA for ; Sat, 25 Feb 2023 20:22:04 -0800 (PST) Received: by mail-pj1-x1032.google.com with SMTP id h11-20020a17090a2ecb00b00237c740335cso2039550pjs.3 for ; Sat, 25 Feb 2023 20:22: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=CkztQHJFG8E1HY0jnPOj65OXed/JJ8e8RRCYx562Gss=; b=rdGn+rf3EDX9CoYEE1C9HkAkC13CzlzzeZwDTwdu2uovrBiZCP7QAv8NiebbDMvT8T JHhdIv62FpvSbHs1zot1bC8VmC71l4Km4a5aQlLtRIQjU+xrViz0kF9urSHjWDwjFYT3 qzmK4ItBVCMfBq+7/H6PYN8ooO2M9cYKvbXdJVBndfNafw/oFKBMpUc6XdqYCnD7Y6VG kQa5Nuc+xsPLcsvGCttpBLXLc3rc8AP024x+i9Aj1CjQQ4S9/Htt1sOYR8aM5xJBD+ND FXnk2AQB26lvVQ5mlDFeg5DBXfdox0OT3Yweyr/lbczjd9MOhmo+i9ZdWn7k9p2lpygf hSbw== 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=CkztQHJFG8E1HY0jnPOj65OXed/JJ8e8RRCYx562Gss=; b=fUzOAcN1KbTEMSjb8//gY8/vIasL7gdNxfBRv3HD86t74+DS3cA6httTFsw5Q5Pgbx zzl4vmHRkYhGCRPGhpt5U4ygfxNu3xQWeFS0dPKGliLP08rCYyNm/TGKN8RnY1IN1YHp tblCIo8MbrGIPEGEj9DUt4qnWRdWaEvjvUvDng3Sgp3qRk9IQOrUe0aGgaItnCZPujNv 5Sy/s17umB9as8gTejg7kqz9ATRdICBnzmM57TArCeucb6aQxFwPQRVhL7MBpHS5KHOJ cxsM8UjxKqP62nrKXEOmOGftvvEXTeFjdvHnpxiju0p/ZZdO7MXfTiYNjw04o2zVmBpW Y4mQ== X-Gm-Message-State: AO0yUKWXbFbn9OIh+m1BZPGRsEtW1jQYn5Xl2HCp+TwGHKcBBIN86mvl vex65Mo9J5a89nuzvyLyDI8jFQ== X-Google-Smtp-Source: AK7set+TXjDoU3ITiFcCYO8sve9Pfp//o1f/rvAn0oCkU01bwS3v67bVJT87Af1odtFsZXDNzCo2gg== X-Received: by 2002:a17:902:fb90:b0:19c:d97f:5d20 with SMTP id lg16-20020a170902fb9000b0019cd97f5d20mr5995110plb.38.1677385316213; Sat, 25 Feb 2023 20:21:56 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id jj2-20020a170903048200b0019aaab3f9d7sm1976036plb.113.2023.02.25.20.21.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 25 Feb 2023 20:21:55 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v1 13/14] perf kvm: Add TUI mode for stat report Date: Sun, 26 Feb 2023 12:20:52 +0800 Message-Id: <20230226042053.1492409-14-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230226042053.1492409-1-leo.yan@linaro.org> References: <20230226042053.1492409-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 | 101 ++++++++++++++++++++++++++++++++++++- tools/perf/util/kvm-stat.h | 1 + 2 files changed, 100 insertions(+), 2 deletions(-) diff --git a/tools/perf/builtin-kvm.c b/tools/perf/builtin-kvm.c index 5b1b2042dfed..3851e5798d75 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,89 @@ static int kvm_hists__init(struct perf_kvm_stat *kvm) =20 __hists__init(&kvm_hists.hists, &kvm_hists.list); perf_hpp_list__init(&kvm_hists.list); + kvm_hists.list.nr_header_lines =3D 1; return kvm_hpp_list__parse(&kvm_hists.list, output_columns, kvm->sort_key); } =20 +static int kvm_browser__title(struct hist_browser *browser, + char *buf, size_t size) +{ + scnprintf(buf, size, "KVM event statistics (%lu entries)", + browser->nr_non_filtered_entries); + return 0; +} + +static struct hist_browser* +perf_kvm_browser__new(struct hists *hists) +{ + struct hist_browser *browser =3D hist_browser__new(hists); + + if (browser) + browser->title =3D kvm_browser__title; + + return browser; +} + +#ifdef HAVE_SLANG_SUPPORT +static void kvm_browser__update_nr_entries(struct hist_browser *hb) +{ + struct rb_node *nd =3D rb_first_cached(&hb->hists->entries); + u64 nr_entries =3D 0; + + for (; nd; nd =3D rb_next(nd)) { + struct hist_entry *he =3D rb_entry(nd, struct hist_entry, + rb_node); + + if (!he->filtered) + nr_entries++; + } + + hb->nr_non_filtered_entries =3D nr_entries; +} + +static int kvm__hists_browse(struct hists *hists) +{ + struct hist_browser *browser; + int key =3D -1; + + browser =3D perf_kvm_browser__new(hists); + if (browser =3D=3D NULL) + return -1; + + /* reset abort key so that it can get Ctrl-C as a key */ + SLang_reset_tty(); + SLang_init_tty(0, 0, 0); + + kvm_browser__update_nr_entries(browser); + + while (1) { + key =3D hist_browser__run(browser, "? - help", true, 0); + + switch (key) { + case 'q': + goto out; + default: + break; + } + } + +out: + hist_browser__delete(browser); + return 0; +} + +static void print_result(struct perf_kvm_stat *kvm); + +static void kvm_display(struct perf_kvm_stat *kvm) +{ + if (!use_browser) + print_result(kvm); + else + kvm__hists_browse(&kvm_hists.hists); +} +#endif + static const char *get_filename_for_perf_kvm(void) { const char *filename; @@ -988,8 +1069,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 +1672,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 +1688,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 +1795,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 +1813,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 Mon Sep 8 06:49:16 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 D2ADDC7EE30 for ; Sun, 26 Feb 2023 04:23:51 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229987AbjBZEXd (ORCPT ); Sat, 25 Feb 2023 23:23:33 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45524 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229753AbjBZEWR (ORCPT ); Sat, 25 Feb 2023 23:22:17 -0500 Received: from mail-pj1-x102a.google.com (mail-pj1-x102a.google.com [IPv6:2607:f8b0:4864:20::102a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 372BE13D44 for ; Sat, 25 Feb 2023 20:22:04 -0800 (PST) Received: by mail-pj1-x102a.google.com with SMTP id 6-20020a17090a190600b00237c5b6ecd7so2347174pjg.4 for ; Sat, 25 Feb 2023 20:22: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=QcYnfVUhbZn9a7DJQxPts8NFnTbESI3ZdIxOG6ZSYi4=; b=fceagpisfJ+wn/x77XGmDDqUVFSi3OWTNsoYpFBrTZjqv2xkLCv1w5L27riERthRf8 FIEY8T7qN+Pe7NBaP8MHQ/Y8FDJajeeSzl+LaqP1neHfuMc1a0pyiikI0DIKUMqWcPkY f1KpBGfri+w/ZdDYg/IDgUIpnMDUx7FfFtGip+MYx573MaGUVMhTODQ6B6rCf16A0mbQ uB9HpdKTdhBmUx4WD9kvKpCMuy9yVDLgg/l3LPjgd+7buFaOqE2pnSjB7ia4Dv4PqsEf ldvtLxiCPXLZVhkSy6+AbsNx+8QqnA4KVYu43bLYTqqWEBQd3dfbKyo5w7PCTXjjo+wF cJWg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=QcYnfVUhbZn9a7DJQxPts8NFnTbESI3ZdIxOG6ZSYi4=; b=2Uky59KA7vAtkmAO3HHyjcVC/lIhSfjcVo2/+pmUrFaGfDNZ6+GNQMSDpaOUTGYavI 0U+LGyxEpUVSe4OgGsDGZuQGY0xVHGW1HS33HBxkhSC0YsQ/Q/KWL7aFkIem/1hFqBMJ eILok8rMYrqmvt+8L20C5MMLCMJANykwyrOHTWv4Layhh6+dRdTzFramHbdfF88R7ogb tkLcseZzzaS4BkKS84PF2rUlFg2vLf96WxbZ2i5SxrJlFT3ev4vL2DU35hGDMlUzpCBm xEq/YAHQE2hcnCR7bjQ6pzxVXSLbtDWULta0E324ILUmVIa16O1syUPM04KAGen295ZO UFMw== X-Gm-Message-State: AO0yUKVDhiobFIl5v7oK5i99HDKCRJIM0CCgIPkj8LlO3K4kqUgrXGTt VIwSGlEU20IqQN3DpUYg51nLOQ== X-Google-Smtp-Source: AK7set/wjYcidWUkA1Sa4dOdMpzYNSexL+23YhqQW9e2pz2wjJxSVS8TjvLVL2MzEF2/NDE9ul1h7A== X-Received: by 2002:a17:903:6c5:b0:19c:c184:d211 with SMTP id kj5-20020a17090306c500b0019cc184d211mr7175760plb.37.1677385319973; Sat, 25 Feb 2023 20:21:59 -0800 (PST) Received: from leoy-huanghe.lan (n058152048225.netvigator.com. [58.152.48.225]) by smtp.gmail.com with ESMTPSA id jj2-20020a170903048200b0019aaab3f9d7sm1976036plb.113.2023.02.25.20.21.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 25 Feb 2023 20:21:59 -0800 (PST) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Ian Rogers , Adrian Hunter , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v1 14/14] perf kvm: Update documentation to reflect new changes Date: Sun, 26 Feb 2023 12:20:53 +0800 Message-Id: <20230226042053.1492409-15-leo.yan@linaro.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230226042053.1492409-1-leo.yan@linaro.org> References: <20230226042053.1492409-1-leo.yan@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Update documentation for new sorting and option '--stdio'. Signed-off-by: Leo Yan --- tools/perf/Documentation/perf-kvm.txt | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tools/perf/Documentation/perf-kvm.txt b/tools/perf/Documentati= on/perf-kvm.txt index 2ad3f5d9f72b..b66be66fe836 100644 --- a/tools/perf/Documentation/perf-kvm.txt +++ b/tools/perf/Documentation/perf-kvm.txt @@ -58,7 +58,7 @@ There are a couple of variants of perf kvm: events. =20 'perf kvm stat report' reports statistical data which includes events - handled time, samples, and so on. + handled sample, percent_sample, time, percent_time, max_t, min_t, mean_t. =20 'perf kvm stat live' reports statistical data in a live mode (similar to record + report but with statistical data updated live at a given display @@ -82,6 +82,8 @@ OPTIONS :GMEXAMPLESUBCMD: top include::guest-files.txt[] =20 +--stdio:: Use the stdio interface. + -v:: --verbose:: Be more verbose (show counter open errors, etc). @@ -97,7 +99,10 @@ STAT REPORT OPTIONS -k:: --key=3D:: Sorting key. Possible values: sample (default, sort by samples - number), time (sort by average time). + number), percent_sample (sort by sample percentage), time + (sort by average time), precent_time (sort by time percentage), + max_t (sort by maximum time), min_t (sort by minimum time), mean_t + (sort by mean time). -p:: --pid=3D:: Analyze events only for given process ID(s) (comma separated list). --=20 2.34.1