From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f52.google.com (mail-wm1-f52.google.com [209.85.128.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 ECE6E32F766 for ; Wed, 18 Feb 2026 19:22:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.52 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771442549; cv=none; b=PjbABUPa69L93h63oX4lzqD8PE/rgxw2fU0Wdi2YZDclMNK+ff4t5/Gap/KS1+fAS4aoq6bzy1stOo4CBwWH4JmsvUkio9eac3hQi9CYwADHe5fReutZLBLsCdeBNpWahqqN/LHluydg0P/8kALPzU3Z9Yj1Bc4++GeEeCcdU24= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771442549; c=relaxed/simple; bh=AqheUMiunbk49MCqtm+1Vyf1gL0rpUY0Uo9gj9Xkk3E=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=VshmIlKEivXZ/WtwCcaKidJqTzhEYPEU4lor/QQ0QnoIHVlYnNv5b4ktIr5iLrLc+RJ24yG76oObOB3uw/L7Hr/F8Ghw6Tpp7FnEdbUBuKmAHuR0XUdWW/9u/XxTTU01qZiKgFNUYvTOA22oYmh0feBNSKY6ylp2jkKYJVQdcl4= 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=LhXctjW+; arc=none smtp.client-ip=209.85.128.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="LhXctjW+" Received: by mail-wm1-f52.google.com with SMTP id 5b1f17b1804b1-483770e0b25so2249385e9.0 for ; Wed, 18 Feb 2026 11:22:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771442546; x=1772047346; 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=AVMlBdmpOuHs2JwMXGuyKiiGeiy+JMhNRC/Yui3rPM4=; b=LhXctjW+C9ABXe2QX5hmcRjMjP/cJ6J4gXUUAMyfXWdwXYU/f3+FXayLkANkUmIxsr o4h8KM2dnOXELECfhVjkDLatRSN1HsFURerDTcD/n23SAUxrkoUOSHSrsJwaO12E8ncp NJXtm6lRn5/A0knwg3FGLKmjIojeLaGT4Hq45M/lbY+N6r6NBF4+p56PDvtRLrTsdgw9 Q17ZOlXIjiQLLmi2Qu3A5dX/zZ0Yi8SempQCkPNxBse+HULnO91Uf4yu/Q86ubgDMlId AGrFx7O7yyvniFAYrl31tFA9vcUtct02nWlcw1bDCggPafGrcivfGy/QCTRMuLofb5py H2HA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771442546; x=1772047346; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=AVMlBdmpOuHs2JwMXGuyKiiGeiy+JMhNRC/Yui3rPM4=; b=nUEDU5PiGbY1f6dlIkx7esJ4H02lvb3qYfTPVVTyml/SRTXBCnELERATwSQTsbVifV pvlEILQeTnivdJUGi8C+LT8oIXnRlgds41cpLyg+fUuY+5HtPAwryhOYTzvRc3WSaRbk uZlUEo9Z6UFMnoSUk1RF94vUgTaErWNiiH3buZFyVg/yK+I1ZMIpuNbW2E0xKocwN+dv 1JB/8u5akdgRSIwQEtZQ2rpIOBJEpyRlvS5rNPLiNXoi82khS/p3TFIKT4CRyQ8g+OWi iQaTAWtkTVfwzKnAjotB2VFY8Ez9MAeYQciKJZtmFrtinaOaiUuwM46/JULqSMrK7y4t 9DAw== X-Gm-Message-State: AOJu0YwAZGwB8zmNqb7KYFF+errGLpDhphBfoaGmLcVcJb1NXwYQH1ZT eNRBIwCxiwLggGCxIpQbXFCHgdr8YedFOsJFb0f6SeBB20Mg8UZHw8bVF/GtMxmI X-Gm-Gg: AZuq6aLJtaH3ATP5SK/z/T1xAZo1hoqAYKk/y6HHMonWYpzYz48YX01XG4O+hhQZxJ2 2cYmgsED6RC0Z1eAryiiFjHzBosSm9a84iKG0B/2dD+HhQuKxVy7bmFz7repPuegQZS9GrYqEfQ ZlAWEipIfc/Pql1GE87XoKTcY2+BS85xCw1Aabo9ECZh1s60C9SVlkbDfiQOUyKuRARPtmq8Lh0 1mbO3DwnrXkXd+0D2lKe7G2jQT/Whesz8JC7BuCyY3J7V8/yti1FHVC3AaUiRRXceURz8jEzoxP uylt+EZjD/+hYhk4XDeu5ii1JbvPi8p1Bel1NE21o/QBK5xv5FYIWz3JR74QjW1vhgH4+9PVLqU k+PmClyaxgsh05wpoNhkZj9qjNt9J4/6blGRK/eQ/7/tGSedyjVRzCzqkDsNNtgcNvN/T5XK550 Pd/rv0NgbWRJQgf6+sSdfSt3EW3bTcFgXulsYsw5Lsxdsh4UArH4MkgqzRMKIpUV5TyJas2Vfgo z7zR5VrII2HujDGmWkr X-Received: by 2002:a05:600c:8411:b0:477:7af8:c88b with SMTP id 5b1f17b1804b1-48371051b20mr272629525e9.11.1771442546046; Wed, 18 Feb 2026 11:22:26 -0800 (PST) Received: from rozandragon.chello.ie (188-141-5-72.dynamic.upc.ie. [188.141.5.72]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4834d5e11f5sm610413065e9.4.2026.02.18.11.22.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 18 Feb 2026 11:22:25 -0800 (PST) From: David Carlier To: Tejun Heo , David Vernet Cc: linux-kernel@vger.kernel.org, David Carlier Subject: [PATCH] tools/sched_ext: scx_userland: fix data races on shared counters Date: Wed, 18 Feb 2026 19:22:23 +0000 Message-ID: <20260218192223.8665-1-devnexen@gmail.com> X-Mailer: git-send-email 2.51.0 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit The stats thread reads nr_vruntime_enqueues, nr_vruntime_dispatches, nr_vruntime_failed, and nr_curr_enqueued concurrently with the main thread writing them, with no synchronization. Use __atomic builtins with relaxed ordering for all accesses to these counters to eliminate the data races. Only display accuracy is affected, not scheduling correctness. Signed-off-by: David Carlier --- tools/sched_ext/scx_userland.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/tools/sched_ext/scx_userland.c b/tools/sched_ext/scx_userland.c index 504a80824f5c..3f2aba658b4a 100644 --- a/tools/sched_ext/scx_userland.c +++ b/tools/sched_ext/scx_userland.c @@ -157,9 +157,9 @@ static int dispatch_task(__s32 pid) err = bpf_map_update_elem(dispatched_fd, NULL, &pid, 0); if (err) { - nr_vruntime_failed++; + __atomic_add_fetch(&nr_vruntime_failed, 1, __ATOMIC_RELAXED); } else { - nr_vruntime_dispatches++; + __atomic_add_fetch(&nr_vruntime_dispatches, 1, __ATOMIC_RELAXED); } return err; @@ -202,8 +202,8 @@ static int vruntime_enqueue(const struct scx_userland_enqueued_task *bpf_task) return ENOENT; update_enqueued(curr, bpf_task); - nr_vruntime_enqueues++; - nr_curr_enqueued++; + __atomic_add_fetch(&nr_vruntime_enqueues, 1, __ATOMIC_RELAXED); + __atomic_add_fetch(&nr_curr_enqueued, 1, __ATOMIC_RELAXED); /* * Enqueue the task in a vruntime-sorted list. A more optimal data @@ -279,9 +279,9 @@ static void dispatch_batch(void) LIST_INSERT_HEAD(&vruntime_head, task, entries); break; } - nr_curr_enqueued--; + __atomic_sub_fetch(&nr_curr_enqueued, 1, __ATOMIC_RELAXED); } - skel->bss->nr_scheduled = nr_curr_enqueued; + skel->bss->nr_scheduled = __atomic_load_n(&nr_curr_enqueued, __ATOMIC_RELAXED); } static void *run_stats_printer(void *arg) @@ -306,9 +306,9 @@ static void *run_stats_printer(void *arg) printf("|-----------------------|\n"); printf("| VRUNTIME / USER |\n"); printf("|-----------------------|\n"); - printf("| enq: %10llu |\n", nr_vruntime_enqueues); - printf("| disp: %10llu |\n", nr_vruntime_dispatches); - printf("| failed: %10llu |\n", nr_vruntime_failed); + printf("| enq: %10llu |\n", __atomic_load_n(&nr_vruntime_enqueues, __ATOMIC_RELAXED)); + printf("| disp: %10llu |\n", __atomic_load_n(&nr_vruntime_dispatches, __ATOMIC_RELAXED)); + printf("| failed: %10llu |\n", __atomic_load_n(&nr_vruntime_failed, __ATOMIC_RELAXED)); printf("o-----------------------o\n"); printf("\n\n"); fflush(stdout); @@ -376,10 +376,10 @@ static void bootstrap(char *comm) { exit_req = 0; min_vruntime = 0.0; - nr_vruntime_enqueues = 0; - nr_vruntime_dispatches = 0; - nr_vruntime_failed = 0; - nr_curr_enqueued = 0; + __atomic_store_n(&nr_vruntime_enqueues, 0, __ATOMIC_RELAXED); + __atomic_store_n(&nr_vruntime_dispatches, 0, __ATOMIC_RELAXED); + __atomic_store_n(&nr_vruntime_failed, 0, __ATOMIC_RELAXED); + __atomic_store_n(&nr_curr_enqueued, 0, __ATOMIC_RELAXED); memset(tasks, 0, pid_max * sizeof(*tasks)); LIST_INIT(&vruntime_head); -- 2.51.0