From patchwork Wed Mar 5 18:20:55 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amery Hung X-Patchwork-Id: 14003127 X-Patchwork-Delegate: bpf@iogearbox.net Received: from mail-pj1-f45.google.com (mail-pj1-f45.google.com [209.85.216.45]) (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 CB18E14884C for ; Wed, 5 Mar 2025 18:21:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741198869; cv=none; b=lUyvl8FXasuk4uOwkynvlFQWFKo907nNvzDKMYqpiYlL+2ao4lYLWveD5l3PbLVr7TXx0Te/bDd44tFD64+0KV+EgruOko71XsICK8vlptDGffGRb7slr+97OUG+WI7iUrQvp/gneQBrLOjzf9/pCwdTi/voooFO+UTv74MjM6Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741198869; c=relaxed/simple; bh=ozd2pbdY4UqD27aHF3OixPXX87oOHxQkVxVuTPD+0Fc=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=Fx0xqkOzW6VGd79CE3WNcO83uynVEcEPirJAOpFFw35takvCrMBQ37oovT7xgncbWB8gQbotJyTyoZ9jd7FL1wzd2+FmvdaNU2GgKBEPYUNKV6Frex0a6fmoHCH5QGybk8ENTMNNS/NVCZi+BB0xBNmDFWqtspxwc9zjRoX75CA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=YTKa+7mv; arc=none smtp.client-ip=209.85.216.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="YTKa+7mv" Received: by mail-pj1-f45.google.com with SMTP id 98e67ed59e1d1-2feb91a25bdso9896960a91.1 for ; Wed, 05 Mar 2025 10:21:07 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741198867; x=1741803667; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=8z4EG64PEenANta4+uVbSSODk00f9kYQBdcZkCg7FQQ=; b=YTKa+7mv6Hrpyicxrc93JIKtbwGsAO8uWRqcUJzYdVeGvSFjVXJ4zXWI1j+6HI3JwM 16qoj6t/cyPbOXq/OV2X3UE22uAghiIkQ93ZVQojBr6oNiFzxtEBeOWld8cWIl7Xwb+c rcMPgLN7OizpmVHfMpcd7Xew1LHAaa1BsDPLhIg2dNEkajCRlXNjYj7A77HonvnVTBHs HTbWYXqwsMKERIHGLlluKW2ZqMN91ZFRyey9zuupZlIbs9iNg6qPaoyn0FmHl0l6o5gZ d8bpnodv8vyqFxbgX0Txn3f64O/ITCq9+Dc72wqbVqE/Y6VOD7XgD49NFQfgHuUqRjDf DE9Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741198867; x=1741803667; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=8z4EG64PEenANta4+uVbSSODk00f9kYQBdcZkCg7FQQ=; b=ZBtJKczdjJOV4yaYg/ex07dTW/VJmSxydYzYlr0KDyvCmFd3w4NC6sCpcKrvnk7s5B /G8AAoiQ9ulz4atzeTwg0sfh+kGhrsTKhUfvMvfSJ4BnZhlvJaGhVCS94gYNrvvozue+ to6zMHf+hzImnGuSAZ+75hoM2r1c/DoV/I+xXpvsZ/pFkwGNNimDxbT8KjBecJG8tyhW zpOtl1znQw7GY4ILg1wR3eE5vVxcjp9kZAJxbpnjPoZdHyiy5MZ8VZUy/xBDfw6zTiwC A+kEU8+Kam4M1ChSUiVmE1LK4eyvraROs2gOVRgLwEq1fHTNZ4w33YdeDSLMUNsVIvwu 3jWw== X-Gm-Message-State: AOJu0YwsdTKaM/CqMpjMFgkNE3ZD0ZaF7VYk2LTXPJgCUCPfPBPlihXS j7yG/lSA0R67YbOdyAoC8aR0YxK/+KWx2G0uGr3ZipE1gXaKLow7yiivkA== X-Gm-Gg: ASbGncsq2i6wAxtorJ4fXdQdfUGYX6ve7Qdd+hNkimw+/ICDjqbT0/9tBW+jH3ATWpq QQpWmW72vCF7m1Vle3ciN+gYInJCJ1YtT+vgNc0l9lTN0SVG558Lb9l86araAzOen7bKywz+Qq1 BfCv3vqj0mIyZH2GPlsG33BK9OdHbkeL6h+GES2w1Uk9E7dazYpvm+fS+r2vxwKweV377WhqT5D IhXUbQd93POTptxVnvjnG+0Syjd/CVk1zx4KXS2deCYxYM7+Ik/v1PTAp6uA/rMMBqbkB8AU6h8 d5WCP58YCTp2tEj+sem+a8gcxorSG5mjwGakXsxgNZ0hrVHgILv1Zbo4z4aCT4JCizxJQvqDN9Z 2rVguUrmAWwTS8fGm7ko= X-Google-Smtp-Source: AGHT+IEQCEoYxEm/wIT6rifSwoWsYLYOw5szJZwxnCJ72foKR++krivfIUBi25bK6sv3AQGGgGKu0g== X-Received: by 2002:a17:90b:38d2:b0:2fe:8217:2da6 with SMTP id 98e67ed59e1d1-2ff4979950cmr5949717a91.22.1741198866816; Wed, 05 Mar 2025 10:21:06 -0800 (PST) Received: from localhost.localdomain (c-76-146-13-146.hsd1.wa.comcast.net. [76.146.13.146]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2ff4e8253acsm1650399a91.49.2025.03.05.10.21.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Mar 2025 10:21:06 -0800 (PST) From: Amery Hung To: bpf@vger.kernel.org Cc: daniel@iogearbox.net, andrii@kernel.org, alexei.starovoitov@gmail.com, martin.lau@kernel.org, eddyz87@gmail.com, ameryhung@gmail.com, kernel-team@meta.com Subject: [PATCH bpf-next v5 1/3] selftests/bpf: Clean up call sites of stdio_restore() Date: Wed, 5 Mar 2025 10:20:55 -0800 Message-ID: <20250305182057.2802606-1-ameryhung@gmail.com> X-Mailer: git-send-email 2.47.1 Precedence: bulk X-Mailing-List: bpf@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: bpf@iogearbox.net reset_affinity() and save_ns() are only called in run_one_test(). There is no need to call stdio_restore() in reset_affinity() and save_ns() if stdio_restore() is moved right after a test finishes in run_one_test(). Also remove an unnecessary check of env.stdout_saved in crash_handler() by moving env.stdout_saved assignment to the beginning of main(). Signed-off-by: Amery Hung Acked-by: Eduard Zingerman --- tools/testing/selftests/bpf/test_progs.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/tools/testing/selftests/bpf/test_progs.c b/tools/testing/selftests/bpf/test_progs.c index 0cb759632225..ab0f2fed3c58 100644 --- a/tools/testing/selftests/bpf/test_progs.c +++ b/tools/testing/selftests/bpf/test_progs.c @@ -474,8 +474,6 @@ static void dump_test_log(const struct prog_test_def *test, print_test_result(test, test_state); } -static void stdio_restore(void); - /* A bunch of tests set custom affinity per-thread and/or per-process. Reset * it after each test/sub-test. */ @@ -490,13 +488,11 @@ static void reset_affinity(void) err = sched_setaffinity(0, sizeof(cpuset), &cpuset); if (err < 0) { - stdio_restore(); fprintf(stderr, "Failed to reset process affinity: %d!\n", err); exit(EXIT_ERR_SETUP_INFRA); } err = pthread_setaffinity_np(pthread_self(), sizeof(cpuset), &cpuset); if (err < 0) { - stdio_restore(); fprintf(stderr, "Failed to reset thread affinity: %d!\n", err); exit(EXIT_ERR_SETUP_INFRA); } @@ -514,7 +510,6 @@ static void save_netns(void) static void restore_netns(void) { if (setns(env.saved_netns_fd, CLONE_NEWNET) == -1) { - stdio_restore(); perror("setns(CLONE_NEWNS)"); exit(EXIT_ERR_SETUP_INFRA); } @@ -1270,8 +1265,7 @@ void crash_handler(int signum) sz = backtrace(bt, ARRAY_SIZE(bt)); - if (env.stdout_saved) - stdio_restore(); + stdio_restore(); if (env.test) { env.test_state->error_cnt++; dump_test_log(env.test, env.test_state, true, false, NULL); @@ -1400,6 +1394,8 @@ static void run_one_test(int test_num) state->tested = true; + stdio_restore(); + if (verbose() && env.worker_id == -1) print_test_result(test, state); @@ -1408,7 +1404,6 @@ static void run_one_test(int test_num) if (test->need_cgroup_cleanup) cleanup_cgroup_environment(); - stdio_restore(); free(stop_libbpf_log_capture()); dump_test_log(test, state, false, false, NULL); @@ -1943,6 +1938,9 @@ int main(int argc, char **argv) sigaction(SIGSEGV, &sigact, NULL); + env.stdout_saved = stdout; + env.stderr_saved = stderr; + env.secs_till_notify = 10; env.secs_till_kill = 120; err = argp_parse(&argp, argc, argv, 0, NULL, &env); @@ -1969,9 +1967,6 @@ int main(int argc, char **argv) return -1; } - env.stdout_saved = stdout; - env.stderr_saved = stderr; - env.has_testmod = true; if (!env.list_test_names) { /* ensure previous instance of the module is unloaded */ From patchwork Wed Mar 5 18:20:56 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amery Hung X-Patchwork-Id: 14003128 X-Patchwork-Delegate: bpf@iogearbox.net Received: from mail-pj1-f52.google.com (mail-pj1-f52.google.com [209.85.216.52]) (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 7C53219ABA3 for ; Wed, 5 Mar 2025 18:21:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741198870; cv=none; b=Gxhi1OPeNINmgbyXuEGKiF/0VMicByyT5VRcPZMUxWd7KOHr0n5J5rlMlrT35sXV7e5DHuQ7p3j1ytKnBHPHI9xevx/W1Y7Lj9QiYwvIWuiqhzANd6JHS1T+yptJZfc7uW4aVZ38pVajRMD+kRAAWS/zmECQBk91D53jRABqV+c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741198870; c=relaxed/simple; bh=RPdasL1MbMrPrt4BIYfwhFqWwkvQGilOkYn2DaefPuI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=dG4iiA51Yf7emtTmo6QRKPHQqXNdDMbfiJFbs4krPXdQo5oevbEtODGWLqucR7oS00lQ0b2+uApjfvyulPOaef1hJsrqXXoLuyo96reKLyCpTocPaAo9B+nT0+R3IBY0P932e8U82hJjjO4S1mndsoy9H7/3PYV7EShtPoxeWic= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Ros8ZBDM; arc=none smtp.client-ip=209.85.216.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Ros8ZBDM" Received: by mail-pj1-f52.google.com with SMTP id 98e67ed59e1d1-2fce3b01efcso10502538a91.3 for ; Wed, 05 Mar 2025 10:21:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741198867; x=1741803667; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=EBeZV5R1UAAg+peVD9OiV0vdIAqTzXf/8YWUV1uCT/w=; b=Ros8ZBDMWXhUCeiz+Jabes2ptPMwqcGbSb5w9Xs30bJ1B17AmOiEX3LyRJ9RdIFGgI iof7kffNep1GglRQmpFphY2ZPLrvZvwkEQ0Zc4aG2nctAli2N3eJ6SFtAlUFz+y1I1R8 T3zBlNT8CDZV3xqiQh55rSzGTdihq44RC+6SCAF1xKafqM8k2aVTi6MSwMTYZb6audi9 K8AS3rRr7w4dPY6A4VWDqcAZdr6gD1Oe+qD1AIWBrQFsqnoweL5wtzVCouLLS7wbRzJA bNtoXOcAquMmXU0Irsx4gdXqjnchYQmRrT4hchi68r03VK0NrwsIiVVYVWUhgo7xTLlY Doig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741198867; x=1741803667; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=EBeZV5R1UAAg+peVD9OiV0vdIAqTzXf/8YWUV1uCT/w=; b=CLSgaJJfuZHR1Q92CFMyHA8JzYjvVwoDdmebSw8tfBcYQOv+yCjoNx4K71AkkyGDAi FiOJqgErAnfPNprwN9NDbOsftdxk2z7GHfDpDTPPPn7ZiPW1B4t7nhNmOmKYdI8W7eN6 LV0rXw+Df6V9kL+IuMvV3AuCZINmfGY6EuP2cYn3u+DFnuJtjkMDAVj1FVLb+xC14IKl FLMdAO8p/7JMvH8ruJLgp0sGE0Ry31PfVTrI5UDNbuyz4LlUW/cfRnhfVG8hcdOpTinq GJlW+CPcojd+aEe6kLRxuhRY6J/CG4im9CteoSRS5cs/WhpSkhTgMgEEqAMP9O8WkZMj ECvQ== X-Gm-Message-State: AOJu0Yw+feZkctMbXqbwC1oH2tsbs3p0VkBtg+hJHW8GoE/jW6xZVHsf iLtG/qR7mMzvQJMXCUFajLoRZEhkW6+ADI6a5RAKHj9xNqAWFYaSusjrCg== X-Gm-Gg: ASbGnctpF2ZgRTRQczjUfo8LNbXpxiEdaVrINz4VBri3ZlCr/kFkwUIxB0za38nH2c/ gx7h3VZYP2fU67esSUuGfFXINkMIeBpIZcIKweiVwzsZXHM6JPkXXVdPBY+vXzvONDZiIUqlHjD bUFRio8ftplq6Zs7NTh0ZHsWftpEVfAE+DtmOFcgqj7Udz268Dz7m7TELwZZMXG8z5Aoc3wqy9C jKE+VVCpAB3pJNOIvIJxnsPHLeBZysBvVx7v5m5psJvoWuLEUbzpnPsbj33+Kn+gamFxsWSdOvH IT3IIGKjyD88kIIgMMlUrjuGnfsBIzEmbJ7278wHfX+VhjxG2hVtKVt9EDqLmcYMWMq1ky/QDhe C4QWmPqPMZvxN/WBTtYM= X-Google-Smtp-Source: AGHT+IHGo570AEWTx0pgqFK3ZuFrltqZSoEBzICmqhhW8IH5ZGdA9Iw591USPU89VU96tL+Br7bBZQ== X-Received: by 2002:a17:90b:35cf:b0:2ee:d96a:5816 with SMTP id 98e67ed59e1d1-2ff497900camr7055495a91.10.1741198867602; Wed, 05 Mar 2025 10:21:07 -0800 (PST) Received: from localhost.localdomain (c-76-146-13-146.hsd1.wa.comcast.net. [76.146.13.146]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2ff4e8253acsm1650399a91.49.2025.03.05.10.21.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Mar 2025 10:21:07 -0800 (PST) From: Amery Hung To: bpf@vger.kernel.org Cc: daniel@iogearbox.net, andrii@kernel.org, alexei.starovoitov@gmail.com, martin.lau@kernel.org, eddyz87@gmail.com, ameryhung@gmail.com, kernel-team@meta.com Subject: [PATCH bpf-next v5 2/3] selftests/bpf: Allow assigning traffic monitor print function Date: Wed, 5 Mar 2025 10:20:56 -0800 Message-ID: <20250305182057.2802606-2-ameryhung@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250305182057.2802606-1-ameryhung@gmail.com> References: <20250305182057.2802606-1-ameryhung@gmail.com> Precedence: bulk X-Mailing-List: bpf@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: bpf@iogearbox.net Allow users to change traffic monitor's print function. If not provided, traffic monitor will print to stdout by default. Signed-off-by: Amery Hung --- tools/testing/selftests/bpf/network_helpers.c | 69 ++++++++++++++----- tools/testing/selftests/bpf/network_helpers.h | 8 +++ 2 files changed, 58 insertions(+), 19 deletions(-) diff --git a/tools/testing/selftests/bpf/network_helpers.c b/tools/testing/selftests/bpf/network_helpers.c index 737a952dcf80..11f07c82166b 100644 --- a/tools/testing/selftests/bpf/network_helpers.c +++ b/tools/testing/selftests/bpf/network_helpers.c @@ -750,6 +750,36 @@ struct tmonitor_ctx { int pcap_fd; }; +static int __base_pr(const char *format, va_list args) +{ + return vfprintf(stdout, format, args); +} + +static tm_print_fn_t __tm_pr = __base_pr; + +tm_print_fn_t traffic_monitor_set_print(tm_print_fn_t fn) +{ + tm_print_fn_t old_print_fn; + + old_print_fn = __atomic_exchange_n(&__tm_pr, fn, __ATOMIC_RELAXED); + + return old_print_fn; +} + +void tm_print(const char *format, ...) +{ + tm_print_fn_t print_fn; + va_list args; + + print_fn = __atomic_load_n(&__tm_pr, __ATOMIC_RELAXED); + if (!print_fn) + return; + + va_start(args, format); + __tm_pr(format, args); + va_end(args); +} + /* Is this packet captured with a Ethernet protocol type? */ static bool is_ethernet(const u_char *packet) { @@ -767,7 +797,7 @@ static bool is_ethernet(const u_char *packet) case 770: /* ARPHRD_FRAD */ case 778: /* ARPHDR_IPGRE */ case 803: /* ARPHRD_IEEE80211_RADIOTAP */ - printf("Packet captured: arphdr_type=%d\n", arphdr_type); + tm_print("Packet captured: arphdr_type=%d\n", arphdr_type); return false; } return true; @@ -817,19 +847,19 @@ static void show_transport(const u_char *packet, u16 len, u32 ifindex, dst_port = ntohs(tcp->dest); transport_str = "TCP"; } else if (proto == IPPROTO_ICMP) { - printf("%-7s %-3s IPv4 %s > %s: ICMP, length %d, type %d, code %d\n", - ifname, pkt_type_str(pkt_type), src_addr, dst_addr, len, - packet[0], packet[1]); + tm_print("%-7s %-3s IPv4 %s > %s: ICMP, length %d, type %d, code %d\n", + ifname, pkt_type_str(pkt_type), src_addr, dst_addr, len, + packet[0], packet[1]); return; } else if (proto == IPPROTO_ICMPV6) { - printf("%-7s %-3s IPv6 %s > %s: ICMPv6, length %d, type %d, code %d\n", - ifname, pkt_type_str(pkt_type), src_addr, dst_addr, len, - packet[0], packet[1]); + tm_print("%-7s %-3s IPv6 %s > %s: ICMPv6, length %d, type %d, code %d\n", + ifname, pkt_type_str(pkt_type), src_addr, dst_addr, len, + packet[0], packet[1]); return; } else { - printf("%-7s %-3s %s %s > %s: protocol %d\n", - ifname, pkt_type_str(pkt_type), ipv6 ? "IPv6" : "IPv4", - src_addr, dst_addr, proto); + tm_print("%-7s %-3s %s %s > %s: protocol %d\n", + ifname, pkt_type_str(pkt_type), ipv6 ? "IPv6" : "IPv4", + src_addr, dst_addr, proto); return; } @@ -843,13 +873,13 @@ static void show_transport(const u_char *packet, u16 len, u32 ifindex, tcp->ack ? ", ACK" : ""); if (ipv6) - printf("%-7s %-3s IPv6 %s.%d > %s.%d: %s, length %d%s\n", - ifname, pkt_type_str(pkt_type), src_addr, src_port, - dst_addr, dst_port, transport_str, len, flags); + tm_print("%-7s %-3s IPv6 %s.%d > %s.%d: %s, length %d%s\n", + ifname, pkt_type_str(pkt_type), src_addr, src_port, + dst_addr, dst_port, transport_str, len, flags); else - printf("%-7s %-3s IPv4 %s:%d > %s:%d: %s, length %d%s\n", - ifname, pkt_type_str(pkt_type), src_addr, src_port, - dst_addr, dst_port, transport_str, len, flags); + tm_print("%-7s %-3s IPv4 %s:%d > %s:%d: %s, length %d%s\n", + ifname, pkt_type_str(pkt_type), src_addr, src_port, + dst_addr, dst_port, transport_str, len, flags); } static void show_ipv6_packet(const u_char *packet, u32 ifindex, u8 pkt_type) @@ -964,8 +994,8 @@ static void *traffic_monitor_thread(void *arg) ifname = _ifname; } - printf("%-7s %-3s Unknown network protocol type 0x%x\n", - ifname, pkt_type_str(ptype), proto); + tm_print("%-7s %-3s Unknown network protocol type 0x%x\n", + ifname, pkt_type_str(ptype), proto); } } @@ -1165,8 +1195,9 @@ void traffic_monitor_stop(struct tmonitor_ctx *ctx) write(ctx->wake_fd, &w, sizeof(w)); pthread_join(ctx->thread, NULL); - printf("Packet file: %s\n", strrchr(ctx->pkt_fname, '/') + 1); + tm_print("Packet file: %s\n", strrchr(ctx->pkt_fname, '/') + 1); traffic_monitor_release(ctx); } + #endif /* TRAFFIC_MONITOR */ diff --git a/tools/testing/selftests/bpf/network_helpers.h b/tools/testing/selftests/bpf/network_helpers.h index 9f6e05d886c5..2d726f8f6327 100644 --- a/tools/testing/selftests/bpf/network_helpers.h +++ b/tools/testing/selftests/bpf/network_helpers.h @@ -249,10 +249,13 @@ static inline __sum16 build_udp_v6_csum(const struct ipv6hdr *ip6h, struct tmonitor_ctx; +typedef int (*tm_print_fn_t)(const char *format, va_list args); + #ifdef TRAFFIC_MONITOR struct tmonitor_ctx *traffic_monitor_start(const char *netns, const char *test_name, const char *subtest_name); void traffic_monitor_stop(struct tmonitor_ctx *ctx); +tm_print_fn_t traffic_monitor_set_print(tm_print_fn_t fn); #else static inline struct tmonitor_ctx *traffic_monitor_start(const char *netns, const char *test_name, const char *subtest_name) @@ -263,6 +266,11 @@ static inline struct tmonitor_ctx *traffic_monitor_start(const char *netns, cons static inline void traffic_monitor_stop(struct tmonitor_ctx *ctx) { } + +static inline tm_print_fn_t traffic_monitor_set_print(tm_print_fn_t fn) +{ + return NULL; +} #endif #endif From patchwork Wed Mar 5 18:20:57 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amery Hung X-Patchwork-Id: 14003129 X-Patchwork-Delegate: bpf@iogearbox.net Received: from mail-pj1-f49.google.com (mail-pj1-f49.google.com [209.85.216.49]) (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 7E8BB1C5D4E for ; Wed, 5 Mar 2025 18:21:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741198871; cv=none; b=XlCp0RJnvXGFXKAiESe6ftL8/wBKeDlmW12oStyg3Sg2GRUCuPlBJlD6Puf1e1L+TF2fWYTIR1Mvdb6tU0riUKdJSdFgxWQ7pxY3Ywd/BvSPrWM25zJznmfsDWZmZq/nwlqiE98IsBO7+frEIMqsUUIIpp3akM5AF5RDjW0zj08= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741198871; c=relaxed/simple; bh=lHS1KyrhxnmX/0SRr698FzEj4PqKJqqmupD4tbsB5/k=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=h7pH/O6sp+gkdT9Lcyu8YW7pH9rIQtdkWX80ZsUv0eDQ4mnvYeEe/6Ds6hWUz53UJm0IZj5rLZmSLnskFQzXPmDQIn8J7S8Peff/otx9CY2197M3O0MrlSbZxBnrcgkS/TzwTF3l0UZkRPKi5Reqr6Hzt5zMUMo2MXKQYUgW8o8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=bMPrmM/Z; arc=none smtp.client-ip=209.85.216.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="bMPrmM/Z" Received: by mail-pj1-f49.google.com with SMTP id 98e67ed59e1d1-2fea795bafeso2243618a91.1 for ; Wed, 05 Mar 2025 10:21:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741198868; x=1741803668; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=2hWGJB8WzsONJqoghVlM8QaL0A/tpY27HaVPYYsb1iU=; b=bMPrmM/ZLi+jfCSeLyjkwbt4YK8hlJvBva0UKe5ItwKTIxRpN+NRNnK5T46zb9Ncpx vxe3zcBPaORyOe5FXU9qHBGTGjou0CNNqEV2dkHZUgU+CKAvKrvmYMAeejbrUCkJUZRY hgYnxSlX68LF2EUlNXgCCMWKMZXM9p2Nt6uWQQ6ObU5YnjZWY5M+/MeVu0evwmi0QYAE 7bfScQ5kvVN17ru3TTPjbM8Vy4vnfXY7thvV10rvcihoxfZBUkGlmFE8aHHlroSyRyzJ MHtK4OszXZoN0M/mNgfVXNzq7n0eq1TOL2edWCmAVCxW1dGcwVI68SSkzQuhfupzl5mt fmCw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741198868; x=1741803668; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=2hWGJB8WzsONJqoghVlM8QaL0A/tpY27HaVPYYsb1iU=; b=l0Kb3m3Sgkmbk0yOSQ+oxTECI1/WAgd4oSEBne8Hqf8xhLu6sSbdyLBDGUo5bSeVpI eJJ45uUcqW3uVgXURlwnVqjLN6XCWwwBpviHY42YcrQiuImAlPdg0o1F0vwR4jb58ncB uwxUpRLVncSNHlvA+wN16Iq0gqdd/FKZBwfmpQNFtZw6W5KOC2R4NDLvfa0e0calox5D PQG3WPoxVZgP8DIMqwsyynx0Dm9NL4ihUfDpGRBiuSSM3MHKms+DJyvcW2z2Ry2PoUDt 3fxOnFwVrmgRMhnEiMT9EnyaME17Wpscq+/Q2E9lPdNzgCeUifZkm/M+ZomDkAiKwEhn YIiQ== X-Gm-Message-State: AOJu0YwRNSAaVDMh5uYvPDqG6SeYiCVsIJjlXw6Cxon7PHw9/00sc2A2 oPYQjXSEpr/qnKp8w+/jg1j7kbQ11EQmGgPgWrk/lhfk82BVSBgS24/tnQ== X-Gm-Gg: ASbGncujpywn6aooSCb7TmUUS1vf+qw89TcbZSf2hENtv2jVOQ7OJuqj5Clun0DhPyx 9zHYVEPIcMzHezmSfLEYsF0h77jocNnkA13LPh2gjoM41C3Eync7Y1Tj6Tk1z0/gaKcpHw3yWEz kllWMPfqg+uGJgTN9RCCpOr7AZ8F70w6dj37Rhi5nfcDpBi+x2ihdPU8x1HDmwNmm0XT/HGjfNs 58O2eRvoJXrw92Q2gF3XG9ZozHUtKRUq4qYc6VUCPaILuZT6JDvE/7rqz+yKq1+Jbo6O3ADSO1e s1drrQTPbA0SFoD/mN7cVoJ5JbPLQTU/URSFSCvtkG2FPUsfbC/f7MbHUuLxgNvdLGYsOH11mqc Nq4gZS2n0aIUuzD0lScw= X-Google-Smtp-Source: AGHT+IELemUSWwGqFUT2uKH88X7MFmXvaaKcmpdm52VXhJkqszx1FPBbXfxF2/nhYq3hXvhzPOFg5g== X-Received: by 2002:a17:90b:2b4c:b0:2f9:d0cd:3403 with SMTP id 98e67ed59e1d1-2ff617bbe47mr500902a91.16.1741198868410; Wed, 05 Mar 2025 10:21:08 -0800 (PST) Received: from localhost.localdomain (c-76-146-13-146.hsd1.wa.comcast.net. [76.146.13.146]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2ff4e8253acsm1650399a91.49.2025.03.05.10.21.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 05 Mar 2025 10:21:08 -0800 (PST) From: Amery Hung To: bpf@vger.kernel.org Cc: daniel@iogearbox.net, andrii@kernel.org, alexei.starovoitov@gmail.com, martin.lau@kernel.org, eddyz87@gmail.com, ameryhung@gmail.com, kernel-team@meta.com Subject: [PATCH bpf-next v5 3/3] selftests/bpf: Fix dangling stdout seen by traffic monitor thread Date: Wed, 5 Mar 2025 10:20:57 -0800 Message-ID: <20250305182057.2802606-3-ameryhung@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250305182057.2802606-1-ameryhung@gmail.com> References: <20250305182057.2802606-1-ameryhung@gmail.com> Precedence: bulk X-Mailing-List: bpf@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-Patchwork-Delegate: bpf@iogearbox.net Traffic monitor thread may see dangling stdout as the main thread closes and reassigns stdout without protection. This happens when the main thread finishes one subtest and moves to another one in the same netns_new() scope. The issue can be reproduced by running test_progs repeatedly with traffic monitor enabled: for ((i=1;i<=100;i++)); do ./test_progs -a flow_dissector_skb* -m '*' done For restoring stdout in crash_handler(), since it does not really care about closing stdout, simlpy flush stdout and restore it to the original one. Then, Fix the issue by consolidating stdio_restore_cleanup() and stdio_restore(), and protecting the use/close/assignment of stdout with a lock. The locking in the main thread is always performed regradless of whether traffic monitor is running or not for simplicity. It won't have any side-effect. Signed-off-by: Amery Hung Acked-by: Eduard Zingerman --- tools/testing/selftests/bpf/test_progs.c | 39 +++++++++++++----------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/tools/testing/selftests/bpf/test_progs.c b/tools/testing/selftests/bpf/test_progs.c index ab0f2fed3c58..d4ec9586b98c 100644 --- a/tools/testing/selftests/bpf/test_progs.c +++ b/tools/testing/selftests/bpf/test_progs.c @@ -88,7 +88,9 @@ static void stdio_hijack(char **log_buf, size_t *log_cnt) #endif } -static void stdio_restore_cleanup(void) +static pthread_mutex_t stdout_lock = PTHREAD_MUTEX_INITIALIZER; + +static void stdio_restore(void) { #ifdef __GLIBC__ if (verbose() && env.worker_id == -1) { @@ -98,6 +100,8 @@ static void stdio_restore_cleanup(void) fflush(stdout); + pthread_mutex_lock(&stdout_lock); + if (env.subtest_state) { fclose(env.subtest_state->stdout_saved); env.subtest_state->stdout_saved = NULL; @@ -106,26 +110,21 @@ static void stdio_restore_cleanup(void) } else { fclose(env.test_state->stdout_saved); env.test_state->stdout_saved = NULL; + stdout = env.stdout_saved; + stderr = env.stderr_saved; } + + pthread_mutex_unlock(&stdout_lock); #endif } -static void stdio_restore(void) +static int traffic_monitor_print_fn(const char *format, va_list args) { -#ifdef __GLIBC__ - if (verbose() && env.worker_id == -1) { - /* nothing to do, output to stdout by default */ - return; - } - - if (stdout == env.stdout_saved) - return; - - stdio_restore_cleanup(); + pthread_mutex_lock(&stdout_lock); + vfprintf(stdout, format, args); + pthread_mutex_unlock(&stdout_lock); - stdout = env.stdout_saved; - stderr = env.stderr_saved; -#endif + return 0; } /* Adapted from perf/util/string.c */ @@ -536,7 +535,8 @@ void test__end_subtest(void) test_result(subtest_state->error_cnt, subtest_state->skipped)); - stdio_restore_cleanup(); + stdio_restore(); + env.subtest_state = NULL; } @@ -1265,7 +1265,10 @@ void crash_handler(int signum) sz = backtrace(bt, ARRAY_SIZE(bt)); - stdio_restore(); + fflush(stdout); + stdout = env.stdout_saved; + stderr = env.stderr_saved; + if (env.test) { env.test_state->error_cnt++; dump_test_log(env.test, env.test_state, true, false, NULL); @@ -1957,6 +1960,8 @@ int main(int argc, char **argv) libbpf_set_strict_mode(LIBBPF_STRICT_ALL); libbpf_set_print(libbpf_print_fn); + traffic_monitor_set_print(traffic_monitor_print_fn); + srand(time(NULL)); env.jit_enabled = is_jit_enabled();