From nobody Wed Oct 8 14:53:57 2025 Received: from mail-wr1-f51.google.com (mail-wr1-f51.google.com [209.85.221.51]) (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 A795F2E975D; Thu, 26 Jun 2025 15:53:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750953204; cv=none; b=es6o3k7zZ1GZeB3cmz7ZP6fBQUIaq3nnwvm/mlIVwSgiDtefwHm3/KKwQydmUrgfGVWgQKBNTuIRBbYts+rXlFyBJGZS3qu5l7gArHjO+QdRAU2TVTTMwJgKMfN/3M7jxDmwpi1Nrz8jghXBeFlzblZx8AiG+NQ3t6E5KK1NS0w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750953204; c=relaxed/simple; bh=C73WJsGSy+51BG0/EVcFn0MOBCuig+szOU1Mn6jtkAU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=S2yUVP86tYTH3aBwKw888YHLUyrFoU2XnSfpFu9BFhp9qicV8SuWvkdRrfXgs6eeTk6oEHz2NtQMuAIAYhjUOv0FIvnlzb0pDPWFBjsqQXKsPUZ8ctc0l5fmitL7VIromqF6GyUdINZRBgPPTtYW0O8fzgEBq/IX2tbNurflo0M= 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=eYgWDyNW; arc=none smtp.client-ip=209.85.221.51 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="eYgWDyNW" Received: by mail-wr1-f51.google.com with SMTP id ffacd0b85a97d-3a57c8e247cso991369f8f.1; Thu, 26 Jun 2025 08:53:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1750953201; x=1751558001; 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=UE84JnQbxu44C2NaGk36OciY7gwqeDTG2jwAmqGsedA=; b=eYgWDyNWGLHhhWG0ZghyQnBKEo+0rMaPIM189VcPxFx3k5DyhB55zkIfG3T8MhOpaU pn7uFaC2vMwpdkh4B2QiaiR0n4jOtd3pSp5jSddnV+wMUU+hyJ7iovPJk6SBILGYHaLV teM8nt94NtpvBOTgQwB4GHRKB9xqYj84m0VSRdiAIiStfqC37WEbRJsSySn/wFLgxPgA OQBg3//a61BaZp0wMw1sYwCgwXnNUBOD3KPNnWIM0bu0FlFe+iQyIBfA+TYXWoNMRvQS rvxcw1fvq6tPhmmdiCF3kmXqxm+FN7lEGok1Wj+Ge/b2S74PyCeOjXcOXXNCPAwEh72X 5/Eg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750953201; x=1751558001; 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=UE84JnQbxu44C2NaGk36OciY7gwqeDTG2jwAmqGsedA=; b=buo8fAzhU3mKu63Ceva1iWsOznq9BbMG4RgqRXqUYvJfgY4zvAhr3u65FMxKwg1BwR rWR54A3Ju2fpBVtpg4ILY8zDhZjlcVf9wQDoow0JKGPWiPo15tKwRYa7AuxYLNUnv1GQ cUENPZgAEDWCB17l9zIO8EAD4csuu85B5ms3qxA7YWRCVXPIWaAs9C4tHTKa+KTK4mr1 0ozR2myKsDWPaQ7EWV0wRUFcMY50Nn+A8Ubi3fpyuLuTU+zT2NxTQUcTbqcvzUAT5yFz pw0y5cx53TLQJzSnx7Lkkc/7AxeVomtgTKwcxuALbllzLvJ2I6lTGlDvCfUrbofsh3/f ja6w== X-Forwarded-Encrypted: i=1; AJvYcCVq7o3YamSmGDsICKUjZCJMiaHcqUsKG7Bny1RVPsEvhB6RurlbdljNR7cij1Bk8oH0lB90t8zaurSHCks=@vger.kernel.org, AJvYcCW6gGX8O+/E45c6l+pgMGDrODMEgdDYI3S/4vmICRw+ZK6qtM08k5bA0zV85i3G9HAZ29neeLMn87widrToaaxi@vger.kernel.org X-Gm-Message-State: AOJu0YzBsP7Q10jyBTlWURJeFZL4s0U1u1+3jKioz7ddERyTSBCITz4B ezVSSmo+PXxQzyE464YbITmTek9ikp4tbPFbzvmFR8GIMFw5HDxp5A/T X-Gm-Gg: ASbGncu3tuV9fdMK01IpAsK1OANAJHZeFnrRO9S2yDIfIlwyRxuIKD3o9cYDTgu7bDC n18kVGcRhzy115yP/FE9Cjrz6u6vsWq+i9IxVqBPhzq90iwjaTmS3Za+TzUZ5dRc8jt7Ix+34mP x+SlysMTMNSAzxfpoPc78HF/9OafVIYNG1xueMV0c5ellfbpx3WbbuVAFb7UZlGazfTGahyl2YJ pYq8OMyAKgVsu8VB9U5sMlfuD6s8WSZRrHGlRTWf1BgpVmxKJVm9sl5LAHDacZ5pYvaUk2OMQ0L 51tmqDTJrKQCN8ui+IxdTp1eL+0T+pPvp/T+Q+Y0l6U2vvmhmfOdkRM5jD1IfNr1RAuqIDvsi8P CtT4/aOdKQioCvGPkJlXL+e2HthII0TJeFUKYLUi7eA== X-Google-Smtp-Source: AGHT+IG95CLelqFabsX5d1K9V+MH0QhrNlpkq1UbF2zKE//jyMJndmyvapX+hdQh5FXyfrj/LZCRaw== X-Received: by 2002:a05:6000:648:b0:3a4:e667:922e with SMTP id ffacd0b85a97d-3a8f435e2b2mr33745f8f.4.1750953200701; Thu, 26 Jun 2025 08:53:20 -0700 (PDT) Received: from puck.. (watf-12-b2-v4wan-169542-cust1006.vm45.cable.virginm.net. [81.98.219.239]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45380705351sm51727455e9.0.2025.06.26.08.53.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Jun 2025 08:53:20 -0700 (PDT) From: Dylan Yudaken To: mathieu.desnoyers@efficios.com, paulmck@kernel.org Cc: mingo@redhat.com, peterz@infradead.org, juri.lelli@redhat.com, vincent.guittot@linaro.org, dietmar.eggemann@arm.com, rostedt@goodmis.org, bsegall@google.com, mgorman@suse.de, vschneid@redhat.com, shuah@kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Dylan Yudaken Subject: [PATCH 1/2] membarrier: allow cpu_id to be set on more commands Date: Thu, 26 Jun 2025 16:52:56 +0100 Message-ID: <20250626155257.81256-2-dyudaken@gmail.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250626155257.81256-1-dyudaken@gmail.com> References: <20250626155257.81256-1-dyudaken@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" No reason to not allow MEMBARRIER_CMD_FLAG_CPU on MEMBARRIER_CMD_PRIVATE_EXPEDITED or MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE. If it is known specifically what cpu you want to interrupt then there is a decent efficiency saving in not interrupting all the other ones. Also - the code already works as is for them. Signed-off-by: Dylan Yudaken --- kernel/sched/membarrier.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/kernel/sched/membarrier.c b/kernel/sched/membarrier.c index 809194cd779f..def6d4094ad6 100644 --- a/kernel/sched/membarrier.c +++ b/kernel/sched/membarrier.c @@ -595,7 +595,9 @@ static int membarrier_get_registrations(void) * contains the CPU on which to interrupt (=3D restart) * the RSEQ critical section. * @cpu_id: if @flags =3D=3D MEMBARRIER_CMD_FLAG_CPU, indicates the cpu on= which - * RSEQ CS should be interrupted (@cmd must be + * RSEQ CS should be interrupted (@cmd must be one of + * MEMBARRIER_CMD_PRIVATE_EXPEDITED, + * MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE, * MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ). * * If this system call is not implemented, -ENOSYS is returned. If the @@ -625,6 +627,8 @@ static int membarrier_get_registrations(void) SYSCALL_DEFINE3(membarrier, int, cmd, unsigned int, flags, int, cpu_id) { switch (cmd) { + case MEMBARRIER_CMD_PRIVATE_EXPEDITED: + case MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE: case MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ: if (unlikely(flags && flags !=3D MEMBARRIER_CMD_FLAG_CPU)) return -EINVAL; --=20 2.49.0 From nobody Wed Oct 8 14:53:57 2025 Received: from mail-wm1-f50.google.com (mail-wm1-f50.google.com [209.85.128.50]) (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 56FA42ECD18; Thu, 26 Jun 2025 15:53:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750953206; cv=none; b=Bn2mMW+yVKIxvKTZbBJuauimvrtgvNadCDkGh3ojeKx9T0j7Kvuyoo7/mvD2xHM5yTM0zBMEUwag8S0J+yuP15LKRNaKNatUFK94E4OOCcFtOFuzJBxHuUUKxhqQpJzDObgCM6xX2yjAGNROFROgJngcBvjRoIYUhtPTxIgA7fk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1750953206; c=relaxed/simple; bh=t7j2zfKYQtnOwWS12vNjvBooNT+a9X6VXD0LhZ5ESmU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Vh02As5huQdYTKovnSSr7M2pP46GzN1wA5JnpdwLCnlS9Sz0ASHUVf1FTPgQlJzfZLoC89996NLQIQMhEGeLAXACmeLC5/uBkwYRc1meBIrE+uCLvzjt17W5ymHscO7LdxQyBY1ahqj17HTJCIOlGFBXTIQDNEPG5Zgmsa4yUd4= 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=mT8pD8kz; arc=none smtp.client-ip=209.85.128.50 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="mT8pD8kz" Received: by mail-wm1-f50.google.com with SMTP id 5b1f17b1804b1-451d7b50815so9186705e9.2; Thu, 26 Jun 2025 08:53:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1750953202; x=1751558002; 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=avFe0uCPAlGUsBDkTrAMoArX5v2saGyLPFhmXQ2cVg0=; b=mT8pD8kzB68yHc7yNVGEVFvPc/GAOFAgvM9MS7i9FktGCXKm48zeJd8t4DiP79og3z sB0WIYwNDpkZRBLsqEcJzdUSYfAhUXywAhdJh3DArFucXEeJgN3383TPcSAXExjJgloH eKe4DvyN+xURNRt8VGBLkUGUsnuaem+NeXRkBREN+CruEQbV/M+vAiDqWlixJb4sSBEe ngoBeXwwu7fE8i2QdmThvJsQ2iJfmXiyG1v0NQSazx7DKrJ9tGjU8GUnGJk54QwWsfsP Npc6bGuwtlWdhpIpHss3ClOKNy1yb0rySLdMoEMsHVeOMgh/3HNSR60y/JR8ozaAAFfr Geug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1750953202; x=1751558002; 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=avFe0uCPAlGUsBDkTrAMoArX5v2saGyLPFhmXQ2cVg0=; b=wpBdN+rIYxVbCjz28EFP4zS+MVmr28O88H+oJDCWknCfoOdojfzaQomeq+UUEz2f9D yYf8iVV0pQwyzldaJe4lTvk8pLu0kGBGiiZt04VeQaG8OCNgS9JpHv871ZJu6OYdgSiQ eiOdHkpA3abJCbUZihNyNI5iMniAr0pTAg526qYnrUF6+E8JwkC6Wtec8NCMySNuhvAk z7ct/j12OtuoQwM0ild+KUG/8ocKESP+MvwdBADOLrYj0OlWsRLpCtMjUYkzPMThPn/0 7v50fRDMsE957p2JuAdHh+gm1rwwC2eV8YobgAQ+B/D1NAsXWR3DDGFtMwTkkEXNu7D0 c4Rw== X-Forwarded-Encrypted: i=1; AJvYcCUitKuo/20inNgolbeCivH4cXazCSNpmv8Er2NxpZ7QCc6IbiCYXULvjMKtvI9akvOi7KUDbsuXI+asYtw=@vger.kernel.org, AJvYcCVq+/CWjWA0lp21IYPh9YqMmZgEG0Vgif4yOijMR4VKyTHXNW/HY2V7qiloDHdamzLOFU4s6DvTz7Dt0uXTKy/2@vger.kernel.org X-Gm-Message-State: AOJu0Yx6WIkolFnWRMSGJpANPMZ9gYKCIL+wX+sIrNqbyyfjcrUYnsPg KO86xOzPu0VjN5Zw6Wyt3quXVHNKFPCL8tXjf1WwqUGKrq5LohD229km X-Gm-Gg: ASbGncv6inqgQnIzvdk/3hbglceyA+gmujFBFfUlK/LWTmZdLD/GE0WP1chRl78UKdE HRpqZbxAdpSribDhW1JnWVehe2zuExU6wO+jO6OerVwtQPlqqfBC70h46hMoIKbWSzkOsw8nqXC nrDuf9PEm1x3ZhpVqXUeV2rFKmYhl8TMYcJRqvnstvqOted1iChB7tQ7GKZ+3/1MmdIN0kIsh8o icJnCUsQ418l1jBNVMeBTR8sf/KjliI6s6pEAgBCwNBe7DEZEcYSX1fc+QeKIyOGqQkBuECrDPQ D+yEtDeR2BdLxw6n/PpdCpt+bQN4mARTW1RVEIAha6/+qvIs0nBlu4Ph7IPGWxcrEBUU3JXSFff 1wjsAqaV4VxO+nv35CWBQVGIMC3MKdj0E84apv4x3iA== X-Google-Smtp-Source: AGHT+IGRKscdnd27cxZAcZV/moc6/jQHPLiIak2xe+ZqUvI8F9Nbn7YdJ7PBCPT+k/TB5QFUb7LEnQ== X-Received: by 2002:a05:600c:c4a3:b0:440:6a79:6df0 with SMTP id 5b1f17b1804b1-45381aeba44mr67564275e9.22.1750953202265; Thu, 26 Jun 2025 08:53:22 -0700 (PDT) Received: from puck.. (watf-12-b2-v4wan-169542-cust1006.vm45.cable.virginm.net. [81.98.219.239]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-45380705351sm51727455e9.0.2025.06.26.08.53.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 26 Jun 2025 08:53:21 -0700 (PDT) From: Dylan Yudaken To: mathieu.desnoyers@efficios.com, paulmck@kernel.org Cc: mingo@redhat.com, peterz@infradead.org, juri.lelli@redhat.com, vincent.guittot@linaro.org, dietmar.eggemann@arm.com, rostedt@goodmis.org, bsegall@google.com, mgorman@suse.de, vschneid@redhat.com, shuah@kernel.org, linux-kernel@vger.kernel.org, linux-kselftest@vger.kernel.org, Dylan Yudaken Subject: [PATCH 2/2] membarrier: self test for cpu specific calls Date: Thu, 26 Jun 2025 16:52:57 +0100 Message-ID: <20250626155257.81256-3-dyudaken@gmail.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250626155257.81256-1-dyudaken@gmail.com> References: <20250626155257.81256-1-dyudaken@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add a self test for the cpu specific calls to membarrier. This works by figuring out the number of interrupts on a given core before/after calling membarrier(2) to assert that at least some interrupts have happened. This feels like it might be a bit flaky if for example the worker thread was switched out. To mitigate this there are some checks such as making sure it stays on one core, and also it asserts only 1 interrupt for every 2 calls to membarrier(2) Signed-off-by: Dylan Yudaken --- tools/testing/selftests/membarrier/.gitignore | 1 + tools/testing/selftests/membarrier/Makefile | 3 +- .../membarrier/membarrier_test_expedited.c | 135 ++++++++++++++++++ .../membarrier/membarrier_test_impl.h | 5 + 4 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 tools/testing/selftests/membarrier/membarrier_test_expe= dited.c diff --git a/tools/testing/selftests/membarrier/.gitignore b/tools/testing/= selftests/membarrier/.gitignore index f2fbba178601..39cdadb11c01 100644 --- a/tools/testing/selftests/membarrier/.gitignore +++ b/tools/testing/selftests/membarrier/.gitignore @@ -1,3 +1,4 @@ # SPDX-License-Identifier: GPL-2.0-only membarrier_test_multi_thread membarrier_test_single_thread +membarrier_test_expedited diff --git a/tools/testing/selftests/membarrier/Makefile b/tools/testing/se= lftests/membarrier/Makefile index fc840e06ff56..f3e7920a900c 100644 --- a/tools/testing/selftests/membarrier/Makefile +++ b/tools/testing/selftests/membarrier/Makefile @@ -3,6 +3,7 @@ CFLAGS +=3D -g $(KHDR_INCLUDES) LDLIBS +=3D -lpthread =20 TEST_GEN_PROGS :=3D membarrier_test_single_thread \ - membarrier_test_multi_thread + membarrier_test_multi_thread \ + membarrier_test_expedited =20 include ../lib.mk diff --git a/tools/testing/selftests/membarrier/membarrier_test_expedited.c= b/tools/testing/selftests/membarrier/membarrier_test_expedited.c new file mode 100644 index 000000000000..aaea36381282 --- /dev/null +++ b/tools/testing/selftests/membarrier/membarrier_test_expedited.c @@ -0,0 +1,135 @@ +// SPDX-License-Identifier: GPL-2.0 +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include + +#include "membarrier_test_impl.h" + +struct thread_state { + atomic_int thread_cpu; + atomic_bool end_thread; + pthread_mutex_t mutex; +}; + +void *test_membarrier_thread(void *arg) +{ + struct thread_state *ts =3D (struct thread_state *)arg; + + ts->thread_cpu =3D sched_getcpu(); + pthread_mutex_unlock(&ts->mutex); + if (ts->thread_cpu < 0) + return 0; + while (!ts->end_thread) + ts->thread_cpu =3D sched_getcpu(); + return NULL; +} + +static long read_interrupts(int cpu) +{ + char line[4096]; + FILE *fp =3D fopen("/proc/interrupts", "r"); + long res =3D 0; + + if (!fp) + ksft_exit_fail_msg("unable to open /proc/interrupts\n"); + + fgets(line, sizeof(line), fp); /* skip first line */ + while (fgets(line, sizeof(line), fp) !=3D NULL) { + char *save; + int next_cpu =3D 0; + + for (char *token =3D strtok_r(line, " ", &save); token; + token =3D strtok_r(NULL, " ", &save)) { + if (*token < '0' || *token > '9') + continue; + if (next_cpu++ =3D=3D cpu) + res +=3D atol(token); + } + } + fclose(fp); + return res; +} + +static int test_membarrier(const char *name, int cmd, int register_cmd) +{ + int runs =3D 0; + long irq =3D 0; + pthread_t test_thread; + int ret =3D 0; + + struct thread_state ts =3D { .thread_cpu =3D -1, + .end_thread =3D 0, + .mutex =3D PTHREAD_MUTEX_INITIALIZER }; + if (sys_membarrier_cpu(cmd, 0) =3D=3D 0) + ksft_exit_fail_msg("%s: expected failure before register\n", + name); + if (sys_membarrier(register_cmd, 0) !=3D 0) + ksft_exit_fail_msg("%s: unable to register\n", name); + + /* nothing interesting in single processor machines */ + if (sysconf(_SC_NPROCESSORS_ONLN) =3D=3D 1) + goto success; + + pthread_mutex_lock(&ts.mutex); + pthread_create(&test_thread, NULL, test_membarrier_thread, &ts); + + /* wait for thread to start */ + pthread_mutex_lock(&ts.mutex); + pthread_mutex_unlock(&ts.mutex); + + for (int i =3D 0; i < 1000; i++) { + int cpu_start, cpu_end, cpu_this; + long irq_start, irq_end; + + cpu_start =3D ts.thread_cpu; + if (cpu_start < 0) + ksft_exit_fail_msg("sched_getcpu() failed\n"); + + irq_start =3D read_interrupts(cpu_start); + if (sys_membarrier_cpu(cmd, cpu_start)) + ksft_exit_fail_msg("%s: sys_membarrier failed\n", name); + cpu_end =3D ts.thread_cpu; + cpu_this =3D sched_getcpu(); + + /* maybe it was moved to a different cpu, so we cannot trust the irq cou= nt */ + /* If we are on the same cpu we wouldnt expect an interrupt */ + if (cpu_end !=3D cpu_start || cpu_this =3D=3D cpu_end) + continue; + irq_end =3D read_interrupts(cpu_end); + irq +=3D (irq_end - irq_start); + runs++; + } + ts.end_thread =3D 1; + pthread_join(test_thread, NULL); + + if (!runs) + ksft_exit_fail_msg("%s: no successful runs\n", name); + + /* Every run should probably have had an interrupt, but use at least half + * to be safe. + */ + if (irq < runs / 2) + ksft_exit_fail_msg("%s: only had %d / %d irqs\n", name, irq, + runs); +success: + ksft_test_result_pass("expedited %s\n", name); + return 0; +} + +int main(int argc, char **argv) +{ + ksft_print_header(); + ksft_set_plan(3); + + test_membarrier("EXPEDITED", MEMBARRIER_CMD_PRIVATE_EXPEDITED, + MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED); + test_membarrier("RSEQ", MEMBARRIER_CMD_PRIVATE_EXPEDITED_RSEQ, + MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_RSEQ); + test_membarrier("SYNC_CORE", MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE, + MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED_SYNC_CORE); + ksft_exit_pass(); +} diff --git a/tools/testing/selftests/membarrier/membarrier_test_impl.h b/to= ols/testing/selftests/membarrier/membarrier_test_impl.h index af89855adb7b..c10a8af4612e 100644 --- a/tools/testing/selftests/membarrier/membarrier_test_impl.h +++ b/tools/testing/selftests/membarrier/membarrier_test_impl.h @@ -16,6 +16,11 @@ static int sys_membarrier(int cmd, int flags) return syscall(__NR_membarrier, cmd, flags); } =20 +static int sys_membarrier_cpu(int cmd, int cpu) +{ + return syscall(__NR_membarrier, cmd, MEMBARRIER_CMD_FLAG_CPU, cpu); +} + static int test_membarrier_get_registrations(int cmd) { int ret, flags =3D 0; --=20 2.49.0