Revision cc84de95

b/kvm-all.c
771 771
        kvm_arch_post_run(env, run);
772 772

  
773 773
        if (ret == -EINTR || ret == -EAGAIN) {
774
            cpu_exit(env);
774 775
            dprintf("io window exit\n");
775 776
            ret = 0;
776 777
            break;
......
1116 1117
{
1117 1118
}
1118 1119
#endif /* !KVM_CAP_SET_GUEST_DEBUG */
1120

  
1121
int kvm_set_signal_mask(CPUState *env, const sigset_t *sigset)
1122
{
1123
    struct kvm_signal_mask *sigmask;
1124
    int r;
1125

  
1126
    if (!sigset)
1127
        return kvm_vcpu_ioctl(env, KVM_SET_SIGNAL_MASK, NULL);
1128

  
1129
    sigmask = qemu_malloc(sizeof(*sigmask) + sizeof(*sigset));
1130

  
1131
    sigmask->len = 8;
1132
    memcpy(sigmask->sigset, sigset, sizeof(*sigset));
1133
    r = kvm_vcpu_ioctl(env, KVM_SET_SIGNAL_MASK, sigmask);
1134
    free(sigmask);
1135

  
1136
    return r;
1137
}
b/kvm.h
53 53
                          target_ulong len, int type);
54 54
void kvm_remove_all_breakpoints(CPUState *current_env);
55 55
int kvm_update_guest_debug(CPUState *env, unsigned long reinject_trap);
56
int kvm_set_signal_mask(CPUState *env, const sigset_t *sigset);
56 57

  
57 58
int kvm_pit_in_kernel(void);
58 59
int kvm_irqchip_in_kernel(void);
b/vl.c
271 271
static QEMUBootSetHandler *boot_set_handler;
272 272
static void *boot_set_opaque;
273 273

  
274
#ifdef SIGRTMIN
275
#define SIG_IPI (SIGRTMIN+4)
276
#else
277
#define SIG_IPI SIGUSR1
278
#endif
279

  
274 280
static int default_serial = 1;
275 281
static int default_parallel = 1;
276 282
static int default_virtcon = 1;
......
3380 3386
static QemuCond qemu_system_cond;
3381 3387
static QemuCond qemu_pause_cond;
3382 3388

  
3383
static void block_io_signals(void);
3389
static void tcg_block_io_signals(void);
3390
static void kvm_block_io_signals(CPUState *env);
3384 3391
static void unblock_io_signals(void);
3385 3392
static int tcg_has_work(void);
3386 3393
static int cpu_has_work(CPUState *env);
......
3432 3439
    qemu_wait_io_event_common(env);
3433 3440
}
3434 3441

  
3442
static void qemu_kvm_eat_signal(CPUState *env, int timeout)
3443
{
3444
    struct timespec ts;
3445
    int r, e;
3446
    siginfo_t siginfo;
3447
    sigset_t waitset;
3448

  
3449
    ts.tv_sec = timeout / 1000;
3450
    ts.tv_nsec = (timeout % 1000) * 1000000;
3451

  
3452
    sigemptyset(&waitset);
3453
    sigaddset(&waitset, SIG_IPI);
3454

  
3455
    qemu_mutex_unlock(&qemu_global_mutex);
3456
    r = sigtimedwait(&waitset, &siginfo, &ts);
3457
    e = errno;
3458
    qemu_mutex_lock(&qemu_global_mutex);
3459

  
3460
    if (r == -1 && !(e == EAGAIN || e == EINTR)) {
3461
        fprintf(stderr, "sigtimedwait: %s\n", strerror(e));
3462
        exit(1);
3463
    }
3464
}
3465

  
3435 3466
static void qemu_kvm_wait_io_event(CPUState *env)
3436 3467
{
3437 3468
    while (!cpu_has_work(env))
3438 3469
        qemu_cond_timedwait(env->halt_cond, &qemu_global_mutex, 1000);
3439 3470

  
3471
    qemu_kvm_eat_signal(env, 0);
3440 3472
    qemu_wait_io_event_common(env);
3441 3473
}
3442 3474

  
......
3446 3478
{
3447 3479
    CPUState *env = arg;
3448 3480

  
3449
    block_io_signals();
3450 3481
    qemu_thread_self(env->thread);
3451 3482
    if (kvm_enabled())
3452 3483
        kvm_init_vcpu(env);
3453 3484

  
3485
    kvm_block_io_signals(env);
3486

  
3454 3487
    /* signal CPU creation */
3455 3488
    qemu_mutex_lock(&qemu_global_mutex);
3456 3489
    env->created = 1;
......
3475 3508
{
3476 3509
    CPUState *env = arg;
3477 3510

  
3478
    block_io_signals();
3511
    tcg_block_io_signals();
3479 3512
    qemu_thread_self(env->thread);
3480 3513

  
3481 3514
    /* signal CPU creation */
......
3501 3534
    CPUState *env = _env;
3502 3535
    qemu_cond_broadcast(env->halt_cond);
3503 3536
    if (kvm_enabled())
3504
        qemu_thread_signal(env->thread, SIGUSR1);
3537
        qemu_thread_signal(env->thread, SIG_IPI);
3505 3538
}
3506 3539

  
3507 3540
int qemu_cpu_self(void *_env)
......
3520 3553
        cpu_exit(cpu_single_env);
3521 3554
}
3522 3555

  
3523
static void block_io_signals(void)
3556
static void tcg_block_io_signals(void)
3524 3557
{
3525 3558
    sigset_t set;
3526 3559
    struct sigaction sigact;
......
3533 3566
    pthread_sigmask(SIG_BLOCK, &set, NULL);
3534 3567

  
3535 3568
    sigemptyset(&set);
3536
    sigaddset(&set, SIGUSR1);
3569
    sigaddset(&set, SIG_IPI);
3537 3570
    pthread_sigmask(SIG_UNBLOCK, &set, NULL);
3538 3571

  
3539 3572
    memset(&sigact, 0, sizeof(sigact));
3540 3573
    sigact.sa_handler = cpu_signal;
3541
    sigaction(SIGUSR1, &sigact, NULL);
3574
    sigaction(SIG_IPI, &sigact, NULL);
3575
}
3576

  
3577
static void dummy_signal(int sig)
3578
{
3579
}
3580

  
3581
static void kvm_block_io_signals(CPUState *env)
3582
{
3583
    int r;
3584
    sigset_t set;
3585
    struct sigaction sigact;
3586

  
3587
    sigemptyset(&set);
3588
    sigaddset(&set, SIGUSR2);
3589
    sigaddset(&set, SIGIO);
3590
    sigaddset(&set, SIGALRM);
3591
    sigaddset(&set, SIGCHLD);
3592
    sigaddset(&set, SIG_IPI);
3593
    pthread_sigmask(SIG_BLOCK, &set, NULL);
3594

  
3595
    pthread_sigmask(SIG_BLOCK, NULL, &set);
3596
    sigdelset(&set, SIG_IPI);
3597

  
3598
    memset(&sigact, 0, sizeof(sigact));
3599
    sigact.sa_handler = dummy_signal;
3600
    sigaction(SIG_IPI, &sigact, NULL);
3601

  
3602
    r = kvm_set_signal_mask(env, &set);
3603
    if (r) {
3604
        fprintf(stderr, "kvm_set_signal_mask: %s\n", strerror(r));
3605
        exit(1);
3606
    }
3542 3607
}
3543 3608

  
3544 3609
static void unblock_io_signals(void)
......
3552 3617
    pthread_sigmask(SIG_UNBLOCK, &set, NULL);
3553 3618

  
3554 3619
    sigemptyset(&set);
3555
    sigaddset(&set, SIGUSR1);
3620
    sigaddset(&set, SIG_IPI);
3556 3621
    pthread_sigmask(SIG_BLOCK, &set, NULL);
3557 3622
}
3558 3623

  
......
3561 3626
    qemu_mutex_lock(&qemu_fair_mutex);
3562 3627

  
3563 3628
    while (qemu_mutex_trylock(&qemu_global_mutex)) {
3564
        qemu_thread_signal(tcg_cpu_thread, SIGUSR1);
3629
        qemu_thread_signal(tcg_cpu_thread, SIG_IPI);
3565 3630
        if (!qemu_mutex_timedlock(&qemu_global_mutex, msecs))
3566 3631
            break;
3567 3632
    }
......
3602 3667

  
3603 3668
    while (penv) {
3604 3669
        penv->stop = 1;
3605
        qemu_thread_signal(penv->thread, SIGUSR1);
3670
        qemu_thread_signal(penv->thread, SIG_IPI);
3606 3671
        qemu_cpu_kick(penv);
3607 3672
        penv = (CPUState *)penv->next_cpu;
3608 3673
    }
......
3611 3676
        qemu_cond_timedwait(&qemu_pause_cond, &qemu_global_mutex, 100);
3612 3677
        penv = first_cpu;
3613 3678
        while (penv) {
3614
            qemu_thread_signal(penv->thread, SIGUSR1);
3679
            qemu_thread_signal(penv->thread, SIG_IPI);
3615 3680
            penv = (CPUState *)penv->next_cpu;
3616 3681
        }
3617 3682
    }
......
3624 3689
    while (penv) {
3625 3690
        penv->stop = 0;
3626 3691
        penv->stopped = 0;
3627
        qemu_thread_signal(penv->thread, SIGUSR1);
3692
        qemu_thread_signal(penv->thread, SIG_IPI);
3628 3693
        qemu_cpu_kick(penv);
3629 3694
        penv = (CPUState *)penv->next_cpu;
3630 3695
    }

Also available in: Unified diff