]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
KVM: selftests: Always run vCPU thread with blocked SIG_IPI
authorPaolo Bonzini <pbonzini@redhat.com>
Tue, 20 Apr 2021 08:13:03 +0000 (04:13 -0400)
committerPaolo Bonzini <pbonzini@redhat.com>
Wed, 21 Apr 2021 16:20:02 +0000 (12:20 -0400)
The main thread could start to send SIG_IPI at any time, even before signal
blocked on vcpu thread.  Therefore, start the vcpu thread with the signal
blocked.

Without this patch, on very busy cores the dirty_log_test could fail directly
on receiving a SIGUSR1 without a handler (when vcpu runs far slower than main).

Reported-by: Peter Xu <peterx@redhat.com>
Cc: stable@vger.kernel.org
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
tools/testing/selftests/kvm/dirty_log_test.c

index ffa4e27919262bf1b1028e7ff1b21385ff59f9f0..81edbd23d371c2ddadd1949d734c94dcb3890328 100644 (file)
@@ -527,9 +527,8 @@ static void *vcpu_worker(void *data)
         */
        sigmask->len = 8;
        pthread_sigmask(0, NULL, sigset);
+       sigdelset(sigset, SIG_IPI);
        vcpu_ioctl(vm, VCPU_ID, KVM_SET_SIGNAL_MASK, sigmask);
-       sigaddset(sigset, SIG_IPI);
-       pthread_sigmask(SIG_BLOCK, sigset, NULL);
 
        sigemptyset(sigset);
        sigaddset(sigset, SIG_IPI);
@@ -858,6 +857,7 @@ int main(int argc, char *argv[])
                .interval = TEST_HOST_LOOP_INTERVAL,
        };
        int opt, i;
+       sigset_t sigset;
 
        sem_init(&sem_vcpu_stop, 0, 0);
        sem_init(&sem_vcpu_cont, 0, 0);
@@ -916,6 +916,11 @@ int main(int argc, char *argv[])
 
        srandom(time(0));
 
+       /* Ensure that vCPU threads start with SIG_IPI blocked.  */
+       sigemptyset(&sigset);
+       sigaddset(&sigset, SIG_IPI);
+       pthread_sigmask(SIG_BLOCK, &sigset, NULL);
+
        if (host_log_mode_option == LOG_MODE_ALL) {
                /* Run each log mode */
                for (i = 0; i < LOG_MODE_NUM; i++) {