From nobody Mon Feb 9 01:06:35 2026 Received: from mail-pl1-f180.google.com (mail-pl1-f180.google.com [209.85.214.180]) (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 9315016F265 for ; Mon, 29 Jul 2024 16:46:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.180 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722271570; cv=none; b=J7l/2CFMOt9DHdwQiZpHVkjvmLjsi7nXQIwx7eeRtzWkjxrP/VfjFR4XtP5O0vXS93bFTuGwSu/DblCWM03SDkaO/yp9LvU7wINi39hHqD0j5LDc7Kk+829NISL4oUDTP8t8uPT0qNj6K/pYeLjjAgtjBLRkjdihSA3yKoO/1es= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722271570; c=relaxed/simple; bh=tPwVwQ9afMUi2qsyAkI7jXUjgcctJpljCtDAaGNiM3w=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mZqK92Q7Vfpp/DodJwIxDMIwA6yp7xcBle2zfmAsyNH9DEvkOi5/9Oul22jMdHvNfrdTZD/SGA811TTHy8YYJBstQ5fNdsB5K0aawVKtK/QJLR69ghYujuiXIWBowg4wO6o13QdRegA5PXrUfiIh98lmDJ4dRCUmKRmkJdagQqY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com; spf=pass smtp.mailfrom=rivosinc.com; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b=ekjWg2T5; arc=none smtp.client-ip=209.85.214.180 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b="ekjWg2T5" Received: by mail-pl1-f180.google.com with SMTP id d9443c01a7336-1fc47abc040so19094185ad.0 for ; Mon, 29 Jul 2024 09:46:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1722271568; x=1722876368; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=2aScmstzHvx/v7UKZvzRNSOVMJdMn5iWDOIaOoUqNRU=; b=ekjWg2T5jNm1Mi5eKw2PnG2c7qdoRkeDWRyyl4sFWGls+/dFD8mna88jsJ1alFjekc SCPOmJl2Qc74r9VfQ2uHjni9pFzcs3g7WfGkdIED/W+W4X5aDH5sSfqWBBeznml+Um7Y PLm3boLWSwTL2yljrjT63jfiy8tCH9/BVhmSb97Xcq+mCQAJewAu6uP4XmAX1U4BxwXy KIlblP/xOMEfxoEUdZiISS1skreEV2ctDKIww0f9pCNp61yUR82UZkRQUY9Te7DVQ4PI ALYa4ALKPgXqvr2hxYQVwyDCkW9kJ+rk16235xsIYeADXamM0Jb36OJrhmFI4BqbGsFg XgKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1722271568; x=1722876368; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=2aScmstzHvx/v7UKZvzRNSOVMJdMn5iWDOIaOoUqNRU=; b=MNd8yypFQynKzxDyCfR+2eJ73eUUhc/YlHECxDAv+0BA+pPMfRGrpHjWdNzNB/DFeq a1zDpQOHEcZWNOEGuHBnv58YW846CCrbGVlIXIXVEzfrqdv5Gr+/acm2RYs/fFNAKz8k hjhsCSIJ6DAjGAtK/WDwHa3+7x4IuDRawREa7reOKT8Hep5A7OA8r8BkW59EFyEbdigr 6tVrLqL1mH4qCRuX7IsIRvEzaHr/z+ow7Yll61T30b3vByw59i94dAq6VmGs1GFT7pdE 3Fr7o8Q32aMJuVa0SoWwuBeEnhH4kWYE4TTm5FsnSCVMTeFetiCti/wgQnfyANeK5uIm dnag== X-Forwarded-Encrypted: i=1; AJvYcCVsTtSNUJ4sxfZkSrQoftdpSinhLMxBImVJK2IsSCCgFrCBuCbcf8xyNHdOX1n9n0MTc+Vup5l6Po07evbRLKPUUUbIxtqfcUv93MlN X-Gm-Message-State: AOJu0YwllAd9OexoVI2AJeC9LHrwYQQGGXDZmNmCdIf/ycKkL5YzDNVn tmRWTZTSBV5mToiuzSppNcmD3uvO5oX6JgaLh/SfFZ3AeOHWvQBqFq75vtEF3Uk= X-Google-Smtp-Source: AGHT+IFw4yvYw/i8q9qY3Z4fCLdCFqDAF12yaV9mKyL9wxg0B2527KSAol4D6gP2nOhvSnXfhixfFQ== X-Received: by 2002:a17:902:f551:b0:1fb:fc96:757e with SMTP id d9443c01a7336-1ff047df750mr62572485ad.37.1722271567833; Mon, 29 Jul 2024 09:46:07 -0700 (PDT) Received: from charlie.ba.rivosinc.com ([64.71.180.162]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1fed7d401c6sm85480545ad.117.2024.07.29.09.46.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jul 2024 09:46:07 -0700 (PDT) From: Charlie Jenkins Date: Fri, 26 Jul 2024 22:29:31 -0700 Subject: [PATCH v2 1/8] libperf: Move 'open_flags' from tools/perf to evsel::open_flags Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20240726-overflow_check_libperf-v2-1-7d154dcf6bea@rivosinc.com> References: <20240726-overflow_check_libperf-v2-0-7d154dcf6bea@rivosinc.com> In-Reply-To: <20240726-overflow_check_libperf-v2-0-7d154dcf6bea@rivosinc.com> To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Andrii Nakryiko , Eduard Zingerman , Alexei Starovoitov , Daniel Borkmann , Martin KaFai Lau , Song Liu , Yonghong Song , John Fastabend , KP Singh , Stanislav Fomichev , Hao Luo Cc: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, bpf@vger.kernel.org, Charlie Jenkins , Shunsuke Nakamura X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1722271564; l=3858; i=charlie@rivosinc.com; s=20231120; h=from:subject:message-id; bh=EYj46EMmFuWQIBLme5IpvIZq5GbJ6nvJPdb/Sh/Sx+Q=; b=vLdlwLK8xuEDGs508wuLB7axsc0kxOK4nqPJyBnq14QfksSIFCuMQLC7FZKwlgaCswfBL1cHF L5JsaoW/jOSB90gGhDupKAl23sFBBAfqB6IwClC3TT0xddOQE+FNgn2 X-Developer-Key: i=charlie@rivosinc.com; a=ed25519; pk=t4RSWpMV1q5lf/NWIeR9z58bcje60/dbtxxmoSfBEcs= From: Shunsuke Nakamura Move evsel::open_flags to perf_evsel::open_flags, so we can move the open_flags interface to libperf. Signed-off-by: Shunsuke Nakamura Signed-off-by: Charlie Jenkins --- tools/lib/perf/include/internal/evsel.h | 2 ++ tools/perf/util/evsel.c | 16 +++++++++------- tools/perf/util/evsel.h | 1 - 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/tools/lib/perf/include/internal/evsel.h b/tools/lib/perf/inclu= de/internal/evsel.h index 5cd220a61962..1d0d0406793a 100644 --- a/tools/lib/perf/include/internal/evsel.h +++ b/tools/lib/perf/include/internal/evsel.h @@ -75,6 +75,8 @@ struct perf_evsel { /** Is the PMU for the event a core one? Effects the handling of own_cpus= . */ bool is_pmu_core; int idx; + + unsigned long open_flags; }; =20 void perf_evsel__init(struct perf_evsel *evsel, struct perf_event_attr *at= tr, diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 4f818ab6b662..65f0f83ada6d 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -1829,9 +1829,9 @@ static int __evsel__prepare_open(struct evsel *evsel,= struct perf_cpu_map *cpus, perf_evsel__alloc_fd(&evsel->core, perf_cpu_map__nr(cpus), nthreads) = < 0) return -ENOMEM; =20 - evsel->open_flags =3D PERF_FLAG_FD_CLOEXEC; + evsel->core.open_flags =3D PERF_FLAG_FD_CLOEXEC; if (evsel->cgrp) - evsel->open_flags |=3D PERF_FLAG_PID_CGROUP; + evsel->core.open_flags |=3D PERF_FLAG_PID_CGROUP; =20 return 0; } @@ -1853,7 +1853,7 @@ static void evsel__disable_missing_features(struct ev= sel *evsel) evsel->core.attr.clockid =3D 0; } if (perf_missing_features.cloexec) - evsel->open_flags &=3D ~(unsigned long)PERF_FLAG_FD_CLOEXEC; + evsel->core.open_flags &=3D ~(unsigned long)PERF_FLAG_FD_CLOEXEC; if (perf_missing_features.mmap2) evsel->core.attr.mmap2 =3D 0; if (evsel->pmu && evsel->pmu->missing_features.exclude_guest) @@ -1951,7 +1951,8 @@ bool evsel__detect_missing_features(struct evsel *evs= el) perf_missing_features.clockid =3D true; pr_debug2_peo("switching off use_clockid\n"); return true; - } else if (!perf_missing_features.cloexec && (evsel->open_flags & PERF_FL= AG_FD_CLOEXEC)) { + } else if (!perf_missing_features.cloexec && + (evsel->core.open_flags & PERF_FLAG_FD_CLOEXEC)) { perf_missing_features.cloexec =3D true; pr_debug2_peo("switching off cloexec flag\n"); return true; @@ -2055,11 +2056,12 @@ static int evsel__open_cpu(struct evsel *evsel, str= uct perf_cpu_map *cpus, =20 /* Debug message used by test scripts */ pr_debug2_peo("sys_perf_event_open: pid %d cpu %d group_fd %d flags = %#lx", - pid, perf_cpu_map__cpu(cpus, idx).cpu, group_fd, evsel->open_flags); + pid, perf_cpu_map__cpu(cpus, idx).cpu, group_fd, + evsel->core.open_flags); =20 fd =3D sys_perf_event_open(&evsel->core.attr, pid, perf_cpu_map__cpu(cpus, idx).cpu, - group_fd, evsel->open_flags); + group_fd, evsel->core.open_flags); =20 FD(evsel, idx, thread) =3D fd; =20 @@ -2076,7 +2078,7 @@ static int evsel__open_cpu(struct evsel *evsel, struc= t perf_cpu_map *cpus, if (unlikely(test_attr__enabled)) { test_attr__open(&evsel->core.attr, pid, perf_cpu_map__cpu(cpus, idx), - fd, group_fd, evsel->open_flags); + fd, group_fd, evsel->core.open_flags); } =20 /* Debug message used by test scripts */ diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index 375a38e15cd9..2efda7ad8f96 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -165,7 +165,6 @@ struct evsel { struct bperf_follower_bpf *follower_skel; void *bpf_skel; }; - unsigned long open_flags; int precise_ip_original; =20 /* for missing_features */ --=20 2.44.0 From nobody Mon Feb 9 01:06:35 2026 Received: from mail-pl1-f179.google.com (mail-pl1-f179.google.com [209.85.214.179]) (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 34D8D17CA1A for ; Mon, 29 Jul 2024 16:46:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722271571; cv=none; b=bM8LPFvtPArdqVVnw20MHpjwyWe01xB0GwNSx3y5T59T8/smZgtYnemlW76RRgYEeJfA/QWKSACRaNBoI9QNN86xnIwzqZg21qJmlUaM9hhbWFfbz1UE1rIggBxIUVRcd/iVfIuFbTUf+aLsJtHrFdY/etMD2VLo29WXVVDqSsk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722271571; c=relaxed/simple; bh=54U0GOikZ5RAzxgP6rcXIBTwH6OjsP6nIPiaMnC28qs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=X7dple6PqM8OUGqqsIX1SoOZ88LdeC64rxo+61qFN1F8+1AUKOdV1VsWFdLkQV7R9BWCbQ1ljjw6IBDVDkk2scvZFL/NFRNHzMGv/c0ctb0CyxZHPK/djJXrKvaMU3OmiGwjAL0DitD7vE8Z1hSSmZ/d7L8/cLyIQIfD2P8T8+k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com; spf=pass smtp.mailfrom=rivosinc.com; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b=XYBFcoMG; arc=none smtp.client-ip=209.85.214.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b="XYBFcoMG" Received: by mail-pl1-f179.google.com with SMTP id d9443c01a7336-1fd6ed7688cso22648885ad.3 for ; Mon, 29 Jul 2024 09:46:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1722271569; x=1722876369; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=C7lNL7a7RnaEeEHqOAz4LqfV1YVzFzzZbPZA8bd7aYY=; b=XYBFcoMGO9GWA/bT4XFl/gAjnmAifflAAROJlrn1HoH7o0fC3h0G+9FJx/9TkQL4hL PQPTSjolFCo4GcTP2e7rj5ZKMyGuQ+/6ApUozIwtfYT76MNYAP8CrXnrcJdLva1+QjpZ x70CXXNvfFQ3ZUsT5qLgYrFT1fgAsKkPO+AizIC9iiBUz5GSk8cOSd3sMIMUHzjRBXlK 07xxgZRFXO7OxmnsNta6Txfzm9QUvxRJmnbv/DhTPbC6hWX7FPmzt12y8qxCsQmYX9nF lJX1wd/Tt2nf53/ibZGKpO8tsagH6sH+kjKJiCfeKC4VwHMVByCC3wYeD1+UU02lAnsF 2EdA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1722271569; x=1722876369; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=C7lNL7a7RnaEeEHqOAz4LqfV1YVzFzzZbPZA8bd7aYY=; b=H7Y5MHwvXMI8xay7/jySrUqEo3NS0sAcZfp/pBxRq19rzRvigjTsDce4x8qmowCPPw g/SOuBFIUPUpWpdeiyD17rWnKtwZZN+72NLgIyEuvN52ujnVMto9d5dNAQiFPW6DAPBS Ww5ye0lM0nImxEUARHP4huuKsLLK+h1NMinbs9JJlr3yzLSzyo1/xmr2fBx/gB/f2DZH mmsGho99eROWeRrv9T9wUVrjefZY4bnAj6f3ufK+dkkYG4P0cC1I4pSJcLuWJ3bRjVWn 8/stH4vCBwziUv+Qdl3Blcd6ryHXUjHpE7bUybkMSiImItdP5HTpNe6qgyE+Z8V5Bp3V i0/g== X-Forwarded-Encrypted: i=1; AJvYcCVtnptb5m6YRQX40e/KY79yAc59Vcr8Uiy7WKhvAcWS8ChTetnOS/b7f72Fkk23BuFBNOWwMfORQ6eEAZF4ngcAHd2S/9lDRu17p2/y X-Gm-Message-State: AOJu0YyoqKYDsMXVtKH2SdQTUWMEwW3H2rHQoOE+eQKeCLY/ci1FJRjt AFtyGGOmXnEIhfdGv2lsOTd9MiOOLoTcC6B6FFfkMfXsn5j42Rg9DMXhKp3RUzI= X-Google-Smtp-Source: AGHT+IEDDXZa+6QWvwQqyxT5UERM3Q6JtNvwNq68P+XR9aZlgl//Sn9tiEuQaD04eysjXHhWZGRLcQ== X-Received: by 2002:a17:902:dad0:b0:1fb:389b:1054 with SMTP id d9443c01a7336-1ff048f402cmr68217195ad.52.1722271569445; Mon, 29 Jul 2024 09:46:09 -0700 (PDT) Received: from charlie.ba.rivosinc.com ([64.71.180.162]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1fed7d401c6sm85480545ad.117.2024.07.29.09.46.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jul 2024 09:46:09 -0700 (PDT) From: Charlie Jenkins Date: Fri, 26 Jul 2024 22:29:32 -0700 Subject: [PATCH v2 2/8] libbpf: Move opts code into dedicated header Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20240726-overflow_check_libperf-v2-2-7d154dcf6bea@rivosinc.com> References: <20240726-overflow_check_libperf-v2-0-7d154dcf6bea@rivosinc.com> In-Reply-To: <20240726-overflow_check_libperf-v2-0-7d154dcf6bea@rivosinc.com> To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Andrii Nakryiko , Eduard Zingerman , Alexei Starovoitov , Daniel Borkmann , Martin KaFai Lau , Song Liu , Yonghong Song , John Fastabend , KP Singh , Stanislav Fomichev , Hao Luo Cc: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, bpf@vger.kernel.org, Charlie Jenkins X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1722271564; l=7398; i=charlie@rivosinc.com; s=20231120; h=from:subject:message-id; bh=54U0GOikZ5RAzxgP6rcXIBTwH6OjsP6nIPiaMnC28qs=; b=nRT6hIItDIVb3k4l/iTG0y78l/VSvtYH5Aq77UEkGeYTziNKgW7O3jJ03EqkBdAB64R0OOHKd l9oHIi4ae1NBYo/uXJckSHs1YGOa5dwGH17LuqtAABhpgbrJdAnPD63 X-Developer-Key: i=charlie@rivosinc.com; a=ed25519; pk=t4RSWpMV1q5lf/NWIeR9z58bcje60/dbtxxmoSfBEcs= Signed-off-by: Charlie Jenkins --- tools/include/tools/opts.h | 68 +++++++++++++++++++++++++++++++++++++= ++++ tools/lib/bpf/bpf.c | 1 + tools/lib/bpf/btf.c | 1 + tools/lib/bpf/btf_dump.c | 1 + tools/lib/bpf/libbpf.c | 3 +- tools/lib/bpf/libbpf_internal.h | 48 ----------------------------- tools/lib/bpf/linker.c | 1 + tools/lib/bpf/netlink.c | 1 + tools/lib/bpf/ringbuf.c | 1 + 9 files changed, 76 insertions(+), 49 deletions(-) diff --git a/tools/include/tools/opts.h b/tools/include/tools/opts.h new file mode 100644 index 000000000000..42b4c1a66cad --- /dev/null +++ b/tools/include/tools/opts.h @@ -0,0 +1,68 @@ +/* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */ + +/* + * Options helpers. + * + * Originally in tools/lib/bpf/libbpf_internal.h + */ + +#ifndef __TOOLS_OPTS_H +#define __TOOLS_OPTS_H + +#include +#include + +#ifndef offsetofend +#define offsetofend(TYPE, MEMBER) \ + (offsetof(TYPE, MEMBER) + sizeof((((TYPE *)0)->MEMBER))) +#endif + +static inline bool lib_is_mem_zeroed(const char *p, ssize_t len) +{ + while (len > 0) { + if (*p) + return false; + p++; + len--; + } + return true; +} + +static inline bool lib_validate_opts(const char *opts, + size_t opts_sz, size_t user_sz, + const char *type_name) +{ + if (user_sz < sizeof(size_t)) { + fprintf(stderr, "%s size (%zu) is too small\n", type_name, user_sz); + return false; + } + if (!lib_is_mem_zeroed(opts + opts_sz, (ssize_t)user_sz - opts_sz)) { + fprintf(stderr, "%s has non-zero extra bytes\n", type_name); + return false; + } + return true; +} + +#define OPTS_VALID(opts, type) \ + (!(opts) || lib_validate_opts((const char *)opts, \ + offsetofend(struct type, \ + type##__last_field), \ + (opts)->sz, #type)) +#define OPTS_HAS(opts, field) \ + ((opts) && opts->sz >=3D offsetofend(typeof(*(opts)), field)) +#define OPTS_GET(opts, field, fallback_value) \ + (OPTS_HAS(opts, field) ? (opts)->field : fallback_value) +#define OPTS_SET(opts, field, value) \ + do { \ + if (OPTS_HAS(opts, field)) \ + (opts)->field =3D value; \ + } while (0) + +#define OPTS_ZEROED(opts, last_nonzero_field) \ +({ \ + ssize_t __off =3D offsetofend(typeof(*(opts)), last_nonzero_field); \ + !(opts) || lib_is_mem_zeroed((const void *)opts + __off, \ + (opts)->sz - __off); \ +}) + +#endif /* __TOOLS_OPTS_H */ diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c index 2a4c71501a17..089f0e0be3a2 100644 --- a/tools/lib/bpf/bpf.c +++ b/tools/lib/bpf/bpf.c @@ -32,6 +32,7 @@ #include #include #include +#include #include "bpf.h" #include "libbpf.h" #include "libbpf_internal.h" diff --git a/tools/lib/bpf/btf.c b/tools/lib/bpf/btf.c index 2d0840ef599a..e03974de2f02 100644 --- a/tools/lib/bpf/btf.c +++ b/tools/lib/bpf/btf.c @@ -16,6 +16,7 @@ #include #include #include +#include #include "btf.h" #include "bpf.h" #include "libbpf.h" diff --git a/tools/lib/bpf/btf_dump.c b/tools/lib/bpf/btf_dump.c index 5dbca76b953f..877479228954 100644 --- a/tools/lib/bpf/btf_dump.c +++ b/tools/lib/bpf/btf_dump.c @@ -17,6 +17,7 @@ #include #include #include +#include #include "btf.h" #include "hashmap.h" #include "libbpf.h" diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 5401f2df463d..97a47a3d4e51 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -43,6 +43,7 @@ #include #include #include +#include #include #include #include @@ -1146,7 +1147,7 @@ static int bpf_map__init_kern_struct_ops(struct bpf_m= ap *map) =20 kern_member =3D find_member_by_name(kern_btf, kern_type, mname); if (!kern_member) { - if (!libbpf_is_mem_zeroed(mdata, msize)) { + if (!lib_is_mem_zeroed(mdata, msize)) { pr_warn("struct_ops init_kern %s: Cannot find member %s in kernel BTF\= n", map->name, mname); return -ENOTSUP; diff --git a/tools/lib/bpf/libbpf_internal.h b/tools/lib/bpf/libbpf_interna= l.h index a0dcfb82e455..033b852ed9a7 100644 --- a/tools/lib/bpf/libbpf_internal.h +++ b/tools/lib/bpf/libbpf_internal.h @@ -283,54 +283,6 @@ void *libbpf_add_mem(void **data, size_t *cap_cnt, siz= e_t elem_sz, size_t cur_cnt, size_t max_cnt, size_t add_cnt); int libbpf_ensure_mem(void **data, size_t *cap_cnt, size_t elem_sz, size_t= need_cnt); =20 -static inline bool libbpf_is_mem_zeroed(const char *p, ssize_t len) -{ - while (len > 0) { - if (*p) - return false; - p++; - len--; - } - return true; -} - -static inline bool libbpf_validate_opts(const char *opts, - size_t opts_sz, size_t user_sz, - const char *type_name) -{ - if (user_sz < sizeof(size_t)) { - pr_warn("%s size (%zu) is too small\n", type_name, user_sz); - return false; - } - if (!libbpf_is_mem_zeroed(opts + opts_sz, (ssize_t)user_sz - opts_sz)) { - pr_warn("%s has non-zero extra bytes\n", type_name); - return false; - } - return true; -} - -#define OPTS_VALID(opts, type) \ - (!(opts) || libbpf_validate_opts((const char *)opts, \ - offsetofend(struct type, \ - type##__last_field), \ - (opts)->sz, #type)) -#define OPTS_HAS(opts, field) \ - ((opts) && opts->sz >=3D offsetofend(typeof(*(opts)), field)) -#define OPTS_GET(opts, field, fallback_value) \ - (OPTS_HAS(opts, field) ? (opts)->field : fallback_value) -#define OPTS_SET(opts, field, value) \ - do { \ - if (OPTS_HAS(opts, field)) \ - (opts)->field =3D value; \ - } while (0) - -#define OPTS_ZEROED(opts, last_nonzero_field) \ -({ \ - ssize_t __off =3D offsetofend(typeof(*(opts)), last_nonzero_field); \ - !(opts) || libbpf_is_mem_zeroed((const void *)opts + __off, \ - (opts)->sz - __off); \ -}) - enum kern_feature_id { /* v4.14: kernel support for program & map names. */ FEAT_PROG_NAME, diff --git a/tools/lib/bpf/linker.c b/tools/lib/bpf/linker.c index 0d4be829551b..e6fb12ba396c 100644 --- a/tools/lib/bpf/linker.c +++ b/tools/lib/bpf/linker.c @@ -16,6 +16,7 @@ #include #include #include +#include #include "libbpf.h" #include "btf.h" #include "libbpf_internal.h" diff --git a/tools/lib/bpf/netlink.c b/tools/lib/bpf/netlink.c index 68a2def17175..786a4f6dc3ab 100644 --- a/tools/lib/bpf/netlink.c +++ b/tools/lib/bpf/netlink.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include =20 diff --git a/tools/lib/bpf/ringbuf.c b/tools/lib/bpf/ringbuf.c index bfd8dac4c0cc..547781cde26d 100644 --- a/tools/lib/bpf/ringbuf.c +++ b/tools/lib/bpf/ringbuf.c @@ -16,6 +16,7 @@ #include #include #include +#include #include =20 #include "libbpf.h" --=20 2.44.0 From nobody Mon Feb 9 01:06:35 2026 Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) (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 DC75E187552 for ; Mon, 29 Jul 2024 16:46:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722271574; cv=none; b=roM3X+feX74ekbDVKCfEnW91BX0VA3KHIWhwo9YQ15q5cdhi4BjYr9LF2hqBOWF0Y6eoFq/x4xtp6YmDIE/Tyjno9WFMtbHDubFeUTrld3czc/7JswYF6oV0Q35ibA1aMdQDZDRoQokQrejKH9AW8+atfkedgTVuvikVgF4hGIQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722271574; c=relaxed/simple; bh=Ngg3rd0M9C6xmXKqdyh5Swv8+ulPNZzaCEcRVN+uVoE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=hyqPjoWguUQOmep2QUzuV7Vwm+FQO6JD6okzQo6reTbbaQ1PVwjAP3XntGO9RaLzWLzxZMiibK2dG3aAObNTf9zn/IabRPNbk39ZXuDy5Fa87WKtbSjf1KWcPRG7fzrNq7aBtuF0yGDyHUtuPlMGLAR46cVaKFjcAxdO7cMZANU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com; spf=pass smtp.mailfrom=rivosinc.com; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b=aHDxMYgR; arc=none smtp.client-ip=209.85.214.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b="aHDxMYgR" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-1fc5549788eso25345095ad.1 for ; Mon, 29 Jul 2024 09:46:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1722271571; x=1722876371; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=uo0PY2WTM6EhFKrs58+9HaWpsdI63v4tb+UT2YjwAqc=; b=aHDxMYgRJqmIcNcMqfj0aJ7fwsosMWNjNnKDzmuPaUd3w+hefwyllWdBb2tkWcttxG HOEMouQRhU+KLLkuuxO7ydQgFenCovmgGEOcXu79kkArkoqvpndyvxTFFAuyVO3aEJ7Q i0CpMsTq7PfeTQFgXtZI4oyjEQgctzUeCwvLdfPPKy7yFMPUzLevDdvbomes6zCTfbOd QHv2W/lUGK1lf6WKDJ5G16/IAesl0ZUOQKE1lQZtkLJ8ua8G1fYOdHfq/DHnMobYL0Np 7ty1SWyhH0ptCyueNahUYk15Kw35RXGZEU4X/7lsQEc0Bpvwocrw5FaGruX4ssLaUEE3 2tSA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1722271571; x=1722876371; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=uo0PY2WTM6EhFKrs58+9HaWpsdI63v4tb+UT2YjwAqc=; b=Jpn1pwcRi3NcVl1oQwqhiIIM5Z1N7mNuDYjmLY+bpIAvZRiaNkaWIxxVKYSZpxncyi YB2z1ZEEvHzZUUoaiEic+58GI1Z3xoS5LjCYwKGhvc3OsscS2qg5KMvTjPbzIvZdr5xT dKpYiLHc4h82EhhF0TBI62zT7VGWjpYdqEnXj/TP0G1AfO2TriJT+tepJvl91+a9Gd8O 81evsOIFT0a2SDiDdm/H9t5lUech8HSJY09I9/OPLmP8QTwKfJPmG6YWpzJxbz17cvbw wbOIGX1lKbWUrZnH8TqS+opKUebjVkvxagsk27luBByzrp/AzQEDsWB6hHp7ypDrMD6l jIVA== X-Forwarded-Encrypted: i=1; AJvYcCXNJ9AkfCkulNra9ZElV9CslSOq6Lw7wkqQV/b/eimKjiklXMreOAr475fyHe27wIwkIUMYSZcC8RuUqpF4pt/07qgWRpedyxfnOVvq X-Gm-Message-State: AOJu0YydMXsBksgQNyqzvVltOrAyWJ10azRpOXx7RYdcfKMZKWAIMDxN UnNP6fEutGfUHRhCbB/dZi9rwUan/L6/VbJ5I5Jy0xJIySRdHMZSX0z1looO5cQ= X-Google-Smtp-Source: AGHT+IHLgMPdjmt0sDFCR6yF11VZsrAEjljxhSUWErrndmlusWxFwhB4XqPZLawRIvpO/YA7zmUOuQ== X-Received: by 2002:a17:902:f542:b0:1fb:779e:4fd0 with SMTP id d9443c01a7336-1ff04824612mr103219635ad.24.1722271571147; Mon, 29 Jul 2024 09:46:11 -0700 (PDT) Received: from charlie.ba.rivosinc.com ([64.71.180.162]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1fed7d401c6sm85480545ad.117.2024.07.29.09.46.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jul 2024 09:46:10 -0700 (PDT) From: Charlie Jenkins Date: Fri, 26 Jul 2024 22:29:33 -0700 Subject: [PATCH v2 3/8] libperf: Introduce perf_{evsel, evlist}__open_opt with extensible struct opts Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20240726-overflow_check_libperf-v2-3-7d154dcf6bea@rivosinc.com> References: <20240726-overflow_check_libperf-v2-0-7d154dcf6bea@rivosinc.com> In-Reply-To: <20240726-overflow_check_libperf-v2-0-7d154dcf6bea@rivosinc.com> To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Andrii Nakryiko , Eduard Zingerman , Alexei Starovoitov , Daniel Borkmann , Martin KaFai Lau , Song Liu , Yonghong Song , John Fastabend , KP Singh , Stanislav Fomichev , Hao Luo Cc: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, bpf@vger.kernel.org, Charlie Jenkins , Shunsuke Nakamura X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1722271564; l=7074; i=charlie@rivosinc.com; s=20231120; h=from:subject:message-id; bh=+5d9mj+wHf0VzhQfYQKCxev5dn5+38ZS8YUUwro/Nzs=; b=4PBFwV6Nyh9X5DwMJ8/GEDy/ecDevgP9/dGJd4n4JTycAjE7K//b7Dbg213JCH5ss5kjqMWkL MfL/jvDn1RkDy5EvdHb4DEd1g9XHj0Z4wrpg4+lHQWiHaPCPH6VQsSK X-Developer-Key: i=charlie@rivosinc.com; a=ed25519; pk=t4RSWpMV1q5lf/NWIeR9z58bcje60/dbtxxmoSfBEcs= From: Shunsuke Nakamura Introduce perf_{evsel, evlist}__open_opt with extensible structure opts. The mechanism of the extensible structure opts imitates tools/lib/bpf/libbpf.h. Currently, only open_flags is supported for the opts structure. Signed-off-by: Shunsuke Nakamura Signed-off-by: Charlie Jenkins --- tools/lib/perf/Documentation/libperf.txt | 10 ++++++++++ tools/lib/perf/evlist.c | 20 ++++++++++++++++++++ tools/lib/perf/evsel.c | 26 +++++++++++++++++++++++++- tools/lib/perf/include/perf/evlist.h | 3 +++ tools/lib/perf/include/perf/evsel.h | 23 +++++++++++++++++++++++ tools/lib/perf/libperf.map | 2 ++ 6 files changed, 83 insertions(+), 1 deletion(-) diff --git a/tools/lib/perf/Documentation/libperf.txt b/tools/lib/perf/Docu= mentation/libperf.txt index fcfb9499ef9c..83827b94617a 100644 --- a/tools/lib/perf/Documentation/libperf.txt +++ b/tools/lib/perf/Documentation/libperf.txt @@ -132,6 +132,16 @@ SYNOPSIS }; }; =20 + struct perf_evsel_open_opts { + /* size of this struct, for forward/backward compatibility */ + size_t sz; + + unsigned long open_flags; /* perf_event_open flags */ + }; + #define perf_evsel_open_opts__last_field open_flags + + #define LIBPERF_OPTS(TYPE, NAME, ...) + struct perf_evsel *perf_evsel__new(struct perf_event_attr *attr); void perf_evsel__delete(struct perf_evsel *evsel); int perf_evsel__open(struct perf_evsel *evsel, struct perf_cpu_map *cpus, diff --git a/tools/lib/perf/evlist.c b/tools/lib/perf/evlist.c index c6d67fc9e57e..7aa62f90f13b 100644 --- a/tools/lib/perf/evlist.c +++ b/tools/lib/perf/evlist.c @@ -753,3 +753,23 @@ void perf_evlist__go_system_wide(struct perf_evlist *e= vlist, struct perf_evsel * __perf_evlist__propagate_maps(evlist, evsel); } } + +int perf_evlist__open_opts(struct perf_evlist *evlist, + struct perf_evsel_open_opts *opts) +{ + struct perf_evsel *evsel; + int err; + + perf_evlist__for_each_entry(evlist, evsel) { + err =3D perf_evsel__open_opts(evsel, evsel->cpus, + evsel->threads, opts); + if (err < 0) + goto out_err; + } + + return 0; + +out_err: + perf_evlist__close(evlist); + return err; +} diff --git a/tools/lib/perf/evsel.c b/tools/lib/perf/evsel.c index c07160953224..96ecf3e5c8b4 100644 --- a/tools/lib/perf/evsel.c +++ b/tools/lib/perf/evsel.c @@ -16,8 +16,13 @@ #include #include #include +#include +#include +#include #include #include +#include +#include "internal.h" =20 void perf_evsel__init(struct perf_evsel *evsel, struct perf_event_attr *at= tr, int idx) @@ -26,6 +31,7 @@ void perf_evsel__init(struct perf_evsel *evsel, struct pe= rf_event_attr *attr, evsel->attr =3D *attr; evsel->idx =3D idx; evsel->leader =3D evsel; + evsel->open_flags =3D 0; } =20 struct perf_evsel *perf_evsel__new(struct perf_event_attr *attr) @@ -160,7 +166,7 @@ int perf_evsel__open(struct perf_evsel *evsel, struct p= erf_cpu_map *cpus, =20 fd =3D sys_perf_event_open(&evsel->attr, threads->map[thread].pid, - cpu, group_fd, 0); + cpu, group_fd, evsel->open_flags); =20 if (fd < 0) { err =3D -errno; @@ -555,3 +561,21 @@ void perf_counts_values__scale(struct perf_counts_valu= es *count, if (pscaled) *pscaled =3D scaled; } + +int perf_evsel__open_opts(struct perf_evsel *evsel, struct perf_cpu_map *c= pus, + struct perf_thread_map *threads, + struct perf_evsel_open_opts *opts) +{ + int err =3D 0; + + if (!OPTS_VALID(opts, perf_evsel_open_opts)) { + err =3D -EINVAL; + return err; + } + + evsel->open_flags =3D OPTS_GET(opts, open_flags, 0); + + err =3D perf_evsel__open(evsel, cpus, threads); + + return err; +} diff --git a/tools/lib/perf/include/perf/evlist.h b/tools/lib/perf/include/= perf/evlist.h index e894b770779e..37ac44364d22 100644 --- a/tools/lib/perf/include/perf/evlist.h +++ b/tools/lib/perf/include/perf/evlist.h @@ -9,6 +9,7 @@ struct perf_evlist; struct perf_evsel; struct perf_cpu_map; struct perf_thread_map; +struct perf_evsel_open_opts; =20 LIBPERF_API void perf_evlist__add(struct perf_evlist *evlist, struct perf_evsel *evsel); @@ -48,4 +49,6 @@ LIBPERF_API struct perf_mmap *perf_evlist__next_mmap(stru= ct perf_evlist *evlist, =20 LIBPERF_API void perf_evlist__set_leader(struct perf_evlist *evlist); LIBPERF_API int perf_evlist__nr_groups(struct perf_evlist *evlist); +LIBPERF_API int perf_evlist__open_opts(struct perf_evlist *evlist, + struct perf_evsel_open_opts *opts); #endif /* __LIBPERF_EVLIST_H */ diff --git a/tools/lib/perf/include/perf/evsel.h b/tools/lib/perf/include/p= erf/evsel.h index 6f92204075c2..8eb3927f3cd0 100644 --- a/tools/lib/perf/include/perf/evsel.h +++ b/tools/lib/perf/include/perf/evsel.h @@ -5,6 +5,7 @@ #include #include #include +#include #include =20 struct perf_evsel; @@ -25,6 +26,24 @@ struct perf_counts_values { }; }; =20 +struct perf_evsel_open_opts { + /* size of this struct, for forward/backward compatibility */ + size_t sz; + + unsigned long open_flags; /* perf_event_open flags */ +}; + +#define perf_evsel_open_opts__last_field open_flags + +#define LIBPERF_OPTS(TYPE, NAME, ...) \ + struct TYPE NAME =3D ({ \ + memset(&NAME, 0, sizeof(struct TYPE)); \ + (struct TYPE) { \ + .sz =3D sizeof(struct TYPE), \ + __VA_ARGS__ \ + }; \ + }) + LIBPERF_API struct perf_evsel *perf_evsel__new(struct perf_event_attr *att= r); LIBPERF_API void perf_evsel__delete(struct perf_evsel *evsel); LIBPERF_API int perf_evsel__open(struct perf_evsel *evsel, struct perf_cpu= _map *cpus, @@ -46,5 +65,9 @@ LIBPERF_API struct perf_thread_map *perf_evsel__threads(s= truct perf_evsel *evsel LIBPERF_API struct perf_event_attr *perf_evsel__attr(struct perf_evsel *ev= sel); LIBPERF_API void perf_counts_values__scale(struct perf_counts_values *coun= t, bool scale, __s8 *pscaled); +LIBPERF_API int perf_evsel__open_opts(struct perf_evsel *evsel, + struct perf_cpu_map *cpus, + struct perf_thread_map *threads, + struct perf_evsel_open_opts *opts); =20 #endif /* __LIBPERF_EVSEL_H */ diff --git a/tools/lib/perf/libperf.map b/tools/lib/perf/libperf.map index 2aa79b696032..84fed76621cb 100644 --- a/tools/lib/perf/libperf.map +++ b/tools/lib/perf/libperf.map @@ -29,6 +29,7 @@ LIBPERF_0.0.1 { perf_evsel__enable; perf_evsel__disable; perf_evsel__open; + perf_evsel__open_opts; perf_evsel__close; perf_evsel__mmap; perf_evsel__munmap; @@ -40,6 +41,7 @@ LIBPERF_0.0.1 { perf_evlist__new; perf_evlist__delete; perf_evlist__open; + perf_evlist__open_opts; perf_evlist__close; perf_evlist__enable; perf_evlist__disable; --=20 2.44.0 From nobody Mon Feb 9 01:06:35 2026 Received: from mail-pl1-f171.google.com (mail-pl1-f171.google.com [209.85.214.171]) (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 AA31D187863 for ; Mon, 29 Jul 2024 16:46:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.171 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722271575; cv=none; b=EDsZzKYbt2zV5WtfL8ikGJnZgSSkMBmhB4m7Y15shgHv5vbUvKjfTdbRp9IXaPSXENVk1iiylZWphe+FOlf9r9sLSKatdjKQQIW8OypqY8qywMpFnRX8a9Y9NhxlGxWk4Jf7EBE2CJg8/3wXubHF+iqY5H1BvRIknDGhFu0WQPY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722271575; c=relaxed/simple; bh=NpgF1/kK1yOkWx7OSvhib/FvJeG2/8hZAiow4pKggL4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=aFEzM9CE5enhMvnqXeQv2/5CkJpdOR4IF7GllTFRlC/epzbFycR3mI+5crd8X2m61U/+CV+219Mx8H77No9mEfNqbYO8ovXjh29Lu394P7rf2nP7rVNuFl43Zx98ku0Vv1nw4LRtmyKUn9htcndq+NqrA2Aecmy6D46ZSDkefI8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com; spf=pass smtp.mailfrom=rivosinc.com; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b=TMwZha5V; arc=none smtp.client-ip=209.85.214.171 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b="TMwZha5V" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-1fc587361b6so20937805ad.2 for ; Mon, 29 Jul 2024 09:46:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1722271573; x=1722876373; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=6sq/wgKkNEoeBfHdwGP5Fnla8E6KMSluE3DaT/hx6/0=; b=TMwZha5Vj0sKoxExJ1Z/M1IWi7zVxSwT2M+iy1OacbKhTpillhnuKWWwgvUKozSrvM 9A8xODtYCaadYioRhXt8gWNmvVDPi8dvIqHmVJbkxSvld8oZBXTsyKtYjDEgxV8PZJmd vLkOgH5R/a+xjjH/o5QVXZKEfgOLPbSoE95e+2UgpJmLUD39i6VdmKPw8UGsc9upjw5o VC4gPLGC8MNk+Tv2GA48RoY2kh2tfFDKrylifX/f5BBsTREzK7yGSwRisei/noVdTmTL qkwBgxLOhLcQ9uAUUJzK4uI5gYZM/1pLqT4PSCLquh17Hiq0iiTC9d3LZnzm35n0LJzS VZ3A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1722271573; x=1722876373; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=6sq/wgKkNEoeBfHdwGP5Fnla8E6KMSluE3DaT/hx6/0=; b=twEcR1WzuY82Lqfo6Tuct34izLPVxHWGyCuuHcQPWL3eM0woF3nc/llpnDB7HpLboH Rw3CvbIaIGgTLFjWllO3GEJJ3Wqyl1lazLSRoCahGa5q/QuJquI2Vyn4umEEs2ErQts3 /NQzvt/IwwtMWyusG89q5zgYJvjBYnYZbbFuU66/VASnYgKspNKmI826pb/LEAiUfQkv FHpKbQl749D+I8FuoxVrRCpbqrSdyuK9qaDAJnsDLWHklXcO78EWEsU+BS2S2fvY0rl6 yYNmWj6/phoDbNd7959RbW9HBcO5GFUILsArb0kQ+An1tmz5D0hgG2/4p74tBYoss8ui /sXQ== X-Forwarded-Encrypted: i=1; AJvYcCWhq59xa4yyjqCugvXvOFzJIaXlkLDRIMxOHBTZTVmQ1579nCJ+Skjgb4Dhe2MfbaMuhJoFLpH1HVpWcgcrjlZVi+BUALzmghX0xUst X-Gm-Message-State: AOJu0Yywv++ZHeJRrTqxfPrYmwIcFo5T8JAGzjOoGBhszR3/pntESfjl W38xyiUY0oTd4ve7Lnogl+EK26dXOx+J2oJ09+RRGalEm7rJFKRsdXR9k1a0sig= X-Google-Smtp-Source: AGHT+IHIU4ZqwMOi+9pCWVyiNYiqbMYPUL7gmvjWFUUZYuciqgVS+40fRq++sBF6vHIYSXwLkZudiw== X-Received: by 2002:a17:902:d491:b0:1fd:709a:2978 with SMTP id d9443c01a7336-1ff0485ba87mr59797395ad.38.1722271572808; Mon, 29 Jul 2024 09:46:12 -0700 (PDT) Received: from charlie.ba.rivosinc.com ([64.71.180.162]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1fed7d401c6sm85480545ad.117.2024.07.29.09.46.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jul 2024 09:46:12 -0700 (PDT) From: Charlie Jenkins Date: Fri, 26 Jul 2024 22:29:34 -0700 Subject: [PATCH v2 4/8] libperf: Add support for overflow handling of sampling events Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20240726-overflow_check_libperf-v2-4-7d154dcf6bea@rivosinc.com> References: <20240726-overflow_check_libperf-v2-0-7d154dcf6bea@rivosinc.com> In-Reply-To: <20240726-overflow_check_libperf-v2-0-7d154dcf6bea@rivosinc.com> To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Andrii Nakryiko , Eduard Zingerman , Alexei Starovoitov , Daniel Borkmann , Martin KaFai Lau , Song Liu , Yonghong Song , John Fastabend , KP Singh , Stanislav Fomichev , Hao Luo Cc: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, bpf@vger.kernel.org, Charlie Jenkins , Shunsuke Nakamura X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1722271564; l=5292; i=charlie@rivosinc.com; s=20231120; h=from:subject:message-id; bh=8zwxFTYoYw8Wodjo527mV6UDvzQ+n1PNG6cEAoqFF1c=; b=kuo9VfbWPQ1nC8bXfn/ATV7gFoalcR9fMmHKAB0r+H6d1E/DkyARWRHZKCQpUjWnGHSDTpwTS qtCb21rRC7iBHI35lGaYorH25PUiulnNYyi3xrmSbD4e9VOHkUtdCLZ X-Developer-Key: i=charlie@rivosinc.com; a=ed25519; pk=t4RSWpMV1q5lf/NWIeR9z58bcje60/dbtxxmoSfBEcs= From: Shunsuke Nakamura Extend the fields of the opts structure to set up overflow handling for sampling events. Also, add processing to set signal handlers in perf_evsel__open_opts. Signed-off-by: Shunsuke Nakamura Signed-off-by: Charlie Jenkins --- tools/lib/perf/Documentation/libperf.txt | 6 ++- tools/lib/perf/Makefile | 1 + tools/lib/perf/evsel.c | 79 ++++++++++++++++++++++++++++= ++++ tools/lib/perf/include/perf/evsel.h | 6 ++- tools/lib/perf/tests/test-evlist.c | 1 - 5 files changed, 90 insertions(+), 3 deletions(-) diff --git a/tools/lib/perf/Documentation/libperf.txt b/tools/lib/perf/Docu= mentation/libperf.txt index 83827b94617a..bb99534d5855 100644 --- a/tools/lib/perf/Documentation/libperf.txt +++ b/tools/lib/perf/Documentation/libperf.txt @@ -137,8 +137,12 @@ SYNOPSIS size_t sz; =20 unsigned long open_flags; /* perf_event_open flags */ + int fcntl_flags; + unsigned int signal; + int owner_type; /* value for F_SETOWN_EX */ + struct sigaction *sigact; }; - #define perf_evsel_open_opts__last_field open_flags + #define perf_evsel_open_opts__last_field sigact =20 #define LIBPERF_OPTS(TYPE, NAME, ...) =20 diff --git a/tools/lib/perf/Makefile b/tools/lib/perf/Makefile index 3a9b2140aa04..9dade2ad91bd 100644 --- a/tools/lib/perf/Makefile +++ b/tools/lib/perf/Makefile @@ -75,6 +75,7 @@ override CFLAGS +=3D -Werror -Wall override CFLAGS +=3D -fPIC override CFLAGS +=3D $(INCLUDES) override CFLAGS +=3D -fvisibility=3Dhidden +override CFLAGS +=3D -D_GNU_SOURCE =20 all: =20 diff --git a/tools/lib/perf/evsel.c b/tools/lib/perf/evsel.c index 96ecf3e5c8b4..17d3d9a88c23 100644 --- a/tools/lib/perf/evsel.c +++ b/tools/lib/perf/evsel.c @@ -562,6 +562,79 @@ void perf_counts_values__scale(struct perf_counts_valu= es *count, *pscaled =3D scaled; } =20 +static int perf_evsel__run_fcntl(struct perf_evsel *evsel, + unsigned int cmd, unsigned long arg, + int cpu_map_idx) +{ + int thread; + + for (thread =3D 0; thread < xyarray__max_y(evsel->fd); thread++) { + int err; + int *fd =3D FD(evsel, cpu_map_idx, thread); + + if (!fd || *fd < 0) + return -1; + + err =3D fcntl(*fd, cmd, arg); + if (err) + return err; + } + + return 0; +} + +static int perf_evsel__set_signal_handler(struct perf_evsel *evsel, + struct perf_evsel_open_opts *opts) +{ + unsigned int fcntl_flags; + unsigned int signal; + struct f_owner_ex owner; + struct sigaction *sigact; + int cpu_map_idx; + int err =3D 0; + + fcntl_flags =3D OPTS_GET(opts, fcntl_flags, (O_RDWR | O_NONBLOCK | O_ASYN= C)); + signal =3D OPTS_GET(opts, signal, SIGIO); + owner.type =3D OPTS_GET(opts, owner_type, F_OWNER_PID); + sigact =3D OPTS_GET(opts, sigact, NULL); + + if (fcntl_flags =3D=3D 0 && signal =3D=3D 0 && !owner.type =3D=3D 0 && si= gact =3D=3D 0) + return err; + + err =3D sigaction(signal, sigact, NULL); + if (err) + return err; + + switch (owner.type) { + case F_OWNER_PID: + owner.pid =3D getpid(); + break; + case F_OWNER_TID: + owner.pid =3D syscall(SYS_gettid); + break; + case F_OWNER_PGRP: + default: + return -1; + } + + for (cpu_map_idx =3D 0; cpu_map_idx < xyarray__max_x(evsel->fd); cpu_map_= idx++) { + err =3D perf_evsel__run_fcntl(evsel, F_SETFL, fcntl_flags, cpu_map_idx); + if (err) + return err; + + err =3D perf_evsel__run_fcntl(evsel, F_SETSIG, signal, cpu_map_idx); + if (err) + return err; + + err =3D perf_evsel__run_fcntl(evsel, F_SETOWN_EX, + (unsigned long)&owner, cpu_map_idx); + if (err) + return err; + } + + return err; +} + int perf_evsel__open_opts(struct perf_evsel *evsel, struct perf_cpu_map *c= pus, struct perf_thread_map *threads, struct perf_evsel_open_opts *opts) @@ -576,6 +649,12 @@ int perf_evsel__open_opts(struct perf_evsel *evsel, st= ruct perf_cpu_map *cpus, evsel->open_flags =3D OPTS_GET(opts, open_flags, 0); =20 err =3D perf_evsel__open(evsel, cpus, threads); + if (err) + return err; + + err =3D perf_evsel__set_signal_handler(evsel, opts); + if (err) + return err; =20 return err; } diff --git a/tools/lib/perf/include/perf/evsel.h b/tools/lib/perf/include/p= erf/evsel.h index 8eb3927f3cd0..344808f23371 100644 --- a/tools/lib/perf/include/perf/evsel.h +++ b/tools/lib/perf/include/perf/evsel.h @@ -31,9 +31,13 @@ struct perf_evsel_open_opts { size_t sz; =20 unsigned long open_flags; /* perf_event_open flags */ + int fcntl_flags; + int signal; + int owner_type; /* value for F_SETOWN_EX */ + struct sigaction *sigact; }; =20 -#define perf_evsel_open_opts__last_field open_flags +#define perf_evsel_open_opts__last_field sigact =20 #define LIBPERF_OPTS(TYPE, NAME, ...) \ struct TYPE NAME =3D ({ \ diff --git a/tools/lib/perf/tests/test-evlist.c b/tools/lib/perf/tests/test= -evlist.c index 10f70cb41ff1..3a833f0349d3 100644 --- a/tools/lib/perf/tests/test-evlist.c +++ b/tools/lib/perf/tests/test-evlist.c @@ -1,5 +1,4 @@ // SPDX-License-Identifier: GPL-2.0 -#define _GNU_SOURCE // needed for sched.h to get sched_[gs]etaffinity and = CPU_(ZERO,SET) #include #include #include --=20 2.44.0 From nobody Mon Feb 9 01:06:35 2026 Received: from mail-pl1-f170.google.com (mail-pl1-f170.google.com [209.85.214.170]) (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 2CDC715A4B5 for ; Mon, 29 Jul 2024 16:46:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722271577; cv=none; b=IN7DJp17+WFmWGQA2n1zlkU7DExz5ECtRDU74tQXdQJKFFWvQBIqrp1ZM2Fr2YSDk4hTqnvqSNr7nTKhX7qsXRkZLaRbXlDqgn8eqpM6paqLS20jMjXWSFQenQoAUpBOdKNOwNTajlmXB2UVQU/zZyxsEDbi+kInrcy2So+vQVo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722271577; c=relaxed/simple; bh=r/jk1bPDMru1N5AoMkuunoH2pb49M7nOjU+z9/MKibs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=QDNygh5AbB3c+6TR1RjnSdH5U9j1zZ8p8xtk/af+xBtUqJHNUZ8ssDe4khL6vM98y6Ff/+sRlpVNPe9I6fym5RR/4NitpjFiqsGuUKciE+XQtjjWcaHJf+JczRMOrQ1RagrkbufKmWeV8rRJc0dE1GmOpUq85X50VKdBYy3YCmk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com; spf=pass smtp.mailfrom=rivosinc.com; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b=1oIw8pz4; arc=none smtp.client-ip=209.85.214.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b="1oIw8pz4" Received: by mail-pl1-f170.google.com with SMTP id d9443c01a7336-1fd90c2fc68so23173175ad.1 for ; Mon, 29 Jul 2024 09:46:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1722271574; x=1722876374; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=hggTn66JrbOD+sBIjW9DCUZjKZdbaIlQ6N1BF/br8RA=; b=1oIw8pz4xw91U1lrSFWpH2e8AatUcCm+BOQmYAcl77qG6e+K0VIGBaC817vD4ocYTu ADb4hUs9AcZ660dCqipoX7LTdcMnbFHqRqrg7LfdqzwYJvLCK00rqToDpUij9nVvWFzk WZ0j2lqkmpqih7CVB3ZIQ/HrqvOaNnEJm8+5LMouIKsiOglMvHYxqlSxCzf9EFfJYWFK hi797EZs/3Lu01f6jAQCuPnj4UmixOG2VGy0x+CPJ5lRd1T4XESJvIM2jqe0O66jP4zK w2dgn1dpxlntwsMad9puw4KIkqagKgdXnZjgfHq/o4HmYn/fF2gofZ24RK+5ES8VkgrE 952g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1722271574; x=1722876374; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=hggTn66JrbOD+sBIjW9DCUZjKZdbaIlQ6N1BF/br8RA=; b=gp/vG/7lXS1I1BwSlPMScCVdJSBIodXBqSWMSqX1aUMSRZV8nKxpo13UC75L7I7aE0 AXhyNZtq27unpQ/qSijdRbTRz9L7uYDIr5i16PcZr2XrEcrddEc19jxH77bQzMGEHCQ7 ey8oI3La6yrKpBuYNquiG0yxnrthCyiIXyxu4qPAvXTdpGwhaqiXRzsSoCvdHj6LiM39 bVH7Xq5hwQyuDhqzFASc1532ztFOUaGx/z4+yl851QA/Tu26g2DXQXZ81B9tTdgUONYu QxFvD+RTgdAVfljFpyPXDQJ0QBt599mRPHa/QC4eXyZ3RuODkmk1bb7ukIizZYjQzfK6 9VDg== X-Forwarded-Encrypted: i=1; AJvYcCX2X5HmpzM/anky6/ZnyrPW4zuvAx54Qt+bcS8RM8Jvpn8R1vCYzZvUeh7UTv1SbUW7zdpsXthq05uQl0LkwAqrmy9dpiZITXCx7ahs X-Gm-Message-State: AOJu0YzfErbno9e4VZBuspLNKPtj0mrx6Ygfjk2d8TxyIgD0l71TWv4e iwK+nK+dMoCUnFdGVqBYUAa/aDibTrtKFT0vAege/dTEyuXiiNsJ+MDuaEQ1HFg= X-Google-Smtp-Source: AGHT+IHwput5h4gdG/FQNNx/hl3tLZc38qQQiY4RziyanWxKoKdtV+dUnUDnm99B90DEvM0zWr8vPg== X-Received: by 2002:a17:902:f68d:b0:1fd:9d0c:99a2 with SMTP id d9443c01a7336-1ff0492e124mr76115145ad.54.1722271574501; Mon, 29 Jul 2024 09:46:14 -0700 (PDT) Received: from charlie.ba.rivosinc.com ([64.71.180.162]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1fed7d401c6sm85480545ad.117.2024.07.29.09.46.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jul 2024 09:46:14 -0700 (PDT) From: Charlie Jenkins Date: Fri, 26 Jul 2024 22:29:35 -0700 Subject: [PATCH v2 5/8] libperf: Add perf_evsel__has_fd() functions Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20240726-overflow_check_libperf-v2-5-7d154dcf6bea@rivosinc.com> References: <20240726-overflow_check_libperf-v2-0-7d154dcf6bea@rivosinc.com> In-Reply-To: <20240726-overflow_check_libperf-v2-0-7d154dcf6bea@rivosinc.com> To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Andrii Nakryiko , Eduard Zingerman , Alexei Starovoitov , Daniel Borkmann , Martin KaFai Lau , Song Liu , Yonghong Song , John Fastabend , KP Singh , Stanislav Fomichev , Hao Luo Cc: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, bpf@vger.kernel.org, Charlie Jenkins , Shunsuke Nakamura X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1722271564; l=2952; i=charlie@rivosinc.com; s=20231120; h=from:subject:message-id; bh=5bOJ2b703722JpraMU92aYFsGhC7VVqbjBOBXBX1n9w=; b=qvpfqD8c3mf+ibeI5OmudMFTmZt9WlbIgEglZdGnFxeEODawAp89wEr+czBg6PIJlpPnwuHka VyXXS8w7cRKCzleuS1aTn0nSnupQnm74zOk1NTd0Isx8R8RG65UAKN1 X-Developer-Key: i=charlie@rivosinc.com; a=ed25519; pk=t4RSWpMV1q5lf/NWIeR9z58bcje60/dbtxxmoSfBEcs= From: Shunsuke Nakamura Add the following functions: perf_evsel__has_fd to check for perf events with the file descriptor specified in the argument. This function can be used in signal handlers to check overflow. Signed-off-by: Shunsuke Nakamura Signed-off-by: Charlie Jenkins --- tools/lib/perf/Documentation/libperf.txt | 1 + tools/lib/perf/evsel.c | 18 ++++++++++++++++++ tools/lib/perf/include/perf/evsel.h | 1 + tools/lib/perf/libperf.map | 1 + 4 files changed, 21 insertions(+) diff --git a/tools/lib/perf/Documentation/libperf.txt b/tools/lib/perf/Docu= mentation/libperf.txt index bb99534d5855..f1bfe6b6e78a 100644 --- a/tools/lib/perf/Documentation/libperf.txt +++ b/tools/lib/perf/Documentation/libperf.txt @@ -161,6 +161,7 @@ SYNOPSIS int perf_evsel__enable_cpu(struct perf_evsel *evsel, int cpu_map_idx); int perf_evsel__disable(struct perf_evsel *evsel); int perf_evsel__disable_cpu(struct perf_evsel *evsel, int cpu_map_idx); + bool perf_evsel__has_fd(struct perf_evsel *evsel, int fd); struct perf_cpu_map *perf_evsel__cpus(struct perf_evsel *evsel); struct perf_thread_map *perf_evsel__threads(struct perf_evsel *evsel); struct perf_event_attr *perf_evsel__attr(struct perf_evsel *evsel); diff --git a/tools/lib/perf/evsel.c b/tools/lib/perf/evsel.c index 17d3d9a88c23..6b98cba6eb4f 100644 --- a/tools/lib/perf/evsel.c +++ b/tools/lib/perf/evsel.c @@ -658,3 +658,21 @@ int perf_evsel__open_opts(struct perf_evsel *evsel, st= ruct perf_cpu_map *cpus, =20 return err; } + +bool perf_evsel__has_fd(struct perf_evsel *evsel, int fd) +{ + int cpu_map_idx; + int thread; + int *evsel_fd; + + for (cpu_map_idx =3D 0; cpu_map_idx < xyarray__max_x(evsel->fd); ++cpu_ma= p_idx) { + for (thread =3D 0; thread < xyarray__max_y(evsel->fd); ++thread) { + evsel_fd =3D FD(evsel, cpu_map_idx, thread); + + if (fd =3D=3D *evsel_fd) + return true; + } + } + + return false; +} diff --git a/tools/lib/perf/include/perf/evsel.h b/tools/lib/perf/include/p= erf/evsel.h index 344808f23371..77816a35c383 100644 --- a/tools/lib/perf/include/perf/evsel.h +++ b/tools/lib/perf/include/perf/evsel.h @@ -73,5 +73,6 @@ LIBPERF_API int perf_evsel__open_opts(struct perf_evsel *= evsel, struct perf_cpu_map *cpus, struct perf_thread_map *threads, struct perf_evsel_open_opts *opts); +LIBPERF_API bool perf_evsel__has_fd(struct perf_evsel *evsel, int fd); =20 #endif /* __LIBPERF_EVSEL_H */ diff --git a/tools/lib/perf/libperf.map b/tools/lib/perf/libperf.map index 84fed76621cb..f68519e17885 100644 --- a/tools/lib/perf/libperf.map +++ b/tools/lib/perf/libperf.map @@ -38,6 +38,7 @@ LIBPERF_0.0.1 { perf_evsel__cpus; perf_evsel__threads; perf_evsel__attr; + perf_evsel__has_fd; perf_evlist__new; perf_evlist__delete; perf_evlist__open; --=20 2.44.0 From nobody Mon Feb 9 01:06:35 2026 Received: from mail-pl1-f181.google.com (mail-pl1-f181.google.com [209.85.214.181]) (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 D3CA5188CD7 for ; Mon, 29 Jul 2024 16:46:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.181 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722271579; cv=none; b=YwmII3QLNj9L4ZY1zIr1AUIumtTvtHBJPr70iWAzYOaWBe0wp1tz6dTG4oSQm7HPqJCN3LbUCfyVAEHLXkXCeiiixjaNWmdjCHhJytDd0cGrgVVIn1s2pZsbKK7x8jAvUDxyBbI2RHebuSMkpg9832wka+f/JZzWssW2NVjd398= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722271579; c=relaxed/simple; bh=etOVA7exvPfFTzoKY8Fso7Jdm7CkckVi5SBT4zKGBQQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FLtWjgIWk3hG6F0CZmCAXL4sW13NgTJNGQm9+3k0Q5HsKe8yjJr64EQokyFlTYwkNmTHOvC5G0AuQFz2WuQ4/PD2kqHg0CwGJXlahAh8sqehE7ArGg6WQo62bSuEJ7Dtw/gpszpph0pzf9CAWzR4bBmBGEUMLZwd1vBuyJcSbgQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com; spf=pass smtp.mailfrom=rivosinc.com; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b=si/D5Nw5; arc=none smtp.client-ip=209.85.214.181 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b="si/D5Nw5" Received: by mail-pl1-f181.google.com with SMTP id d9443c01a7336-1fd90c2fc68so23173535ad.1 for ; Mon, 29 Jul 2024 09:46:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1722271576; x=1722876376; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=TiJ7fM85IMGMjgBBVYYw2ZNteCJKvpwjrHE2P481mUM=; b=si/D5Nw5bXzZWCnofDgsL7pgSb1ARcMF2ZLz8CGawwrDXFSeujISVWosTh1pWrwwgi Y5SLPzHYOEIbdm8DA56jrh2iGxIy6gr3J2fi0DQDhUy6/pugFDg4pRZa/QTstt2prcE5 1LELcbFNQy+dBWO1/Os5CFWfOjRP5TKdzcpZ529TX7PxotrQhoMTnew07+/LzswPEdPp R2woQPlsInLrY1WJEbLfM1a8zBltJ8OLvwN2QFP5q+Mi7BJJOoLNN1qI/2M7EPs6a7hj +frRa4BkHh1Ngzw7N+CKCdEpoSyoKMDbavgj9LT9b8+vWUj/YuQE1DQrlZYpua2wSmrF TwQQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1722271576; x=1722876376; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=TiJ7fM85IMGMjgBBVYYw2ZNteCJKvpwjrHE2P481mUM=; b=N6NYnt0mQA0UL2rfNbSjlP5BKbYigzUr8a2i5ZP8wYxQ+ZlgBPxjMkpjsXfxHHLZsU +UfS8/MKHyF+fGdcb+9L1ZqS7kaUvhpVVSKH9v0tZlb0iNCc6WV6u4402lxZQmG2qGGt tXwUkfrSsCYuSctk9d7IsT7rAS6PF+0+1JzNLF6yarAAyJDHWefePbkARnwGHTmzgJ+S SnB9snlFXjldSkx/DJR3SHtWLxDnIqnzldQPS9d5+LxeJ6mD8Shzol6PWNi1LRmx1Lwx 9cS4k8uKG9ELwrnsClb1INjSsvdk28lWy9pF5nHG1djZ0WWJWNhAMwp7hnTaAswaZjge ZiRg== X-Forwarded-Encrypted: i=1; AJvYcCVslcx8hAkmonZ0t26CzikRioDXQVStFH1JYVEVkDxF1AGUgW0D3+58nX0ScB42FFwphihgUp700AshYVtey0f5phE34vjd1AcpvbZ/ X-Gm-Message-State: AOJu0YybCntw7NtcYzmyvzkIlIVk1gkxx/UtxgqUpdozveUmJtQ5gEZt byr3JmwogTqjq9Uw5lUzDGpZEWGhFYS5E12YnzNHOvwQDkyWDQilVv0B6z6MReI= X-Google-Smtp-Source: AGHT+IFhuipRzGKQii+jATiqJQQJZtOk5vz10sHKaqUAKhBj4Dqb4RoBXjOU9eIeu9ns2+sh073puA== X-Received: by 2002:a17:903:1245:b0:1fb:3e8c:95a6 with SMTP id d9443c01a7336-1ff048e59c8mr60825725ad.40.1722271576219; Mon, 29 Jul 2024 09:46:16 -0700 (PDT) Received: from charlie.ba.rivosinc.com ([64.71.180.162]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1fed7d401c6sm85480545ad.117.2024.07.29.09.46.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jul 2024 09:46:15 -0700 (PDT) From: Charlie Jenkins Date: Fri, 26 Jul 2024 22:29:36 -0700 Subject: [PATCH v2 6/8] libperf: Add perf_evsel__{refresh, period}() functions Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20240726-overflow_check_libperf-v2-6-7d154dcf6bea@rivosinc.com> References: <20240726-overflow_check_libperf-v2-0-7d154dcf6bea@rivosinc.com> In-Reply-To: <20240726-overflow_check_libperf-v2-0-7d154dcf6bea@rivosinc.com> To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Andrii Nakryiko , Eduard Zingerman , Alexei Starovoitov , Daniel Borkmann , Martin KaFai Lau , Song Liu , Yonghong Song , John Fastabend , KP Singh , Stanislav Fomichev , Hao Luo Cc: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, bpf@vger.kernel.org, Charlie Jenkins , Shunsuke Nakamura X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1722271564; l=6171; i=charlie@rivosinc.com; s=20231120; h=from:subject:message-id; bh=aVBjIsxJT8LS4fAGhXq/xpQCeYcYwi9ufo4Vs2pLLv0=; b=4ordREpvBQFF9nRLjzkG5AYtTDom9kp+2J+geJhO9Yp6HMv/+UWcHQtAxs9+iatyKJaqco8NC SpRNHVe7k69ClWIp01TemQTm7dk2bf/Zfb5bcN84iq/MmtiCHsCmzla X-Developer-Key: i=charlie@rivosinc.com; a=ed25519; pk=t4RSWpMV1q5lf/NWIeR9z58bcje60/dbtxxmoSfBEcs= From: Shunsuke Nakamura Add the following functions: perf_evsel__refresh() perf_evsel__period() to set the over flow limit and period. Signed-off-by: Shunsuke Nakamura Signed-off-by: Charlie Jenkins --- tools/lib/perf/Documentation/libperf.txt | 2 ++ tools/lib/perf/evsel.c | 46 ++++++++++++++++++++++++++--= ---- tools/lib/perf/include/perf/evsel.h | 2 ++ tools/lib/perf/libperf.map | 2 ++ 4 files changed, 44 insertions(+), 8 deletions(-) diff --git a/tools/lib/perf/Documentation/libperf.txt b/tools/lib/perf/Docu= mentation/libperf.txt index f1bfe6b6e78a..aac764e63db6 100644 --- a/tools/lib/perf/Documentation/libperf.txt +++ b/tools/lib/perf/Documentation/libperf.txt @@ -162,6 +162,8 @@ SYNOPSIS int perf_evsel__disable(struct perf_evsel *evsel); int perf_evsel__disable_cpu(struct perf_evsel *evsel, int cpu_map_idx); bool perf_evsel__has_fd(struct perf_evsel *evsel, int fd); + int perf_evsel__refresh(struct perf_evsel *evsel, int refresh); + int perf_evsel__period(struct perf_evsel *evsel, int period); struct perf_cpu_map *perf_evsel__cpus(struct perf_evsel *evsel); struct perf_thread_map *perf_evsel__threads(struct perf_evsel *evsel); struct perf_event_attr *perf_evsel__attr(struct perf_evsel *evsel); diff --git a/tools/lib/perf/evsel.c b/tools/lib/perf/evsel.c index 6b98cba6eb4f..063498fc52f2 100644 --- a/tools/lib/perf/evsel.c +++ b/tools/lib/perf/evsel.c @@ -418,7 +418,7 @@ int perf_evsel__read(struct perf_evsel *evsel, int cpu_= map_idx, int thread, return 0; } =20 -static int perf_evsel__ioctl(struct perf_evsel *evsel, int ioc, void *arg, +static int perf_evsel__ioctl(struct perf_evsel *evsel, int ioc, unsigned l= ong arg, int cpu_map_idx, int thread) { int *fd =3D FD(evsel, cpu_map_idx, thread); @@ -430,7 +430,7 @@ static int perf_evsel__ioctl(struct perf_evsel *evsel, = int ioc, void *arg, } =20 static int perf_evsel__run_ioctl(struct perf_evsel *evsel, - int ioc, void *arg, + int ioc, unsigned long arg, int cpu_map_idx) { int thread; @@ -447,7 +447,7 @@ static int perf_evsel__run_ioctl(struct perf_evsel *evs= el, =20 int perf_evsel__enable_cpu(struct perf_evsel *evsel, int cpu_map_idx) { - return perf_evsel__run_ioctl(evsel, PERF_EVENT_IOC_ENABLE, NULL, cpu_map_= idx); + return perf_evsel__run_ioctl(evsel, PERF_EVENT_IOC_ENABLE, 0, cpu_map_idx= ); } =20 int perf_evsel__enable_thread(struct perf_evsel *evsel, int thread) @@ -457,7 +457,7 @@ int perf_evsel__enable_thread(struct perf_evsel *evsel,= int thread) int err; =20 perf_cpu_map__for_each_cpu(cpu, idx, evsel->cpus) { - err =3D perf_evsel__ioctl(evsel, PERF_EVENT_IOC_ENABLE, NULL, idx, threa= d); + err =3D perf_evsel__ioctl(evsel, PERF_EVENT_IOC_ENABLE, 0, idx, thread); if (err) return err; } @@ -471,13 +471,13 @@ int perf_evsel__enable(struct perf_evsel *evsel) int err =3D 0; =20 for (i =3D 0; i < xyarray__max_x(evsel->fd) && !err; i++) - err =3D perf_evsel__run_ioctl(evsel, PERF_EVENT_IOC_ENABLE, NULL, i); + err =3D perf_evsel__run_ioctl(evsel, PERF_EVENT_IOC_ENABLE, 0, i); return err; } =20 int perf_evsel__disable_cpu(struct perf_evsel *evsel, int cpu_map_idx) { - return perf_evsel__run_ioctl(evsel, PERF_EVENT_IOC_DISABLE, NULL, cpu_map= _idx); + return perf_evsel__run_ioctl(evsel, PERF_EVENT_IOC_DISABLE, 0, cpu_map_id= x); } =20 int perf_evsel__disable(struct perf_evsel *evsel) @@ -486,7 +486,37 @@ int perf_evsel__disable(struct perf_evsel *evsel) int err =3D 0; =20 for (i =3D 0; i < xyarray__max_x(evsel->fd) && !err; i++) - err =3D perf_evsel__run_ioctl(evsel, PERF_EVENT_IOC_DISABLE, NULL, i); + err =3D perf_evsel__run_ioctl(evsel, PERF_EVENT_IOC_DISABLE, 0, i); + return err; +} + +int perf_evsel__refresh(struct perf_evsel *evsel, int refresh) +{ + int i; + int err =3D 0; + + for (i =3D 0; i < xyarray__max_x(evsel->fd) && !err; i++) + err =3D perf_evsel__run_ioctl(evsel, PERF_EVENT_IOC_REFRESH, refresh, i); + return err; +} + +int perf_evsel__period(struct perf_evsel *evsel, __u64 period) +{ + struct perf_event_attr *attr; + int i; + int err =3D 0; + + attr =3D perf_evsel__attr(evsel); + + for (i =3D 0; i < xyarray__max_x(evsel->fd); i++) { + err =3D perf_evsel__run_ioctl(evsel, PERF_EVENT_IOC_PERIOD, + (unsigned long)&period, i); + if (err) + return err; + } + + attr->sample_period =3D period; + return err; } =20 @@ -497,7 +527,7 @@ int perf_evsel__apply_filter(struct perf_evsel *evsel, = const char *filter) for (i =3D 0; i < perf_cpu_map__nr(evsel->cpus) && !err; i++) err =3D perf_evsel__run_ioctl(evsel, PERF_EVENT_IOC_SET_FILTER, - (void *)filter, i); + (unsigned long)filter, i); return err; } =20 diff --git a/tools/lib/perf/include/perf/evsel.h b/tools/lib/perf/include/p= erf/evsel.h index 77816a35c383..613a63790346 100644 --- a/tools/lib/perf/include/perf/evsel.h +++ b/tools/lib/perf/include/perf/evsel.h @@ -63,6 +63,8 @@ LIBPERF_API int perf_evsel__enable(struct perf_evsel *evs= el); LIBPERF_API int perf_evsel__enable_cpu(struct perf_evsel *evsel, int cpu_m= ap_idx); LIBPERF_API int perf_evsel__enable_thread(struct perf_evsel *evsel, int th= read); LIBPERF_API int perf_evsel__disable(struct perf_evsel *evsel); +LIBPERF_API int perf_evsel__refresh(struct perf_evsel *evsel, int refresh); +LIBPERF_API int perf_evsel__period(struct perf_evsel *evsel, __u64 period); LIBPERF_API int perf_evsel__disable_cpu(struct perf_evsel *evsel, int cpu_= map_idx); LIBPERF_API struct perf_cpu_map *perf_evsel__cpus(struct perf_evsel *evsel= ); LIBPERF_API struct perf_thread_map *perf_evsel__threads(struct perf_evsel = *evsel); diff --git a/tools/lib/perf/libperf.map b/tools/lib/perf/libperf.map index f68519e17885..12bdf2f43993 100644 --- a/tools/lib/perf/libperf.map +++ b/tools/lib/perf/libperf.map @@ -35,6 +35,8 @@ LIBPERF_0.0.1 { perf_evsel__munmap; perf_evsel__mmap_base; perf_evsel__read; + perf_evsel__refresh; + perf_evsel__period; perf_evsel__cpus; perf_evsel__threads; perf_evsel__attr; --=20 2.44.0 From nobody Mon Feb 9 01:06:35 2026 Received: from mail-pl1-f170.google.com (mail-pl1-f170.google.com [209.85.214.170]) (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 EE34F189F32 for ; Mon, 29 Jul 2024 16:46:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722271581; cv=none; b=sL431RN3rI6M384Kejh/o6LKuCq2Na4J2Pia8/bIC1n+PFzsMK8JGS+ALyMRlMHyOldp5JhPfR9rmannNcx7DrAsdzbSewDLK8uD9juSHF30GEc1own47A84jqeAD/XwRD4dV4WqLR1RJY9NYxPe6/ncL+1UlrkoA/JrEGDtiwg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722271581; c=relaxed/simple; bh=DcCALxIHVCUK+9WrmJFTXpoeJxfw9pHG1sO9q8SD+00=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=T5kPdVgx1gj3gMNujzJovfMrU76KVX2OiF8OtXAp9OtpmE2hvSA1QYeKYRNZy7/7dzAIcwV+LjSXEz2XYFl8aaCOuCVbigNgC7UPZiiZS6CmM4PH7zE6rHHNOxX3fiVwbJ4nDk4v/TFRJU3xSSWgjYRiF9km909fHCnCG3EO8Fs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com; spf=pass smtp.mailfrom=rivosinc.com; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b=mJyZycx+; arc=none smtp.client-ip=209.85.214.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b="mJyZycx+" Received: by mail-pl1-f170.google.com with SMTP id d9443c01a7336-1fd9e6189d5so23481165ad.3 for ; Mon, 29 Jul 2024 09:46:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1722271578; x=1722876378; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=esv+2bQw0aEMT9KM4UokUyH6FGgrDkyBUaVhFoJhC+U=; b=mJyZycx+hMEodAzZe9rbUdYqULnRVrcPJN0Y0oBMluGhX7EROrWyv/Rj7aqLnRorml tRmoyulT9QlLciumW9EVqeQYxBg3Um/woe6WrkyZ4iEUL54YvinHk0wN+WwCriZGELGI y2x4Xvi4Dee0ICkK6yDO6GB9/RTItdpsLn6jVhn410NJEhfkw7HpFLFqYckGaMBN7uLl 7ILn1M5v0bgPftZD3RkuEV4G9R5Hck6JLLnSDcq22USvZ5Gg4adW40pVXpTFi/3L/xuW XtNzQNrqHI1EU3YrocfJLmOkGjjvi0vOY09xEAkzjh/bIJf9lZL9w8U7EhHVBH0WpaG+ 8iBQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1722271578; x=1722876378; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=esv+2bQw0aEMT9KM4UokUyH6FGgrDkyBUaVhFoJhC+U=; b=Kmo+wm1ChZqEJbRcTTzxzbZwlm6iQ4T7IxJ0KOrwbJB2Ut407M5VWdHlU28umV9m+e I4DVI89esVw/wszFuVCp5fNqV8Q8dWyoWZ+f1Ttb5hOBpRofHngubRrhDLFHI/jUzrfM EQ1cpyuprryUU84aj8bmRZFKCr7edSrqmO9Vx0429EVrKI2FmRZSOrFlRr9ibKRPj8XW AED+mJYXZS6q6b9BFoqrrmhYJ4c25pZl7Ve+UPfbYGuStEppw5sLimv7YrhMrDRjtufT kNe1Jfn2Av6BZl0MXNn9uBI414oOLu4PhJyIHMSrtKLHed+bYTovfv01hbiQ2nWJX5dh jyYw== X-Forwarded-Encrypted: i=1; AJvYcCX/L4wvwMrFLV2rugzsDN3ffYmwKjH9usz09TOxkVHjdSxhRb+qfKP7DTzZsT4WER2RBX2hPhqgDpPdeoGABBcOw+FDp0k2etNEWiAZ X-Gm-Message-State: AOJu0YzWgF11WJccMMzurDXhUY5g45lPjbCNVkyuwBXeN+8MHG/F+8Tk 1anS4CIoo9dZdN6LKLCkiEMYsUJM198CoJ9eAqpniLOB/i4TOZ0g0sw9vlbF2Wl83+yN+Uaq6f9 a X-Google-Smtp-Source: AGHT+IFSQceV8kL40vzasoKkWICuL+b5k2ukcYwrsTHg9WGugoQ3cfB1FuG9VUzxm2y6klGdQ4UbgQ== X-Received: by 2002:a17:902:ecd1:b0:1fd:a412:5ded with SMTP id d9443c01a7336-1ff0482c4b4mr61845635ad.26.1722271578209; Mon, 29 Jul 2024 09:46:18 -0700 (PDT) Received: from charlie.ba.rivosinc.com ([64.71.180.162]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1fed7d401c6sm85480545ad.117.2024.07.29.09.46.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jul 2024 09:46:17 -0700 (PDT) From: Charlie Jenkins Date: Fri, 26 Jul 2024 22:29:37 -0700 Subject: [PATCH v2 7/8] libperf test: Add test_stat_overflow() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20240726-overflow_check_libperf-v2-7-7d154dcf6bea@rivosinc.com> References: <20240726-overflow_check_libperf-v2-0-7d154dcf6bea@rivosinc.com> In-Reply-To: <20240726-overflow_check_libperf-v2-0-7d154dcf6bea@rivosinc.com> To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Andrii Nakryiko , Eduard Zingerman , Alexei Starovoitov , Daniel Borkmann , Martin KaFai Lau , Song Liu , Yonghong Song , John Fastabend , KP Singh , Stanislav Fomichev , Hao Luo Cc: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, bpf@vger.kernel.org, Charlie Jenkins , Shunsuke Nakamura X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1722271564; l=6608; i=charlie@rivosinc.com; s=20231120; h=from:subject:message-id; bh=A//Q40WQ+t6MAB7Qrx+4soh8s9dOFzIWFwFxUkcU1xQ=; b=+cUdR4bb9FAKj9f/4IUP2R/tUuPZM+LqB0IMO5aNFMPM4mX7d13LQVKXc6rmVNnaFYgiGulWk PlzGGTIQ9umDJIit7xHV/tS7FtHPUUN0OsO1VqzI/T/ntOXJ8jerbFS X-Developer-Key: i=charlie@rivosinc.com; a=ed25519; pk=t4RSWpMV1q5lf/NWIeR9z58bcje60/dbtxxmoSfBEcs= From: Shunsuke Nakamura Added overflow test using refresh and period. Confirmation - That the overflow occurs the number of times specified by perf_evse__refresh() - That the period can be updated by perf_evsel__period() Committer testing: $ sudo make tests -C ./tools/lib/perf V=3D1 make: Entering directory '/home/nakamura/build_work/build_kernel/linux-ke= rnel/linux/tools/lib/perf' make -f /home/nakamura/build_work/build_kernel/linux-kernel/linux/tools/b= uild/Makefile.build dir=3D. obj=3Dlibperf make -C /home/nakamura/build_work/build_kernel/linux-kernel/linux/tools/l= ib/api/ O=3D libapi.a make -f /home/nakamura/build_work/build_kernel/linux-kernel/linux/tools/b= uild/Makefile.build dir=3D./fd obj=3Dlibapi make -f /home/nakamura/build_work/build_kernel/linux-kernel/linux/tools/b= uild/Makefile.build dir=3D./fs obj=3Dlibapi make -f /home/nakamura/build_work/build_kernel/linux-kernel/linux/tools/b= uild/Makefile.build dir=3D. obj=3Dtests make -f /home/nakamura/build_work/build_kernel/linux-kernel/linux/tools/b= uild/Makefile.build dir=3D./tests obj=3Dtests running static: - running tests/test-cpumap.c...OK - running tests/test-threadmap.c...OK - running tests/test-evlist.c... OK - running tests/test-evsel.c... period =3D 1000000 overflow limit =3D 3, overflow count =3D 3, POLL_IN =3D 2, POLL_H= UP =3D 1, other signal event =3D 0 period =3D 2000000 overflow limit =3D 3, overflow count =3D 3, POLL_IN =3D 2, POLL_H= UP =3D 1, other signal event =3D 0 period =3D 1000000 overflow limit =3D 3, overflow count =3D 3, POLL_IN =3D 2, POLL_H= UP =3D 1, other signal event =3D 0 period =3D 2000000 overflow limit =3D 3, overflow count =3D 3, POLL_IN =3D 2, POLL_H= UP =3D 1, other signal event =3D 0 OK running dynamic: - running tests/test-cpumap.c...OK - running tests/test-threadmap.c...OK - running tests/test-evlist.c... OK - running tests/test-evsel.c... period =3D 1000000 overflow limit =3D 3, overflow count =3D 3, POLL_IN =3D 2, POLL_H= UP =3D 1, other signal event =3D 0 period =3D 2000000 overflow limit =3D 3, overflow count =3D 3, POLL_IN =3D 2, POLL_H= UP =3D 1, other signal event =3D 0 period =3D 1000000 overflow limit =3D 3, overflow count =3D 3, POLL_IN =3D 2, POLL_H= UP =3D 1, other signal event =3D 0 period =3D 2000000 overflow limit =3D 3, overflow count =3D 3, POLL_IN =3D 2, POLL_H= UP =3D 1, other signal event =3D 0 OK make: Leaving directory '/home/nakamura/build_work/build_kernel/linux-ker= nel/linux/tools/lib/perf' Signed-off-by: Shunsuke Nakamura Signed-off-by: Charlie Jenkins --- tools/lib/perf/tests/test-evsel.c | 107 ++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 107 insertions(+) diff --git a/tools/lib/perf/tests/test-evsel.c b/tools/lib/perf/tests/test-= evsel.c index 545ec3150546..b27dd65f2ec9 100644 --- a/tools/lib/perf/tests/test-evsel.c +++ b/tools/lib/perf/tests/test-evsel.c @@ -1,7 +1,11 @@ // SPDX-License-Identifier: GPL-2.0 +#include #include #include #include +#include +#include +#include #include #include #include @@ -11,6 +15,15 @@ #include #include "tests.h" =20 +#define WAIT_COUNT 10000000UL +static struct signal_counts { + int in; + int hup; + int others; + int overflow; +} sig_count; +static struct perf_evsel *s_evsel; + static int libperf_print(enum libperf_print_level level, const char *fmt, va_list ap) { @@ -349,6 +362,98 @@ static int test_stat_read_format(void) return 0; } =20 +static void sig_handler(int signo, siginfo_t *info, void *uc) +{ + switch (info->si_code) { + case POLL_IN: + sig_count.in++; + break; + case POLL_HUP: + sig_count.hup++; + break; + default: + sig_count.others++; + } + + sig_count.overflow++; +} + +static int test_stat_overflow(int owner) +{ + static struct sigaction sig; + u64 period =3D 1000000; + int overflow_limit =3D 3; + + struct perf_thread_map *threads; + struct perf_event_attr attr =3D { + .type =3D PERF_TYPE_SOFTWARE, + .config =3D PERF_COUNT_SW_TASK_CLOCK, + .sample_type =3D PERF_SAMPLE_PERIOD, + .sample_period =3D period, + .disabled =3D 1, + }; + struct perf_event_attr *tmp_attr; + int err =3D 0, i; + + LIBPERF_OPTS(perf_evsel_open_opts, opts, + .open_flags =3D PERF_FLAG_FD_CLOEXEC, + .flags =3D (O_RDWR | O_NONBLOCK | O_ASYNC), + .signal =3D SIGRTMIN + 1, + .owner_type =3D owner, + .sig =3D &sig); + + /* setup signal handler */ + memset(&sig, 0, sizeof(struct sigaction)); + sig.sa_sigaction =3D (void *)sig_handler; + sig.sa_flags =3D SA_SIGINFO; + + threads =3D perf_thread_map__new_dummy(); + __T("failed to create threads", threads); + + perf_thread_map__set_pid(threads, 0, 0); + + s_evsel =3D perf_evsel__new(&attr); + __T("failed to create evsel", s_evsel); + + err =3D perf_evsel__open_opts(s_evsel, NULL, threads, &opts); + __T("failed to open evsel", err =3D=3D 0); + + for (i =3D 0; i < 2; i++) { + volatile unsigned int wait_count =3D WAIT_COUNT; + + sig_count.in =3D 0; + sig_count.hup =3D 0; + sig_count.others =3D 0; + sig_count.overflow =3D 0; + + period =3D period << i; + err =3D perf_evsel__period(s_evsel, period); + __T("failed to period evsel", err =3D=3D 0); + + tmp_attr =3D perf_evsel__attr(s_evsel); + __T_VERBOSE("\tperiod =3D %llu\n", tmp_attr->sample_period); + + err =3D perf_evsel__refresh(s_evsel, overflow_limit); + __T("failed to refresh evsel", err =3D=3D 0); + + while (wait_count--) + ; + + __T_VERBOSE("\toverflow limit =3D %d, overflow count =3D %d, ", + overflow_limit, sig_count.overflow); + __T_VERBOSE("POLL_IN =3D %d, POLL_HUP =3D %d, other signal event =3D %d\= n", + sig_count.in, sig_count.hup, sig_count.others); + + __T("failed to overflow count", overflow_limit =3D=3D sig_count.overflow= ); + } + + perf_evsel__close(s_evsel); + perf_evsel__delete(s_evsel); + perf_thread_map__put(threads); + + return 0; +} + int test_evsel(int argc, char **argv) { __T_START; @@ -361,6 +466,8 @@ int test_evsel(int argc, char **argv) test_stat_user_read(PERF_COUNT_HW_INSTRUCTIONS); test_stat_user_read(PERF_COUNT_HW_CPU_CYCLES); test_stat_read_format(); + test_stat_overflow(F_OWNER_PID); + test_stat_overflow(F_OWNER_TID); =20 __T_END; return tests_failed =3D=3D 0 ? 0 : -1; --=20 2.44.0 From nobody Mon Feb 9 01:06:35 2026 Received: from mail-pl1-f177.google.com (mail-pl1-f177.google.com [209.85.214.177]) (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 BB3D018A94A for ; Mon, 29 Jul 2024 16:46:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.177 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722271583; cv=none; b=KhGzeWspwdqW3coLoB2QnsXLXrewJ18PAdvqNBN4cF71JAPva19mMb9bZiWV/xUPeH2TYogot6di8fNGYd8Vg6/7H1C9bYZI/XFeVLhtZfjruf8Dfo8Mkqmb8ys3yEEYXV3u64SpGEBHurThG87qpLcC7daTqm2pkNmhwDyTCCU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1722271583; c=relaxed/simple; bh=vcEzXouSW5qhs+WKWJ6j7BThr5Umszy0VJSt4R3KWXE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=pNzG/7TxYJ53cm/Ms9+JVvVmHMhPOTvuDOdGWsV8roJL0ZK5UypFs9KatcvP8WE30ykREaAiMEoBJ2k/NZyH/Vy/HfQZDbA11VPiBLvYFchKy//Df4dQed8IVy5ZxTkBwpL3bMj8/3Z15JisQ38u8NjaYdJMvSk1fg36QjSyTrU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com; spf=pass smtp.mailfrom=rivosinc.com; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b=P6zz1nS1; arc=none smtp.client-ip=209.85.214.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b="P6zz1nS1" Received: by mail-pl1-f177.google.com with SMTP id d9443c01a7336-1fbc3a9d23bso19317745ad.1 for ; Mon, 29 Jul 2024 09:46:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1722271580; x=1722876380; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=BW7CGRA85beDZYynJOG3K+o2YMpxrF+HMxsvS/Z8BLI=; b=P6zz1nS1Qk6Oh+bA2gtESUKV0MFqo0sGW6ESrThezO3r8j2MjGd+lofOCCGbUF/dwa ETo0w5q6T8iRFn1kZjwph9A9dd4ODJ377xXiXrNxF6j5A1Y0xhUMbmtk+SQpHIqRxy/0 CUQPgYPdFIV4biOdmMyPOHS9GkVyWCH6C7nF52tuLAr/PmD05i8MCg1HBxXb0+67xmBL HcGtAMzRYcDVmPkJ76hwO+EEWH4vSJrr1fcvQOZ6PXkzBu0v10ZEtNikGmpks0h9b49H HfQjfDzuBOZlXUaPkR716dz/Y/KrQeVj0M+052DE/a3E9YWmxoaSpGBUbSghCmnYXVsY U9cg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1722271580; x=1722876380; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=BW7CGRA85beDZYynJOG3K+o2YMpxrF+HMxsvS/Z8BLI=; b=Mf2GAZQn3fJnVOcVXcBzpdnQ+qCQkgWGtuPD7WtRmK7/U85MwkXxQUCX0H2UIzG4m+ 00/81/pLdSGhfPJEZnEYGel9CC5neEB8XoENOuWq+etCQYQajCd0DdhqltuVQe/Va71Y vz9yLGEn/gtM6yDoNEB8ErcjY+X2K7sBM1vrX56rFLfJg9aF2Ax5IGNv0gzN21Kr0RMG CJOQnioM1K1BKNMhk925FeY21JDXyC1Fd10UrK/3OJEausL4NAlKe2WWDo6JVMb6ZxpH nd5X8X+gSPJbrMVgnEfII934Etcvo+9jKe21bi2HP7AZPdnQY61+5FYOS46w4dXa5Ztp LGvA== X-Forwarded-Encrypted: i=1; AJvYcCW2a6QGZO+KroHZiGiKqNI10ETDg3sd0T07eLE1UYgCC/mNlKro7u667k4O6cHyuLMBP9EqJ7vVsL767fQUHiJBzMHMBaLLsiBfZkV+ X-Gm-Message-State: AOJu0YyDCLD3kG6BxD39x+ZMjcnGJ76NLLPJmjyhvgKPeGuaAptteW2m 4J+JYD+A1l7cdvwTW8HjR76i7swUmjT/ECCYC247rMg0hlu9fLONX4Bb6hqDKUE= X-Google-Smtp-Source: AGHT+IGT68p/2k5fQAsQJYVblnXyBTkymlHklXNAKKlhKSCjLI+wrBNoURLMQpu2s75WaRqmrTJs/A== X-Received: by 2002:a17:903:4298:b0:1fd:3cf9:c7d1 with SMTP id d9443c01a7336-1ff0482be69mr57426615ad.19.1722271579966; Mon, 29 Jul 2024 09:46:19 -0700 (PDT) Received: from charlie.ba.rivosinc.com ([64.71.180.162]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-1fed7d401c6sm85480545ad.117.2024.07.29.09.46.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 29 Jul 2024 09:46:19 -0700 (PDT) From: Charlie Jenkins Date: Fri, 26 Jul 2024 22:29:38 -0700 Subject: [PATCH v2 8/8] libperf test: Add test_stat_overflow_event() Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20240726-overflow_check_libperf-v2-8-7d154dcf6bea@rivosinc.com> References: <20240726-overflow_check_libperf-v2-0-7d154dcf6bea@rivosinc.com> In-Reply-To: <20240726-overflow_check_libperf-v2-0-7d154dcf6bea@rivosinc.com> To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Andrii Nakryiko , Eduard Zingerman , Alexei Starovoitov , Daniel Borkmann , Martin KaFai Lau , Song Liu , Yonghong Song , John Fastabend , KP Singh , Stanislav Fomichev , Hao Luo Cc: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, bpf@vger.kernel.org, Charlie Jenkins , Shunsuke Nakamura X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1722271564; l=7556; i=charlie@rivosinc.com; s=20231120; h=from:subject:message-id; bh=NX8BD2CX09iOEogiAZJc+2h9Y+GaCDx2QBL9DE7jL6c=; b=vj4XrZPx2rKNLrg7qQ9zQkLdR+6nTeAcc3FVWqgcDvl00wCiU8f0eW84vn9pbovF0dF0LBn7o BXCM/LpaJu1DMdDywG4WOfEvQVKgPjHU1FyIEX12mh4eKyAnU8EZExi X-Developer-Key: i=charlie@rivosinc.com; a=ed25519; pk=t4RSWpMV1q5lf/NWIeR9z58bcje60/dbtxxmoSfBEcs= From: Shunsuke Nakamura Add a test to check overflowed events. Committer testing: $ sudo make tests -C ./tools/lib/perf V=3D1 make: Entering directory '/home/nakamura/build_work/build_kernel/linux-ke= rnel/linux/tools/lib/perf' make -f /home/nakamura/build_work/build_kernel/linux-kernel/linux/tools/b= uild/Makefile.build dir=3D. obj=3Dlibperf make -C /home/nakamura/build_work/build_kernel/linux-kernel/linux/tools/l= ib/api/ O=3D libapi.a make -f /home/nakamura/build_work/build_kernel/linux-kernel/linux/tools/b= uild/Makefile.build dir=3D./fd obj=3Dlibapi make -f /home/nakamura/build_work/build_kernel/linux-kernel/linux/tools/b= uild/Makefile.build dir=3D./fs obj=3Dlibapi make -f /home/nakamura/build_work/build_kernel/linux-kernel/linux/tools/b= uild/Makefile.build dir=3D. obj=3Dtests make -f /home/nakamura/build_work/build_kernel/linux-kernel/linux/tools/b= uild/Makefile.build dir=3D./tests obj=3Dtests running static: - running tests/test-cpumap.c...OK - running tests/test-threadmap.c...OK - running tests/test-evlist.c... Event 0 -- overflow flag =3D 0x1, POLL_HUP =3D 1, other signal event =3D= 0 Event 1 -- overflow flag =3D 0x2, POLL_HUP =3D 1, other signal event =3D= 0 Event 2 -- overflow flag =3D 0x4, POLL_HUP =3D 1, other signal event =3D= 0 Event 3 -- overflow flag =3D 0x8, POLL_HUP =3D 1, other signal event =3D= 0 OK - running tests/test-evsel.c... OK running dynamic: - running tests/test-cpumap.c...OK - running tests/test-threadmap.c...OK - running tests/test-evlist.c... Event 0 -- overflow flag =3D 0x1, POLL_HUP =3D 1, other signal event =3D= 0 Event 1 -- overflow flag =3D 0x2, POLL_HUP =3D 1, other signal event =3D= 0 Event 2 -- overflow flag =3D 0x4, POLL_HUP =3D 1, other signal event =3D= 0 Event 3 -- overflow flag =3D 0x8, POLL_HUP =3D 1, other signal event =3D= 0 OK - running tests/test-evsel.c... OK make: Leaving directory '/home/nakamura/build_work/build_kernel/linux-ker= nel/linux/tools/lib/perf' Signed-off-by: Shunsuke Nakamura Signed-off-by: Charlie Jenkins --- tools/lib/perf/tests/test-evlist.c | 111 +++++++++++++++++++++++++++++++++= ++++ tools/lib/perf/tests/test-evsel.c | 20 +++---- 2 files changed, 121 insertions(+), 10 deletions(-) diff --git a/tools/lib/perf/tests/test-evlist.c b/tools/lib/perf/tests/test= -evlist.c index 3a833f0349d3..7bfceb8e0c66 100644 --- a/tools/lib/perf/tests/test-evlist.c +++ b/tools/lib/perf/tests/test-evlist.c @@ -5,6 +5,8 @@ #include #include #include +#include +#include #include #include #include @@ -24,6 +26,13 @@ #define EVENT_NUM 15 #define WAIT_COUNT 100000000UL =20 +static unsigned int overflow_flag; +static struct signal_counts { + int hup; + int others; +} sig_count; +static struct perf_evlist *s_evlist; + static int libperf_print(enum libperf_print_level level, const char *fmt, va_list ap) { @@ -570,6 +579,107 @@ static int test_stat_multiplexing(void) return 0; } =20 +static void sig_handler(int signo, siginfo_t *info, void *uc) +{ + struct perf_evsel *evsel; + int i =3D 0; + + perf_evlist__for_each_evsel(s_evlist, evsel) { + if (perf_evsel__has_fd(evsel, info->si_fd)) { + if (info->si_code =3D=3D POLL_HUP) + sig_count.hup++; + else + sig_count.others++; + + overflow_flag =3D (1U << i); + return; + } + i++; + } + + __T_VERBOSE("Failed to get fd of overflowed event"); +} + +static int test_stat_overflow_event(void) +{ + static struct sigaction sigact; + + struct perf_thread_map *threads; + struct perf_evsel *evsel; + struct perf_event_attr attr =3D { + .type =3D PERF_TYPE_SOFTWARE, + .config =3D PERF_COUNT_SW_CPU_CLOCK, + .sample_type =3D PERF_SAMPLE_PERIOD, + .sample_period =3D 100000, + .disabled =3D 1, + }; + int err, i, event_num =3D 4; + + LIBPERF_OPTS(perf_evsel_open_opts, opts, + .open_flags =3D PERF_FLAG_FD_CLOEXEC, + .fcntl_flags =3D (O_RDWR | O_NONBLOCK | O_ASYNC), + .signal =3D SIGRTMIN + 1, + .owner_type =3D F_OWNER_PID, + .sigact =3D &sigact); + + /* setup signal handler */ + memset(&sigact, 0, sizeof(struct sigaction)); + sigact.sa_sigaction =3D (void *)sig_handler; + sigact.sa_flags =3D SA_SIGINFO; + + threads =3D perf_thread_map__new_dummy(); + __T("failed to create threads", threads); + + perf_thread_map__set_pid(threads, 0, 0); + + s_evlist =3D perf_evlist__new(); + __T("failed to create evlist", s_evlist); + + for (i =3D 0; i < event_num; i++) { + evsel =3D perf_evsel__new(&attr); + __T("failed to create evsel", evsel); + + perf_evlist__add(s_evlist, evsel); + } + + perf_evlist__set_maps(s_evlist, NULL, threads); + + err =3D perf_evlist__open_opts(s_evlist, &opts); + __T("failed to open evlist", err =3D=3D 0); + + i =3D 0; + perf_evlist__for_each_evsel(s_evlist, evsel) { + volatile unsigned int wait_count =3D WAIT_COUNT; + + overflow_flag =3D 0; + sig_count.hup =3D 0; + sig_count.others =3D 0; + + err =3D perf_evsel__refresh(evsel, 1); + __T("failed to refresh evsel", err =3D=3D 0); + + while (wait_count--) + ; + + __T_VERBOSE("Event %2d -- overflow flag =3D %#x, ", + i, overflow_flag); + __T_VERBOSE("POLL_HUP =3D %d, other signal event =3D %d\n", + sig_count.hup, sig_count.others); + + __T("unexpected event overflow detected", overflow_flag && (1U << i)); + __T("unexpected signal event detected", + sig_count.hup =3D=3D 1 && sig_count.others =3D=3D 0); + + i++; + } + + perf_evlist__close(s_evlist); + perf_evlist__delete(s_evlist); + perf_thread_map__put(threads); + + return 0; +} + int test_evlist(int argc, char **argv) { __T_START; @@ -582,6 +692,7 @@ int test_evlist(int argc, char **argv) test_mmap_thread(); test_mmap_cpus(); test_stat_multiplexing(); + test_stat_overflow_event(); =20 __T_END; return tests_failed =3D=3D 0 ? 0 : -1; diff --git a/tools/lib/perf/tests/test-evsel.c b/tools/lib/perf/tests/test-= evsel.c index b27dd65f2ec9..56f4ae20e922 100644 --- a/tools/lib/perf/tests/test-evsel.c +++ b/tools/lib/perf/tests/test-evsel.c @@ -15,7 +15,7 @@ #include #include "tests.h" =20 -#define WAIT_COUNT 10000000UL +#define WAIT_COUNT 100000000UL static struct signal_counts { int in; int hup; @@ -380,7 +380,7 @@ static void sig_handler(int signo, siginfo_t *info, voi= d *uc) =20 static int test_stat_overflow(int owner) { - static struct sigaction sig; + static struct sigaction sigact; u64 period =3D 1000000; int overflow_limit =3D 3; =20 @@ -396,16 +396,16 @@ static int test_stat_overflow(int owner) int err =3D 0, i; =20 LIBPERF_OPTS(perf_evsel_open_opts, opts, - .open_flags =3D PERF_FLAG_FD_CLOEXEC, - .flags =3D (O_RDWR | O_NONBLOCK | O_ASYNC), - .signal =3D SIGRTMIN + 1, - .owner_type =3D owner, - .sig =3D &sig); + .open_flags =3D PERF_FLAG_FD_CLOEXEC, + .fcntl_flags =3D (O_RDWR | O_NONBLOCK | O_ASYNC), + .signal =3D SIGRTMIN + 1, + .owner_type =3D owner, + .sigact =3D &sigact); =20 /* setup signal handler */ - memset(&sig, 0, sizeof(struct sigaction)); - sig.sa_sigaction =3D (void *)sig_handler; - sig.sa_flags =3D SA_SIGINFO; + memset(&sigact, 0, sizeof(struct sigaction)); + sigact.sa_sigaction =3D (void *)sig_handler; + sigact.sa_flags =3D SA_SIGINFO; =20 threads =3D perf_thread_map__new_dummy(); __T("failed to create threads", threads); --=20 2.44.0