All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Cornelia Huck <cornelia.huck@de.ibm.com>
Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org,
	stable@vger.kernel.org,
	virtualization@lists.linux-foundation.org
Subject: Re: [PATCH] virtio-balloon: do not call blocking ops when !TASK_RUNNING
Date: Wed, 25 Feb 2015 15:33:53 +0100	[thread overview]
Message-ID: <20150225143353.GA17142@redhat.com> (raw)
In-Reply-To: <20150225153208.341b230f.cornelia.huck@de.ibm.com>

On Wed, Feb 25, 2015 at 03:32:08PM +0100, Cornelia Huck wrote:
> On Wed, 25 Feb 2015 15:14:36 +0100
> "Michael S. Tsirkin" <mst@redhat.com> wrote:
> 
> > virtio balloon has this code:
> >         wait_event_interruptible(vb->config_change,
> >                                  (diff = towards_target(vb)) != 0
> >                                  || vb->need_stats_update
> >                                  || kthread_should_stop()
> >                                  || freezing(current));
> > 
> > Which is a problem because towards_target() call might block after
> > wait_event_interruptible sets task state to TAST_INTERRUPTIBLE, causing
> > the task_struct::state collision typical of nesting of sleeping
> > primitives
> > 
> > See also http://lwn.net/Articles/628628/ or Thomas's
> > bug report
> > http://article.gmane.org/gmane.linux.kernel.virtualization/24846
> > for a fuller explanation.
> > 
> > To fix, rewrite using wait_woken.
> > 
> > Cc: stable@vger.kernel.org
> > Reported-by: Thomas Huth <thuth@linux.vnet.ibm.com>
> > Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> > ---
> >  drivers/virtio/virtio_balloon.c | 14 ++++++++++++++
> >  1 file changed, 14 insertions(+)
> > 
> > diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c
> > index 0413157..2f19f65 100644
> > --- a/drivers/virtio/virtio_balloon.c
> > +++ b/drivers/virtio/virtio_balloon.c
> > @@ -29,6 +29,7 @@
> >  #include <linux/module.h>
> >  #include <linux/balloon_compaction.h>
> >  #include <linux/oom.h>
> > +#include <linux/wait.h>
> >  
> >  /*
> >   * Balloon device works in 4K page units.  So each page is pointed to by
> > @@ -334,12 +335,25 @@ static int virtballoon_oom_notify(struct notifier_block *self,
> >  static int balloon(void *_vballoon)
> >  {
> >  	struct virtio_balloon *vb = _vballoon;
> > +	DEFINE_WAIT_FUNC(wait, woken_wake_function);
> >  
> >  	set_freezable();
> >  	while (!kthread_should_stop()) {
> >  		s64 diff;
> >  
> >  		try_to_freeze();
> > +
> > +		add_wait_queue(&vb->config_change, &wait);
> > +		for (;;) {
> > +			if ((diff = towards_target(vb)) != 0 ||
> > +			    vb->need_stats_update ||
> > +			    kthread_should_stop() ||
> > +			    freezing(current))
> > +				break;
> > +			wait_woken(&wait, TASK_INTERRUPTIBLE, MAX_SCHEDULE_TIMEOUT);
> > +		}
> > +		remove_wait_queue(&vb->config_change, &wait);
> > +
> >  		wait_event_interruptible(vb->config_change,
> >  					 (diff = towards_target(vb)) != 0
> >  					 || vb->need_stats_update
> 
> Forgot to remove the wait_event_interruptible()?

Ugh. Forgot to commit :(
Will resend.

WARNING: multiple messages have this Message-ID (diff)
From: "Michael S. Tsirkin" <mst@redhat.com>
To: Cornelia Huck <cornelia.huck@de.ibm.com>
Cc: linux-kernel@vger.kernel.org, stable@vger.kernel.org,
	Thomas Huth <thuth@linux.vnet.ibm.com>,
	Rusty Russell <rusty@rustcorp.com.au>,
	virtualization@lists.linux-foundation.org, kvm@vger.kernel.org
Subject: Re: [PATCH] virtio-balloon: do not call blocking ops when !TASK_RUNNING
Date: Wed, 25 Feb 2015 15:33:53 +0100	[thread overview]
Message-ID: <20150225143353.GA17142@redhat.com> (raw)
In-Reply-To: <20150225153208.341b230f.cornelia.huck@de.ibm.com>

On Wed, Feb 25, 2015 at 03:32:08PM +0100, Cornelia Huck wrote:
> On Wed, 25 Feb 2015 15:14:36 +0100
> "Michael S. Tsirkin" <mst@redhat.com> wrote:
> 
> > virtio balloon has this code:
> >         wait_event_interruptible(vb->config_change,
> >                                  (diff = towards_target(vb)) != 0
> >                                  || vb->need_stats_update
> >                                  || kthread_should_stop()
> >                                  || freezing(current));
> > 
> > Which is a problem because towards_target() call might block after
> > wait_event_interruptible sets task state to TAST_INTERRUPTIBLE, causing
> > the task_struct::state collision typical of nesting of sleeping
> > primitives
> > 
> > See also http://lwn.net/Articles/628628/ or Thomas's
> > bug report
> > http://article.gmane.org/gmane.linux.kernel.virtualization/24846
> > for a fuller explanation.
> > 
> > To fix, rewrite using wait_woken.
> > 
> > Cc: stable@vger.kernel.org
> > Reported-by: Thomas Huth <thuth@linux.vnet.ibm.com>
> > Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> > ---
> >  drivers/virtio/virtio_balloon.c | 14 ++++++++++++++
> >  1 file changed, 14 insertions(+)
> > 
> > diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c
> > index 0413157..2f19f65 100644
> > --- a/drivers/virtio/virtio_balloon.c
> > +++ b/drivers/virtio/virtio_balloon.c
> > @@ -29,6 +29,7 @@
> >  #include <linux/module.h>
> >  #include <linux/balloon_compaction.h>
> >  #include <linux/oom.h>
> > +#include <linux/wait.h>
> >  
> >  /*
> >   * Balloon device works in 4K page units.  So each page is pointed to by
> > @@ -334,12 +335,25 @@ static int virtballoon_oom_notify(struct notifier_block *self,
> >  static int balloon(void *_vballoon)
> >  {
> >  	struct virtio_balloon *vb = _vballoon;
> > +	DEFINE_WAIT_FUNC(wait, woken_wake_function);
> >  
> >  	set_freezable();
> >  	while (!kthread_should_stop()) {
> >  		s64 diff;
> >  
> >  		try_to_freeze();
> > +
> > +		add_wait_queue(&vb->config_change, &wait);
> > +		for (;;) {
> > +			if ((diff = towards_target(vb)) != 0 ||
> > +			    vb->need_stats_update ||
> > +			    kthread_should_stop() ||
> > +			    freezing(current))
> > +				break;
> > +			wait_woken(&wait, TASK_INTERRUPTIBLE, MAX_SCHEDULE_TIMEOUT);
> > +		}
> > +		remove_wait_queue(&vb->config_change, &wait);
> > +
> >  		wait_event_interruptible(vb->config_change,
> >  					 (diff = towards_target(vb)) != 0
> >  					 || vb->need_stats_update
> 
> Forgot to remove the wait_event_interruptible()?

Ugh. Forgot to commit :(
Will resend.


  reply	other threads:[~2015-02-25 14:33 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-02-25 14:14 [PATCH] virtio-balloon: do not call blocking ops when !TASK_RUNNING Michael S. Tsirkin
2015-02-25 14:14 ` Michael S. Tsirkin
2015-02-25 14:32 ` Cornelia Huck
2015-02-25 14:32   ` Cornelia Huck
2015-02-25 14:33   ` Michael S. Tsirkin [this message]
2015-02-25 14:33     ` Michael S. Tsirkin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20150225143353.GA17142@redhat.com \
    --to=mst@redhat.com \
    --cc=cornelia.huck@de.ibm.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=stable@vger.kernel.org \
    --cc=virtualization@lists.linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.