From nobody Fri Apr 17 22:34:55 2026 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 6C240C433EF for ; Thu, 21 Jul 2022 04:36:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231555AbiGUEg5 (ORCPT ); Thu, 21 Jul 2022 00:36:57 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33872 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231259AbiGUEgw (ORCPT ); Thu, 21 Jul 2022 00:36:52 -0400 Received: from mail-pf1-x436.google.com (mail-pf1-x436.google.com [IPv6:2607:f8b0:4864:20::436]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 79839201B3; Wed, 20 Jul 2022 21:36:50 -0700 (PDT) Received: by mail-pf1-x436.google.com with SMTP id l124so680028pfl.8; Wed, 20 Jul 2022 21:36:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=9Tm3AHOmJIo0LacOb7QWvPa4kYeHblOrKXCz3/M7PV0=; b=nHAvR4E2L/igqO9S7PJm4qOdZOfSW81xtL0MPTSjTU4Bv80e9a/91ZfjDvjjS4abpn hDluGNPX7zdoyvh0apqG+8XRD8jPOIV4eS7dbcheZVnSl7sd+u985webkG/1QQiJSVPb vk3hfBguQdKD8QD4Fg9eXXid+eiuW7aGllfD6gmDoOIOYAnxzyjBVr5rO5vid5Rd8rkx KtqfNZ182ySu63T+XXpHELf4d6p4x2RQvts0oQeISoUjf1H+rcon2gMFdmVNVtWt2Lb+ u828qLVvH8tn/CrvD+XxND0FTm+xRS+z+FGR3/EcqhjcC+vBflJPLvxeWHfhVxsKt3uO ANpw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=9Tm3AHOmJIo0LacOb7QWvPa4kYeHblOrKXCz3/M7PV0=; b=wivNz0CIhxapmAZ0EIQZTt56T954VZPJbO45nJ5weAAfyLi2VZZ9XJ2koKkF8xRklv HKXwpmxUxzhcTjEkDbrftQSRz9NgC9GSKNXYAp8v/y1h2E9FwvLVLuq4t9Qhy0b9g5Lv +OwxIkOD4hSi1SOu0z6/rVt17dwGG4R80YfGAufZt/TLP/LxH+xBI+amMKlqkHzrwf9K EqAXrveLyKD+9B0NdXUM8wXcI65jPEXC5mdFtcBwww5buTUWVt/bRb8ESW+dAz8yTbU+ TX+5f9UpEIbga8y7RTk8wJ+XvayqjsOf5k2izuHyk/zOZwhgp03NdXbOpQJsbCm13pQa QfpA== X-Gm-Message-State: AJIora9x2Fw70l3GFrTqGPk9IY1pnVY8EKelilS9Us/6RKvLwkW6jPkQ /m3BiOPGKRdxIy8ObuKloms= X-Google-Smtp-Source: AGRyM1uxrGSa0yoBJ3pzloZKuuHoei85kxEJBRAbWJkYgMTBxm0GCErvon54rmwButMdBHswD8A5JQ== X-Received: by 2002:a63:4c0d:0:b0:41a:77fe:2bc8 with SMTP id z13-20020a634c0d000000b0041a77fe2bc8mr3393322pga.82.1658378209878; Wed, 20 Jul 2022 21:36:49 -0700 (PDT) Received: from balhae.roam.corp.google.com ([2607:fb90:467:a1e4:c167:53fd:8047:7f62]) by smtp.gmail.com with ESMTPSA id x11-20020a170902a38b00b0016bea2a0a8dsm450824pla.91.2022.07.20.21.36.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Jul 2022 21:36:49 -0700 (PDT) Sender: Namhyung Kim From: Namhyung Kim To: Arnaldo Carvalho de Melo , Jiri Olsa Cc: Ingo Molnar , Peter Zijlstra , LKML , Ian Rogers , linux-perf-users@vger.kernel.org, Will Deacon , Waiman Long , Boqun Feng , Davidlohr Bueso Subject: [PATCH 1/6] perf lock: Fix a copy-n-paste bug Date: Wed, 20 Jul 2022 21:36:39 -0700 Message-Id: <20220721043644.153718-2-namhyung@kernel.org> X-Mailer: git-send-email 2.37.0.170.g444d1eabd0-goog In-Reply-To: <20220721043644.153718-1-namhyung@kernel.org> References: <20220721043644.153718-1-namhyung@kernel.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" It should be lock_text_end instead of _start. Fixes: 0d2997f750d1 ("perf lock: Look up callchain for the contended locks") Signed-off-by: Namhyung Kim --- tools/perf/builtin-lock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c index c5ca34741561..0aae88fdf93a 100644 --- a/tools/perf/builtin-lock.c +++ b/tools/perf/builtin-lock.c @@ -892,7 +892,7 @@ static bool is_lock_function(u64 addr) sym =3D machine__find_kernel_symbol_by_name(machine, "__lock_text_end", &kmap); - lock_text_start =3D kmap->unmap_ip(kmap, sym->start); + lock_text_end =3D kmap->unmap_ip(kmap, sym->start); } =20 /* failed to get kernel symbols */ --=20 2.37.0.170.g444d1eabd0-goog From nobody Fri Apr 17 22:34:55 2026 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 3E2B2C43334 for ; Thu, 21 Jul 2022 04:37:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231710AbiGUEg7 (ORCPT ); Thu, 21 Jul 2022 00:36:59 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:33884 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231300AbiGUEgx (ORCPT ); Thu, 21 Jul 2022 00:36:53 -0400 Received: from mail-pf1-x434.google.com (mail-pf1-x434.google.com [IPv6:2607:f8b0:4864:20::434]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 78AC461D98; Wed, 20 Jul 2022 21:36:52 -0700 (PDT) Received: by mail-pf1-x434.google.com with SMTP id y9so664122pff.12; Wed, 20 Jul 2022 21:36:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=px593lhrI3ohQi/d5ZOfxWI2P2og7GTsgTAQATVwjH8=; b=gJ9fKqucSaZTY5SR3tghXWgT1FaxQx9M/SZtokIzPRzPrEXAuLkjtnE70sOO53Wuyu 8Lot0nfmHnYv6rioiQ6fXtuBNf7cOh/SBznCRiXv4jCPPOd0Wzg852xKoH3272JNxt+l EFWjh+8k8uNGHcuaSZyRpIrdipMmgqKte8c66c6roTVazHP9INlZ3mWPvXn2a9qcnuZI /lqZ10JQy45aDHrSoIhj/O0he8x2Jm5BLSpYvehHtwvPwKW1xE+xkqcwJfLdsxYs4W59 +mQ5rgG05bK2g+wu/3zlJibe22Cr1Y8BlMhBiEytgaKgzjIgwbWQ0qiI+TK3nyQDd8XJ Nf0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=px593lhrI3ohQi/d5ZOfxWI2P2og7GTsgTAQATVwjH8=; b=g/aZFl1nC/nmxfNY0EKcsigR9BE3fmoiwqC1BJIBLJt/ad/0L2Zu2bSAbzfTasEqun iA4+257SREcFE8Z2ASOSe4o9aBoCbq68LF9gdClq82jG2xGnl/rUXHc+WRYVDidCNQ2S QwgtmRfbGgfnrkxNLqoj1fSWu9caRAWho6bRVhA7BtrgD10jTnMwsuRLGX4POAcDOaxE JIwbPi7c8lmjRBqGNfBGO2ujJ5p0VVzdfx94oeHKD/OxZrqwFee4Vm1mPTHS6RAHMKjm MXJeDsb1HTGG3ztUh7kA7AkYia7t6Ju1DMUw5wrhX4dLjSUqa55X9DL/zM4a0cYHRcfs dPOw== X-Gm-Message-State: AJIora/uCkBot80KTwCbJxf/8bBeINTI3C6qkf27joYFAUXQXEZvw/vi E57VRnqngcU4YO7O8UIza7k= X-Google-Smtp-Source: AGRyM1tik97f09/xLZHzhieB7Yo6QdNETV2SCAO29QFgG443YHzKwdAE0PKW/M+gYyM9o/a+ouFd2Q== X-Received: by 2002:a63:85c3:0:b0:419:ec94:198e with SMTP id u186-20020a6385c3000000b00419ec94198emr25167140pgd.569.1658378211823; Wed, 20 Jul 2022 21:36:51 -0700 (PDT) Received: from balhae.roam.corp.google.com ([2607:fb90:467:a1e4:c167:53fd:8047:7f62]) by smtp.gmail.com with ESMTPSA id x11-20020a170902a38b00b0016bea2a0a8dsm450824pla.91.2022.07.20.21.36.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Jul 2022 21:36:51 -0700 (PDT) Sender: Namhyung Kim From: Namhyung Kim To: Arnaldo Carvalho de Melo , Jiri Olsa Cc: Ingo Molnar , Peter Zijlstra , LKML , Ian Rogers , linux-perf-users@vger.kernel.org, Will Deacon , Waiman Long , Boqun Feng , Davidlohr Bueso Subject: [PATCH 2/6] perf lock: Add flags field in the lock_stat Date: Wed, 20 Jul 2022 21:36:40 -0700 Message-Id: <20220721043644.153718-3-namhyung@kernel.org> X-Mailer: git-send-email 2.37.0.170.g444d1eabd0-goog In-Reply-To: <20220721043644.153718-1-namhyung@kernel.org> References: <20220721043644.153718-1-namhyung@kernel.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" For lock contention tracepoint analysis, it needs to keep the flags. As nr_readlock and nr_trylock fields are not used for it, let's make it a union. Signed-off-by: Namhyung Kim --- tools/perf/builtin-lock.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c index 0aae88fdf93a..1de459198b99 100644 --- a/tools/perf/builtin-lock.c +++ b/tools/perf/builtin-lock.c @@ -59,7 +59,10 @@ struct lock_stat { unsigned int nr_contended; unsigned int nr_release; =20 - unsigned int nr_readlock; + union { + unsigned int nr_readlock; + unsigned int flags; + }; unsigned int nr_trylock; =20 /* these times are in nano sec. */ @@ -516,7 +519,7 @@ static struct lock_stat *lock_stat_find(u64 addr) return NULL; } =20 -static struct lock_stat *lock_stat_findnew(u64 addr, const char *name) +static struct lock_stat *lock_stat_findnew(u64 addr, const char *name, int= flags) { struct hlist_head *entry =3D lockhashentry(addr); struct lock_stat *ret, *new; @@ -531,13 +534,13 @@ static struct lock_stat *lock_stat_findnew(u64 addr, = const char *name) goto alloc_failed; =20 new->addr =3D addr; - new->name =3D zalloc(sizeof(char) * strlen(name) + 1); + new->name =3D strdup(name); if (!new->name) { free(new); goto alloc_failed; } =20 - strcpy(new->name, name); + new->flags =3D flags; new->wait_time_min =3D ULLONG_MAX; =20 hlist_add_head(&new->hash_entry, entry); @@ -624,7 +627,7 @@ static int report_lock_acquire_event(struct evsel *evse= l, if (show_thread_stats) addr =3D sample->tid; =20 - ls =3D lock_stat_findnew(addr, name); + ls =3D lock_stat_findnew(addr, name, 0); if (!ls) return -ENOMEM; =20 @@ -696,7 +699,7 @@ static int report_lock_acquired_event(struct evsel *evs= el, if (show_thread_stats) addr =3D sample->tid; =20 - ls =3D lock_stat_findnew(addr, name); + ls =3D lock_stat_findnew(addr, name, 0); if (!ls) return -ENOMEM; =20 @@ -758,7 +761,7 @@ static int report_lock_contended_event(struct evsel *ev= sel, if (show_thread_stats) addr =3D sample->tid; =20 - ls =3D lock_stat_findnew(addr, name); + ls =3D lock_stat_findnew(addr, name, 0); if (!ls) return -ENOMEM; =20 @@ -813,7 +816,7 @@ static int report_lock_release_event(struct evsel *evse= l, if (show_thread_stats) addr =3D sample->tid; =20 - ls =3D lock_stat_findnew(addr, name); + ls =3D lock_stat_findnew(addr, name, 0); if (!ls) return -ENOMEM; =20 @@ -985,11 +988,12 @@ static int report_lock_contention_begin_event(struct = evsel *evsel, if (!ls) { char buf[128]; const char *caller =3D buf; + unsigned int flags =3D evsel__intval(evsel, sample, "flags"); =20 if (lock_contention_caller(evsel, sample, buf, sizeof(buf)) < 0) caller =3D "Unknown"; =20 - ls =3D lock_stat_findnew(addr, caller); + ls =3D lock_stat_findnew(addr, caller, flags); if (!ls) return -ENOMEM; } --=20 2.37.0.170.g444d1eabd0-goog From nobody Fri Apr 17 22:34:55 2026 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 AC6C0C43334 for ; Thu, 21 Jul 2022 04:37:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231992AbiGUEhK (ORCPT ); Thu, 21 Jul 2022 00:37:10 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34348 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230063AbiGUEhE (ORCPT ); Thu, 21 Jul 2022 00:37:04 -0400 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 597656D55B; Wed, 20 Jul 2022 21:36:56 -0700 (PDT) Received: by mail-pj1-x1032.google.com with SMTP id ku18so515757pjb.2; Wed, 20 Jul 2022 21:36:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=FlonJbiCrIbX27YpRbbAWUw/yuoyRGqchFM5XXg+n5s=; b=jYTsJqabEVdZqCboKQzgwmU1gBH4AyjwBBn+WDOuK65xpFrPrZeRtix5k8k+BAgxzR 1OebIA7SzdRriwtEHZkZGYa5FD14zUDJRQiF/h8lIn5lbK9qMdqE0PAoy3wwDKEszFeV Xgo/meBsu+F+0OkbwWvk5xS/NglGibiNaoShRS0yYi9MeYdenAvEYGZtWsai2oKt4LDk BegdL7FhO6PlU2hCl26u3uydNjfU5Z7RIMObuvsiwJ3BdjtN1fOt2Q6lzVttFyGl7IPw GW9+P3OnILObxjgrd6JIxrW8XL+7ES2PxUgPBdDK3+XcmuB83xpDCIEoyiEMJENxsk9+ NaIw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=FlonJbiCrIbX27YpRbbAWUw/yuoyRGqchFM5XXg+n5s=; b=3QmGLRy9i8IHxcZQdab5IazwI25dwX/vx3mtapJGyzRt9/j5ik51fHBJD/OAxPb9JM Mkj6vJx0/wRkf+Jy0bC4KCHphu/JEe0xLtxdeMhTxQxdURTUj9Fia4zOWTfG0V2cwSfn La1T9zPqrjcUoD1t3atlu+esD/fNd5XIG0+H4sK9vM6RdgB441ChUDAPhf0GP81k7znM 7DOjVb8MNKy7UMivbl4O/VYmvWtzjiUbKQMnHOJfkvi3gWaAnpcutuEEhHgFkJCffUbe aZgAtkcIL9jlVyEviwXq+zq4Sto/nXzQnRGJmrJLN2eFc5TBLzRMyidbAO/3jQGUtEYr lMgA== X-Gm-Message-State: AJIora9I5w2hjfw9L//VMEGO2c7VlEAEmR6kEsPjV/zQExX6MbaqmGu2 9GIgfDvpBbGsxmbOHutczRQ= X-Google-Smtp-Source: AGRyM1smMrTRGnjELhAv6qdbmz+LTu533MNpRd0RAGLsSqwtyaRcbVuQccbHlYCtXb750wdQN5+tKw== X-Received: by 2002:a17:902:d2c8:b0:16c:58d:727e with SMTP id n8-20020a170902d2c800b0016c058d727emr42037675plc.76.1658378215660; Wed, 20 Jul 2022 21:36:55 -0700 (PDT) Received: from balhae.roam.corp.google.com ([2607:fb90:467:a1e4:c167:53fd:8047:7f62]) by smtp.gmail.com with ESMTPSA id x11-20020a170902a38b00b0016bea2a0a8dsm450824pla.91.2022.07.20.21.36.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Jul 2022 21:36:55 -0700 (PDT) Sender: Namhyung Kim From: Namhyung Kim To: Arnaldo Carvalho de Melo , Jiri Olsa Cc: Ingo Molnar , Peter Zijlstra , LKML , Ian Rogers , linux-perf-users@vger.kernel.org, Will Deacon , Waiman Long , Boqun Feng , Davidlohr Bueso Subject: [PATCH 3/6] perf lock: Add lock aggregation enum Date: Wed, 20 Jul 2022 21:36:41 -0700 Message-Id: <20220721043644.153718-4-namhyung@kernel.org> X-Mailer: git-send-email 2.37.0.170.g444d1eabd0-goog In-Reply-To: <20220721043644.153718-1-namhyung@kernel.org> References: <20220721043644.153718-1-namhyung@kernel.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" Introduce the aggr_mode variable to prepare the later code change. The default is LOCK_AGGR_ADDR which aggregate the result for the lock instances. When -t/--threads option is given, it'd be set to LOCK_AGGR_TASK. The LOCK_AGGR_CALLER is for the contention analysis and it'd aggregate the stat by comparing the callstacks. Signed-off-by: Namhyung Kim --- tools/perf/builtin-lock.c | 112 +++++++++++++++++++++++++++++++------- 1 file changed, 93 insertions(+), 19 deletions(-) diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c index 1de459198b99..551bad905139 100644 --- a/tools/perf/builtin-lock.c +++ b/tools/perf/builtin-lock.c @@ -126,6 +126,12 @@ static struct rb_root thread_stats; static bool combine_locks; static bool show_thread_stats; =20 +static enum { + LOCK_AGGR_ADDR, + LOCK_AGGR_TASK, + LOCK_AGGR_CALLER, +} aggr_mode =3D LOCK_AGGR_ADDR; + /* * CONTENTION_STACK_DEPTH * Number of stack trace entries to find callers @@ -622,12 +628,22 @@ static int report_lock_acquire_event(struct evsel *ev= sel, const char *name =3D evsel__strval(evsel, sample, "name"); u64 addr =3D evsel__intval(evsel, sample, "lockdep_addr"); int flag =3D evsel__intval(evsel, sample, "flags"); + u64 key; =20 - /* abuse ls->addr for tid */ - if (show_thread_stats) - addr =3D sample->tid; + switch (aggr_mode) { + case LOCK_AGGR_ADDR: + key =3D addr; + break; + case LOCK_AGGR_TASK: + key =3D sample->tid; + break; + case LOCK_AGGR_CALLER: + default: + pr_err("Invalid aggregation mode: %d\n", aggr_mode); + return -EINVAL; + } =20 - ls =3D lock_stat_findnew(addr, name, 0); + ls =3D lock_stat_findnew(key, name, 0); if (!ls) return -ENOMEM; =20 @@ -695,11 +711,22 @@ static int report_lock_acquired_event(struct evsel *e= vsel, u64 contended_term; const char *name =3D evsel__strval(evsel, sample, "name"); u64 addr =3D evsel__intval(evsel, sample, "lockdep_addr"); + u64 key; =20 - if (show_thread_stats) - addr =3D sample->tid; + switch (aggr_mode) { + case LOCK_AGGR_ADDR: + key =3D addr; + break; + case LOCK_AGGR_TASK: + key =3D sample->tid; + break; + case LOCK_AGGR_CALLER: + default: + pr_err("Invalid aggregation mode: %d\n", aggr_mode); + return -EINVAL; + } =20 - ls =3D lock_stat_findnew(addr, name, 0); + ls =3D lock_stat_findnew(key, name, 0); if (!ls) return -ENOMEM; =20 @@ -757,11 +784,22 @@ static int report_lock_contended_event(struct evsel *= evsel, struct lock_seq_stat *seq; const char *name =3D evsel__strval(evsel, sample, "name"); u64 addr =3D evsel__intval(evsel, sample, "lockdep_addr"); + u64 key; =20 - if (show_thread_stats) - addr =3D sample->tid; + switch (aggr_mode) { + case LOCK_AGGR_ADDR: + key =3D addr; + break; + case LOCK_AGGR_TASK: + key =3D sample->tid; + break; + case LOCK_AGGR_CALLER: + default: + pr_err("Invalid aggregation mode: %d\n", aggr_mode); + return -EINVAL; + } =20 - ls =3D lock_stat_findnew(addr, name, 0); + ls =3D lock_stat_findnew(key, name, 0); if (!ls) return -ENOMEM; =20 @@ -812,11 +850,22 @@ static int report_lock_release_event(struct evsel *ev= sel, struct lock_seq_stat *seq; const char *name =3D evsel__strval(evsel, sample, "name"); u64 addr =3D evsel__intval(evsel, sample, "lockdep_addr"); + u64 key; =20 - if (show_thread_stats) - addr =3D sample->tid; + switch (aggr_mode) { + case LOCK_AGGR_ADDR: + key =3D addr; + break; + case LOCK_AGGR_TASK: + key =3D sample->tid; + break; + case LOCK_AGGR_CALLER: + default: + pr_err("Invalid aggregation mode: %d\n", aggr_mode); + return -EINVAL; + } =20 - ls =3D lock_stat_findnew(addr, name, 0); + ls =3D lock_stat_findnew(key, name, 0); if (!ls) return -ENOMEM; =20 @@ -980,11 +1029,22 @@ static int report_lock_contention_begin_event(struct= evsel *evsel, struct thread_stat *ts; struct lock_seq_stat *seq; u64 addr =3D evsel__intval(evsel, sample, "lock_addr"); + u64 key; =20 - if (show_thread_stats) - addr =3D sample->tid; + switch (aggr_mode) { + case LOCK_AGGR_ADDR: + key =3D addr; + break; + case LOCK_AGGR_TASK: + key =3D sample->tid; + break; + case LOCK_AGGR_CALLER: + default: + pr_err("Invalid aggregation mode: %d\n", aggr_mode); + return -EINVAL; + } =20 - ls =3D lock_stat_find(addr); + ls =3D lock_stat_find(key); if (!ls) { char buf[128]; const char *caller =3D buf; @@ -993,7 +1053,7 @@ static int report_lock_contention_begin_event(struct e= vsel *evsel, if (lock_contention_caller(evsel, sample, buf, sizeof(buf)) < 0) caller =3D "Unknown"; =20 - ls =3D lock_stat_findnew(addr, caller, flags); + ls =3D lock_stat_findnew(key, caller, flags); if (!ls) return -ENOMEM; } @@ -1050,9 +1110,20 @@ static int report_lock_contention_end_event(struct e= vsel *evsel, struct lock_seq_stat *seq; u64 contended_term; u64 addr =3D evsel__intval(evsel, sample, "lock_addr"); + u64 key; =20 - if (show_thread_stats) - addr =3D sample->tid; + switch (aggr_mode) { + case LOCK_AGGR_ADDR: + key =3D addr; + break; + case LOCK_AGGR_TASK: + key =3D sample->tid; + break; + case LOCK_AGGR_CALLER: + default: + pr_err("Invalid aggregation mode: %d\n", aggr_mode); + return -EINVAL; + } =20 ls =3D lock_stat_find(addr); if (!ls) @@ -1416,6 +1487,9 @@ static int __cmd_report(bool display_info) if (select_key()) goto out_delete; =20 + if (show_thread_stats) + aggr_mode =3D LOCK_AGGR_TASK; + err =3D perf_session__process_events(session); if (err) goto out_delete; --=20 2.37.0.170.g444d1eabd0-goog From nobody Fri Apr 17 22:34:55 2026 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 9E650C43334 for ; Thu, 21 Jul 2022 04:37:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232003AbiGUEhO (ORCPT ); Thu, 21 Jul 2022 00:37:14 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34428 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231783AbiGUEhF (ORCPT ); Thu, 21 Jul 2022 00:37:05 -0400 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 1147D6BC0E; Wed, 20 Jul 2022 21:36:58 -0700 (PDT) Received: by mail-pl1-x62c.google.com with SMTP id p8so692658plq.13; Wed, 20 Jul 2022 21:36:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=q2xu+SoyIdv+ETd2l4mk8D6QVIj8apyQV3oFiSqMZ6A=; b=CVq8o4fEZomXztSRf3HmmyUKPAuxulqZh93+iK+FnAyhI0ICnEjegABisP+3uXbIXQ 115PA8mqVW9HqUVBvAGjhCxA0KVSzkjufEKal7feNnet8ji8cAyn9a/Knru/NhkuFzCQ KJIco4YyNAq5ZkwIlNvyWOmL90VMBapft/8xAa5gcH+iWLnCE/VShadpY92rZYuWPXY2 Hur0y1ACl320WnU/IFKeU0/6DIBiB0zoHVBiG+yaEG9jfoLA3yG5RXnHrNsor4/Y1c3V HYoIF3CP39jxRmwU/oNW5ppBzL4BZHgBi6oE9ylnXt/0BJ7F1M0rKFlNHem7Kmm7WYl6 2BPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=q2xu+SoyIdv+ETd2l4mk8D6QVIj8apyQV3oFiSqMZ6A=; b=ghnCXJC6scEFielGuAAmGLSnZg4bC2dXMU3MGk3JW180k18EbBAwHCO5Rz6HalhMzb wxKSt9yC5mzb7nKf4q1NxioG+9v7YvxIVpJjXZY3YGOf/r9h0MnknONPXp+HedZ/HIOG 2exZhDSl+r2gF/HUnGXIG0rBFJG6MouPX/txAMv95CytqKpV6QQCmEzp0mLEPce+z11w hfUT3lr9H2zNKxXgpiHO4U0p7CmEY4tKrUO9Dl9AYIDBk+v0vF+85k9hIzP43on1k6u5 TQ6k0eRN+Tp+lEIWql0u3d5iU5/JPirZW/8TF7rYFTjBMXZORr24D4HtmyB7EyI7Vxgt nkuQ== X-Gm-Message-State: AJIora93FcIpoImO5Qck9QwdRmLWLheoZtsrmmPqIcvHAkHHnM+nil3C 0BuTK9d1JigTFoErSF/U0J8= X-Google-Smtp-Source: AGRyM1tXgeLJigyKACxaesjB/kZgYtYYrv7zZ1jgwIUkiy2idAiU8I8XKLDDLt/5blTNHG/+tuCYEw== X-Received: by 2002:a17:90a:f404:b0:1f1:fd63:281a with SMTP id ch4-20020a17090af40400b001f1fd63281amr9305110pjb.158.1658378217527; Wed, 20 Jul 2022 21:36:57 -0700 (PDT) Received: from balhae.roam.corp.google.com ([2607:fb90:467:a1e4:c167:53fd:8047:7f62]) by smtp.gmail.com with ESMTPSA id x11-20020a170902a38b00b0016bea2a0a8dsm450824pla.91.2022.07.20.21.36.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Jul 2022 21:36:57 -0700 (PDT) Sender: Namhyung Kim From: Namhyung Kim To: Arnaldo Carvalho de Melo , Jiri Olsa Cc: Ingo Molnar , Peter Zijlstra , LKML , Ian Rogers , linux-perf-users@vger.kernel.org, Will Deacon , Waiman Long , Boqun Feng , Davidlohr Bueso Subject: [PATCH 4/6] perf lock: Add 'contention' subcommand Date: Wed, 20 Jul 2022 21:36:42 -0700 Message-Id: <20220721043644.153718-5-namhyung@kernel.org> X-Mailer: git-send-email 2.37.0.170.g444d1eabd0-goog In-Reply-To: <20220721043644.153718-1-namhyung@kernel.org> References: <20220721043644.153718-1-namhyung@kernel.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" The 'perf lock contention' processes the lock contention events and displays the result like perf lock report. Right now, there's not much difference between the two but the lock contention specific features will come soon. $ perf lock contention contended total wait max wait avg wait type caller 238 1.41 ms 29.20 us 5.94 us spinlock update_b= locked_averages+0x4c 1 902.08 us 902.08 us 902.08 us rwsem:R do_user_= addr_fault+0x1dd 81 330.30 us 17.24 us 4.08 us spinlock _nohz_id= le_balance+0x172 2 89.54 us 61.26 us 44.77 us spinlock do_anony= mous_page+0x16d 24 78.36 us 12.27 us 3.27 us mutex pipe_rea= d+0x56 2 71.58 us 59.56 us 35.79 us spinlock __handle= _mm_fault+0x6aa 6 25.68 us 6.89 us 4.28 us spinlock do_idle+= 0x28d 1 18.46 us 18.46 us 18.46 us rtmutex exec_fw_= cmd+0x21b 3 15.25 us 6.26 us 5.08 us spinlock tick_do_= update_jiffies64+0x2c Signed-off-by: Namhyung Kim --- tools/perf/Documentation/perf-lock.txt | 4 +- tools/perf/builtin-lock.c | 214 ++++++++++++++++++++++++- 2 files changed, 215 insertions(+), 3 deletions(-) diff --git a/tools/perf/Documentation/perf-lock.txt b/tools/perf/Documentat= ion/perf-lock.txt index 4b8568f0c53b..da0bcbc676a3 100644 --- a/tools/perf/Documentation/perf-lock.txt +++ b/tools/perf/Documentation/perf-lock.txt @@ -8,7 +8,7 @@ perf-lock - Analyze lock events SYNOPSIS -------- [verse] -'perf lock' {record|report|script|info} +'perf lock' {record|report|script|info|contention} =20 DESCRIPTION ----------- @@ -27,6 +27,8 @@ and statistics with this 'perf lock' command. 'perf lock info' shows metadata like threads or addresses of lock instances. =20 + 'perf lock contention' shows contention statistics. + COMMON OPTIONS -------------- =20 diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c index 551bad905139..64f635273660 100644 --- a/tools/perf/builtin-lock.c +++ b/tools/perf/builtin-lock.c @@ -145,6 +145,18 @@ static enum { */ #define CONTENTION_STACK_SKIP 3 =20 +/* + * flags for lock:contention_begin + * Imported from include/trace/events/lock.h. + */ +#define LCB_F_SPIN (1U << 0) +#define LCB_F_READ (1U << 1) +#define LCB_F_WRITE (1U << 2) +#define LCB_F_RT (1U << 3) +#define LCB_F_PERCPU (1U << 4) +#define LCB_F_MUTEX (1U << 5) + + static u64 sched_text_start; static u64 sched_text_end; static u64 lock_text_start; @@ -1022,6 +1034,51 @@ static int lock_contention_caller(struct evsel *evse= l, struct perf_sample *sampl return -1; } =20 +static u64 callchain_id(struct evsel *evsel, struct perf_sample *sample) +{ + struct callchain_cursor *cursor =3D &callchain_cursor; + struct thread *thread; + u64 hash =3D 0; + int skip =3D 0; + int ret; + + thread =3D machine__findnew_thread(&session->machines.host, + -1, sample->pid); + if (thread =3D=3D NULL) + return -1; + + /* use caller function name from the callchain */ + ret =3D thread__resolve_callchain(thread, cursor, evsel, sample, + NULL, NULL, CONTENTION_STACK_DEPTH); + thread__put(thread); + + if (ret !=3D 0) + return -1; + + callchain_cursor_commit(cursor); + + while (true) { + struct callchain_cursor_node *node; + + node =3D callchain_cursor_current(cursor); + if (node =3D=3D NULL) + break; + + /* skip first few entries - for lock functions */ + if (++skip <=3D CONTENTION_STACK_SKIP) + goto next; + + if (node->ms.sym && is_lock_function(node->ip)) + goto next; + + hash ^=3D hash_long((unsigned long)node->ip, 64); + +next: + callchain_cursor_advance(cursor); + } + return hash; +} + static int report_lock_contention_begin_event(struct evsel *evsel, struct perf_sample *sample) { @@ -1039,6 +1096,8 @@ static int report_lock_contention_begin_event(struct = evsel *evsel, key =3D sample->tid; break; case LOCK_AGGR_CALLER: + key =3D callchain_id(evsel, sample); + break; default: pr_err("Invalid aggregation mode: %d\n", aggr_mode); return -EINVAL; @@ -1120,12 +1179,14 @@ static int report_lock_contention_end_event(struct = evsel *evsel, key =3D sample->tid; break; case LOCK_AGGR_CALLER: + key =3D callchain_id(evsel, sample); + break; default: pr_err("Invalid aggregation mode: %d\n", aggr_mode); return -EINVAL; } =20 - ls =3D lock_stat_find(addr); + ls =3D lock_stat_find(key); if (!ls) return 0; =20 @@ -1183,6 +1244,12 @@ static struct trace_lock_handler report_lock_ops = =3D { .contention_end_event =3D report_lock_contention_end_event, }; =20 +static struct trace_lock_handler contention_lock_ops =3D { + .contention_begin_event =3D report_lock_contention_begin_event, + .contention_end_event =3D report_lock_contention_end_event, +}; + + static struct trace_lock_handler *trace_handler; =20 static int evsel__process_lock_acquire(struct evsel *evsel, struct perf_sa= mple *sample) @@ -1428,6 +1495,67 @@ static void sort_result(void) } } =20 +static const char *get_type_str(struct lock_stat *st) +{ + static const struct { + unsigned int flags; + const char *name; + } table[] =3D { + { 0, "semaphore" }, + { LCB_F_SPIN, "spinlock" }, + { LCB_F_SPIN | LCB_F_READ, "rwlock:R" }, + { LCB_F_SPIN | LCB_F_WRITE, "rwlock:W"}, + { LCB_F_READ, "rwsem:R" }, + { LCB_F_WRITE, "rwsem:W" }, + { LCB_F_RT, "rtmutex" }, + { LCB_F_RT | LCB_F_READ, "rwlock-rt:R" }, + { LCB_F_RT | LCB_F_WRITE, "rwlock-rt:W"}, + { LCB_F_PERCPU | LCB_F_READ, "pcpu-sem:R" }, + { LCB_F_PERCPU | LCB_F_WRITE, "pcpu-sem:W" }, + { LCB_F_MUTEX, "mutex" }, + { LCB_F_MUTEX | LCB_F_SPIN, "mutex" }, + }; + + for (unsigned int i =3D 0; i < ARRAY_SIZE(table); i++) { + if (table[i].flags =3D=3D st->flags) + return table[i].name; + } + return "unknown"; +} + +static void sort_contention_result(void) +{ + sort_result(); +} + +static void print_contention_result(void) +{ + struct lock_stat *st; + struct lock_key *key; + int bad, total; + + list_for_each_entry(key, &lock_keys, list) + pr_info("%*s ", key->len, key->header); + + pr_info(" %10s %s\n\n", "type", "caller"); + + bad =3D total =3D 0; + while ((st =3D pop_from_result())) { + total++; + if (st->broken) + bad++; + + list_for_each_entry(key, &lock_keys, list) { + key->print(key, st); + pr_info(" "); + } + + pr_info(" %10s %s\n", get_type_str(st), st->name); + } + + print_bad_events(bad, total); +} + static const struct evsel_str_handler lock_tracepoints[] =3D { { "lock:lock_acquire", evsel__process_lock_acquire, }, /* CONFIG_LOCKD= EP */ { "lock:lock_acquired", evsel__process_lock_acquired, }, /* CONFIG_LOCK= DEP, CONFIG_LOCK_STAT */ @@ -1508,6 +1636,68 @@ static int __cmd_report(bool display_info) return err; } =20 +static int __cmd_contention(void) +{ + int err =3D -EINVAL; + struct perf_tool eops =3D { + .sample =3D process_sample_event, + .comm =3D perf_event__process_comm, + .mmap =3D perf_event__process_mmap, + .ordered_events =3D true, + }; + struct perf_data data =3D { + .path =3D input_name, + .mode =3D PERF_DATA_MODE_READ, + .force =3D force, + }; + + session =3D perf_session__new(&data, &eops); + if (IS_ERR(session)) { + pr_err("Initializing perf session failed\n"); + return PTR_ERR(session); + } + + /* for lock function check */ + symbol_conf.sort_by_name =3D true; + symbol__init(&session->header.env); + + if (!perf_session__has_traces(session, "lock record")) + goto out_delete; + + if (!evlist__find_evsel_by_str(session->evlist, "lock:contention_begin"))= { + pr_err("lock contention evsel not found\n"); + goto out_delete; + } + + if (perf_session__set_tracepoints_handlers(session, contention_tracepoint= s)) { + pr_err("Initializing perf session tracepoint handlers failed\n"); + goto out_delete; + } + + if (setup_output_field("contended,wait_total,wait_max,avg_wait")) + goto out_delete; + + sort_key =3D "wait_total"; + if (select_key()) + goto out_delete; + + aggr_mode =3D LOCK_AGGR_CALLER; + + err =3D perf_session__process_events(session); + if (err) + goto out_delete; + + setup_pager(); + + sort_contention_result(); + print_contention_result(); + +out_delete: + perf_session__delete(session); + return err; +} + + static int __cmd_record(int argc, const char **argv) { const char *record_args[] =3D { @@ -1626,12 +1816,17 @@ int cmd_lock(int argc, const char **argv) OPT_PARENT(lock_options) }; =20 + const struct option contention_options[] =3D { + OPT_PARENT(lock_options) + }; + const char * const info_usage[] =3D { "perf lock info []", NULL }; const char *const lock_subcommands[] =3D { "record", "report", "script", - "info", NULL }; + "info", "contention", + "contention", NULL }; const char *lock_usage[] =3D { NULL, NULL @@ -1640,6 +1835,10 @@ int cmd_lock(int argc, const char **argv) "perf lock report []", NULL }; + const char * const contention_usage[] =3D { + "perf lock contention []", + NULL + }; unsigned int i; int rc =3D 0; =20 @@ -1675,6 +1874,17 @@ int cmd_lock(int argc, const char **argv) /* recycling report_lock_ops */ trace_handler =3D &report_lock_ops; rc =3D __cmd_report(true); + } else if (strlen(argv[0]) > 2 && strstarts("contention", argv[0])) { + trace_handler =3D &contention_lock_ops; + if (argc) { + argc =3D parse_options(argc, argv, contention_options, + contention_usage, 0); + if (argc) { + usage_with_options(contention_usage, + contention_options); + } + } + rc =3D __cmd_contention(); } else { usage_with_options(lock_usage, lock_options); } --=20 2.37.0.170.g444d1eabd0-goog From nobody Fri Apr 17 22:34:55 2026 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 346B3C433EF for ; Thu, 21 Jul 2022 04:37:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232039AbiGUEhY (ORCPT ); Thu, 21 Jul 2022 00:37:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34428 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231883AbiGUEhG (ORCPT ); Thu, 21 Jul 2022 00:37:06 -0400 Received: from mail-pg1-x52d.google.com (mail-pg1-x52d.google.com [IPv6:2607:f8b0:4864:20::52d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 6554478DDE; Wed, 20 Jul 2022 21:37:00 -0700 (PDT) Received: by mail-pg1-x52d.google.com with SMTP id 72so622643pge.0; Wed, 20 Jul 2022 21:37:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=n/4XRRED8YKZQ7Xs4jvt7+uAqyncKJn/fVF0nQfTeZA=; b=iurPgdZ0+GIB8Z4hJC5ehu/0sGF6lCm/sJ6Vkp6rndQT96J93gyjgDo/T/4fvyd97v C+gkfmyhqvUc+jW7+ny/rwEUcLcI43s6+0lkvEVJT+4mXjwmKHWOHVKk9+PiL1Ag1WhG wP/fd6P26En5A9T4NxgkgM5tD5zn4aL1AWEb/RaUdbTmFJXKIJQw2KwXGXqyb/IQjqKm ILrEXCM49Khl6S3jGdrUNSnZe4g/oLBBhXrzco5DAQ2rIUxIHYsGnBDxW/lNhXK4BzNo iBPN+DIGIqS6Vv3AhH5/vBNSoAflFdsCpCvFNtozXLa88VCT2d+24FgqoLfrZtOWnW+4 FIfA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=n/4XRRED8YKZQ7Xs4jvt7+uAqyncKJn/fVF0nQfTeZA=; b=jOok7DIWUlk7du89r83LkRq6JQAxmMCfeDvOibAoU25sQ59Yk3g9Ka3O4b8QBzUKSa r1BP9Tm3PAVvEa/pJSuxSEi9v8feUfNeFJTwYbjK4qAnJUU5+WzXs2BoxpOIu2At/di1 1kdsMyyq55AFylDrXHBjOwCHlGzQLmizMbnJ1aMF/+3TBpkM1F//fXnhIIZMliboE7CD TQMs9WBJbIVV+mqbGVvMjP5u6a7vsWkmmx/jowlE/K7+lT0QYvJqc4fL0qwjCmcolRN5 fuiQe1mJq4PBQcSh6b6iT7SYmAvBb83iBrsWMqCq3zOMY+VCs+zMlmfy4blkIt5NDAjA HlyA== X-Gm-Message-State: AJIora9+ox0WNiE4e2Jw/33Jl35jsAUe+cKnSZUTVWVF+V47AfpXbvNC JWmOBxNX/YePoAXBy4KngCY= X-Google-Smtp-Source: AGRyM1uB88GhGqYLgFUhRv95rNl4fIljsyNCwXIFX3fqjUjqtBAYTW0fkslhIBBJBZUDNgXv3j5udw== X-Received: by 2002:a63:1b22:0:b0:411:9b47:f6bf with SMTP id b34-20020a631b22000000b004119b47f6bfmr36293434pgb.200.1658378219450; Wed, 20 Jul 2022 21:36:59 -0700 (PDT) Received: from balhae.roam.corp.google.com ([2607:fb90:467:a1e4:c167:53fd:8047:7f62]) by smtp.gmail.com with ESMTPSA id x11-20020a170902a38b00b0016bea2a0a8dsm450824pla.91.2022.07.20.21.36.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Jul 2022 21:36:59 -0700 (PDT) Sender: Namhyung Kim From: Namhyung Kim To: Arnaldo Carvalho de Melo , Jiri Olsa Cc: Ingo Molnar , Peter Zijlstra , LKML , Ian Rogers , linux-perf-users@vger.kernel.org, Will Deacon , Waiman Long , Boqun Feng , Davidlohr Bueso Subject: [PATCH 5/6] perf lock: Add -k and -F options to 'contention' subcommand Date: Wed, 20 Jul 2022 21:36:43 -0700 Message-Id: <20220721043644.153718-6-namhyung@kernel.org> X-Mailer: git-send-email 2.37.0.170.g444d1eabd0-goog In-Reply-To: <20220721043644.153718-1-namhyung@kernel.org> References: <20220721043644.153718-1-namhyung@kernel.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" Like perf lock report, add -k/--key and -F/--field options to control output formatting and sorting. Note that it has slightly different default options as some fields are not available and to optimize the screen space. Signed-off-by: Namhyung Kim --- tools/perf/Documentation/perf-lock.txt | 15 ++++++++ tools/perf/builtin-lock.c | 51 ++++++++++++++++++++------ 2 files changed, 55 insertions(+), 11 deletions(-) diff --git a/tools/perf/Documentation/perf-lock.txt b/tools/perf/Documentat= ion/perf-lock.txt index da0bcbc676a3..ae78e04346bd 100644 --- a/tools/perf/Documentation/perf-lock.txt +++ b/tools/perf/Documentation/perf-lock.txt @@ -105,6 +105,21 @@ INFO OPTIONS --map:: dump map of lock instances (address:name table) =20 +CONTENTION OPTIONS +-------------- + +-k:: +--key=3D:: + Sorting key. Possible values: contended, wait_total (default), + wait_max, wait_min, avg_wait. + +-F:: +--field=3D:: + Output fields. By default it shows all but the wait_min fields + and users can customize that using this. Possible values: + contended, wait_total, wait_max, wait_min, avg_wait. + + SEE ALSO -------- linkperf:perf[1] diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c index 64f635273660..ad3b191db2e7 100644 --- a/tools/perf/builtin-lock.c +++ b/tools/perf/builtin-lock.c @@ -362,7 +362,7 @@ static const char *output_fields; =20 #define DEF_KEY_LOCK(name, header, fn_suffix, len) \ { #name, header, len, lock_stat_key_ ## fn_suffix, lock_stat_key_print_ #= # fn_suffix, {} } -struct lock_key keys[] =3D { +static struct lock_key report_keys[] =3D { DEF_KEY_LOCK(acquired, "acquired", nr_acquired, 10), DEF_KEY_LOCK(contended, "contended", nr_contended, 10), DEF_KEY_LOCK(avg_wait, "avg wait", avg_wait_time, 12), @@ -374,9 +374,24 @@ struct lock_key keys[] =3D { { } }; =20 -static int select_key(void) +static struct lock_key contention_keys[] =3D { + DEF_KEY_LOCK(contended, "contended", nr_contended, 10), + DEF_KEY_LOCK(wait_total, "total wait", wait_time_total, 12), + DEF_KEY_LOCK(wait_max, "max wait", wait_time_max, 12), + DEF_KEY_LOCK(wait_min, "min wait", wait_time_min, 12), + DEF_KEY_LOCK(avg_wait, "avg wait", avg_wait_time, 12), + + /* extra comparisons much complicated should be here */ + { } +}; + +static int select_key(bool contention) { int i; + struct lock_key *keys =3D report_keys; + + if (contention) + keys =3D contention_keys; =20 for (i =3D 0; keys[i].name; i++) { if (!strcmp(keys[i].name, sort_key)) { @@ -394,9 +409,13 @@ static int select_key(void) return -1; } =20 -static int add_output_field(struct list_head *head, char *name) +static int add_output_field(bool contention, char *name) { int i; + struct lock_key *keys =3D report_keys; + + if (contention) + keys =3D contention_keys; =20 for (i =3D 0; keys[i].name; i++) { if (strcmp(keys[i].name, name)) @@ -404,7 +423,7 @@ static int add_output_field(struct list_head *head, cha= r *name) =20 /* prevent double link */ if (list_empty(&keys[i].list)) - list_add_tail(&keys[i].list, head); + list_add_tail(&keys[i].list, &lock_keys); =20 return 0; } @@ -413,10 +432,14 @@ static int add_output_field(struct list_head *head, c= har *name) return -1; } =20 -static int setup_output_field(const char *str) +static int setup_output_field(bool contention, const char *str) { char *tok, *tmp, *orig; int i, ret =3D 0; + struct lock_key *keys =3D report_keys; + + if (contention) + keys =3D contention_keys; =20 /* no output field given: use all of them */ if (str =3D=3D NULL) { @@ -433,7 +456,7 @@ static int setup_output_field(const char *str) return -ENOMEM; =20 while ((tok =3D strsep(&tmp, ",")) !=3D NULL){ - ret =3D add_output_field(&lock_keys, tok); + ret =3D add_output_field(contention, tok); if (ret < 0) break; } @@ -1609,10 +1632,10 @@ static int __cmd_report(bool display_info) goto out_delete; } =20 - if (setup_output_field(output_fields)) + if (setup_output_field(false, output_fields)) goto out_delete; =20 - if (select_key()) + if (select_key(false)) goto out_delete; =20 if (show_thread_stats) @@ -1674,11 +1697,10 @@ static int __cmd_contention(void) goto out_delete; } =20 - if (setup_output_field("contended,wait_total,wait_max,avg_wait")) + if (setup_output_field(true, output_fields)) goto out_delete; =20 - sort_key =3D "wait_total"; - if (select_key()) + if (select_key(true)) goto out_delete; =20 aggr_mode =3D LOCK_AGGR_CALLER; @@ -1817,6 +1839,10 @@ int cmd_lock(int argc, const char **argv) }; =20 const struct option contention_options[] =3D { + OPT_STRING('k', "key", &sort_key, "wait_total", + "key for sorting (contended / wait_total / wait_max / wait_min / avg= _wait)"), + OPT_STRING('F', "field", &output_fields, "contended,wait_total,wait_max,a= vg_wait", + "output fields (contended / wait_total / wait_max / wait_min / avg_w= ait)"), OPT_PARENT(lock_options) }; =20 @@ -1876,6 +1902,9 @@ int cmd_lock(int argc, const char **argv) rc =3D __cmd_report(true); } else if (strlen(argv[0]) > 2 && strstarts("contention", argv[0])) { trace_handler =3D &contention_lock_ops; + sort_key =3D "wait_total"; + output_fields =3D "contended,wait_total,wait_max,avg_wait"; + if (argc) { argc =3D parse_options(argc, argv, contention_options, contention_usage, 0); --=20 2.37.0.170.g444d1eabd0-goog From nobody Fri Apr 17 22:34:55 2026 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 09CA5C433EF for ; Thu, 21 Jul 2022 04:37:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232052AbiGUEh2 (ORCPT ); Thu, 21 Jul 2022 00:37:28 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34498 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231911AbiGUEhH (ORCPT ); Thu, 21 Jul 2022 00:37:07 -0400 Received: from mail-pl1-x62b.google.com (mail-pl1-x62b.google.com [IPv6:2607:f8b0:4864:20::62b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A14EC796AF; Wed, 20 Jul 2022 21:37:02 -0700 (PDT) Received: by mail-pl1-x62b.google.com with SMTP id z3so740498plb.1; Wed, 20 Jul 2022 21:37:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Sg1vg+JchJzlA6ZZPjGXncq9USvySKwhhpNA+cUndxk=; b=DOzqzuMtBwoya2y0PW/nibHO9bnCrmyFQY3FjD5e3DMlCK3FKfhsynG/H9+zhcUWVR 1D/dIEPiLNyq3cK+cng5Glkae1fBWMJFcAJLSY4NOMonLidBiVCrzusCp4WUAQeriish TAttV0a3Tn0PfD1aScM76QNjGHL9VpB4s+KRnXiAo1AjeyG4JdGpR9PAMoGXqQ+9MYrB u10t+pNv1PUdZC8Iy/QmS9SXFQXupkjB4XVI/wCPt7VJ8uXtFiMDJ2u1gVFkYlBtap++ Vk/9+iyknzd6Op+r5/a9l0myPSXaMnNC7RjPtHW1MWvxMmNCTdFNKJ4StWHxzyHNAcPY wqJQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=Sg1vg+JchJzlA6ZZPjGXncq9USvySKwhhpNA+cUndxk=; b=J8WULAumMNLJs9Dg5/jSimFwVJ9Fq8bP0ig3sRyqbDqJY6owRsEIIHQXDkkAthQzhB hBX+9TUxErlddGud+2aXsKosWTnXzgDZMQWh3DAXwAwY377yMB3p/mEijRLllN2x2u4X var+ABKbn0vq2wnrHg183lnqDiaMGExtHKGIsDqTKGGv5QBW0HrpO+NUH6QEM43HeMGw E7FVyWpjgmw3qbIoPAT5P1ECcqaROXiUl1aNMhpKdr7GyHbCt3d9SVqVs7zvxTvRIi4T ZbFsXlljC/fGGNgSgHx7G5zBjYG+Suu0eEAqCm3WLTB11mkbC+q1FKbl680pNt7yXjeA FJrw== X-Gm-Message-State: AJIora+NrBowaSRpafXABjInuL1wuRy3Tjv9BCY4JlYvkfqi0KdC/g0J yB6Wwj35raiZOjQxhTbt/nE= X-Google-Smtp-Source: AGRyM1tiX/TGfsAlPbMoQ/XELk71Lsxxc/EhpuG/O62GTz4XhbHZSkEzuNb3tYX9FxcEGqVpzWmuSw== X-Received: by 2002:a17:90a:9315:b0:1f1:fea7:5899 with SMTP id p21-20020a17090a931500b001f1fea75899mr9088008pjo.123.1658378221383; Wed, 20 Jul 2022 21:37:01 -0700 (PDT) Received: from balhae.roam.corp.google.com ([2607:fb90:467:a1e4:c167:53fd:8047:7f62]) by smtp.gmail.com with ESMTPSA id x11-20020a170902a38b00b0016bea2a0a8dsm450824pla.91.2022.07.20.21.36.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Jul 2022 21:37:01 -0700 (PDT) Sender: Namhyung Kim From: Namhyung Kim To: Arnaldo Carvalho de Melo , Jiri Olsa Cc: Ingo Molnar , Peter Zijlstra , LKML , Ian Rogers , linux-perf-users@vger.kernel.org, Will Deacon , Waiman Long , Boqun Feng , Davidlohr Bueso Subject: [PATCH 6/6] perf lock: Support -t option for 'contention' subcommand Date: Wed, 20 Jul 2022 21:36:44 -0700 Message-Id: <20220721043644.153718-7-namhyung@kernel.org> X-Mailer: git-send-email 2.37.0.170.g444d1eabd0-goog In-Reply-To: <20220721043644.153718-1-namhyung@kernel.org> References: <20220721043644.153718-1-namhyung@kernel.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" Like perf lock report, it can report lock contention stat of each task. $ perf lock contention -t contended total wait max wait avg wait pid comm 5 945.20 us 902.08 us 189.04 us 316167 EventMan= ager_De 33 98.17 us 6.78 us 2.97 us 766063 kworker/= 0:1-get 7 92.47 us 61.26 us 13.21 us 316170 EventMan= ager_De 14 76.31 us 12.87 us 5.45 us 12949 timedcall 24 76.15 us 12.27 us 3.17 us 767992 sched-pi= pe 15 75.62 us 11.93 us 5.04 us 15127 switchto= -defaul 24 71.84 us 5.59 us 2.99 us 629168 kworker/= u513:2- 17 67.41 us 7.94 us 3.96 us 13504 coroner- 1 59.56 us 59.56 us 59.56 us 316165 EventMan= ager_De 14 56.21 us 6.89 us 4.01 us 0 swapper Signed-off-by: Namhyung Kim --- tools/perf/Documentation/perf-lock.txt | 4 ++++ tools/perf/builtin-lock.c | 22 ++++++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/tools/perf/Documentation/perf-lock.txt b/tools/perf/Documentat= ion/perf-lock.txt index ae78e04346bd..8f4e34f924d5 100644 --- a/tools/perf/Documentation/perf-lock.txt +++ b/tools/perf/Documentation/perf-lock.txt @@ -119,6 +119,10 @@ CONTENTION OPTIONS and users can customize that using this. Possible values: contended, wait_total, wait_max, wait_min, avg_wait. =20 +-t:: +--threads:: + Show per-thread lock contention stat + =20 SEE ALSO -------- diff --git a/tools/perf/builtin-lock.c b/tools/perf/builtin-lock.c index ad3b191db2e7..041801d8b6ac 100644 --- a/tools/perf/builtin-lock.c +++ b/tools/perf/builtin-lock.c @@ -1560,7 +1560,10 @@ static void print_contention_result(void) list_for_each_entry(key, &lock_keys, list) pr_info("%*s ", key->len, key->header); =20 - pr_info(" %10s %s\n\n", "type", "caller"); + if (show_thread_stats) + pr_info(" %10s %s\n\n", "pid", "comm"); + else + pr_info(" %10s %s\n\n", "type", "caller"); =20 bad =3D total =3D 0; while ((st =3D pop_from_result())) { @@ -1573,6 +1576,16 @@ static void print_contention_result(void) pr_info(" "); } =20 + if (show_thread_stats) { + struct thread *t; + int pid =3D st->addr; + + /* st->addr contains tid of thread */ + t =3D perf_session__findnew(session, pid); + pr_info(" %10d %s\n", pid, thread__comm_str(t)); + continue; + } + pr_info(" %10s %s\n", get_type_str(st), st->name); } =20 @@ -1703,7 +1716,10 @@ static int __cmd_contention(void) if (select_key(true)) goto out_delete; =20 - aggr_mode =3D LOCK_AGGR_CALLER; + if (show_thread_stats) + aggr_mode =3D LOCK_AGGR_TASK; + else + aggr_mode =3D LOCK_AGGR_CALLER; =20 err =3D perf_session__process_events(session); if (err) @@ -1843,6 +1859,8 @@ int cmd_lock(int argc, const char **argv) "key for sorting (contended / wait_total / wait_max / wait_min / avg= _wait)"), OPT_STRING('F', "field", &output_fields, "contended,wait_total,wait_max,a= vg_wait", "output fields (contended / wait_total / wait_max / wait_min / avg_w= ait)"), + OPT_BOOLEAN('t', "threads", &show_thread_stats, + "show per-thread lock stats"), OPT_PARENT(lock_options) }; =20 --=20 2.37.0.170.g444d1eabd0-goog