Re: [PATCH] do not enter vcpu again if it was stopped during IO

Gleb Natapov
2010-06-23T10:21:54Z

On Wed, Jun 23, 2010 at 12:16:46PM +0200, Jan Kiszka wrote:
> Gleb Natapov wrote:
> > To prevent reentering vcpu after IO completion it is not enough
> > to set env->stopped since it is checked only in main loop but control
> > will not get there until next non-IO exit since kvm_run() will reenter
> > vcpu to complete IO instruction. Solve this by sending self-signal to
> > request exit after IO instruction completion.
> >
> > Signed-off-by: Gleb Natapov <gleb@redhat.com>
> > diff --git a/qemu-kvm.c b/qemu-kvm.c
> > index be1dac2..4f7cf6d 100644
> > --- a/qemu-kvm.c
> > +++ b/qemu-kvm.c
> > @@ -603,6 +603,10 @@ int kvm_run(CPUState *env)
> > r = pre_kvm_run(kvm, env);
> > if (r)
> > return r;
> > + if (env->exit_request) {
> > + env->exit_request = 0;
> > + pthread_kill(env->kvm_cpu_state.thread, SIG_IPI);
> > + }
> > r = ioctl(fd, KVM_RUN, 0);
> >
> > if (r == -1 && errno != EINTR && errno != EAGAIN) {
> > diff --git a/vl.c b/vl.c
> > index 9e9c176..dcfab13 100644
> > --- a/vl.c
> > +++ b/vl.c
> > @@ -1817,6 +1817,7 @@ void qemu_system_reset_request(void)
> > }
> > if (cpu_single_env) {
> > cpu_single_env->stopped = 1;
> > + cpu_exit(cpu_single_env);
> > }
> > qemu_notify_event();
> > }
>
> What does this second hunk do, specifically in the context of I/O
> processing? The changelog does not mention it explicitly (or I'm missing
> the obvious).
>
It sets env->exit_request. If qemu_system_reset_request() inside io
handler (happens during S3) we should not return to vcpu till resume,
or terrible things will happen. You are probably right that it should
have been send as different patch.

--
Gleb.