From patchwork Mon Aug 9 11:27:25 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leo Yan X-Patchwork-Id: 12426243 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.5 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C2381C432BE for ; Mon, 9 Aug 2021 11:30:00 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 7BF4B601FD for ; Mon, 9 Aug 2021 11:30:00 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 7BF4B601FD Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=XnRafiekCDfI3ul+XIWrN7bhnrCftpXap+6eppHFhVQ=; b=qZZ0gWHyaaH8U2 LxOlu0vzjUMJ8S9GHt+nEsT3f9sY7e9ZTNfE9W6v1KMlNJZwrY3+7ISltN3TOW35/zH/FxvedCuNO rlxNPLZnqiavRUxw8jPcePFHTqHzoBGEFbFW/QzRdErsl69M9s+Ht3EI4mngiq36Dxi5pEcn8vQFp cvMEKvKZC8EsBNdDn08aG1L7BVeWxoeYff13E/KWN+zTqhKo8o15AYHdPDzXseMxFdfQ7KwbT2B5E Ft93vMB9nf7FOcqE+oxFUYr9zKdhxrgZ1MScN/AsUnW8iwgCMXRJXw0S2SPZCNcpOstyQAsJqYNax q9NPlvzHkkpkwBZlW0Vw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mD3Ri-000MKe-9P; Mon, 09 Aug 2021 11:27:54 +0000 Received: from mail-pj1-x1034.google.com ([2607:f8b0:4864:20::1034]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mD3RS-000MGR-Ow for linux-arm-kernel@lists.infradead.org; Mon, 09 Aug 2021 11:27:40 +0000 Received: by mail-pj1-x1034.google.com with SMTP id pj14-20020a17090b4f4eb029017786cf98f9so29837391pjb.2 for ; Mon, 09 Aug 2021 04:27:38 -0700 (PDT) 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=/3VLoyUUFLgGGIpwzBZniAYs6R20cyWHMNHgFMGrgsI=; b=yoqwI5vsX5wlcGT223si8LwTa1uAsMG6307HtfcLZz/1TcnoZzdwJ8EY1D+3EaRYk4 nO2FvLrZR9I0nbdck2yzBThuGqegbgtgk6fQ6ieEjS4vc43NKuOu8TVIvHO3SvAtR/0N zOmRHMOWNkQBhAMmakeM7ALPJ8STlw+uEv2nyXY2b6kJIN73wyX1xSBbArZ6zGSnDEXN nTkqjJ+W1LveX4MhMGTZHDULFJTTI1mbOOKv0BmhYf6js1K840zLLIVdS+J5DkIM0FZ0 799pBxr0xz1D2G8CqHaCvqu71CYo/8v1gFx0OdjUsUQxj53IcwPiIpDdaEV5fIjx0Cjq BQvw== 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=/3VLoyUUFLgGGIpwzBZniAYs6R20cyWHMNHgFMGrgsI=; b=pTQK/VI6GkTscTMDmJvOLmfywvbqLJHUEbIT970rgq34jkUt9x/g7+OvOuWmyfqUj6 dyHn+pU+Urny9oQIpYSWnTPS5JmmNyyPQUCSr1xDhPgVriv3XZInJT0EAet1J8qjZHKS taJQI0Mk8hDn5UkELfKKXpQGX8+1hJNsKgF3D8Dx94qSI3O1u/G03quKQaoK2R1zV7Pw NjsAkDRaUjyQB210psdHzaAvKAWSz3YZv295LJwFbUGwBetHCjjxJYvbtc+3GdoJh+Do KCpkACREXTBOKfiV32NmNoDTO/q0FPwsj4CuHs8YsiNsLs6iVlGK2IdIivT3jqKJ9rY9 bqAQ== X-Gm-Message-State: AOAM532zRojXbV6QkBe9AvwjtJXFH15han0lXMbbnTgS0TxC6gldWJuj G15bphmV8wRqdXzS6SMu+W2eCw== X-Google-Smtp-Source: ABdhPJz72xJUcKouE4PzDu7moJ6A3YlxKWnVOiFrEhLX2UI/6z0N+uCgXJev6X4O86udz1RAbqtlaw== X-Received: by 2002:aa7:8752:0:b029:3bd:82f0:3bf9 with SMTP id g18-20020aa787520000b02903bd82f03bf9mr23655808pfo.75.1628508458189; Mon, 09 Aug 2021 04:27:38 -0700 (PDT) Received: from localhost ([210.0.159.74]) by smtp.gmail.com with ESMTPSA id k11sm23841483pgc.30.2021.08.09.04.27.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 09 Aug 2021 04:27:37 -0700 (PDT) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Adrian Hunter , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Will Deacon , Russell King , Catalin Marinas , Mathieu Poirier , Suzuki K Poulose , Mike Leach , John Garry , Andi Kleen , Riccardo Mancini , Jin Yao , Li Huafei , coresight@lists.linaro.org, linux-arm-kernel@lists.infradead.org, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan , Arnaldo Carvalho de Melo Subject: [PATCH v1 1/3] perf env: Track kernel 64-bit mode in environment Date: Mon, 9 Aug 2021 19:27:25 +0800 Message-Id: <20210809112727.596876-2-leo.yan@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210809112727.596876-1-leo.yan@linaro.org> References: <20210809112727.596876-1-leo.yan@linaro.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210809_042738_890274_E3FC67A4 X-CRM114-Status: GOOD ( 18.87 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org It's useful to know that the kernel is running in 32-bit or 64-bit mode. E.g. We can decide if perf tool is running in compat mode based on the info. This patch adds an item "kernel_is_64_bit" into session's environment structure perf_env, its value is initialized based on the architecture string. Suggested-by: Arnaldo Carvalho de Melo Signed-off-by: Leo Yan --- tools/perf/util/env.c | 24 +++++++++++++++++++++++- tools/perf/util/env.h | 3 +++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/tools/perf/util/env.c b/tools/perf/util/env.c index ab341050be46..8f7ff0035c41 100644 --- a/tools/perf/util/env.c +++ b/tools/perf/util/env.c @@ -219,13 +219,35 @@ void perf_env__exit(struct perf_env *env) zfree(&env->hybrid_cpc_nodes); } -void perf_env__init(struct perf_env *env __maybe_unused) +void perf_env__init(struct perf_env *env) { #ifdef HAVE_LIBBPF_SUPPORT env->bpf_progs.infos = RB_ROOT; env->bpf_progs.btfs = RB_ROOT; init_rwsem(&env->bpf_progs.lock); #endif + env->kernel_is_64_bit = -1; +} + +static void perf_env__init_kernel_mode(struct perf_env *env) +{ + const char *arch = perf_env__raw_arch(env); + + if (!strncmp(arch, "x86_64", 6) || !strncmp(arch, "aarch64", 7) || + !strncmp(arch, "arm64", 5) || !strncmp(arch, "mips64", 6) || + !strncmp(arch, "parisc64", 8) || !strncmp(arch, "riscv64", 7) || + !strncmp(arch, "s390x", 5) || !strncmp(arch, "sparc64", 7)) + env->kernel_is_64_bit = 1; + else + env->kernel_is_64_bit = 0; +} + +int perf_env__kernel_is_64_bit(struct perf_env *env) +{ + if (env->kernel_is_64_bit == -1) + perf_env__init_kernel_mode(env); + + return env->kernel_is_64_bit; } int perf_env__set_cmdline(struct perf_env *env, int argc, const char *argv[]) diff --git a/tools/perf/util/env.h b/tools/perf/util/env.h index 6824a7423a2d..1f5175820a05 100644 --- a/tools/perf/util/env.h +++ b/tools/perf/util/env.h @@ -61,6 +61,7 @@ struct perf_env { unsigned long long total_mem; unsigned int msr_pmu_type; unsigned int max_branches; + int kernel_is_64_bit; int nr_cmdline; int nr_sibling_cores; @@ -143,6 +144,8 @@ extern struct perf_env perf_env; void perf_env__exit(struct perf_env *env); +int perf_env__kernel_is_64_bit(struct perf_env *env); + int perf_env__set_cmdline(struct perf_env *env, int argc, const char *argv[]); int perf_env__read_cpuid(struct perf_env *env); From patchwork Mon Aug 9 11:27:26 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leo Yan X-Patchwork-Id: 12426241 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.5 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DCC91C4338F for ; Mon, 9 Aug 2021 11:29:53 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 9F80A60F8F for ; Mon, 9 Aug 2021 11:29:53 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 9F80A60F8F Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=3jODR8aH32yGMPAYcuAsdxmJty7ishTL2k2gxzEXwVU=; b=MuxGreQzYn+NNu +Ua82WvXEHgHChEIg6u8/R9NjUV7Cw8zC73g3HHaU7ARtVvRkt3iDFRQ2Ah7CrN1mZz/dq7coNRBr do7SqKr0+3azIEOdrI450b++w43DfFppneZW88V98Pt7IZQCFSiJffe+w+gJbW74grfONIwaxTYKC 6dpEh4cct3iJRHGF0pgsfvsmArX/5dzdFompdn7bo2znNLDhtIv6P+XkmsYulctpQbvr6vwKTqNpO UXHEB8/5g67fzU6V6NwwDsoFRnt3Ooapai4bLs8eYCyphbZvroWvqLt7tG4XEwzcuKWIOJGh3I/pe KZhUAiy4AVkpiL6NwGPQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mD3Rs-000MMR-Rt; Mon, 09 Aug 2021 11:28:05 +0000 Received: from mail-pl1-x635.google.com ([2607:f8b0:4864:20::635]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mD3RV-000MHp-L2 for linux-arm-kernel@lists.infradead.org; Mon, 09 Aug 2021 11:27:43 +0000 Received: by mail-pl1-x635.google.com with SMTP id a5so304669plh.5 for ; Mon, 09 Aug 2021 04:27:41 -0700 (PDT) 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=ajDoBVXaLvyhD2njCnRvrBk1JkA3DBsW6qyen3EKOrs=; b=p+33WPzXUBJkHmwTMdGajurbzQ0Zf+vkT4HLlGoEGzfXddTjdVXt9ypn0pCFw7qE4s sRhvto/jGS14dBPUgoO5N+7O2IMbTm4rRTZ2BY6mFXSKs2dHp8emCfn/ol0qau5uJteD 4FBylpP9YwHrxogW5PHnf4da3TgVmIhPU+JrqWW9Ooo2qWezd76k/pROXeu4b/FuZFeO +VX4iciEH4SZRh4fSdVrcfRpISgXWUbkfs+VCZZpJQgt50baxNKfGCSxWC27qgo1TZaU CNAewWD/6gN8fbg529Vh0kgh9S5DkRyh5yrj9N8ZRBrCYTkKw+jeYQRMZh4Z68eCpsPB uUzw== 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=ajDoBVXaLvyhD2njCnRvrBk1JkA3DBsW6qyen3EKOrs=; b=fmXiJiaR79nLNQ2td+xYofmk9SY4HFTNywTSX/UdX7CB5x9BB7/+9zXxk8R/ziVj6C d8TYhstdVtkDwKFYwaiEF0PZX1KlzvW3d1rX+zFz368smImMQ8NkzQcCf6oBGxasnuoY g1SFhD9ehasaqqGA/HQUMaed0YsbSCq3IcEUhR+3KPDVHPKG4K856zzhJFULPRUPnxue 0F5rI6JMHieL3BOXmVKnUOtd3+tZbwwV5CFyrcskUbu6bNJ0XiYfUYjIgsXO4Na1lG/r CXahbjYxkwaoYFHddEUQS4/nlLElcvFIKarC6B1+gB+WumtEvOGi6PeFpYg5jYq/c33R Q06Q== X-Gm-Message-State: AOAM533EipixfastQUbgOQa6VU2uU9YKlS0WSI0WHh07cttUVHcOdKMe qj2tu2MtfHfRpfdOinE2gTakRg== X-Google-Smtp-Source: ABdhPJwtz2JzbCfM4hkNuD9zCGq/9wXymXXh/2uq0b5hZXLmypge9FM4P3ftmRInk5X4uQMXfNKSmA== X-Received: by 2002:a17:902:e04e:b029:12c:def4:56a3 with SMTP id x14-20020a170902e04eb029012cdef456a3mr19139678plx.76.1628508460774; Mon, 09 Aug 2021 04:27:40 -0700 (PDT) Received: from localhost ([210.0.159.74]) by smtp.gmail.com with ESMTPSA id z24sm19148876pfn.150.2021.08.09.04.27.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 09 Aug 2021 04:27:40 -0700 (PDT) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Adrian Hunter , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Will Deacon , Russell King , Catalin Marinas , Mathieu Poirier , Suzuki K Poulose , Mike Leach , John Garry , Andi Kleen , Riccardo Mancini , Jin Yao , Li Huafei , coresight@lists.linaro.org, linux-arm-kernel@lists.infradead.org, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v1 2/3] perf auxtrace: Add compat_auxtrace_mmap__{read_head|write_tail} Date: Mon, 9 Aug 2021 19:27:26 +0800 Message-Id: <20210809112727.596876-3-leo.yan@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210809112727.596876-1-leo.yan@linaro.org> References: <20210809112727.596876-1-leo.yan@linaro.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210809_042741_802692_8CDA9456 X-CRM114-Status: GOOD ( 30.85 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org When perf runs in compat mode (kernel in 64-bit mode and the perf is in 32-bit mode), the 64-bit value atomicity in the user space cannot be assured, E.g. on some architectures, the 64-bit value accessing is split into two instructions, one is for the low 32-bit word accessing and another is for the high 32-bit word. This patch introduces weak functions compat_auxtrace_mmap__read_head() and compat_auxtrace_mmap__write_tail(), as their naming indicates, when perf tool works in compat mode, it uses these two functions to access the AUX head and tail. These two functions can allow the perf tool to work properly in certain conditions, e.g. when perf tool works in snapshot mode with only using AUX head pointer, or perf tool uses the AUX buffer and the incremented tail is not bigger than 4GB. When perf tool cannot handle the case when the AUX tail is bigger than 4GB, the function compat_auxtrace_mmap__write_tail() returns -1 and tells the caller to bail out for the error. These two functions are declared as weak attribute, this allows to implement arch specific functions if any arch can support the 64-bit value atomicity in compat mode. Suggested-by: Adrian Hunter Signed-off-by: Leo Yan Acked-by: Adrian Hunter --- tools/perf/util/auxtrace.c | 88 ++++++++++++++++++++++++++++++++++++-- tools/perf/util/auxtrace.h | 22 ++++++++-- 2 files changed, 103 insertions(+), 7 deletions(-) diff --git a/tools/perf/util/auxtrace.c b/tools/perf/util/auxtrace.c index f33f09b8b535..60975df05d54 100644 --- a/tools/perf/util/auxtrace.c +++ b/tools/perf/util/auxtrace.c @@ -1669,6 +1669,82 @@ int perf_event__process_auxtrace_error(struct perf_session *session, return 0; } +/* + * In the compat mode kernel runs in 64-bit and perf tool runs in 32-bit mode, + * 32-bit perf tool cannot access 64-bit value atomically, which might lead to + * the issues caused by the below sequence on multiple CPUs: when perf tool + * accesses either the load operation or the store operation for 64-bit value, + * on some architectures the operation is divided into two instructions, one + * is for accessing the low 32-bit value and another is for the high 32-bit; + * thus these two user operations can give the kernel chances to access the + * 64-bit value, and thus leads to the unexpected load values. + * + * kernel (64-bit) user (32-bit) + * + * if (LOAD ->aux_tail) { --, LOAD ->aux_head_lo + * STORE $aux_data | ,---> + * FLUSH $aux_data | | LOAD ->aux_head_hi + * STORE ->aux_head --|-------` smp_rmb() + * } | LOAD $data + * | smp_mb() + * | STORE ->aux_tail_lo + * `-----------> + * STORE ->aux_tail_hi + * + * For this reason, it's impossible for the perf tool to work correctly when + * the AUX head or tail is bigger than 4GB (more than 32 bits length); and we + * can not simply limit the AUX ring buffer to less than 4GB, the reason is + * the pointers can be increased monotonically, whatever the buffer size it is, + * at the end the head and tail can be bigger than 4GB and carry out to the + * high 32-bit. + * + * To mitigate the issues and improve the user experience, we can allow the + * perf tool working in certain conditions and bail out with error if detect + * any overflow cannot be handled. + * + * For reading the AUX head, it reads out the values for three times, and + * compares the high 4 bytes of the values between the first time and the last + * time, if there has no change for high 4 bytes injected by the kernel during + * the user reading sequence, it's safe for use the second value. + * + * When update the AUX tail and detects any carrying in the high 32 bits, it + * means there have two store operations in user space and it cannot promise + * the atomicity for 64-bit write, so return '-1' in this case to tell the + * caller an overflow error has happened. + */ +u64 __weak compat_auxtrace_mmap__read_head(struct auxtrace_mmap *mm) +{ + struct perf_event_mmap_page *pc = mm->userpg; + u64 first, second, last; + u64 mask = (u64)(UINT32_MAX) << 32; + + do { + first = READ_ONCE(pc->aux_head); + /* Ensure all reads are done after we read the head */ + smp_rmb(); + second = READ_ONCE(pc->aux_head); + /* Ensure all reads are done after we read the head */ + smp_rmb(); + last = READ_ONCE(pc->aux_head); + } while ((first & mask) != (last & mask)); + + return second; +} + +int __weak compat_auxtrace_mmap__write_tail(struct auxtrace_mmap *mm, u64 tail) +{ + struct perf_event_mmap_page *pc = mm->userpg; + u64 mask = (u64)(UINT32_MAX) << 32; + + if (tail & mask) + return -1; + + /* Ensure all reads are done before we write the tail out */ + smp_mb(); + WRITE_ONCE(pc->aux_tail, tail); + return 0; +} + static int __auxtrace_mmap__read(struct mmap *map, struct auxtrace_record *itr, struct perf_tool *tool, process_auxtrace_t fn, @@ -1680,8 +1756,9 @@ static int __auxtrace_mmap__read(struct mmap *map, size_t size, head_off, old_off, len1, len2, padding; union perf_event ev; void *data1, *data2; + int kernel_is_64_bit = perf_env__kernel_is_64_bit(evsel__env(NULL)); - head = auxtrace_mmap__read_head(mm); + head = auxtrace_mmap__read_head(mm, kernel_is_64_bit); if (snapshot && auxtrace_record__find_snapshot(itr, mm->idx, mm, data, &head, &old)) @@ -1764,10 +1841,13 @@ static int __auxtrace_mmap__read(struct mmap *map, mm->prev = head; if (!snapshot) { - auxtrace_mmap__write_tail(mm, head); - if (itr->read_finish) { - int err; + int err; + + err = auxtrace_mmap__write_tail(mm, head, kernel_is_64_bit); + if (err < 0) + return err; + if (itr->read_finish) { err = itr->read_finish(itr, mm->idx); if (err < 0) return err; diff --git a/tools/perf/util/auxtrace.h b/tools/perf/util/auxtrace.h index d68a5e80b217..5f383908ca6e 100644 --- a/tools/perf/util/auxtrace.h +++ b/tools/perf/util/auxtrace.h @@ -440,23 +440,39 @@ struct auxtrace_cache; #ifdef HAVE_AUXTRACE_SUPPORT -static inline u64 auxtrace_mmap__read_head(struct auxtrace_mmap *mm) +u64 compat_auxtrace_mmap__read_head(struct auxtrace_mmap *mm); +int compat_auxtrace_mmap__write_tail(struct auxtrace_mmap *mm, u64 tail); + +static inline u64 auxtrace_mmap__read_head(struct auxtrace_mmap *mm, + int kernel_is_64_bit __maybe_unused) { struct perf_event_mmap_page *pc = mm->userpg; - u64 head = READ_ONCE(pc->aux_head); + u64 head; + +#if BITS_PER_LONG == 32 + if (kernel_is_64_bit) + return compat_auxtrace_mmap__read_head(mm); +#endif + head = READ_ONCE(pc->aux_head); /* Ensure all reads are done after we read the head */ smp_rmb(); return head; } -static inline void auxtrace_mmap__write_tail(struct auxtrace_mmap *mm, u64 tail) +static inline int auxtrace_mmap__write_tail(struct auxtrace_mmap *mm, u64 tail, + int kernel_is_64_bit __maybe_unused) { struct perf_event_mmap_page *pc = mm->userpg; +#if BITS_PER_LONG == 32 + if (kernel_is_64_bit) + return compat_auxtrace_mmap__write_tail(mm, tail); +#endif /* Ensure all reads are done before we write the tail out */ smp_mb(); WRITE_ONCE(pc->aux_tail, tail); + return 0; } int auxtrace_mmap__mmap(struct auxtrace_mmap *mm, From patchwork Mon Aug 9 11:27:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leo Yan X-Patchwork-Id: 12426267 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.5 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 85F23C432BE for ; Mon, 9 Aug 2021 11:30:32 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 292EA6101E for ; Mon, 9 Aug 2021 11:30:32 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 292EA6101E Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=l75yCT4x0qc49GMG45+jyT16lwCyImhYe34Mnc3EN9I=; b=Ttx8uAymp52SDR aYgX5QriXXCtdTfB7WFkBa9c/JRz3v/UfVfZuugMb90ylpmTG/vQ35fZrX2nkBHUiffSDdQoHcPnY xAe2019PMjBnGlPOOdeRcNcWQq7LKo4OeusM9nAcQKc0/hPk6HvZD7L2S4lfR7n+FAU9XA7L1XS3a nUf3vaeslndhomOKCbgP/tEbfAr5GILUWlh0gjW4jwzz9ApdEl4ewEq47y92IZc7dqPzb9cdyWMN9 vPeDI9NGSG0FErz4MrMMSsWxa4w0hOJdZnr2BXPD2iji+9kNdL0pgFLIfZkyp2hpcQ378n5zphxZE bvlqI0krvnZDQ73b9gag==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mD3S3-000MOU-Jl; Mon, 09 Aug 2021 11:28:15 +0000 Received: from mail-pj1-x102e.google.com ([2607:f8b0:4864:20::102e]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mD3RX-000MIb-Qf for linux-arm-kernel@lists.infradead.org; Mon, 09 Aug 2021 11:27:45 +0000 Received: by mail-pj1-x102e.google.com with SMTP id mq2-20020a17090b3802b0290178911d298bso6665662pjb.1 for ; Mon, 09 Aug 2021 04:27:43 -0700 (PDT) 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=ffo+BFghYOyiUfwtRs9Z93LC8RfNRNR6YWnTHcFyWA4=; b=HtzCFgTbZujxHFgCpuT6lhx9Xq35xX0vxduY4GYyyL9tuctz+TnYquFIa5mifGnUhY O/C7H5CU9Ssl03Vnh+XmSPGod2KGKgfz0ebYwXQjxCmIepFStIJCpbqSwb8yT51N9p41 YKFgufs0olY+BFMHDGm5M1Pk4am40Tbno9y4rmChxhaJ+rQF2oVhuub44BYfOmW2IriB aP0nkhsT4wsFR8iJDMDaN1ekfcze9ZA/EGYSNH7XOWpx5KdULmWAkhvx0TSGC0900zxH VcmeASB8ipPDqqo+pIKXPF6e++vP/7dDDE6wgtb3+yQOga67qNDi7uyV2TJzGV16PupE EL6Q== 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=ffo+BFghYOyiUfwtRs9Z93LC8RfNRNR6YWnTHcFyWA4=; b=G15HdIp26K7cR6jmnUZ8LA4oeklvDUWFprevjzaychPCuBS0AY4aV95gs7wX9GcpvH HWQnSGLZVfor4vyUfv27FfmLLQ6UxDtOVB0MaNIR7UwcpVTu3XZFPCnuArB8n+46V4Fo 847W9sQrnjOpLLE5c2IvAYJ+Mtf/6FW1nSAK7zcJKH5uMk8yLJ14qskEQYR1tKP+ghgV iUVAEgRVEc0tXIGsI6x6jI5D96AWdvK+d5OFrpJVfIm9j2jKRyqkbjBWIKZWBZ5Hpkne gJvioVu8nK+5ly5vcQ84nMI8Z6nt27O/fFdeTFDPIApMYq22eznViPiPkaTs6mR6S90T g9eg== X-Gm-Message-State: AOAM530RtfkcJtH+hEp8KqWeWazT5UPPd5jBC93fXxj4jcbnAXUcNCRb KAECMKpQa+sYIQeijAt2jS10Xg== X-Google-Smtp-Source: ABdhPJyZKOEWkzuWrpbCfIaSlK/cFovYTDHtSnY0Zu2owhEQ5lf+WOHFqQxw8aoKiDD1Y3HLoJueBw== X-Received: by 2002:a17:90a:f696:: with SMTP id cl22mr8519679pjb.124.1628508463334; Mon, 09 Aug 2021 04:27:43 -0700 (PDT) Received: from localhost ([210.0.159.74]) by smtp.gmail.com with ESMTPSA id 8sm9000578pfo.153.2021.08.09.04.27.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 09 Aug 2021 04:27:42 -0700 (PDT) From: Leo Yan To: Arnaldo Carvalho de Melo , Peter Zijlstra , Adrian Hunter , Ingo Molnar , Mark Rutland , Alexander Shishkin , Jiri Olsa , Namhyung Kim , Will Deacon , Russell King , Catalin Marinas , Mathieu Poirier , Suzuki K Poulose , Mike Leach , John Garry , Andi Kleen , Riccardo Mancini , Jin Yao , Li Huafei , coresight@lists.linaro.org, linux-arm-kernel@lists.infradead.org, linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Leo Yan Subject: [PATCH v1 3/3] perf auxtrace arm: Support compat_auxtrace_mmap__{read_head|write_tail} Date: Mon, 9 Aug 2021 19:27:27 +0800 Message-Id: <20210809112727.596876-4-leo.yan@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20210809112727.596876-1-leo.yan@linaro.org> References: <20210809112727.596876-1-leo.yan@linaro.org> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210809_042743_936989_75F4FFA2 X-CRM114-Status: GOOD ( 16.53 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org When the tool runs with compat mode on Arm platform, the kernel is in 64-bit mode and user space is in 32-bit mode; the user space can use instructions "ldrd" and "strd" for 64-bit value atomicity. This patch adds compat_auxtrace_mmap__{read_head|write_tail} for arm building, it uses "ldrd" and "strd" instructions to ensure accessing atomicity for aux head and tail. The file arch/arm/util/auxtrace.c is built for arm and arm64 building, these two functions are not needed for arm64, so check the compiler macro "__arm__" to only include them for arm building. Signed-off-by: Leo Yan --- tools/perf/arch/arm/util/auxtrace.c | 32 +++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/tools/perf/arch/arm/util/auxtrace.c b/tools/perf/arch/arm/util/auxtrace.c index b187bddbd01a..c7c7ec0812d5 100644 --- a/tools/perf/arch/arm/util/auxtrace.c +++ b/tools/perf/arch/arm/util/auxtrace.c @@ -107,3 +107,35 @@ struct auxtrace_record *err = 0; return NULL; } + +#if defined(__arm__) +u64 compat_auxtrace_mmap__read_head(struct auxtrace_mmap *mm) +{ + struct perf_event_mmap_page *pc = mm->userpg; + u64 result; + + __asm__ __volatile__( +" ldrd %0, %H0, [%1]" + : "=&r" (result) + : "r" (&pc->aux_head), "Qo" (pc->aux_head) + ); + + return result; +} + +int compat_auxtrace_mmap__write_tail(struct auxtrace_mmap *mm, u64 tail) +{ + struct perf_event_mmap_page *pc = mm->userpg; + + /* Ensure all reads are done before we write the tail out */ + smp_mb(); + + __asm__ __volatile__( +" strd %2, %H2, [%1]" + : "=Qo" (pc->aux_tail) + : "r" (&pc->aux_tail), "r" (tail) + ); + + return 0; +} +#endif