From patchwork Tue Jan 17 04:49:01 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tonghao Zhang X-Patchwork-Id: 13104170 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 76C2BC3DA78 for ; Tue, 17 Jan 2023 04:50:42 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235163AbjAQEuj (ORCPT ); Mon, 16 Jan 2023 23:50:39 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34044 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234078AbjAQEug (ORCPT ); Mon, 16 Jan 2023 23:50:36 -0500 Received: from bg4.exmail.qq.com (bg4.exmail.qq.com [43.155.67.158]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 95B25234FE for ; Mon, 16 Jan 2023 20:50:32 -0800 (PST) X-QQ-mid: bizesmtp82t1673931011tc4ge5k6 Received: from localhost.localdomain ( [1.202.165.115]) by bizesmtp.qq.com (ESMTP) with id ; Tue, 17 Jan 2023 12:50:09 +0800 (CST) X-QQ-SSF: 01000000000000709000000A0000000 X-QQ-FEAT: +FrjhAEeCXsmF5IaL3D29sBXbpY081Qnr6CCZ56mMUQ6BrV6Wanmk6Xo+iL/Y GGA45CHEblr+yolM0moN81SaJEZ3LjNAcCNAhxijNlXT3MYBMwKwDFC9ddhUGXe/pZNaV1w /pMCAl2goAvGrDyz9nm39jSNn8xKFaaBRqUW4H5MQJasYguMjM+KzOQJOu+SwI3mi39x7GU BwNVaG9K/bHLuf5WtXa9OYBaXpDZXtSJJjT6BOqkQCILd0vkb3aP4zko4LdsMp6tIVdfu99 lg1KsHNIx19pGnoiAQ6XwAjzkdqeJb1am8YrejOw34kBRUBKpzvU0e0pcKYSKdq6wWTmQi4 6aZCLhPovANsF/nm47cog8uI79lrabhgYqCFdcO X-QQ-GoodBg: 0 From: tong@infragraf.org To: bpf@vger.kernel.org Cc: Tonghao Zhang , Quentin Monnet , Alexei Starovoitov , Daniel Borkmann , Andrii Nakryiko , Martin KaFai Lau , Song Liu , Yonghong Song , John Fastabend , KP Singh , Stanislav Fomichev , Hao Luo , Jiri Olsa Subject: [bpf-next v1 1/2] libbpf: introduce new API libbpf_num_online_cpus Date: Tue, 17 Jan 2023 12:49:01 +0800 Message-Id: <20230117044902.98938-1-tong@infragraf.org> X-Mailer: git-send-email 2.30.1 (Apple Git-130) MIME-Version: 1.0 X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:infragraf.org:qybglogicsvr:qybglogicsvr5 Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org X-Patchwork-Delegate: bpf@iogearbox.net From: Tonghao Zhang Adding a new API libbpf_num_online_cpus() that helps user with fetching online CPUs number. It's useful in system which number of online CPUs is different with possible CPUs. Signed-off-by: Tonghao Zhang Cc: Quentin Monnet Cc: Alexei Starovoitov Cc: Daniel Borkmann Cc: Andrii Nakryiko Cc: Martin KaFai Lau Cc: Song Liu Cc: Yonghong Song Cc: John Fastabend Cc: KP Singh Cc: Stanislav Fomichev Cc: Hao Luo Cc: Jiri Olsa --- tools/lib/bpf/libbpf.c | 47 ++++++++++++++++++++++++++++++---------- tools/lib/bpf/libbpf.h | 7 ++++++ tools/lib/bpf/libbpf.map | 1 + 3 files changed, 43 insertions(+), 12 deletions(-) diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index 27d9faa80471..b84904f79ffd 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -12192,30 +12192,53 @@ int parse_cpu_mask_file(const char *fcpu, bool **mask, int *mask_sz) return parse_cpu_mask_str(buf, mask, mask_sz); } -int libbpf_num_possible_cpus(void) +static int num_cpus(const char *fcpu) { - static const char *fcpu = "/sys/devices/system/cpu/possible"; - static int cpus; - int err, n, i, tmp_cpus; + int err, n, i, cpus; bool *mask; - tmp_cpus = READ_ONCE(cpus); - if (tmp_cpus > 0) - return tmp_cpus; - err = parse_cpu_mask_file(fcpu, &mask, &n); if (err) return libbpf_err(err); - tmp_cpus = 0; + cpus = 0; for (i = 0; i < n; i++) { if (mask[i]) - tmp_cpus++; + cpus++; } free(mask); - WRITE_ONCE(cpus, tmp_cpus); - return tmp_cpus; + return cpus; +} + +int libbpf_num_online_cpus(void) +{ + static int online_cpus; + int cpus; + + cpus = READ_ONCE(online_cpus); + if (cpus > 0) + return cpus; + + cpus = num_cpus("/sys/devices/system/cpu/online"); + + WRITE_ONCE(online_cpus, cpus); + return cpus; +} + +int libbpf_num_possible_cpus(void) +{ + static int possible_cpus; + int cpus; + + cpus = READ_ONCE(possible_cpus); + if (cpus > 0) + return cpus; + + cpus = num_cpus("/sys/devices/system/cpu/possible"); + + WRITE_ONCE(possible_cpus, cpus); + return cpus; } static int populate_skeleton_maps(const struct bpf_object *obj, diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h index 898db26e42e9..e433575ff865 100644 --- a/tools/lib/bpf/libbpf.h +++ b/tools/lib/bpf/libbpf.h @@ -1332,6 +1332,13 @@ LIBBPF_API int libbpf_probe_bpf_helper(enum bpf_prog_type prog_type, */ LIBBPF_API int libbpf_num_possible_cpus(void); +/** + * @brief **libbpf_num_online_cpus()** is a helper function to get the + * number of online CPUs that the host kernel supports and expects. + * @return number of online CPUs; or error code on failure + */ +LIBBPF_API int libbpf_num_online_cpus(void); + struct bpf_map_skeleton { const char *name; struct bpf_map **map; diff --git a/tools/lib/bpf/libbpf.map b/tools/lib/bpf/libbpf.map index 11c36a3c1a9f..384fb6333f3f 100644 --- a/tools/lib/bpf/libbpf.map +++ b/tools/lib/bpf/libbpf.map @@ -381,6 +381,7 @@ LIBBPF_1.1.0 { user_ring_buffer__reserve; user_ring_buffer__reserve_blocking; user_ring_buffer__submit; + libbpf_num_online_cpus; } LIBBPF_1.0.0; LIBBPF_1.2.0 { From patchwork Tue Jan 17 04:49:02 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tonghao Zhang X-Patchwork-Id: 13104169 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id AE123C63797 for ; Tue, 17 Jan 2023 04:50:41 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235199AbjAQEuh (ORCPT ); Mon, 16 Jan 2023 23:50:37 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:34042 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235192AbjAQEuf (ORCPT ); Mon, 16 Jan 2023 23:50:35 -0500 Received: from bg4.exmail.qq.com (bg4.exmail.qq.com [43.154.221.58]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1156B234FB for ; Mon, 16 Jan 2023 20:50:29 -0800 (PST) X-QQ-mid: bizesmtp82t1673931018twi1c3g3 Received: from localhost.localdomain ( [1.202.165.115]) by bizesmtp.qq.com (ESMTP) with id ; Tue, 17 Jan 2023 12:50:14 +0800 (CST) X-QQ-SSF: 01000000000000709000000A0000000 X-QQ-FEAT: QityeSR92A2LRM9HbIp6yqtbbENnQhbRc6Lqy6GH6yiTMl5HRRGRVKcS2bdJf Dkximu1JZ/83DtHNYl6Q0qJRfT7fVgBFlYgu5xuB00aeHp2KOnPguk4xldRcZB1E9e4sfiv wcfGrN83o6wDpvS+w/8bXxgZ08tqyI1ZfRulpuCUKTYSG6JMXOgRJi34DnSZocDLX7Z18jM zge5ClwmPZx72OLLSVINiG72FCYWdcV5Cnz0v3M057jpcfWUOHw9BsT2SLUswXhMxn/p85w 2sYav/k701dpt0tv0WluNHBgxaDOodCNNpsUdA5Pv49hqXOQgK7uE1oIJksgnu5db3FOpXq lh8cRk82tqE4HrzxusCxpsm8bTWsvFnKTxcVWakXycx03WgRVE= X-QQ-GoodBg: 0 From: tong@infragraf.org To: bpf@vger.kernel.org Cc: Tonghao Zhang , Quentin Monnet , Alexei Starovoitov , Daniel Borkmann , Andrii Nakryiko , Martin KaFai Lau , Song Liu , Yonghong Song , John Fastabend , KP Singh , Stanislav Fomichev , Hao Luo , Jiri Olsa Subject: [bpf-next v1 2/2] bpftool: profile online CPUs instead of possible Date: Tue, 17 Jan 2023 12:49:02 +0800 Message-Id: <20230117044902.98938-2-tong@infragraf.org> X-Mailer: git-send-email 2.30.1 (Apple Git-130) In-Reply-To: <20230117044902.98938-1-tong@infragraf.org> References: <20230117044902.98938-1-tong@infragraf.org> MIME-Version: 1.0 X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:infragraf.org:qybglogicsvr:qybglogicsvr5 Precedence: bulk List-ID: X-Mailing-List: bpf@vger.kernel.org X-Patchwork-Delegate: bpf@iogearbox.net From: Tonghao Zhang The number of online cpu may be not equal to possible cpu. bpftool prog profile, can not create pmu event on possible but not online cpu. $ dmidecode -s system-product-name PowerEdge R620 $ cat /sys/devices/system/cpu/online 0-31 $ cat /sys/devices/system/cpu/possible 0-47 To fix this issue, use online cpu instead of possible, to create perf event and other resource. Signed-off-by: Tonghao Zhang Cc: Quentin Monnet Cc: Alexei Starovoitov Cc: Daniel Borkmann Cc: Andrii Nakryiko Cc: Martin KaFai Lau Cc: Song Liu Cc: Yonghong Song Cc: John Fastabend Cc: KP Singh Cc: Stanislav Fomichev Cc: Hao Luo Cc: Jiri Olsa --- tools/bpf/bpftool/prog.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/bpf/bpftool/prog.c b/tools/bpf/bpftool/prog.c index cfc9fdc1e863..08b352dd799e 100644 --- a/tools/bpf/bpftool/prog.c +++ b/tools/bpf/bpftool/prog.c @@ -2056,6 +2056,7 @@ static int profile_parse_metrics(int argc, char **argv) static void profile_read_values(struct profiler_bpf *obj) { + __u32 possible_cpus = libbpf_num_possible_cpus(); __u32 m, cpu, num_cpu = obj->rodata->num_cpu; int reading_map_fd, count_map_fd; __u64 counts[num_cpu]; @@ -2080,7 +2081,7 @@ static void profile_read_values(struct profiler_bpf *obj) profile_total_count += counts[cpu]; for (m = 0; m < ARRAY_SIZE(metrics); m++) { - struct bpf_perf_event_value values[num_cpu]; + struct bpf_perf_event_value values[possible_cpus]; if (!metrics[m].selected) continue; @@ -2321,7 +2322,7 @@ static int do_profile(int argc, char **argv) if (num_metric <= 0) goto out; - num_cpu = libbpf_num_possible_cpus(); + num_cpu = libbpf_num_online_cpus(); if (num_cpu <= 0) { p_err("failed to identify number of CPUs"); goto out;