Kernel KVM virtualization development
 help / color / mirror / Atom feed
* [PATCH] KVM: selftests: Use KVM's task pinning APIs in steal_time
@ 2026-07-06 16:36 Hisam Mehboob
  2026-07-06 16:49 ` sashiko-bot
  0 siblings, 1 reply; 2+ messages in thread
From: Hisam Mehboob @ 2026-07-06 16:36 UTC (permalink / raw)
  To: pbonzini
  Cc: shuah, seanjc, kvm, linux-kselftest, linux-kernel, aqibaf,
	Hisam Mehboob

From: Sean Christopherson <seanjc@google.com>

Use pin_self_to_cpu() and pin_task_to_cpu() to pin the vCPU thread and
the stealer thread to pCPU0 in the steal_time test. Eliminating the usage
of pthread_attr_setaffinity_np() in particular allows building the test
against non-glibc C libraries.

Reported-by: Aqib Faruqui <aqibaf@amazon.com>
Closes: https://lore.kernel.org/all/20250829142556.72577-4-aqibaf@amazon.com/
Signed-off-by: Sean Christopherson <seanjc@google.com>
Link: https://lore.kernel.org/all/aLIroyJSWQ26wnY4@google.com/
[hisamshar@gmail.com: resend, fix changelog typos; original series was never reposted]
Signed-off-by: Hisam Mehboob <hisamshar@gmail.com>
---
 tools/testing/selftests/kvm/steal_time.c | 12 ++++--------
 1 file changed, 4 insertions(+), 8 deletions(-)

diff --git a/tools/testing/selftests/kvm/steal_time.c b/tools/testing/selftests/kvm/steal_time.c
index 76fcdd1fd3cb..19a97d6a3607 100644
--- a/tools/testing/selftests/kvm/steal_time.c
+++ b/tools/testing/selftests/kvm/steal_time.c
@@ -508,9 +508,7 @@ int main(int ac, char **av)
 {
 	struct kvm_vcpu *vcpus[NR_VCPUS];
 	struct kvm_vm *vm;
-	pthread_attr_t attr;
 	pthread_t thread;
-	cpu_set_t cpuset;
 	unsigned int gpages;
 	long stolen_time;
 	long run_delay;
@@ -520,11 +518,7 @@ int main(int ac, char **av)
 	verbose = ac > 1 && (!strncmp(av[1], "-v", 3) || !strncmp(av[1], "--verbose", 10));
 
 	/* Set CPU affinity so we can force preemption of the VCPU */
-	CPU_ZERO(&cpuset);
-	CPU_SET(0, &cpuset);
-	pthread_attr_init(&attr);
-	pthread_attr_setaffinity_np(&attr, sizeof(cpu_set_t), &cpuset);
-	pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset);
+	pin_self_to_cpu(0);
 
 	/* Create a VM and an identity mapped memslot for the steal time structure */
 	vm = vm_create_with_vcpus(NR_VCPUS, guest_code, vcpus);
@@ -558,7 +552,9 @@ int main(int ac, char **av)
 
 		/* Steal time from the VCPU. The steal time thread has the same CPU affinity as the VCPUs. */
 		run_delay = get_run_delay();
-		pthread_create(&thread, &attr, do_steal_time, NULL);
+		pthread_create(&thread, NULL, do_steal_time, NULL);
+		pin_task_to_cpu(thread, 0);
+
 		do
 			sched_yield();
 		while (get_run_delay() - run_delay < MIN_RUN_DELAY_NS);
-- 
2.51.0


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] KVM: selftests: Use KVM's task pinning APIs in steal_time
  2026-07-06 16:36 [PATCH] KVM: selftests: Use KVM's task pinning APIs in steal_time Hisam Mehboob
@ 2026-07-06 16:49 ` sashiko-bot
  0 siblings, 0 replies; 2+ messages in thread
From: sashiko-bot @ 2026-07-06 16:49 UTC (permalink / raw)
  To: Hisam Mehboob; +Cc: kvm

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] Race condition causing intermittent test failure (ESRCH) due to late thread pinning
--

commit 27b6bbfae99d5564cda41cbc7b8c36c7b9a4ed64
Author: Sean Christopherson <seanjc@google.com>

KVM: selftests: Use KVM's task pinning APIs in steal_time

This commit updates the steal_time test to use KVM's task pinning APIs
(pin_self_to_cpu and pin_task_to_cpu) to pin the vCPU and stealer threads
to pCPU0. This removes the use of pthread_attr_setaffinity_np, allowing
the test to build against non-glibc C libraries.

Link: https://lore.kernel.org/all/aLIroyJSWQ26wnY4@google.com/

> diff --git a/tools/testing/selftests/kvm/steal_time.c b/tools/testing/selftests/kvm/steal_time.c
> index 76fcdd1fd3cb4..19a97d6a36076 100644
> --- a/tools/testing/selftests/kvm/steal_time.c
> +++ b/tools/testing/selftests/kvm/steal_time.c
[ ... ]
> @@ -558,7 +552,9 @@ int main(int ac, char **av)
>  
>  		/* Steal time from the VCPU. The steal time thread has the same CPU affinity as the VCPUs. */
>  		run_delay = get_run_delay();
> -		pthread_create(&thread, &attr, do_steal_time, NULL);
> +		pthread_create(&thread, NULL, do_steal_time, NULL);
> +		pin_task_to_cpu(thread, 0);

[Severity: Medium]
Could this introduce a race condition that causes intermittent test failures?

Since pthread_create is called before pinning, there is a small window
where the child thread (do_steal_time) could execute and complete its very
brief 200us run before the parent thread executes pin_task_to_cpu.

If the child thread exits before pin_task_to_cpu attempts to set its
affinity, it will return ESRCH and trigger the TEST_ASSERT inside
pin_task_to_cpu, abruptly aborting the test.

Is the explicit pin_task_to_cpu call necessary here? Since the main thread
already called pin_self_to_cpu(0) earlier, the new thread created by
pthread_create should automatically inherit the parent's CPU affinity mask.

> +
>  		do
>  			sched_yield();
>  		while (get_run_delay() - run_delay < MIN_RUN_DELAY_NS);

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20260706163649.155548-1-hisamshar@gmail.com?part=1

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2026-07-06 16:49 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-06 16:36 [PATCH] KVM: selftests: Use KVM's task pinning APIs in steal_time Hisam Mehboob
2026-07-06 16:49 ` sashiko-bot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox