[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: |
Jan Kiszka |
Subject: |
[Qemu-devel] Re: [PATCH 12/22] kvm: Call qemu_kvm_eat_signals also under !CONFIG_IOTHREAD |
Date: |
Tue, 01 Feb 2011 14:21:22 +0100 |
User-agent: |
Mozilla/5.0 (X11; U; Linux i686 (x86_64); de; rv:1.8.1.12) Gecko/20080226 SUSE/2.0.0.12-1.1 Thunderbird/2.0.0.12 Mnenhy/0.7.5.666 |
On 2011-02-01 13:38, Marcelo Tosatti wrote:
> 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).
>
For those signals that matter, it is.
Jan
--
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux