From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bart Van Assche Subject: [PATCH] vhost: Avoid that vhost_work_flush() locks up Date: Fri, 05 Jul 2013 10:36:46 +0200 Message-ID: <51D6859E.2040500@acm.org> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Cc: kvm-devel , Asias He , Nadav Har'El , Abel Gordon To: "Michael S. Tsirkin" Return-path: Received: from jacques.telenet-ops.be ([195.130.132.50]:41254 "EHLO jacques.telenet-ops.be" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757047Ab3GEIgt (ORCPT ); Fri, 5 Jul 2013 04:36:49 -0400 Sender: kvm-owner@vger.kernel.org List-ID: Wake up work->done waiters even if the TIF_NEED_RESCHED task flag has been set. This patch fixes a regression introduced in commit d550dda (kernel v3.4). Signed-off-by: Bart Van Assche Reference: https://bugzilla.kernel.org/show_bug.cgi?id=60505 Cc: Michael S. Tsirkin Cc: Asias He Cc: Nadav Har'El Cc: Abel Gordon Cc: # v3.4+ --- drivers/vhost/vhost.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c index 60aa5ad..cd544ae 100644 --- a/drivers/vhost/vhost.c +++ b/drivers/vhost/vhost.c @@ -227,8 +227,16 @@ static int vhost_worker(void *data) if (work) { __set_current_state(TASK_RUNNING); work->fn(work); - if (need_resched()) + if (need_resched()) { + spin_lock_irq(&dev->work_lock); + work->done_seq = seq; + if (work->flushing) + wake_up_all(&work->done); + spin_unlock_irq(&dev->work_lock); + + work = NULL; schedule(); + } } else schedule(); -- 1.7.10.4