From nobody Tue Feb 10 05:46:33 2026 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1594304249; cv=none; d=zohomail.com; s=zohoarc; b=ZQqaqmmrSpgxTDbEukXep/cy/QpMVAFaie+RPMv7thm4jn4j2ANkwvXNNVCDTSzSl1XTtnY6WKCxIjXPm0qD9Sl4AitwAxEkY6W7cZXuE1iC1v5de0FLfJi4DBNeoV2fF6ZXzzHJfTx/1qeCC1BTDhTkisM7b35JYrdhp+bun8I= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1594304249; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=xx3w/5InGdpOLaQRb40pJxZ2fJfVESZ8ECU7qAZSRME=; b=N3CD1ZVj6A0MYbFf7NUwEcI128KTqqqsjszb4RXNJEu8KTP3sNhEM2dGsFl1Pwig0cT6Yras+yknVB2iVyeXMPK0C3HkYGfAZknXPgz/IYLAxJTf3uVfUIRhNwArBZlESUgIG1L7IIro8QKGSpbDtRMp1GfBZ3htDYJ/G2EuixY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=fail header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1594304249348720.2428288293022; Thu, 9 Jul 2020 07:17:29 -0700 (PDT) Received: from localhost ([::1]:49324 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jtXMd-0005ha-RM for importer@patchew.org; Thu, 09 Jul 2020 10:17:27 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:50918) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1jtXIy-0000Mh-Q9 for qemu-devel@nongnu.org; Thu, 09 Jul 2020 10:13:40 -0400 Received: from mail-wm1-x343.google.com ([2a00:1450:4864:20::343]:39677) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1jtXIw-0001L2-VV for qemu-devel@nongnu.org; Thu, 09 Jul 2020 10:13:40 -0400 Received: by mail-wm1-x343.google.com with SMTP id w3so1971350wmi.4 for ; Thu, 09 Jul 2020 07:13:38 -0700 (PDT) Received: from zen.linaroharston ([51.148.130.216]) by smtp.gmail.com with ESMTPSA id 12sm4771730wmg.6.2020.07.09.07.13.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 09 Jul 2020 07:13:34 -0700 (PDT) Received: from zen.lan (localhost [127.0.0.1]) by zen.linaroharston (Postfix) with ESMTP id 29C1D1FF96; Thu, 9 Jul 2020 15:13:28 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=xx3w/5InGdpOLaQRb40pJxZ2fJfVESZ8ECU7qAZSRME=; b=WcKYEYgj3pXvhW+StbmmEEue9T9NBzgWIMQeXEmhBPGc4C60e9oe+7ot3HtSgv5JaW AOhnjrq/hPAv+ajvCl1mBXp1yR11UsrGrDRS0g0Sw/FrgZX0uWzBxDHBucM/zyujwiRf Oko0j0DwbUPbpIT49VKsHZ9NMKbZAUZtbQVxFUSWccZ75ANctmSfxOlKAoW4WLx5SBxr Fcih0sqCMFBQ2ZvELcZHjH8vGrJRtefVlBPRy0/Bir9y9sEqkdn3B6DvdSaVmsQsAU1S mu2E183HbY1x9gZ7OBlzQSGOXBGIej/9OpnWDeEnirnq67koz/DVikKkfO+sihPyzuqe eZJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=xx3w/5InGdpOLaQRb40pJxZ2fJfVESZ8ECU7qAZSRME=; b=M6LV9mCsmVWmpWw3CdJFPTTElFPwez8nboJ4/XMDrMQ7F0lgHWizR0GXTb7cDxVxu5 aCYgdlV8jdPACDsoE+udOjTa4/agwvbcB1qchXQf9joAKsEvN2RkhEKx08cDbTAn5Svo 4NX7GkKfhpDHV9k2ha8ePzhu8vh5pIJMGRleN31HeydT/BeZJCyWeyTyxwKxa14ufaMJ UZQkhkvnZwj0Rp1j8ROSmrnfqU7KAb6GTemKb4qIm3XufX4YdbG4aQ1mrwHEI0NVt1r7 2aNnPexeXRhbGFy+2q7ocJACcoMTv8TyCWnftPFawwaM/ohPWIVrDEIUpFj+01yVyKc2 Mcnw== X-Gm-Message-State: AOAM530VJUYc0Q9gBF2oy1CTnMbXv7EC/T8NF4DWxS2FfUO9QFo+Eoce feC/loyEbjIajj0j6vuZh8pjjQ== X-Google-Smtp-Source: ABdhPJyCHf3lPsoli+JeCPEIFlO0ZGuqCj+49RaaXobyAfFUTHi9IuhIjzQFAREw/CNR2J39s9edAA== X-Received: by 2002:a1c:7717:: with SMTP id t23mr198850wmi.75.1594304017422; Thu, 09 Jul 2020 07:13:37 -0700 (PDT) From: =?UTF-8?q?Alex=20Benn=C3=A9e?= To: qemu-devel@nongnu.org Subject: [PATCH v1 08/13] plugins: expand the bb plugin to be thread safe and track per-cpu Date: Thu, 9 Jul 2020 15:13:22 +0100 Message-Id: <20200709141327.14631-9-alex.bennee@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200709141327.14631-1-alex.bennee@linaro.org> References: <20200709141327.14631-1-alex.bennee@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::343; envelope-from=alex.bennee@linaro.org; helo=mail-wm1-x343.google.com X-detected-operating-system: by eggs.gnu.org: No matching host in p0f cache. That's all we know. X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: fam@euphon.net, berrange@redhat.com, robert.foley@linaro.org, =?UTF-8?q?Alex=20Benn=C3=A9e?= , richard.henderson@linaro.org, f4bug@amsat.org, robhenry@microsoft.com, aaron@os.amperecomputing.com, cota@braap.org, Dave Bort , kuhn.chenqun@huawei.com, peter.puhov@linaro.org, aurelien@aurel32.net Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) While there isn't any easy way to make the inline counts thread safe we can ensure the callback based ones are. While we are at it we can reduce introduce a new option ("idle") to dump a report of the current bb and insn count each time a vCPU enters the idle state. Signed-off-by: Alex Benn=C3=A9e Cc: Dave Bort Reviewed-by: Robert Foley --- v2 - fixup for non-inline linux-user case - minor cleanup and re-factor --- tests/plugin/bb.c | 96 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 83 insertions(+), 13 deletions(-) diff --git a/tests/plugin/bb.c b/tests/plugin/bb.c index df19fd359df3..89c373e19cd8 100644 --- a/tests/plugin/bb.c +++ b/tests/plugin/bb.c @@ -16,24 +16,67 @@ =20 QEMU_PLUGIN_EXPORT int qemu_plugin_version =3D QEMU_PLUGIN_VERSION; =20 -static uint64_t bb_count; -static uint64_t insn_count; +typedef struct { + GMutex lock; + int index; + uint64_t bb_count; + uint64_t insn_count; +} CPUCount; + +/* Used by the inline & linux-user counts */ static bool do_inline; +static CPUCount inline_count; + +/* Dump running CPU total on idle? */ +static bool idle_report; +static GPtrArray *counts; +static int max_cpus; + +static void gen_one_cpu_report(CPUCount *count, GString *report) +{ + if (count->bb_count) { + g_string_append_printf(report, "CPU%d: " + "bb's: %" PRIu64", insns: %" PRIu64 "\n", + count->index, + count->bb_count, count->insn_count); + } +} =20 static void plugin_exit(qemu_plugin_id_t id, void *p) { - g_autofree gchar *out =3D g_strdup_printf( - "bb's: %" PRIu64", insns: %" PRIu64 "\n", - bb_count, insn_count); - qemu_plugin_outs(out); + g_autoptr(GString) report =3D g_string_new(""); + + if (do_inline || !max_cpus) { + g_string_printf(report, "bb's: %" PRIu64", insns: %" PRIu64 "\n", + inline_count.bb_count, inline_count.insn_count); + } else { + g_ptr_array_foreach(counts, (GFunc) gen_one_cpu_report, report); + } + qemu_plugin_outs(report->str); +} + +static void vcpu_idle(qemu_plugin_id_t id, unsigned int cpu_index) +{ + CPUCount *count =3D g_ptr_array_index(counts, cpu_index); + g_autoptr(GString) report =3D g_string_new(""); + gen_one_cpu_report(count, report); + + if (report->len > 0) { + g_string_prepend(report, "Idling "); + qemu_plugin_outs(report->str); + } } =20 static void vcpu_tb_exec(unsigned int cpu_index, void *udata) { - unsigned long n_insns =3D (unsigned long)udata; + CPUCount *count =3D max_cpus ? + g_ptr_array_index(counts, cpu_index) : &inline_count; =20 - insn_count +=3D n_insns; - bb_count++; + unsigned long n_insns =3D (unsigned long)udata; + g_mutex_lock(&count->lock); + count->insn_count +=3D n_insns; + count->bb_count++; + g_mutex_unlock(&count->lock); } =20 static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb) @@ -42,9 +85,9 @@ static void vcpu_tb_trans(qemu_plugin_id_t id, struct qem= u_plugin_tb *tb) =20 if (do_inline) { qemu_plugin_register_vcpu_tb_exec_inline(tb, QEMU_PLUGIN_INLINE_AD= D_U64, - &bb_count, 1); + &inline_count.bb_count, 1= ); qemu_plugin_register_vcpu_tb_exec_inline(tb, QEMU_PLUGIN_INLINE_AD= D_U64, - &insn_count, n_insns); + &inline_count.insn_count,= n_insns); } else { qemu_plugin_register_vcpu_tb_exec_cb(tb, vcpu_tb_exec, QEMU_PLUGIN_CB_NO_REGS, @@ -56,8 +99,35 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_i= d_t id, const qemu_info_t *info, int argc, char **argv) { - if (argc && strcmp(argv[0], "inline") =3D=3D 0) { - do_inline =3D true; + int i; + + for (i =3D 0; i < argc; i++) { + char *opt =3D argv[i]; + if (g_strcmp0(opt, "inline") =3D=3D 0) { + do_inline =3D true; + } else if (g_strcmp0(opt, "idle") =3D=3D 0) { + idle_report =3D true; + } else { + fprintf(stderr, "option parsing failed: %s\n", opt); + return -1; + } + } + + if (info->system_emulation && !do_inline) { + max_cpus =3D info->system.max_vcpus; + counts =3D g_ptr_array_new(); + for (i =3D 0; i < max_cpus; i++) { + CPUCount *count =3D g_new0(CPUCount, 1); + g_mutex_init(&count->lock); + count->index =3D i; + g_ptr_array_add(counts, count); + } + } else if (!do_inline) { + g_mutex_init(&inline_count.lock); + } + + if (idle_report) { + qemu_plugin_register_vcpu_idle_cb(id, vcpu_idle); } =20 qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans); --=20 2.20.1