From nobody Tue Feb 10 23:01:32 2026 Received: from mail-yb1-f201.google.com (mail-yb1-f201.google.com [209.85.219.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0E7441947D for ; Tue, 23 Apr 2024 03:17:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713842262; cv=none; b=k9sz5QVoajXlvJKrQgMlOuse+gISwMBi5uJJF5SHJI4z1VEyBUL7dGI454G4ZMWg56fRjh2fDXnCB/fcSg96Jiu6dabKQXQVfytXoLhMYxNbBG/qsJJYZGPsv4cEVeL6/xVxt4lGKCcn9Lb1Rcn3p1e4fiPfRq1WUTLTe7g9dqM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713842262; c=relaxed/simple; bh=BSADm/2St2RzD/ArABRW7n8F/sOX5AJupKxZq1RwerQ=; h=Date:In-Reply-To:Message-Id:Mime-Version:References:Subject:From: To:Content-Type; b=UOyKIo/Y5EoJVUYIIG00JFtoiaixMwHj3MMbhDrfyGQs97/Y+vLBn8+zwl6M97KD/wnB+I2+VHrpvoS41YeR7dTk2030PB9BhhdJz4GlZXURxUeVTJuYrmgktX5ru6qVe1FdCsX4kw/wqmMvUTICSZ5zHaHkB844nXM0/IrGGX0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=ljCMgLmS; arc=none smtp.client-ip=209.85.219.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="ljCMgLmS" Received: by mail-yb1-f201.google.com with SMTP id 3f1490d57ef6-dc6b26783b4so7502716276.0 for ; Mon, 22 Apr 2024 20:17:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1713842260; x=1714447060; darn=vger.kernel.org; h=to:from:subject:references:mime-version:message-id:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=guh8O4YIfp8ysMStU/pCY+FOTLUwi/avvI0eH709Ct4=; b=ljCMgLmSKJWJ3oiuM/Ovfz+TKBKLYxXMST8ri1svbmCwhAfFFvh672zbEfbl0Vuklc Jv90OsYiOQAsO0vQ2Aq0M3PIzfKyzwuK85j9dsvZzQPmTXqpCIqSvJOHNq+SxGSO00Ed zIJUC4exy/gjgO/4R7d/mDVtlYtg5L7F80jIBHg1s3i8b8CaOk31XLBfkj+PIfpPRZdL qP/zQFME4Q16wgz5YWWJmWvgjuGRpISIOKJ6dmdl2HZ53uJApSrgYiQ4aB8ZYZS9ZhbW BXgMEe0tJDmYmvFLgTcwVThdMtDS1gv8nJ8DdGIcfz6Y0uaNzk4ce43sb90Y7Feb7dYu ufBA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713842260; x=1714447060; h=to:from:subject:references:mime-version:message-id:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=guh8O4YIfp8ysMStU/pCY+FOTLUwi/avvI0eH709Ct4=; b=Vyn+b4X/Akf2yBNaPDS+OEGbI1U4Ish9WErJeKbx1+H0Hl1Wv4b8OC+m8vApxg7zjT qz9j3gMTCuBFJbbFSxR6lq9uJbqw6HeTxz0OsweTYojNAJx8xKpFntBfwk4exHmrqT7u AnGSdx5+7N2lkRrFtLoMbitMWOIkWWAxT/r5ohH8baaClcJLi/DGXCfTwOGx8RGTVaYJ 2AYVoBwyxlk6Q2vMant93sJOElfXXMyfY0Kji3VoWvkQFJXfeWJfmQJWOJJkdII0MqJg UeDd1T5c4uDQk+t+IyQeD3vLVoGDYT+nSUmh+l/zSkjDfq79dRoCUzMghLbl5deDSlsr 1sJQ== X-Forwarded-Encrypted: i=1; AJvYcCUnDqUEAjGY7zW5qlJBuMPP/5rxXfBxkCKXtj8rCzGwFeZgyFOTLGP6561xsTjhDycb7MwE9a1dSnCNNsUqJh1hTmTDj7MYaUeQjQfb X-Gm-Message-State: AOJu0Yxx3vsq0QOyUpSMalWs0ZLjBfwrAeky4qtlrfSkuh5Y506bjg09 71YvykKUbdio0hkuD1BPce8L1kUl+Ck/A6+Ip0bBsPOgaALt1IibqpOLwBw68dyLl7ygrEYGC7F 1Q3bK7A== X-Google-Smtp-Source: AGHT+IHGKH5+IAFSPrKbSp7HCOUltahfcSA++mKCgkd0vEejKdeJCozwx75DouGBXip/RJvJe4uKwmLEJFd5 X-Received: from irogers.svl.corp.google.com ([2620:15c:2a3:200:4ca4:4d48:a7fe:d70c]) (user=irogers job=sendgmr) by 2002:a05:6902:c04:b0:de5:3003:4b64 with SMTP id fs4-20020a0569020c0400b00de530034b64mr386604ybb.1.1713842260251; Mon, 22 Apr 2024 20:17:40 -0700 (PDT) Date: Mon, 22 Apr 2024 20:17:14 -0700 In-Reply-To: <20240423031719.1941141-1-irogers@google.com> Message-Id: <20240423031719.1941141-2-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240423031719.1941141-1-irogers@google.com> X-Mailer: git-send-email 2.44.0.769.g3c40516874-goog Subject: [PATCH v2 1/6] perf test pmu-events: Make it clearer that pmu-events tests json events From: Ian Rogers To: Kan Liang , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Jonathan Corbet , Bjorn Helgaas , Randy Dunlap , Jing Zhang , James Clark , Ravi Bangoria , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add json to the test name. Signed-off-by: Ian Rogers --- tools/perf/tests/pmu-events.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/perf/tests/pmu-events.c b/tools/perf/tests/pmu-events.c index 47a7c3277540..7b2c34462fcb 100644 --- a/tools/perf/tests/pmu-events.c +++ b/tools/perf/tests/pmu-events.c @@ -1105,6 +1105,6 @@ static struct test_case pmu_events_tests[] =3D { }; =20 struct test_suite suite__pmu_events =3D { - .desc =3D "PMU events", + .desc =3D "PMU json event tests", .test_cases =3D pmu_events_tests, }; --=20 2.44.0.769.g3c40516874-goog From nobody Tue Feb 10 23:01:32 2026 Received: from mail-yw1-f202.google.com (mail-yw1-f202.google.com [209.85.128.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 817251C6A4 for ; Tue, 23 Apr 2024 03:17:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713842264; cv=none; b=VkPZJbPEbQgKisiMNEVCt/Kas0ShL8D88DBMNbsVdtenZEsD/uskBnAyw+LqzKO7xI9EIw61g/tbM342TchIqd+mJbf1Ap9WSRftc4DF/uevZJVgZnwSmyyOGAN2hJpqER+O/P2k3vZMafF3JllgmX3RXBwka7gK0HLx7igjxHE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713842264; c=relaxed/simple; bh=lH5HflBC8pWb+z+Kv7k5EJDzEizYIwE8s7tE/0qlMFw=; h=Date:In-Reply-To:Message-Id:Mime-Version:References:Subject:From: To:Content-Type; b=PpmIG8EGhb/t+K5bPGeKF4o9NpF4ucTm0GMuNNrCCzrCXBZ0/qnqJYwXErj1E50EBuknXgHF6mkWmx5Es3KQX/HdljPQrVBkqT3FwRnNejfi7WKLvC1j7f85QEXEOg08ca7jGNFu8EaoFNcD7jXpPI5eMgmdKb8c67ecGymHPME= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=nf7CR8Xo; arc=none smtp.client-ip=209.85.128.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="nf7CR8Xo" Received: by mail-yw1-f202.google.com with SMTP id 00721157ae682-61b2ef746c9so91038417b3.1 for ; Mon, 22 Apr 2024 20:17:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1713842262; x=1714447062; darn=vger.kernel.org; h=to:from:subject:references:mime-version:message-id:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=/nhUNWHd/vBo68/OMf2V7DkzBC0fWIc9SzssVfvUJw4=; b=nf7CR8XopxMclIE2aAo6VLB6BIWihGvzw/uabd4cnJ7bJsjSsmAuYNBRXjnJaEu0GJ KikY/t1NVSjoh9dVKst1rfHeoL0esicXCFf9VUUG+T/w0HTQsJIKupDyVa0GRlEllNWB Bj8zGGZImj0zf3j86m33gOeiYSwtMDDvQ+LsRERafwbyhKKNGNNaKGr/uYJ8ssGjzD0s bWCdCkLPNf536T3W1qSzodKq5SVzLeuIhln8Z25v8lfV3sYkZ/9wxe0P6ha7lR4WO1FC dnDiLKFdCQHDUJCPpqnP63dY3q5dEWG+y/4g1hM2SxIrTyi6+jiUGph5e8uJGdboSguE rDHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713842262; x=1714447062; h=to:from:subject:references:mime-version:message-id:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=/nhUNWHd/vBo68/OMf2V7DkzBC0fWIc9SzssVfvUJw4=; b=WUmv/I4YTIP0+7cFgJ3iGJpIDsJ0aTpfXG/4qNw1j3fLxutfbymfYHtXjOnglc+NGj Fct791v8TR1DpAnLM3YIyUJnAN9UNQdF3Aq5TuULEid8MhCXapwpgJMqX7ZzgG7bdHSH 3RTlTJvsOuj0yrH5lIzMiTUUe77oLutorZaN3d4d7NpKkVkY178geUl4e8RhiycPGVnr KCfrBRwdSH2LU5uGzUKCsphct0LKKd0s5Xwms1xrX42WzRo/j8gtjA8/F5Nejri3TRsO 0j6Yq4dIycriTV2jTE9H00RxQ06gDeGSvFE3ol3iVTo5MTZZ28YVam2Y+zIbKGtAH0L1 Cj/Q== X-Forwarded-Encrypted: i=1; AJvYcCXBhggZ2PftAiGDY5p1+VOIxVLxNwsIR1RQu3TF7wtIqeEIfA9VamaKbjvL35wGgwjde7LhEPhg9xZ4XcysH8wZDvuU2Jc9UTbFraK5 X-Gm-Message-State: AOJu0YymNKQzcLueO/Ar2boLm3zs43rKVXCjS8KxuGK1WLGiqOrbKgxT tJsJvrZTrGiiVowxTymPvL6dU3lhCC/a/NWlX/yLN1yYIBAJx+q3crL2lTSOz4pNHUSrhNM3nAr dRrTbMw== X-Google-Smtp-Source: AGHT+IHUb9CQO39gnMLndOg3/rTLB5xw24Gc5Hm+GfTLcEC7+RhHCe/Ji6Zw2FEV8Tag+UZIqiAVx4Y0hZQe X-Received: from irogers.svl.corp.google.com ([2620:15c:2a3:200:4ca4:4d48:a7fe:d70c]) (user=irogers job=sendgmr) by 2002:a0d:d48a:0:b0:618:931c:9a14 with SMTP id w132-20020a0dd48a000000b00618931c9a14mr2819322ywd.4.1713842262540; Mon, 22 Apr 2024 20:17:42 -0700 (PDT) Date: Mon, 22 Apr 2024 20:17:15 -0700 In-Reply-To: <20240423031719.1941141-1-irogers@google.com> Message-Id: <20240423031719.1941141-3-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240423031719.1941141-1-irogers@google.com> X-Mailer: git-send-email 2.44.0.769.g3c40516874-goog Subject: [PATCH v2 2/6] perf Document: Capture that sysfs event names must be lower case From: Ian Rogers To: Kan Liang , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Jonathan Corbet , Bjorn Helgaas , Randy Dunlap , Jing Zhang , James Clark , Ravi Bangoria , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" To avoid directory scans in perf it is going to be assumed that sysfs event names are lower case. Signed-off-by: Ian Rogers --- .../ABI/testing/sysfs-bus-event_source-devices-events | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Documentation/ABI/testing/sysfs-bus-event_source-devices-event= s b/Documentation/ABI/testing/sysfs-bus-event_source-devices-events index 77de58d03822..3e0100e9c664 100644 --- a/Documentation/ABI/testing/sysfs-bus-event_source-devices-events +++ b/Documentation/ABI/testing/sysfs-bus-event_source-devices-events @@ -37,6 +37,12 @@ Description: Per-pmu performance monitoring events speci= fic to the running syste performance monitoring event supported by the . The name of the file is the name of the event. =20 + As performance monitoring event names are case + insensitive in the perf tool, the perf tool only looks + for lower case event names in sysfs to avoid scanning + the directory. It is therefore required the name of + the event here is lower case. + File contents: =20 [=3D][,[=3D]]... --=20 2.44.0.769.g3c40516874-goog From nobody Tue Feb 10 23:01:32 2026 Received: from mail-yw1-f202.google.com (mail-yw1-f202.google.com [209.85.128.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C89EB1CFA8 for ; Tue, 23 Apr 2024 03:17:45 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713842268; cv=none; b=fwkv575HGwkpJXNJq1ogYOJNnaDChX2kq+uNfynKNIF2rZ+gxrf7ke5t9D7xJeS57F/ZWrSXDc85Rgvjd9rbTPOdQ1gAKKKwYcsImr/wt6H+oIpOsgfgr8161Vfg8ebXZS0t8A0rJwn6aBusqZpqo+Hx/zqixddO9oko5DXx71Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713842268; c=relaxed/simple; bh=bMQOrIGPcgWIQ4evMiZlMvR0yin+sElR5hdt+gDf+ww=; h=Date:In-Reply-To:Message-Id:Mime-Version:References:Subject:From: To:Content-Type; b=YIqh2Uo06plMleLwDToTykOrV5nPK26S9iF0d0qaZfRLVzYGowmv0PLJvAT1uCx/Kbv0sWUiUCGD6VKy/n3Jx1JvBF+vvsOgR4HL8KQq3XnFl2mR98wPqp+fVQNkxnmA7ryuBP7LzFzjj51ulRt6k/Wl7C2T4URQMOSIHKwYJ68= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=gV5jcHdR; arc=none smtp.client-ip=209.85.128.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="gV5jcHdR" Received: by mail-yw1-f202.google.com with SMTP id 00721157ae682-61b7a24b843so2709087b3.1 for ; Mon, 22 Apr 2024 20:17:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1713842265; x=1714447065; darn=vger.kernel.org; h=to:from:subject:references:mime-version:message-id:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=9y1r+gD4Oe/iYQYEI9apmB+nGEa92EkEtckssrKbNa8=; b=gV5jcHdRnJ/W0gRxXYYsn9mq56+a96tzwpQ1a2QkQCMapAYPYghIocm6GADEcCw57l AhPaF/RavFIhnpsDRZnZElTC3yNskYutohuTC/PdSK24CXJ3boQb3tfsW9Jm9CQe77ht n0hfCE2Sp8QCE/EIkFdeIE5DuyJ0+2yidJs4IKpO743tpR+BJUArUgPu3anIwV2mHhRI RpPPA3ItfOKFJ7ZwIa0K3V3fdYMFpQGABcmD6g4kprga+JmjmqTeg/3Y5tt1GhVYwNfO tltHKmtsvvxCAz4s+kIr4OgsLDgcA5J7u9Er6aLrLZE13w2j+7YFcmgy8LsdqR8IEieU iU/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713842265; x=1714447065; h=to:from:subject:references:mime-version:message-id:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=9y1r+gD4Oe/iYQYEI9apmB+nGEa92EkEtckssrKbNa8=; b=pIWjdkHkjISGyEnizyKf8Drk3ZJbvrdv9Ha8OXPRuExR+Tq1yLcUP+N6YTTEMpzWjR YHydUjewmwVUYmFPk8cBzipnDUqcFFQILc6Rw59pCKyjATDlqoBxFX5ZFG1FUWu4LkYa /7U25vpkSNXqp8v+U5sO+hSof0lsk9bq+U0rLPbUNl2OrlXWr9j3uPDqPnpaFK2q3BDC lTSAQEVMIPJyfxJ8FhmOfwd4rWIh5lI75bRuginMWQU/lyNzbIDi0qNUy47tv1DTxFr0 IvVGnDPZvqwPS1RCizFg9VMa53CgrTtTb83+d544C4TCeiYnMWP+XZmR9yUKlaJJsbck kHhA== X-Forwarded-Encrypted: i=1; AJvYcCUau+mLSbsCjSzAGrscn3IZD7+K7OAfKsglyvW1oOtJxw2kyJlgH/wcqdgVQqhF8fjiss96pwlWg763GhOkb8eIL1cKsYYsSrGoq+YX X-Gm-Message-State: AOJu0Yyg5/ogWT4Xsdke1ZK9yGMQrXGj8hHxiuQSUufLi/fdJG4g8dsW UlfVRlwEhz8iEtQGnfzIMhndOUnvEo3OlNEqea6JnFTP4WP8ddXZeGJ8SpCBGFQVc2FwV9rH42G pL5Qegg== X-Google-Smtp-Source: AGHT+IFGTZ3TkqNiefF+BdIRXnlR0Upt33SB1y8bfcEBRWfLKJ7Mgbkko9JvffnbJNQnI/Ftf7bJwPyqP4iX X-Received: from irogers.svl.corp.google.com ([2620:15c:2a3:200:4ca4:4d48:a7fe:d70c]) (user=irogers job=sendgmr) by 2002:a81:9e4b:0:b0:618:91c3:c8e2 with SMTP id n11-20020a819e4b000000b0061891c3c8e2mr2611894ywj.1.1713842264908; Mon, 22 Apr 2024 20:17:44 -0700 (PDT) Date: Mon, 22 Apr 2024 20:17:16 -0700 In-Reply-To: <20240423031719.1941141-1-irogers@google.com> Message-Id: <20240423031719.1941141-4-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240423031719.1941141-1-irogers@google.com> X-Mailer: git-send-email 2.44.0.769.g3c40516874-goog Subject: [PATCH v2 3/6] perf test pmu: Refactor format test and exposed test APIs From: Ian Rogers To: Kan Liang , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Jonathan Corbet , Bjorn Helgaas , Randy Dunlap , Jing Zhang , James Clark , Ravi Bangoria , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" In tests/pmu.c, make a common utility that creates a PMU in mkdtemp directory and uses regular PMU parsing logic to load that PMU. Formats must still be eagerly loaded as by default the PMU code assumes devices are going to be in sysfs. In util/pmu.[ch], hide perf_pmu__format_parse but add the eager argument to perf_pmu__lookup called by perf_pmus__add_test_pmu. Later patches will eagerly load other non-sysfs files when eager loading is enabled. In tests/pmu.c, rather than manually constructing a list of term arguments, just use the term parsing code from a string. Add more comments and debug logging. Signed-off-by: Ian Rogers --- tools/perf/tests/pmu.c | 313 +++++++++++++++------------------ tools/perf/util/parse-events.c | 2 +- tools/perf/util/parse-events.h | 2 +- tools/perf/util/pmu.c | 11 +- tools/perf/util/pmu.h | 4 +- tools/perf/util/pmus.c | 16 +- tools/perf/util/pmus.h | 2 + 7 files changed, 171 insertions(+), 179 deletions(-) diff --git a/tools/perf/tests/pmu.c b/tools/perf/tests/pmu.c index 8f18127d876a..6b2d9adcc583 100644 --- a/tools/perf/tests/pmu.c +++ b/tools/perf/tests/pmu.c @@ -2,203 +2,180 @@ #include "parse-events.h" #include "pmu.h" #include "tests.h" +#include "debug.h" #include #include #include -#include -#include -#include - -/* Simulated format definitions. */ -static struct test_format { - const char *name; - const char *value; -} test_formats[] =3D { - { "krava01", "config:0-1,62-63\n", }, - { "krava02", "config:10-17\n", }, - { "krava03", "config:5\n", }, - { "krava11", "config1:0,2,4,6,8,20-28\n", }, - { "krava12", "config1:63\n", }, - { "krava13", "config1:45-47\n", }, - { "krava21", "config2:0-3,10-13,20-23,30-33,40-43,50-53,60-63\n", }, - { "krava22", "config2:8,18,48,58\n", }, - { "krava23", "config2:28-29,38\n", }, -}; +#include +#include +#include =20 -/* Simulated users input. */ -static struct parse_events_term test_terms[] =3D { - { - .config =3D "krava01", - .val.num =3D 15, - .type_val =3D PARSE_EVENTS__TERM_TYPE_NUM, - .type_term =3D PARSE_EVENTS__TERM_TYPE_USER, - }, - { - .config =3D "krava02", - .val.num =3D 170, - .type_val =3D PARSE_EVENTS__TERM_TYPE_NUM, - .type_term =3D PARSE_EVENTS__TERM_TYPE_USER, - }, - { - .config =3D "krava03", - .val.num =3D 1, - .type_val =3D PARSE_EVENTS__TERM_TYPE_NUM, - .type_term =3D PARSE_EVENTS__TERM_TYPE_USER, - }, - { - .config =3D "krava11", - .val.num =3D 27, - .type_val =3D PARSE_EVENTS__TERM_TYPE_NUM, - .type_term =3D PARSE_EVENTS__TERM_TYPE_USER, - }, - { - .config =3D "krava12", - .val.num =3D 1, - .type_val =3D PARSE_EVENTS__TERM_TYPE_NUM, - .type_term =3D PARSE_EVENTS__TERM_TYPE_USER, - }, - { - .config =3D "krava13", - .val.num =3D 2, - .type_val =3D PARSE_EVENTS__TERM_TYPE_NUM, - .type_term =3D PARSE_EVENTS__TERM_TYPE_USER, - }, - { - .config =3D "krava21", - .val.num =3D 119, - .type_val =3D PARSE_EVENTS__TERM_TYPE_NUM, - .type_term =3D PARSE_EVENTS__TERM_TYPE_USER, - }, - { - .config =3D "krava22", - .val.num =3D 11, - .type_val =3D PARSE_EVENTS__TERM_TYPE_NUM, - .type_term =3D PARSE_EVENTS__TERM_TYPE_USER, - }, - { - .config =3D "krava23", - .val.num =3D 2, - .type_val =3D PARSE_EVENTS__TERM_TYPE_NUM, - .type_term =3D PARSE_EVENTS__TERM_TYPE_USER, - }, -}; +/* Fake PMUs created in temp directory. */ +static LIST_HEAD(test_pmus); =20 -/* - * Prepare format directory data, exported by kernel - * at /sys/bus/event_source/devices//format. - */ -static char *test_format_dir_get(char *dir, size_t sz) -{ - unsigned int i; - - snprintf(dir, sz, "/tmp/perf-pmu-test-format-XXXXXX"); - if (!mkdtemp(dir)) - return NULL; - - for (i =3D 0; i < ARRAY_SIZE(test_formats); i++) { - char name[PATH_MAX]; - struct test_format *format =3D &test_formats[i]; - FILE *file; - - scnprintf(name, PATH_MAX, "%s/%s", dir, format->name); - - file =3D fopen(name, "w"); - if (!file) - return NULL; - - if (1 !=3D fwrite(format->value, strlen(format->value), 1, file)) - break; - - fclose(file); - } - - return dir; -} - -/* Cleanup format directory. */ -static int test_format_dir_put(char *dir) +/* Cleanup test PMU directory. */ +static int test_pmu_put(const char *dir, struct perf_pmu *pmu) { char buf[PATH_MAX + 20]; + int ret; =20 - snprintf(buf, sizeof(buf), "rm -f %s/*\n", dir); - if (system(buf)) - return -1; + if (scnprintf(buf, sizeof(buf), "rm -fr %s", dir) < 0) { + pr_err("Failure to set up buffer for \"%s\"\n", dir); + return -EINVAL; + } + ret =3D system(buf); + if (ret) + pr_err("Failure to \"%s\"\n", buf); =20 - snprintf(buf, sizeof(buf), "rmdir %s\n", dir); - return system(buf); + list_del(&pmu->list); + perf_pmu__delete(pmu); + return ret; } =20 -static void add_test_terms(struct parse_events_terms *terms) +/* + * Prepare test PMU directory data, normally exported by kernel at + * /sys/bus/event_source/devices//. Give as input a buffer to hold th= e file + * path, the result is PMU loaded using that directory. + */ +static struct perf_pmu *test_pmu_get(char *dir, size_t sz) { - unsigned int i; + /* Simulated format definitions. */ + const struct test_format { + const char *name; + const char *value; + } test_formats[] =3D { + { "krava01", "config:0-1,62-63\n", }, + { "krava02", "config:10-17\n", }, + { "krava03", "config:5\n", }, + { "krava11", "config1:0,2,4,6,8,20-28\n", }, + { "krava12", "config1:63\n", }, + { "krava13", "config1:45-47\n", }, + { "krava21", "config2:0-3,10-13,20-23,30-33,40-43,50-53,60-63\n", }, + { "krava22", "config2:8,18,48,58\n", }, + { "krava23", "config2:28-29,38\n", }, + }; + char name[PATH_MAX]; + int dirfd, file; + struct perf_pmu *pmu =3D NULL; + + /* Create equivalent of sysfs mount point. */ + scnprintf(dir, sz, "/tmp/perf-pmu-test-XXXXXX"); + if (!mkdtemp(dir)) { + pr_err("mkdtemp failed\n"); + dir[0] =3D '\0'; + return NULL; + } + dirfd =3D open(dir, O_DIRECTORY); + if (dirfd < 0) { + pr_err("Failed to open test directory \"%s\"\n", dir); + goto err_out; + } =20 - for (i =3D 0; i < ARRAY_SIZE(test_terms); i++) { - struct parse_events_term *clone; + /* Create the test PMU directory and give it a perf_event_attr type numbe= r. */ + if (mkdirat(dirfd, "perf-pmu-test", 0755) < 0) { + pr_err("Failed to mkdir PMU directory\n"); + goto err_out; + } + file =3D openat(dirfd, "perf-pmu-test/type", O_WRONLY | O_CREAT, 0600); + if (!file) { + pr_err("Failed to open for writing file \"type\"\n"); + goto err_out; + } + write(file, "9999\n", 5); + close(file); =20 - parse_events_term__clone(&clone, &test_terms[i]); - list_add_tail(&clone->list, &terms->terms); + /* Create format directory and files. */ + if (mkdirat(dirfd, "perf-pmu-test/format", 0755) < 0) { + pr_err("Failed to mkdir PMU format directory\n)"); + goto err_out; } + for (size_t i =3D 0; i < ARRAY_SIZE(test_formats); i++) { + const struct test_format *format =3D &test_formats[i]; + + if (scnprintf(name, PATH_MAX, "perf-pmu-test/format/%s", format->name) <= 0) { + pr_err("Failure to set up path for \"%s\"\n", format->name); + goto err_out; + } + file =3D openat(dirfd, name, O_WRONLY | O_CREAT, 0600); + if (!file) { + pr_err("Failed to open for writing file \"%s\"\n", name); + goto err_out; + } + + if (write(file, format->value, strlen(format->value)) < 0) { + pr_err("Failed to write to file \"%s\"\n", name); + close(file); + goto err_out; + } + close(file); + } + + /* Make the PMU reading the files created above. */ + pmu =3D perf_pmus__add_test_pmu(dirfd, "perf-pmu-test"); + if (!pmu) + pr_err("Test PMU creation failed\n"); + +err_out: + if (!pmu) + test_pmu_put(dir, pmu); + if (dirfd >=3D 0) + close(dirfd); + return pmu; } =20 -static int test__pmu(struct test_suite *test __maybe_unused, int subtest _= _maybe_unused) +static int test__pmu_format(struct test_suite *test __maybe_unused, int su= btest __maybe_unused) { char dir[PATH_MAX]; - char *format; - struct parse_events_terms terms; struct perf_event_attr attr; - struct perf_pmu *pmu; - int fd; - int ret; + struct parse_events_terms terms; + int ret =3D TEST_FAIL; + struct perf_pmu *pmu =3D test_pmu_get(dir, sizeof(dir)); =20 - parse_events_terms__init(&terms); - add_test_terms(&terms); - pmu =3D zalloc(sizeof(*pmu)); - if (!pmu) { - parse_events_terms__exit(&terms); - return -ENOMEM; - } + if (!pmu) + return TEST_FAIL; =20 - INIT_LIST_HEAD(&pmu->format); - INIT_LIST_HEAD(&pmu->aliases); - INIT_LIST_HEAD(&pmu->caps); - format =3D test_format_dir_get(dir, sizeof(dir)); - if (!format) { - free(pmu); - parse_events_terms__exit(&terms); - return -EINVAL; + parse_events_terms__init(&terms); + if (parse_events_terms(&terms, + "krava01=3D15,krava02=3D170,krava03=3D1,krava11=3D27,krava12=3D1," + "krava13=3D2,krava21=3D119,krava22=3D11,krava23=3D2", + NULL)) { + pr_err("Term parsing failed\n"); + goto err_out; } =20 memset(&attr, 0, sizeof(attr)); - - fd =3D open(format, O_DIRECTORY); - if (fd < 0) { - ret =3D fd; - goto out; + ret =3D perf_pmu__config_terms(pmu, &attr, &terms, /*zero=3D*/false, /*er= r=3D*/NULL); + if (ret) { + pr_err("perf_pmu__config_terms failed"); + goto err_out; } =20 - pmu->name =3D strdup("perf-pmu-test"); - ret =3D perf_pmu__format_parse(pmu, fd, /*eager_load=3D*/true); - if (ret) - goto out; + if (attr.config !=3D 0xc00000000002a823) { + pr_err("Unexpected config value %llx\n", attr.config); + goto err_out; + } + if (attr.config1 !=3D 0x8000400000000145) { + pr_err("Unexpected config1 value %llx\n", attr.config1); + goto err_out; + } + if (attr.config2 !=3D 0x0400000020041d07) { + pr_err("Unexpected config2 value %llx\n", attr.config2); + goto err_out; + } =20 - ret =3D perf_pmu__config_terms(pmu, &attr, &terms, /*zero=3D*/false, /*er= r=3D*/NULL); - if (ret) - goto out; - - ret =3D -EINVAL; - if (attr.config !=3D 0xc00000000002a823) - goto out; - if (attr.config1 !=3D 0x8000400000000145) - goto out; - if (attr.config2 !=3D 0x0400000020041d07) - goto out; - - ret =3D 0; -out: - test_format_dir_put(format); - perf_pmu__delete(pmu); + ret =3D TEST_OK; +err_out: parse_events_terms__exit(&terms); + test_pmu_put(dir, pmu); return ret; } =20 -DEFINE_SUITE("Parse perf pmu format", pmu); +static struct test_case tests__pmu[] =3D { + TEST_CASE("Parsing with PMU format directory", pmu_format), + { .name =3D NULL, } +}; + +struct test_suite suite__pmu =3D { + .desc =3D "Sysfs PMU tests", + .test_cases =3D tests__pmu, +}; diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 6f8b0fa17689..2683a6158cec 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -2576,7 +2576,7 @@ int parse_events_term__term(struct parse_events_term = **term, } =20 int parse_events_term__clone(struct parse_events_term **new, - struct parse_events_term *term) + const struct parse_events_term *term) { char *str; struct parse_events_term temp =3D *term; diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h index 809359e8544e..5f7a0c45e28a 100644 --- a/tools/perf/util/parse-events.h +++ b/tools/perf/util/parse-events.h @@ -178,7 +178,7 @@ int parse_events_term__term(struct parse_events_term **= term, enum parse_events__term_type term_rhs, void *loc_term, void *loc_val); int parse_events_term__clone(struct parse_events_term **new, - struct parse_events_term *term); + const struct parse_events_term *term); void parse_events_term__delete(struct parse_events_term *term); =20 void parse_events_terms__delete(struct parse_events_terms *terms); diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index ab30f22eaf10..b86ce9535088 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -182,7 +182,7 @@ static void perf_pmu_format__load(const struct perf_pmu= *pmu, struct perf_pmu_fo * Parse & process all the sysfs attributes located under * the directory specified in 'dir' parameter. */ -int perf_pmu__format_parse(struct perf_pmu *pmu, int dirfd, bool eager_loa= d) +static int perf_pmu__format_parse(struct perf_pmu *pmu, int dirfd, bool ea= ger_load) { struct dirent *evt_ent; DIR *format_dir; @@ -232,7 +232,7 @@ int perf_pmu__format_parse(struct perf_pmu *pmu, int di= rfd, bool eager_load) * located at: * /sys/bus/event_source/devices//format as sysfs group attributes. */ -static int pmu_format(struct perf_pmu *pmu, int dirfd, const char *name) +static int pmu_format(struct perf_pmu *pmu, int dirfd, const char *name, b= ool eager_load) { int fd; =20 @@ -241,7 +241,7 @@ static int pmu_format(struct perf_pmu *pmu, int dirfd, = const char *name) return 0; =20 /* it'll close the fd */ - if (perf_pmu__format_parse(pmu, fd, /*eager_load=3D*/false)) + if (perf_pmu__format_parse(pmu, fd, eager_load)) return -1; =20 return 0; @@ -994,7 +994,8 @@ perf_pmu__arch_init(struct perf_pmu *pmu) pmu->mem_events =3D perf_mem_events; } =20 -struct perf_pmu *perf_pmu__lookup(struct list_head *pmus, int dirfd, const= char *name) +struct perf_pmu *perf_pmu__lookup(struct list_head *pmus, int dirfd, const= char *name, + bool eager_load) { struct perf_pmu *pmu; __u32 type; @@ -1023,7 +1024,7 @@ struct perf_pmu *perf_pmu__lookup(struct list_head *p= mus, int dirfd, const char * type value and format definitions. Load both right * now. */ - if (pmu_format(pmu, dirfd, name)) + if (pmu_format(pmu, dirfd, name, eager_load)) goto err; =20 pmu->is_core =3D is_pmu_core(name); diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h index 152700f78455..a4e5243c3c74 100644 --- a/tools/perf/util/pmu.h +++ b/tools/perf/util/pmu.h @@ -214,7 +214,6 @@ int perf_pmu__check_alias(struct perf_pmu *pmu, struct = parse_events_terms *head_ struct parse_events_error *err); int perf_pmu__find_event(struct perf_pmu *pmu, const char *event, void *st= ate, pmu_event_callback cb); =20 -int perf_pmu__format_parse(struct perf_pmu *pmu, int dirfd, bool eager_loa= d); void perf_pmu_format__set_value(void *format, int config, unsigned long *b= its); bool perf_pmu__has_format(const struct perf_pmu *pmu, const char *name); int perf_pmu__for_each_format(struct perf_pmu *pmu, void *state, pmu_forma= t_callback cb); @@ -272,7 +271,8 @@ int perf_pmu__pathname_scnprintf(char *buf, size_t size, int perf_pmu__event_source_devices_fd(void); int perf_pmu__pathname_fd(int dirfd, const char *pmu_name, const char *fil= ename, int flags); =20 -struct perf_pmu *perf_pmu__lookup(struct list_head *pmus, int dirfd, const= char *lookup_name); +struct perf_pmu *perf_pmu__lookup(struct list_head *pmus, int dirfd, const= char *lookup_name, + bool eager_load); struct perf_pmu *perf_pmu__create_placeholder_core_pmu(struct list_head *c= ore_pmus); void perf_pmu__delete(struct perf_pmu *pmu); struct perf_pmu *perf_pmus__find_core_pmu(void); diff --git a/tools/perf/util/pmus.c b/tools/perf/util/pmus.c index 2fd369e45832..b9b4c5eb5002 100644 --- a/tools/perf/util/pmus.c +++ b/tools/perf/util/pmus.c @@ -124,7 +124,8 @@ struct perf_pmu *perf_pmus__find(const char *name) return NULL; =20 dirfd =3D perf_pmu__event_source_devices_fd(); - pmu =3D perf_pmu__lookup(core_pmu ? &core_pmus : &other_pmus, dirfd, name= ); + pmu =3D perf_pmu__lookup(core_pmu ? &core_pmus : &other_pmus, dirfd, name, + /*eager_load=3D*/false); close(dirfd); =20 if (!pmu) { @@ -159,7 +160,8 @@ static struct perf_pmu *perf_pmu__find2(int dirfd, cons= t char *name) if (core_pmu && read_sysfs_core_pmus) return NULL; =20 - return perf_pmu__lookup(core_pmu ? &core_pmus : &other_pmus, dirfd, name); + return perf_pmu__lookup(core_pmu ? &core_pmus : &other_pmus, dirfd, name, + /*eager_load=3D*/false); } =20 static int pmus_cmp(void *priv __maybe_unused, @@ -696,3 +698,13 @@ struct perf_pmu *perf_pmus__find_core_pmu(void) { return perf_pmus__scan_core(NULL); } + +struct perf_pmu *perf_pmus__add_test_pmu(int test_sysfs_dirfd, const char = *name) +{ + /* + * Some PMU functions read from the sysfs mount point, so care is + * needed, hence passing the eager_load flag to load things like the + * format files. + */ + return perf_pmu__lookup(&other_pmus, test_sysfs_dirfd, name, /*eager_load= =3D*/true); +} diff --git a/tools/perf/util/pmus.h b/tools/perf/util/pmus.h index eec599d8aebd..9d4ded80b8e9 100644 --- a/tools/perf/util/pmus.h +++ b/tools/perf/util/pmus.h @@ -24,4 +24,6 @@ int perf_pmus__num_core_pmus(void); bool perf_pmus__supports_extended_type(void); char *perf_pmus__default_pmu_name(void); =20 +struct perf_pmu *perf_pmus__add_test_pmu(int test_sysfs_dirfd, const char = *name); + #endif /* __PMUS_H */ --=20 2.44.0.769.g3c40516874-goog From nobody Tue Feb 10 23:01:32 2026 Received: from mail-yb1-f201.google.com (mail-yb1-f201.google.com [209.85.219.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 307EE1946B for ; Tue, 23 Apr 2024 03:17:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713842269; cv=none; b=kaY2z8tfgM9fZ7kGRDomIdgecCmk+5u+vBEME+oFavlcM4LLa9G1O0CzEKLV1NdyHTJjE5asWEf1ITHNg7p7V0TTNMERwbLLQFwdsjumR0nPcuIn0a3Wfcyg8E7Vf9h7tdtjUUnoQVFgxeEsd35Pd7DZQ1cM2c232175DqPkFyQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713842269; c=relaxed/simple; bh=8Ud9azO5PcSjSbHgyCUljRZLTNFfHQSnFxy0D2ZmZBY=; h=Date:In-Reply-To:Message-Id:Mime-Version:References:Subject:From: To:Content-Type; b=sjHkdl1Z7A/zpyJJ6Q95K+DB0byINnLiQLboYLphqjAGqB2QMrADXTl312mNPWDvUbL9AziZl6VfHkOGhMItks+cmw8bsBvgMJK+OKTRBbQyC3nZl1DeSF1Vx2ENsJ+w8dFMsZFJeQj5mQ6t/WWpdAnBJBIsV58qlqfZtbjtbxE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=PFO+hdSq; arc=none smtp.client-ip=209.85.219.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="PFO+hdSq" Received: by mail-yb1-f201.google.com with SMTP id 3f1490d57ef6-de465062289so11627151276.2 for ; Mon, 22 Apr 2024 20:17:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1713842267; x=1714447067; darn=vger.kernel.org; h=to:from:subject:references:mime-version:message-id:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=ZZQIYLC3Jp4B8zg6R/mTCkQTco968W585hjb/CFclqU=; b=PFO+hdSqlIsF6ty84t09pjptlnyTX0DmzAwShAb1KcL0sB6+SdFLA2jAgkUrZAlVDX ou09y/9EpGSq1LQEgVnD0JA4pYVDzvu8qDPewj0oFfMbh9pK4HZfa4im830AEWUUju// slScyaFrk7xNMRaboWE7fyrqy1FvdBNjzy6RuxrQQNBCY6pZXlxVsQlrRd/St9PU67Lm mG0hZE+VYhMiz1OLC5g2wDncPRR2RtJs1hRmmCb7b7zVwup85/O6nE6+OarWGVFpqn03 O4JNtiGZcPJ4pAW2tvGKJAxgT7t8/YSqJVCGwKykikRrF1ELLGJtfCmLgUwTS4zh4drz CD6w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713842267; x=1714447067; h=to:from:subject:references:mime-version:message-id:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=ZZQIYLC3Jp4B8zg6R/mTCkQTco968W585hjb/CFclqU=; b=PkWfdSIBqi3Qcjxpgy0KHNtGcr5yU1nQm7F/GWH7QLD5KsON9ju5Kt70xWy2e9lo+C WoxmTz8ASsliCYlFkFmczGmmkWljku9T6FUdUD0Zk3CJ/hnobgWDh7tPGDUAIGnbkwO+ 1mW42AfdX17GwcGHn9Pp10fZesJEUPpCxIUCxzhqCPUMneo6V9dXhDoHohX9U58YX9xs +wx2QLGnXPbo9K5abLiARLzNpLUUrSr7S29gvl9iAuKtYouzUZnGx4+UrLE4nTmbIjom e5vqjP5rI8vm3aqO3X6MlFdAQzqgFdfMH/0mCQ6Vhq8SaGCaCQNC4URxXYmhe3H/lCCU XPWw== X-Forwarded-Encrypted: i=1; AJvYcCUael/mKg+7ip0q9s5Xl42dJHgINYS/D5NpRc+wpbdykwHIDjd8o3uL9jvJM3qR2DYr3ABeiCkkGGPlqsogo9p1UQ8Zw9+Zg+Jf10fE X-Gm-Message-State: AOJu0YxtXu45n049KguCRitrYigqiaNlkKuLevZ4gNGBR5Nw78w5HQsD rxrv1qevnBE5R2HzA1ZsmhmyCHKKah2UoYL86tbdVxlS/PqOojf322y7AExz/jmqbz4g1jmuDxq C42RCxQ== X-Google-Smtp-Source: AGHT+IH3lZGQUW6LT1S/BiMu7u8Ku/D/9AAj9hgQDSYHOpY7UakxkCM+1OpCzb0NJ61jmcjfNtPzBnUxKrWl X-Received: from irogers.svl.corp.google.com ([2620:15c:2a3:200:4ca4:4d48:a7fe:d70c]) (user=irogers job=sendgmr) by 2002:a05:6902:2b93:b0:dc6:dfc6:4207 with SMTP id fj19-20020a0569022b9300b00dc6dfc64207mr3696839ybb.10.1713842267277; Mon, 22 Apr 2024 20:17:47 -0700 (PDT) Date: Mon, 22 Apr 2024 20:17:17 -0700 In-Reply-To: <20240423031719.1941141-1-irogers@google.com> Message-Id: <20240423031719.1941141-5-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240423031719.1941141-1-irogers@google.com> X-Mailer: git-send-email 2.44.0.769.g3c40516874-goog Subject: [PATCH v2 4/6] perf test pmu: Add an eagerly loaded event test From: Ian Rogers To: Kan Liang , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Jonathan Corbet , Bjorn Helgaas , Randy Dunlap , Jing Zhang , James Clark , Ravi Bangoria , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Allow events/aliases to be eagerly loaded for a PMU. Factor out the pmu_aliases_parse to allow this. Parse a test event and check it configures the attribute as expected. There is overlap with the parse-events tests, but this test is done with a PMU created in a temp directory and doesn't rely on PMUs in sysfs. Signed-off-by: Ian Rogers --- tools/perf/tests/pmu.c | 72 ++++++++++++++++++++++++++++++++++++++++++ tools/perf/util/pmu.c | 69 ++++++++++++++++++++++++++++------------ 2 files changed, 120 insertions(+), 21 deletions(-) diff --git a/tools/perf/tests/pmu.c b/tools/perf/tests/pmu.c index 6b2d9adcc583..f4e9a39534cb 100644 --- a/tools/perf/tests/pmu.c +++ b/tools/perf/tests/pmu.c @@ -1,4 +1,6 @@ // SPDX-License-Identifier: GPL-2.0 +#include "evlist.h" +#include "evsel.h" #include "parse-events.h" #include "pmu.h" #include "tests.h" @@ -54,6 +56,9 @@ static struct perf_pmu *test_pmu_get(char *dir, size_t sz) { "krava22", "config2:8,18,48,58\n", }, { "krava23", "config2:28-29,38\n", }, }; + const char *test_event =3D "krava01=3D15,krava02=3D170,krava03=3D1,krava1= 1=3D27,krava12=3D1," + "krava13=3D2,krava21=3D119,krava22=3D11,krava23=3D2\n"; + char name[PATH_MAX]; int dirfd, file; struct perf_pmu *pmu =3D NULL; @@ -110,6 +115,19 @@ static struct perf_pmu *test_pmu_get(char *dir, size_t= sz) close(file); } =20 + /* Create test event. */ + if (mkdirat(dirfd, "perf-pmu-test/events", 0755) < 0) { + pr_err("Failed to mkdir PMU events directory\n"); + goto err_out; + } + file =3D openat(dirfd, "perf-pmu-test/events/test-event", O_WRONLY | O_CR= EAT, 0600); + if (!file) { + pr_err("Failed to open for writing file \"type\"\n"); + goto err_out; + } + write(file, test_event, strlen(test_event)); + close(file); + /* Make the PMU reading the files created above. */ pmu =3D perf_pmus__add_test_pmu(dirfd, "perf-pmu-test"); if (!pmu) @@ -170,8 +188,62 @@ static int test__pmu_format(struct test_suite *test __= maybe_unused, int subtest return ret; } =20 +static int test__pmu_events(struct test_suite *test __maybe_unused, int su= btest __maybe_unused) +{ + char dir[PATH_MAX]; + struct parse_events_error err; + struct evlist *evlist; + struct evsel *evsel; + struct perf_event_attr *attr; + int ret; + struct perf_pmu *pmu =3D test_pmu_get(dir, sizeof(dir)); + const char *event =3D "perf-pmu-test/test-event/"; + + + if (!pmu) + return TEST_FAIL; + + evlist =3D evlist__new(); + if (evlist =3D=3D NULL) { + pr_err("Failed allocation"); + goto err_out; + } + parse_events_error__init(&err); + ret =3D parse_events(evlist, event, &err); + if (ret) { + pr_debug("failed to parse event '%s', err %d\n", event, ret); + parse_events_error__print(&err, event); + ret =3D TEST_FAIL; + if (parse_events_error__contains(&err, "can't access trace events")) + ret =3D TEST_SKIP; + goto err_out; + } + evsel =3D evlist__first(evlist); + attr =3D &evsel->core.attr; + if (attr->config !=3D 0xc00000000002a823) { + pr_err("Unexpected config value %llx\n", attr->config); + goto err_out; + } + if (attr->config1 !=3D 0x8000400000000145) { + pr_err("Unexpected config1 value %llx\n", attr->config1); + goto err_out; + } + if (attr->config2 !=3D 0x0400000020041d07) { + pr_err("Unexpected config2 value %llx\n", attr->config2); + goto err_out; + } + + ret =3D TEST_OK; +err_out: + parse_events_error__exit(&err); + evlist__delete(evlist); + test_pmu_put(dir, pmu); + return ret; +} + static struct test_case tests__pmu[] =3D { TEST_CASE("Parsing with PMU format directory", pmu_format), + TEST_CASE("Parsing with PMU event", pmu_events), { .name =3D NULL, } }; =20 diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index b86ce9535088..40f3b5bd8260 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -597,33 +597,18 @@ static inline bool pmu_alias_info_file(const char *na= me) * Reading the pmu event aliases definition, which should be located at: * /sys/bus/event_source/devices//events as sysfs group attributes. */ -static int pmu_aliases_parse(struct perf_pmu *pmu) +static int __pmu_aliases_parse(struct perf_pmu *pmu, int events_dir_fd) { - char path[PATH_MAX]; struct dirent *evt_ent; DIR *event_dir; - size_t len; - int fd, dir_fd; =20 - len =3D perf_pmu__event_source_devices_scnprintf(path, sizeof(path)); - if (!len) - return 0; - scnprintf(path + len, sizeof(path) - len, "%s/events", pmu->name); - - dir_fd =3D open(path, O_DIRECTORY); - if (dir_fd =3D=3D -1) { - pmu->sysfs_aliases_loaded =3D true; - return 0; - } - - event_dir =3D fdopendir(dir_fd); - if (!event_dir){ - close (dir_fd); + event_dir =3D fdopendir(events_dir_fd); + if (!event_dir) return -EINVAL; - } =20 while ((evt_ent =3D readdir(event_dir))) { char *name =3D evt_ent->d_name; + int fd; FILE *file; =20 if (!strcmp(name, ".") || !strcmp(name, "..")) @@ -635,7 +620,7 @@ static int pmu_aliases_parse(struct perf_pmu *pmu) if (pmu_alias_info_file(name)) continue; =20 - fd =3D openat(dir_fd, name, O_RDONLY); + fd =3D openat(events_dir_fd, name, O_RDONLY); if (fd =3D=3D -1) { pr_debug("Cannot open %s\n", name); continue; @@ -653,11 +638,50 @@ static int pmu_aliases_parse(struct perf_pmu *pmu) } =20 closedir(event_dir); - close (dir_fd); pmu->sysfs_aliases_loaded =3D true; return 0; } =20 +static int pmu_aliases_parse(struct perf_pmu *pmu) +{ + char path[PATH_MAX]; + size_t len; + int events_dir_fd, ret; + + if (pmu->sysfs_aliases_loaded) + return 0; + + len =3D perf_pmu__event_source_devices_scnprintf(path, sizeof(path)); + if (!len) + return 0; + scnprintf(path + len, sizeof(path) - len, "%s/events", pmu->name); + + events_dir_fd =3D open(path, O_DIRECTORY); + if (events_dir_fd =3D=3D -1) { + pmu->sysfs_aliases_loaded =3D true; + return 0; + } + ret =3D __pmu_aliases_parse(pmu, events_dir_fd); + close(events_dir_fd); + return ret; +} + +static int pmu_aliases_parse_eager(struct perf_pmu *pmu, int sysfs_fd) +{ + char path[FILENAME_MAX + 7]; + int ret, events_dir_fd; + + scnprintf(path, sizeof(path), "%s/events", pmu->name); + events_dir_fd =3D openat(sysfs_fd, path, O_DIRECTORY, 0); + if (events_dir_fd =3D=3D -1) { + pmu->sysfs_aliases_loaded =3D true; + return 0; + } + ret =3D __pmu_aliases_parse(pmu, events_dir_fd); + close(events_dir_fd); + return ret; +} + static int pmu_alias_terms(struct perf_pmu_alias *alias, int err_loc, stru= ct list_head *terms) { struct parse_events_term *term, *cloned; @@ -1042,6 +1066,9 @@ struct perf_pmu *perf_pmu__lookup(struct list_head *p= mus, int dirfd, const char =20 perf_pmu__arch_init(pmu); =20 + if (eager_load) + pmu_aliases_parse_eager(pmu, dirfd); + return pmu; err: zfree(&pmu->name); --=20 2.44.0.769.g3c40516874-goog From nobody Tue Feb 10 23:01:32 2026 Received: from mail-yb1-f201.google.com (mail-yb1-f201.google.com [209.85.219.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6FF6F208A9 for ; Tue, 23 Apr 2024 03:17:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713842273; cv=none; b=V17bucbzS9ej0JEFd4XYU6ZUWyWCYZLfHgy/N0+ntkyWNXfGlm1pFG4KsuvKlCd15FCysewf/DlTB8e+5Lc8TbSnR0gMPrTbpor0hLqrGwFhV9IA4iz9IcrRTFAZF+SZvNkjQfrOH8PJsNnqIvURs1fTy3uqtUgzoLE2A48eBVw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713842273; c=relaxed/simple; bh=E1NYTZCiPELYJLqZwKX2be/pmTCtqFmd3FWtFUf2X/o=; h=Date:In-Reply-To:Message-Id:Mime-Version:References:Subject:From: To:Content-Type; b=Kqdhd07ntV6el+3RoIF5nlVj4RtanWGJGGOwWzQp6UNXKMWvzB/JtgTOdn5jIdzLgLS9IIQfveSX1a8Do+5N2qup1tNkciZWTb3MeZ/PKjF15aTZdwz8Nl2zPj71u6sco4hCSv/H/rP5UUYmMwqdqnOrWLdczh+HQ8JFG7l8aZM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=jfXKRgps; arc=none smtp.client-ip=209.85.219.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="jfXKRgps" Received: by mail-yb1-f201.google.com with SMTP id 3f1490d57ef6-de54ab795e9so879722276.1 for ; Mon, 22 Apr 2024 20:17:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1713842269; x=1714447069; darn=vger.kernel.org; h=to:from:subject:references:mime-version:message-id:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=9MZ1B2ThtmuE4LUDfVaEWTRWvyIuqxlXw4qD7SFEw9g=; b=jfXKRgps/TqR5jWCUL9LS5sSS17uaPQvtlJMeMXMCyTC80xyNWQMUT71TH3XpmlE8z D75H8JG7Wjcgyq3/xSDgMle4JDviuOiWDEUteQYbsUurZpO1l0lcNcah+o7X0Wtoyk6e ffeJu7PRUn7+nBtoncgRgM4wu318S7j/LNt1ErAHxkO7PtQFCgszGiRqGmKfkCPwA9MM 9rYFANXkUWnOM2IrYSFskS2h1/g1Qv6xqZbMfO56cZV84UI1eMIri8/ZjwCzZoJM6+yy pxkwiPSPPl2GItzQjqPq0eXYN/IX98o0STznMotKUJlNq/Ax75uMwMF9T6K6gK0eFd5W Acmg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713842269; x=1714447069; h=to:from:subject:references:mime-version:message-id:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=9MZ1B2ThtmuE4LUDfVaEWTRWvyIuqxlXw4qD7SFEw9g=; b=BC1XgAi5ecxO3K2qT8/EeL56YAGcdyPN/Pbs7Oug+DwTrP1giuQQ39+6f1mqHltqie SDTCBfrYbxPbyhGFNwVSjdnGlGrU2ShfMKpgfS+LD8VB846I56GkkLaVgoGlgR+CZvZM T2efNLj2G4A+BXgUjx64pbqzKxy7wSE84w+SejErJDOhPstrv97hRkiAuAehUi5QeSZr wmc42CkRib1d4hdFZKA84vVVlqmlTBfCfHWhL/F/TY2n2NXBJSSFiTVSlJIbQmgneGOM oo/8XnSWycTc8zBlGvf7Q+I/SmY/rglmGxKTJ2lMtZR5scY5VgFaEp0I2o6aMq9Hzl+h k35g== X-Forwarded-Encrypted: i=1; AJvYcCWTjxWtqLQxoBb1/jDLveFuFWUEy7GBCWgFGVzN+gFbml6BDJ3mI9aWO3pDUV/kJUHIIJW6Wu28MQwZ51eeCB9ZbiKcsCJTfJwJL8ee X-Gm-Message-State: AOJu0YyV0Aci7ZLimr5mLfytutYTMU/WpToFc0qZkqasA+Kc6BzRVnBc cbDl8wyDyNBVqgpnYpoz53bp9hybjYT1VCydnIyMjc81ezz3MYA1BZJcPJONE85mdbVy26C4qu9 Alh8jCw== X-Google-Smtp-Source: AGHT+IHaDrw55QOQi2OcL5qkYZUPabOA+Exfyv96i/byxsyQDlCUif+jbm64bsDhJeNP5sRPoTUu8y2nLbDz X-Received: from irogers.svl.corp.google.com ([2620:15c:2a3:200:4ca4:4d48:a7fe:d70c]) (user=irogers job=sendgmr) by 2002:a05:6902:1883:b0:de4:67d9:a2c6 with SMTP id cj3-20020a056902188300b00de467d9a2c6mr968089ybb.2.1713842269517; Mon, 22 Apr 2024 20:17:49 -0700 (PDT) Date: Mon, 22 Apr 2024 20:17:18 -0700 In-Reply-To: <20240423031719.1941141-1-irogers@google.com> Message-Id: <20240423031719.1941141-6-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240423031719.1941141-1-irogers@google.com> X-Mailer: git-send-email 2.44.0.769.g3c40516874-goog Subject: [PATCH v2 5/6] perf test pmu: Test all sysfs PMU event names are lowercase From: Ian Rogers To: Kan Liang , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Jonathan Corbet , Bjorn Helgaas , Randy Dunlap , Jing Zhang , James Clark , Ravi Bangoria , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Being lowercase means event name probes can avoid scanning the directory doing case insensitive comparisons, just the lowercase version of the name can be checked for existence. Signed-off-by: Ian Rogers --- tools/perf/tests/pmu.c | 75 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/tools/perf/tests/pmu.c b/tools/perf/tests/pmu.c index f4e9a39534cb..c49e790248cd 100644 --- a/tools/perf/tests/pmu.c +++ b/tools/perf/tests/pmu.c @@ -5,12 +5,17 @@ #include "pmu.h" #include "tests.h" #include "debug.h" +#include "fncache.h" +#include +#include +#include #include #include #include #include #include #include +#include =20 /* Fake PMUs created in temp directory. */ static LIST_HEAD(test_pmus); @@ -241,9 +246,79 @@ static int test__pmu_events(struct test_suite *test __= maybe_unused, int subtest return ret; } =20 +static bool permitted_event_name_char(char c) +{ + if (islower(c) || isdigit(c)) + return true; + + return c =3D=3D '.' || c =3D=3D '_' || c =3D=3D '-'; +} + +static int test__pmu_event_names(struct test_suite *test __maybe_unused, + int subtest __maybe_unused) +{ + char path[PATH_MAX]; + DIR *pmu_dir, *event_dir; + struct dirent *pmu_dent, *event_dent; + const char *sysfs =3D sysfs__mountpoint(); + int ret =3D TEST_OK; + + if (!sysfs) { + pr_err("Sysfs not mounted\n"); + return TEST_FAIL; + } + + snprintf(path, sizeof(path), "%s/bus/event_source/devices/", sysfs); + pmu_dir =3D opendir(path); + if (!pmu_dir) { + pr_err("Error opening \"%s\"\n", path); + return TEST_FAIL; + } + while ((pmu_dent =3D readdir(pmu_dir))) { + if (!strcmp(pmu_dent->d_name, ".") || + !strcmp(pmu_dent->d_name, "..")) + continue; + + snprintf(path, sizeof(path), "%s/bus/event_source/devices/%s/type", + sysfs, pmu_dent->d_name); + + /* Does it look like a PMU? */ + if (!file_available(path)) + continue; + + /* Process events. */ + snprintf(path, sizeof(path), "%s/bus/event_source/devices/%s/events", + sysfs, pmu_dent->d_name); + + event_dir =3D opendir(path); + if (!event_dir) { + pr_debug("No event directory \"%s\"\n", path); + continue; + } + while ((event_dent =3D readdir(event_dir))) { + const char *event_name =3D event_dent->d_name; + + if (!strcmp(event_name, ".") || !strcmp(event_name, "..")) + continue; + + for (size_t i =3D 0, n =3D strlen(event_name); i < n; i++) { + if (!permitted_event_name_char(event_name[i])) { + pr_err("Sysfs event names should be lower case \"%s/%s\"\n", + pmu_dent->d_name, event_name); + ret =3D TEST_FAIL; + } + } + } + closedir(event_dir); + } + closedir(pmu_dir); + return ret; +} + static struct test_case tests__pmu[] =3D { TEST_CASE("Parsing with PMU format directory", pmu_format), TEST_CASE("Parsing with PMU event", pmu_events), + TEST_CASE("PMU event names", pmu_event_names), { .name =3D NULL, } }; =20 --=20 2.44.0.769.g3c40516874-goog From nobody Tue Feb 10 23:01:32 2026 Received: from mail-yw1-f202.google.com (mail-yw1-f202.google.com [209.85.128.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BCD1B21A0D for ; Tue, 23 Apr 2024 03:17:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713842274; cv=none; b=svDJoZx8taFAXR8on2439eoh/ewR0cCsHWbVycKKJLYuJj7QDdiORfnXc9+DzrBUHXCvaRmJ3m12g7P6u190PYY8b1xEkBNr2tQGnHKiylcqjCtogQ4K3BOm8yCL7W8N+sh+GXwl38L17bPLJF9gNDxSKN999RzorU//WhDZcno= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713842274; c=relaxed/simple; bh=SxEDWrn/lFxPOvag5N8wzuGUB1n1P7PWYBfiKXO1nAk=; h=Date:In-Reply-To:Message-Id:Mime-Version:References:Subject:From: To:Content-Type; b=d7/58ZlsX8YZsh9QZbDVgJYXSOm6hhXYwxRzP2Sv9jH6PmyCN97j5KYcytHvRDHlXLVrlyWDSk76hMwpWr/yeHpkATj8iPOUeLLoRjsMox0EWwKJTBdIN/8/44mAXSl+22goroJmidPipADHNU+Wq/hLJ4NvQMVc9co3bib9Mkg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=nTUgBxaQ; arc=none smtp.client-ip=209.85.128.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="nTUgBxaQ" Received: by mail-yw1-f202.google.com with SMTP id 00721157ae682-6188040f3d2so109285197b3.1 for ; Mon, 22 Apr 2024 20:17:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1713842272; x=1714447072; darn=vger.kernel.org; h=to:from:subject:references:mime-version:message-id:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=1gyJD4QoBqevKrIjKy2FdMgw5O7ztEDQh0P4WQSqqmY=; b=nTUgBxaQJ+/GzAN0/Xr/hHl3/ukWu8P1T/KYH494ioXAqSnZKTkU9PJHcZnSXam7aa ztoUzr3mnwYPzlBkxzXYmyRY8P1iYFz3p2Xll8Z8SLdHv4mXZ9Hmv+CoPzPxgSEt6euj rRheFRx9eRb5gNxF4H5qOsE8KIYojKY97imF0dFrfjTWaLmRY4P8uJCVSr5kr/RLleiJ iZgSOAUUTNX+9xkc1DUkf84Fdgy9DNDHWCxNOGWW8Yj1w67hvWoxbn6TXNUzbcSHoDII hd1h5unYI3ZUq5iPCKu5Sf8x+0IyaMMpO3oXkGcmPAZ1L36XhPun84m0AC7pvSqYEDRJ 153w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713842272; x=1714447072; h=to:from:subject:references:mime-version:message-id:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=1gyJD4QoBqevKrIjKy2FdMgw5O7ztEDQh0P4WQSqqmY=; b=P7skoCOTaGs0Pbk6n3mwcp8858KJOMmStubOALlyfwx3t8ZkUAiNjNvM2FwHm9ZYli c4Mv7qiZ7KCSCW/J1Jrrqv/gundoibQDDH1GoJ3Je0GXeReXo8MEpX019YpfSZ1zev2i wm4vGSjmso6AzTmw6DfmdeIdesGwPsYpc0uvoU9bAcSKj9xR/A3HMvaKnB4SY5TQurng b+KzUxoOk+K1a7q44s+g1ISYdSg4K+mBxFhr5FeFgsA3m6Td3hEX1QMy8BI0KT5OMPZt 3BTZtr/xiMNSqD/6x0TxHq32TkyGefMwJ6SmfC4eCU+2BjPRQWyzs217v2QlVR+7lcP9 hbSw== X-Forwarded-Encrypted: i=1; AJvYcCWIbvQSPPosJdgF+k3V3TVqU6+kevtD+l94JAdAnZlyHoO9R/3KE+UOmQGLfLQ03JBFzUslQNTzcNMBcc956eRQs0uhwsmIydv0wcC9 X-Gm-Message-State: AOJu0YzXam2xMX5kpMhIazh5BfseivtA0t71EC1/94rOGm5zsTYoXDLq yjRIvDc/nuQWH2TJzLxQlajVocKASNiiHHjk6bfzJZlf/SHgxEp7Nf8keHO8WjAChjxrtcm9W46 CQFvKcQ== X-Google-Smtp-Source: AGHT+IHuIv06zsnCVJVN7pSt2E/XMUWzJTdljzRqLpOgrm3bi86g9DMQm+s3UK3S1GujsuF4MIsvc2q2G11B X-Received: from irogers.svl.corp.google.com ([2620:15c:2a3:200:4ca4:4d48:a7fe:d70c]) (user=irogers job=sendgmr) by 2002:a0d:efc1:0:b0:615:e53:1c1 with SMTP id y184-20020a0defc1000000b006150e5301c1mr3040732ywe.7.1713842271767; Mon, 22 Apr 2024 20:17:51 -0700 (PDT) Date: Mon, 22 Apr 2024 20:17:19 -0700 In-Reply-To: <20240423031719.1941141-1-irogers@google.com> Message-Id: <20240423031719.1941141-7-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20240423031719.1941141-1-irogers@google.com> X-Mailer: git-send-email 2.44.0.769.g3c40516874-goog Subject: [PATCH v2 6/6] perf pmu: Assume sysfs events are always lowercase From: Ian Rogers To: Kan Liang , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Jonathan Corbet , Bjorn Helgaas , Randy Dunlap , Jing Zhang , James Clark , Ravi Bangoria , linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Perf event names aren't case sensitive. For sysfs events the entire directory of events is read then iterated comparing names in a case insensitive way, most often to see if an event is present. Consider: $ perf stat -e inst_retired.any true The event inst_retired.any may be present in any PMU, so every PMU's sysfs events are loaded and then searched with strcasecmp to see if any match. This event is only present on the cpu PMU as a json event so a lot of events were loaded from sysfs unnecessarily just to prove an event didn't exist there. This change avoids loading all the events by assuming sysfs event names are always lowercase. It then uses file exists and only loads the events when the desired event is present. For the example above, the number of openat calls measured by perf trace on a tigerlake laptop goes from 325 down to 255. The reduction will be larger for machines with many PMUs, particularly replicated uncore PMUs. Ensure pmu_aliases_parse is called before all uses of the aliases list, but remove some "pmu->sysfs_aliases_loaded" tests as they are now part of the function. Signed-off-by: Ian Rogers --- tools/perf/util/pmu.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index 40f3b5bd8260..88ce0aae2764 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -425,9 +425,16 @@ static struct perf_pmu_alias *perf_pmu__find_alias(str= uct perf_pmu *pmu, { struct perf_pmu_alias *alias; =20 - if (load && !pmu->sysfs_aliases_loaded) - pmu_aliases_parse(pmu); + if (load && !pmu->sysfs_aliases_loaded) { + char event_file_name[FILENAME_MAX + 8]; =20 + scnprintf(event_file_name, sizeof(event_file_name), "events/%s", name); + for (size_t i =3D 7, n =3D 7 + strlen(name); i < n; i++) + event_file_name[i] =3D tolower(event_file_name[i]); + + if (perf_pmu__file_exists(pmu, event_file_name)) + pmu_aliases_parse(pmu); + } list_for_each_entry(alias, &pmu->aliases, list) { if (!strcasecmp(alias->name, name)) return alias; @@ -1717,9 +1724,7 @@ size_t perf_pmu__num_events(struct perf_pmu *pmu) { size_t nr; =20 - if (!pmu->sysfs_aliases_loaded) - pmu_aliases_parse(pmu); - + pmu_aliases_parse(pmu); nr =3D pmu->sysfs_aliases; =20 if (pmu->cpu_aliases_added) @@ -1778,6 +1783,7 @@ int perf_pmu__for_each_event(struct perf_pmu *pmu, bo= ol skip_duplicate_pmus, struct strbuf sb; =20 strbuf_init(&sb, /*hint=3D*/ 0); + pmu_aliases_parse(pmu); pmu_add_cpu_aliases(pmu); list_for_each_entry(event, &pmu->aliases, list) { size_t buf_used; @@ -2182,6 +2188,7 @@ const char *perf_pmu__name_from_config(struct perf_pm= u *pmu, u64 config) if (!pmu) return NULL; =20 + pmu_aliases_parse(pmu); pmu_add_cpu_aliases(pmu); list_for_each_entry(event, &pmu->aliases, list) { struct perf_event_attr attr =3D {.config =3D 0,}; --=20 2.44.0.769.g3c40516874-goog