From: "Michael S. Tsirkin" <mst@redhat.com>
To: Peter Zijlstra <peterz@infradead.org>
Cc: Rusty Russell <rusty@rustcorp.com.au>,
Thomas Huth <thuth@linux.vnet.ibm.com>,
virtualization@lists.linux-foundation.org, kvm@vger.kernel.org
Subject: Re: virtio balloon: do not call blocking ops when !TASK_RUNNING
Date: Thu, 26 Feb 2015 18:27:43 +0100 [thread overview]
Message-ID: <20150226172743.GA20582@redhat.com> (raw)
In-Reply-To: <20150226170849.GV21418@twins.programming.kicks-ass.net>
On Thu, Feb 26, 2015 at 06:08:49PM +0100, Peter Zijlstra wrote:
> On Thu, Feb 26, 2015 at 09:30:31AM +0100, Michael S. Tsirkin wrote:
> > On Thu, Feb 26, 2015 at 11:50:42AM +1030, Rusty Russell wrote:
> > > Thomas Huth <thuth@linux.vnet.ibm.com> writes:
> > > > Hi all,
> > > >
> > > > with the recent kernel 3.19, I get a kernel warning when I start my
> > > > KVM guest on s390 with virtio balloon enabled:
> > >
> > > The deeper problem is that virtio_ccw_get_config just silently fails on
> > > OOM.
> > >
> > > Neither get_config nor set_config are expected to fail.
> > >
> > > Cornelia, I think ccw and config_area should be allocated inside vcdev.
> > > You could either use pointers, or simply allocate vcdev with GDP_DMA.
> > >
> > > This would avoid the kmalloc inside these calls.
> > >
> > > Thanks,
> > > Rusty.
> >
> > But it won't solve the problem of nested sleepers
> > with ccw: ATM is invokes ccw_io_helper to execute
> > commands, and that one calls wait_event
> > to wait for an interrupt.
> >
> > Might be fixable but I think my patch looks like a safer
> > solution for 4.0/3.19, no?
>
> I've no idea what your patch was since I'm not subscribed to any of the
> lists this discussion is had on.
Oh, sorry about that.
Here it is, below:
----- Forwarded message from "Michael S. Tsirkin" <mst@redhat.com> -----
Date: Wed, 25 Feb 2015 15:36:02 +0100
From: "Michael S. Tsirkin" <mst@redhat.com>
To: linux-kernel@vger.kernel.org
Cc: 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, Cornelia Huck <cornelia.huck@de.ibm.com>
Subject: [PATCH v2] virtio-balloon: do not call blocking ops when !TASK_RUNNING
Message-ID: <1424874878-17155-1-git-send-email-mst@redhat.com>
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>
---
changes from v1:
remove wait_event_interruptible
noticed by Cornelia Huck <cornelia.huck@de.ibm.com>
drivers/virtio/virtio_balloon.c | 19 ++++++++++++++-----
1 file changed, 14 insertions(+), 5 deletions(-)
diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c
index 0413157..5a6ad6d 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,17 +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();
- wait_event_interruptible(vb->config_change,
- (diff = towards_target(vb)) != 0
- || vb->need_stats_update
- || kthread_should_stop()
- || freezing(current));
+
+ 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);
+
if (vb->need_stats_update)
stats_handle_request(vb);
if (diff > 0)
--
MST
----- End forwarded message -----
next prev parent reply other threads:[~2015-02-26 17:29 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-25 10:13 virtio balloon: do not call blocking ops when !TASK_RUNNING Thomas Huth
2015-02-25 11:09 ` Cornelia Huck
2015-02-25 14:17 ` Michael S. Tsirkin
2015-02-26 1:20 ` Rusty Russell
2015-02-26 7:36 ` Thomas Huth
2015-03-02 0:07 ` Rusty Russell
2015-03-02 11:13 ` Michael S. Tsirkin
2015-03-02 11:31 ` Cornelia Huck
2015-03-02 11:31 ` Cornelia Huck
2015-03-02 11:46 ` Michael S. Tsirkin
2015-03-02 12:11 ` Cornelia Huck
2015-03-02 12:11 ` Cornelia Huck
2015-03-02 12:19 ` Michael S. Tsirkin
2015-03-02 12:35 ` Cornelia Huck
2015-03-02 20:44 ` Michael S. Tsirkin
2015-03-06 11:47 ` Cornelia Huck
2015-03-06 11:47 ` Cornelia Huck
2015-03-02 20:44 ` Michael S. Tsirkin
2015-03-02 12:19 ` Michael S. Tsirkin
2015-03-02 20:39 ` Michael S. Tsirkin
2015-03-02 20:39 ` Michael S. Tsirkin
2015-03-04 6:14 ` Rusty Russell
2015-03-04 10:25 ` Michael S. Tsirkin
2015-03-06 11:56 ` Cornelia Huck
2015-03-10 1:26 ` Rusty Russell
2015-03-02 11:13 ` Michael S. Tsirkin
2015-02-26 7:36 ` Thomas Huth
2015-02-26 8:30 ` Michael S. Tsirkin
2015-02-26 17:08 ` Peter Zijlstra
2015-02-26 17:27 ` Michael S. Tsirkin [this message]
2015-02-26 17:41 ` Michael S. Tsirkin
2015-02-26 17:27 ` Michael S. Tsirkin
2015-02-26 8:45 ` Michael S. Tsirkin
2015-02-26 8:45 ` Michael S. Tsirkin
2015-02-26 8:57 ` Cornelia Huck
2015-02-26 8:47 ` Cornelia Huck
2015-02-26 8:47 ` Cornelia Huck
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=20150226172743.GA20582@redhat.com \
--to=mst@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=peterz@infradead.org \
--cc=rusty@rustcorp.com.au \
--cc=thuth@linux.vnet.ibm.com \
--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.