From patchwork Tue Mar 4 16:36:24 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amery Hung X-Patchwork-Id: 14001120 X-Patchwork-Delegate: bpf@iogearbox.net 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 3E23827D78E for ; Tue, 4 Mar 2025 16:36:36 +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=1741106198; cv=none; b=WXw8miU5dy7PtB5tqQjNmvST6OLA0g6Rebnrzuqk1vh5VwF/bsXjOpfBeqkSRvDvk3t6l48hMYjU0be1XexZXJ//2Ez/tdy1LF5P1bznrB5tpeoM3fcwUYM8GzOQ4r7GkaPGsjkR+uHicVnwC8r0ElVZFd5zTNvhm9D5Gjp45fU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741106198; c=relaxed/simple; bh=cmj6bbIUqp8KpVm7XmlXg9Sr0ixNvnpECyPWlxSgQO8=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=VpDScPOmFYyWm+Z/B5TMQHCvlvc2WL8zNwg2lZwlA7O92nlo6tio6B66c1I9q4U74rPxJbzOfgfxDJLUiij4tNfWDIPDKrmuUJ6v/2xEGLfDLAMh5y/AlDmuwO4xAaTJMmZOQ5GWUdg+lCGCW3Iz7uKLO5j5qmMkHVpAUfxwLI4= 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=MfMBYbOA; arc=none smtp.client-ip=209.85.214.171 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="MfMBYbOA" Received: by mail-pl1-f171.google.com with SMTP id d9443c01a7336-223cc017ef5so32988855ad.0 for ; Tue, 04 Mar 2025 08:36:36 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741106196; x=1741710996; 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=YwE8stpXJbXD+kGBqv12ge0hXz6xpKbJOoTcTsZBR4A=; b=MfMBYbOACbQ7/ks0rQUC9GiYUBHoI1WZ5VTtxBczVisbCdTKdbjlP5UTWgsq89CrX5 iIwOsAKBaXf6QLmjQK4UwvI8LznipPKQboFHojxcAVYiSDdmxG1yI+vXtzwYS/e0ThxJ gp+UAZ9Ii7TO4csuTUbysmh0lnroWShJUvu0psjzJE8o8NgU0ASIIHXeSqgBZfuvBOpk GCrhIt5XOveyfYkJAMsQvGTPvKDVfDI2yQwZx/zosnWZCEcAos6axkSmH7GFd0hGjwfU eb8wNzaO5jaN7N1KSszbc7JtBL30Ju+1hJXuBSFw5i4N6HpDorKbmCcFx+bHQm+65Tz5 wcPA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741106196; x=1741710996; 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=YwE8stpXJbXD+kGBqv12ge0hXz6xpKbJOoTcTsZBR4A=; b=N8pMi2hR8z0kLXbXj8N1WXwvOuV/FvVS8UH1Cdjn6ySgHl6LZIQoWGdW/GhA+FDuVS cB+76UB3d+DmZC1PRYc4pAw954SkcZrUXiXqq3uCXm725offRLfE8So1U9He15rVk+WI y+SIGfklPxHubY07Gr9JUHmk20Lm/cL50CXB02d1MFD/bBM+BUKaSulRlH2A0eB/IMek nMNRW5quOf4qVb/jKbK8deziyjENtK3EVKEJMRJMSF2VnMAsY4mWnZSS9HSWZyC39aV/ 07Y0mzEBZ4prRCLSbnvLGnwKTY13FGRNAdg313GMw7JlXN+EVOtBP87WeVUdEJ0jJP4t 4qIg== X-Gm-Message-State: AOJu0YxxEJdrHjMU0NpR35sici7vioZoyxlvxyUPUISR71zODpmD8dy9 xCEvLaiUL8zAvsU3jT36/xoOdfzYTkhK2+/tRUb17nEDgOO+bJKEcbfD3Q== X-Gm-Gg: ASbGnctnkwznyK/f3It6faLPPKH1HJEyo3OR93tddegygXJuQhe47xPIcWxOtmwvabo rAzwFhI61qKdhqfiT4hNyJcQOQKb1XucWRk4xHpBfiEhEui6c5UMBnJxIFMJITEEtWg0AL/HNip fpTBvqB75jXl9vzKbq8k6fJK88CRpZsMAtQdNPWizBDrQufmgaZ43c+1b/OBooZ5Fq6mtqKRrPS 31cM9gt5yXMffQcwTBRW0vYjvk/CIaSpH3aklCCs8g9Oz+oyRERj0Oxq+BpDz3FfCwK6jVj6d+c oVJsaX9L5109fM2d3/KEFzJWzezAxoEljxPB0oRV91Snxp9+UvRd3p5HMHHc1+d6SI3teSh+Y2U buDtcrKeOTiYC/sKnF/g= X-Google-Smtp-Source: AGHT+IGt6Bw8UQPPlJNYmEvlfVCTLToEjDkUpEl1qwr46xOXVv5w/HCQR3m4ah0LcsvgrNxYfDyXAg== X-Received: by 2002:a05:6a00:1791:b0:736:434f:57f4 with SMTP id d2e1a72fcca58-736434f5acdmr15641179b3a.21.1741106196184; Tue, 04 Mar 2025 08:36:36 -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 d2e1a72fcca58-7349fe2a640sm11522175b3a.16.2025.03.04.08.36.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Mar 2025 08:36:35 -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, ameryhung@gmail.com, kernel-team@meta.com Subject: [PATCH bpf-next v4 1/3] selftests/bpf: Clean up call sites of stdio_restore() Date: Tue, 4 Mar 2025 08:36:24 -0800 Message-ID: <20250304163626.1362031-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 There is no need to call a bunch of stdio_restore() in test_progs if the scope of stdio redirection is reduced to what it needs to be: only hijacking tests/subtests' stdio. Also remove an unnecessary check of env.stdout_saved in the crash handler. 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 Tue Mar 4 16:36:25 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amery Hung X-Patchwork-Id: 14001121 X-Patchwork-Delegate: bpf@iogearbox.net Received: from mail-pl1-f174.google.com (mail-pl1-f174.google.com [209.85.214.174]) (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 180EE20E716 for ; Tue, 4 Mar 2025 16:36:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.174 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741106199; cv=none; b=CLyNEzX8yOauK4fd8mCt3rufZbqYzVepd75XT1NvO87Mwgq8Ij1SetFT1NWCrlLzvSOvHtmThziIpFdpK512G8GzswWBAniI5a7O4sXc9Kvhu/QyznLwdOAqAlcE8wng8VpFq9I681Q9siIpHO8QOFniGogbNTG/0zETnmvyq2U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741106199; c=relaxed/simple; bh=RPdasL1MbMrPrt4BIYfwhFqWwkvQGilOkYn2DaefPuI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kT5Ac0oUi4jfHDzrm4PXJLlrdTbXl8BQ7J895iG+HY+m8/isHsH26VItPPgDC7I24sHdUYI6SLIBm4r0v3ZO4FtjrPilPBv3Pcob0JK2UzxkNfOBeUYA4hvT4XOK6ylYH/xT2hH1YS5xBkRkTMQ5gaJbaM3cigwCj3QyJvfclm8= 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=ePHQNT+X; arc=none smtp.client-ip=209.85.214.174 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="ePHQNT+X" Received: by mail-pl1-f174.google.com with SMTP id d9443c01a7336-223785beedfso72301505ad.1 for ; Tue, 04 Mar 2025 08:36:37 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741106197; x=1741710997; 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=ePHQNT+XVwIOY3YA81XvAdJXCe9OMJyjlm7momBncmlLZUbD1vYc6pm335zf3LUfr5 CVgTJC3ZsHg4wTSBS1zwPHeu7W8uwOD0suiaMJ45P8dQlMSUQbxQSgl11xKwpB7oINXr L16/QurqvVIhUgKQGf0EgDoVHOsssHVU45Z1KUMKboxxox7jU3YveCOldhhmBfi6qmGw 3lQNsJRJEIDbstmoDkMCxour5oc1JGdhzBIVc39sOt8rghCTrrc01mIETob3khs4GILi P4HndjsClHIQ5BWEUVsNkoKE/KLc8KJr3HeEuRXLuuFnwheTqyOgZXkicOV6yN0MgbCd Ze+g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741106197; x=1741710997; 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=TUxmMAygYMoz9cdLm8HvubsZPCIctTZuPWH+ZO2BE+FImu/rClURxH9Zk/I8XAuNUd QldtwvWCZKx6qvcrANf70+cjnhIQfywei28nTT1tdGcMexs6TaeK8PN+Yk8rrdNfjPVA UbIlVd89vtNXKkvDhlaRWJ6JHwkPKXj6OVGaxBmQaDSIfQyQMBpprzNxxwFhrXRWBYw6 W4XcNpHH9e9v3fQjLN2e/PzCAIcZ0DHI5x1gR54ZQ0A2pTBCNVE42yfTOhAYfDhnpn8c ct5yCojnS+v1tQ2ugWKCGafV4ejgY7TOc3npo1Pzx8Z5G5H8dPsvI49JKPLqVesLck5H 8bDg== X-Gm-Message-State: AOJu0YwJEUr23HBYpiOmhQ/JS46tIk4ytvnZsPOciZGFqPaE9TnNcwfN unfUlGLuVg9TlSP3nVJ1Gp2mlbS7Qq6ORhrhTRM2EOVziCYtTdMuWOIz0Q== X-Gm-Gg: ASbGncsHJu3cSV5346kvflpKX8sdWrcWCD478SADCIXR35B33Exswp0NCmS/PfTDpK6 kEJMYZCv5D2Ump3EPSIIsoIvBxMeGx5+lwRawOeZvjEDCtViksWTeqkQKw7g2z9sjFJ2aCfekIY WqVxWxOYLZyb1rsvZk97+j+ZRGs51cH1WRi47ysjF0v+vclhEJGVnTH9cZ70usOvZBzYwoWly1X PNekC/SI+gEf0X/CytCIRuLF6s7SBCuY1ihxxfB+2EErbPmsD8z/Ex/v5Oc7mM372TsiBKhe+71 33GMVkA6vHUwkKOfh53usvdAWf8T9LsrPcLJUpZWTNJlfRC9cRJ0ZYDYgJO2FdRrCeWoVwWK3Kj JSF1kkfAoQifYf3/4brE= X-Google-Smtp-Source: AGHT+IGwfOa5ZhVnNacAJOPecoHkWeOyha5xogkk4xyYjBRKxg3JlPYDyyHHFz6Ng8rneyRP6jqu0w== X-Received: by 2002:a05:6a00:3ccc:b0:736:69aa:112c with SMTP id d2e1a72fcca58-73669aa1598mr7613554b3a.9.1741106197026; Tue, 04 Mar 2025 08:36:37 -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 d2e1a72fcca58-7349fe2a640sm11522175b3a.16.2025.03.04.08.36.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Mar 2025 08:36:36 -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, ameryhung@gmail.com, kernel-team@meta.com Subject: [PATCH bpf-next v4 2/3] selftests/bpf: Allow assigning traffic monitor print function Date: Tue, 4 Mar 2025 08:36:25 -0800 Message-ID: <20250304163626.1362031-2-ameryhung@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250304163626.1362031-1-ameryhung@gmail.com> References: <20250304163626.1362031-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 Tue Mar 4 16:36:26 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Amery Hung X-Patchwork-Id: 14001122 X-Patchwork-Delegate: bpf@iogearbox.net Received: from mail-pl1-f176.google.com (mail-pl1-f176.google.com [209.85.214.176]) (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 C6EBB283C9F for ; Tue, 4 Mar 2025 16:36:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741106200; cv=none; b=Dp2tShjAfihfP3lg8XDofSv7+v2Bzlzs5y16cAfJDnMbC0XDSy33tvR3v8rQGGIKnexh7UmnrIxv2k47iGbl3bwUwtgQFqtL78MD1TdRdnm3EoMIE/EFYbYeuXoqljyhDYNZSppZdXmW0U4QYKaYsF22Nd2MfY55Yp24pN/2nF0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1741106200; c=relaxed/simple; bh=kqNHw2+T/1wXMr6Y3928ToTIzaObb12uuShcoklOe2c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=RJRG5YdZjAdqdm7IbmUbkr5qcVdftRMg3ULRKMHa/Z+gcz0FoVKbb+4weKVEsnYEZSsCvP+LUMRFTdMGZBikqsJ1FW6n5yWVqzNg0sbHOOqulpHu6XKZRShPoeFuxK9FKkjnae8dpfl/JEgqbGIdxGArtGdIkAARAU737UcHsuc= 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=e+4x6aZ1; arc=none smtp.client-ip=209.85.214.176 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="e+4x6aZ1" Received: by mail-pl1-f176.google.com with SMTP id d9443c01a7336-2239f8646f6so56708915ad.2 for ; Tue, 04 Mar 2025 08:36:38 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1741106198; x=1741710998; 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=KGXRguMufwQmV+Pu+mdyOEnpHQa0yP21dRDMQmg9c/c=; b=e+4x6aZ1uYBB21Fbx5uJsdsES8z6tdp8xNYPTAAWiMwkEX96YgR/zUkeYb5ir31xZw t2kf/vmXBq7qmujJtMpbAWUeTVRorY599YsYoOTP1sEthd+HBoZztrrm+UvHMr2Z9IHR YwuwBF/EC8GvsCNSvXL1nr1LAxItW6uK/sJpneaPHEW6XekUqEmoz+JwtFgBPaX4pfd8 gu/+SFrHbKfmxC2yiImcacl6pZCWiVc5dNhPi2A7P7xnU3HVFDEtf/Rm1brtO7SAaNDA c9mtTBA8S1Q20FbMzbKZmYc7Ffaw8cpDTqmOPdtQIK7c1XBr7WJRLYm1xFnty9PAUOq8 9K4g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741106198; x=1741710998; 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=KGXRguMufwQmV+Pu+mdyOEnpHQa0yP21dRDMQmg9c/c=; b=VKUWHDqCMa//haFKAk/kwvMIhkw2JhL54BSA8ehrWjNJ0a1mgX8uG98LA1ax8iXpo7 CG8UYaQPYheTyqMuZJnx3gJlH1rUftUs3Bv/zNOAKVRaFEJJiv65rVevAj6+HbOmVFme C8WqS9qcGAZXutXDIqpgC+lo0DDbXUTzdf/wPZKaAJnszIhyyB7Jcs/yPS13V328Ql/I 5C7dlYSZcl2Irlu3Tr80ELC46dXNlywtWW5o426s1iWPJEmLWMgyfn+ZxkneEfzZBqEh NtPkMGP3Qsxo6HOumtLkJWA1MqrsXix21HwovvRcqWFNFhEtpTAKcxaWY/oelRsElARv YznQ== X-Gm-Message-State: AOJu0Yz3oDwPXWzpO05pk4eudyg9EBDc0u/HH8UZspRPnfK5mbBYl7kq rjBsOYhY5rHQgPebsqr7epk+so7lEl+jcME8iZaPBaJ26xUqU3jCnlKHtA== X-Gm-Gg: ASbGncuGrJk3/qU7gHXA6aEVng4ijFnrz3as0ahfQHF76SKn1ME5jJOfemxhZ/FXFas cP6IUR3ZdAjYBiS1qKsOzE2wi9DbucvE+ttShUukbQiQTuRl2EB/c5y+aew0VoE6A22xvQC1ILe OupkUhmACMT2iJBvCsmn8ZgIdtKrCKDuiMOOJr0+of0g8W87eWqJ9UiyOjrImvIYa8T33HJ3OIX Ju1cOVCXWjp49VZjlyb0+UVuUXqEAu2+b/9OshbaX/IoaP559ILqaAZWTAR0sdkSoK2WYv8O75S O6bAEYfe2WVnlGK4fj9hUqkB4DaipB89ErmmtK665BeMfJQ9BouK12ahqBcA6ToEXEw9LrZ+Qpu 00cnxdAbp5CAlRjW58yo= X-Google-Smtp-Source: AGHT+IG/pbhzU6mnv3ToWceZ6QtglhmDrfkKRkwpNRGQaLUrEBC6RP7ocpNAivPitxOJTF1jBMmfKA== X-Received: by 2002:a05:6a00:b4c:b0:736:450c:fa54 with SMTP id d2e1a72fcca58-736450cff8amr13852469b3a.6.1741106197819; Tue, 04 Mar 2025 08:36:37 -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 d2e1a72fcca58-7349fe2a640sm11522175b3a.16.2025.03.04.08.36.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 04 Mar 2025 08:36:37 -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, ameryhung@gmail.com, kernel-team@meta.com Subject: [PATCH bpf-next v4 3/3] selftests/bpf: Fix dangling stdout seen by traffic monitor thread Date: Tue, 4 Mar 2025 08:36:26 -0800 Message-ID: <20250304163626.1362031-3-ameryhung@gmail.com> X-Mailer: git-send-email 2.47.1 In-Reply-To: <20250304163626.1362031-1-ameryhung@gmail.com> References: <20250304163626.1362031-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 Fix it by first consolidating stdout assignment into stdio_restore(). stdout will be restored to env.stdout_saved when a test ends or running in the crash handler and to test_state.stdout_saved otherwise. Then, protect use/close/reassignment 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. stdio_restore() is kept in the crash handler instead of making all print functions in the crash handler use env.stdout_saved to make it less error-prone. Signed-off-by: Amery Hung Tested-by: Eduard Zingerman --- tools/testing/selftests/bpf/test_progs.c | 59 ++++++++++++++++-------- 1 file changed, 39 insertions(+), 20 deletions(-) diff --git a/tools/testing/selftests/bpf/test_progs.c b/tools/testing/selftests/bpf/test_progs.c index ab0f2fed3c58..5b89f6ca5a0a 100644 --- a/tools/testing/selftests/bpf/test_progs.c +++ b/tools/testing/selftests/bpf/test_progs.c @@ -88,7 +88,11 @@ 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 bool in_crash_handler(void); + +static void stdio_restore(void) { #ifdef __GLIBC__ if (verbose() && env.worker_id == -1) { @@ -98,34 +102,34 @@ static void stdio_restore_cleanup(void) fflush(stdout); - if (env.subtest_state) { + pthread_mutex_lock(&stdout_lock); + + if (!env.subtest_state || in_crash_handler()) { + if (stdout == env.stdout_saved) + goto out; + + fclose(env.test_state->stdout_saved); + env.test_state->stdout_saved = NULL; + stdout = env.stdout_saved; + stderr = env.stderr_saved; + } else { fclose(env.subtest_state->stdout_saved); env.subtest_state->stdout_saved = NULL; stdout = env.test_state->stdout_saved; stderr = env.test_state->stdout_saved; - } else { - fclose(env.test_state->stdout_saved); - env.test_state->stdout_saved = NULL; } +out: + 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 +540,8 @@ void test__end_subtest(void) test_result(subtest_state->error_cnt, subtest_state->skipped)); - stdio_restore_cleanup(); + stdio_restore(); + env.subtest_state = NULL; } @@ -1276,6 +1281,18 @@ void crash_handler(int signum) backtrace_symbols_fd(bt, sz, STDERR_FILENO); } +static bool in_crash_handler(void) +{ + struct sigaction sigact; + + /* sa_handler will be cleared if invoked since crash_handler is + * registered with SA_RESETHAND + */ + sigaction(SIGSEGV, NULL, &sigact); + + return sigact.sa_handler != crash_handler; +} + void hexdump(const char *prefix, const void *buf, size_t len) { for (int i = 0; i < len; i++) { @@ -1957,6 +1974,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();