[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] Re: [PATCH 12/22] kvm: Call qemu_kvm_eat_signals also under
From: |
Marcelo Tosatti |
Subject: |
[Qemu-devel] Re: [PATCH 12/22] kvm: Call qemu_kvm_eat_signals also under !CONFIG_IOTHREAD |
Date: |
Tue, 1 Feb 2011 10:38:35 -0200 |
User-agent: |
Mutt/1.5.20 (2009-08-17) |
On Thu, Jan 27, 2011 at 02:09:56PM +0100, Jan Kiszka wrote:
> Move qemu_kvm_eat_signals around and call it also when the IO-thread is
> not used. Do not yet process SIGBUS, will be armed in a separate step.
>
> Signed-off-by: Jan Kiszka <address@hidden>
> ---
> cpus.c | 88 ++++++++++++++++++++++++++++++++++++---------------------------
> 1 files changed, 50 insertions(+), 38 deletions(-)
>
> diff --git a/cpus.c b/cpus.c
> index 9071848..558c0d3 100644
> --- a/cpus.c
> +++ b/cpus.c
> @@ -261,6 +261,45 @@ static void qemu_kvm_init_cpu_signals(CPUState *env)
> }
> }
>
> +static void qemu_kvm_eat_signals(CPUState *env)
> +{
> + struct timespec ts = { 0, 0 };
> + siginfo_t siginfo;
> + sigset_t waitset;
> + sigset_t chkset;
> + int r;
> +
> + sigemptyset(&waitset);
> + sigaddset(&waitset, SIG_IPI);
> + sigaddset(&waitset, SIGBUS);
> +
> + do {
> + r = sigtimedwait(&waitset, &siginfo, &ts);
> + if (r == -1 && !(errno == EAGAIN || errno == EINTR)) {
> + perror("sigtimedwait");
> + exit(1);
> + }
> +
> + switch (r) {
> +#ifdef CONFIG_IOTHREAD
> + case SIGBUS:
> + if (kvm_on_sigbus_vcpu(env, siginfo.si_code, siginfo.si_addr)) {
> + sigbus_reraise();
> + }
> + break;
> +#endif
> + default:
> + break;
> + }
> +
> + r = sigpending(&chkset);
> + if (r == -1) {
> + perror("sigpending");
> + exit(1);
> + }
> + } while (sigismember(&chkset, SIG_IPI) || sigismember(&chkset, SIGBUS));
> +}
> +
> #else /* _WIN32 */
>
> HANDLE qemu_event_handle;
> @@ -292,6 +331,10 @@ static void qemu_event_increment(void)
> static void qemu_kvm_init_cpu_signals(CPUState *env)
> {
> }
> +
> +static void qemu_kvm_eat_signals(CPUState *env)
> +{
> +}
> #endif /* _WIN32 */
>
> #ifndef CONFIG_IOTHREAD
> @@ -631,43 +674,6 @@ static void sigbus_handler(int n, struct
> qemu_signalfd_siginfo *siginfo,
> }
> }
>
> -static void qemu_kvm_eat_signals(CPUState *env)
> -{
> - struct timespec ts = { 0, 0 };
> - siginfo_t siginfo;
> - sigset_t waitset;
> - sigset_t chkset;
> - int r;
> -
> - sigemptyset(&waitset);
> - sigaddset(&waitset, SIG_IPI);
> - sigaddset(&waitset, SIGBUS);
> -
> - do {
> - r = sigtimedwait(&waitset, &siginfo, &ts);
> - if (r == -1 && !(errno == EAGAIN || errno == EINTR)) {
> - perror("sigtimedwait");
> - exit(1);
> - }
> -
> - switch (r) {
> - case SIGBUS:
> - if (kvm_on_sigbus_vcpu(env, siginfo.si_code, siginfo.si_addr)) {
> - sigbus_reraise();
> - }
> - break;
> - default:
> - break;
> - }
> -
> - r = sigpending(&chkset);
> - if (r == -1) {
> - perror("sigpending");
> - exit(1);
> - }
> - } while (sigismember(&chkset, SIG_IPI) || sigismember(&chkset, SIGBUS));
> -}
> -
> static void qemu_kvm_wait_io_event(CPUState *env)
> {
> while (!cpu_has_work(env))
> @@ -932,6 +938,8 @@ static int qemu_cpu_exec(CPUState *env)
>
> bool cpu_exec_all(void)
> {
> + int r;
> +
> if (next_cpu == NULL)
> next_cpu = first_cpu;
> for (; next_cpu != NULL && !exit_request; next_cpu = next_cpu->next_cpu)
> {
> @@ -943,7 +951,11 @@ bool cpu_exec_all(void)
> if (qemu_alarm_pending())
> break;
> if (cpu_can_run(env)) {
> - if (qemu_cpu_exec(env) == EXCP_DEBUG) {
> + r = qemu_cpu_exec(env);
> + if (kvm_enabled()) {
> + qemu_kvm_eat_signals(env);
> + }
> + if (r == EXCP_DEBUG) {
> break;
> }
As mentioned before, signal processing should be independent of
cpu_can_run (still want to process SIGALRM if vm is stopped, for
example).
- [Qemu-devel] Re: [PATCH 12/22] kvm: Call qemu_kvm_eat_signals also under !CONFIG_IOTHREAD,
Marcelo Tosatti <=