Received: by 2002:ac0:a5a7:0:0:0:0:0 with SMTP id m36-v6csp1388244imm; Thu, 19 Jul 2018 00:18:05 -0700 (PDT) X-Google-Smtp-Source: AAOMgpeUu9YyCUX5EhDIQMEmM38IN1W5M9jHYz6Dy5vlZjkcO0+iU0ZH4zK7hN7imjazvdXJyzND X-Received: by 2002:a17:902:3e3:: with SMTP id d90-v6mr9013209pld.12.1531984685779; Thu, 19 Jul 2018 00:18:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1531984685; cv=none; d=google.com; s=arc-20160816; b=z9U1u/LXVAjDZ8sJPK4tuVqw2TcP3koWTPyP1YK62uNpnxlrL9OBMnz/gBED07M2PS 4HWttKEMlP0+e57mlzMVGU0x+pFIlisU1pyaOTrOycUhRLtL+9EoaGtPddMv3Fd/i8VF Zt1rfC3Mm0cjwq0ubtPQz6KJqoJUbNA1y7W2ULno65ELhpiBrBgrAK712Li+l6dsghLH k3fyauqKqwaG1hbwPRUUjKOQX6s5vTB0RJip7E37VzTGCJ5UtKiSKK9C+P2xmGHr1z9+ 9CUYfnPt11itK2hQFVl73pfEqg5sWVPdwA/tOBqwblUDLLQ7An12BSaHiW+Z+5bc+dNY dSog== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:date:message-id:subject:from:cc:to :arc-authentication-results; bh=kL+oxONyf7Z+sXA53hUyFNNPLVRuY4zJMjQLCGW9mgI=; b=zvgEmYyH26L0zRe+AkWbTzAtemE2v98VW8vzFSbCAlOPBvg5xbCIA2GoyHRKVG6ii6 A+1hzWuaOQOvbyCpzVfMLyomEbNSUMZyMZTcbtNi1J7Zmuc2WxBBYyJ+d+IocCs3Ryxf zlbXLQKPi2i4Zh9JoHFl9xy2iLS4EG+yu3mEl0rPWt8xP4/4gZMipmWTRy2iXHB7ITfl TlCNLVGQXC5AptyYy1LCdL1piNtnOarzr0fvlIsHSCJmS6+pEyS5p1mPqtSVDksrQ/Dk k7rJ4BavYSaj6dYK9Cv/pPy30/U3Q79kbu2I9GHC6Eq7uY3s80MoHEvySvHsCP4owKaf 34wQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v2-v6si4957532pgt.228.2018.07.19.00.17.50; Thu, 19 Jul 2018 00:18:05 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730077AbeGSH6t (ORCPT + 99 others); Thu, 19 Jul 2018 03:58:49 -0400 Received: from szxga07-in.huawei.com ([45.249.212.35]:52184 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727288AbeGSH6s (ORCPT ); Thu, 19 Jul 2018 03:58:48 -0400 Received: from DGGEMS401-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id CCD8453BAE834; Thu, 19 Jul 2018 15:17:03 +0800 (CST) Received: from [127.0.0.1] (10.177.16.168) by DGGEMS401-HUB.china.huawei.com (10.3.19.201) with Microsoft SMTP Server id 14.3.382.0; Thu, 19 Jul 2018 15:17:01 +0800 To: Andrew Morton , Eric Van Hensbergen , Ron Minnich , Latchesar Ionkov CC: Linux Kernel Mailing List , , Dominique Martinet From: jiangyiwen Subject: [V9fs-developer] [PATCH v3] Fix a hard lockup case in the virtio transport Message-ID: <5B503AEC.5080404@huawei.com> Date: Thu, 19 Jul 2018 15:17:00 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit X-Originating-IP: [10.177.16.168] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When client has multiple threads that issue io requests all the time, and the server has a very good performance, it may cause cpu is running in the irq context for a long time because it can check virtqueue has buf in the *while* loop. So we should keep chan->lock in the whole loop. Signed-off-by: Yiwen Jiang --- net/9p/trans_virtio.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/net/9p/trans_virtio.c b/net/9p/trans_virtio.c index 05006cb..3589864 100644 --- a/net/9p/trans_virtio.c +++ b/net/9p/trans_virtio.c @@ -144,24 +144,25 @@ static void req_done(struct virtqueue *vq) struct virtio_chan *chan = vq->vdev->priv; unsigned int len; struct p9_req_t *req; + bool need_wakeup = false; unsigned long flags; p9_debug(P9_DEBUG_TRANS, ": request done\n"); - while (1) { - spin_lock_irqsave(&chan->lock, flags); - req = virtqueue_get_buf(chan->vq, &len); - if (req == NULL) { - spin_unlock_irqrestore(&chan->lock, flags); - break; + spin_lock_irqsave(&chan->lock, flags); + while ((req = virtqueue_get_buf(chan->vq, &len)) != NULL) { + if (!chan->ring_bufs_avail) { + chan->ring_bufs_avail = 1; + need_wakeup = true; } - chan->ring_bufs_avail = 1; - spin_unlock_irqrestore(&chan->lock, flags); - /* Wakeup if anyone waiting for VirtIO ring space. */ - wake_up(chan->vc_wq); + if (len) p9_client_cb(chan->client, req, REQ_STATUS_RCVD); } + spin_unlock_irqrestore(&chan->lock, flags); + /* Wakeup if anyone waiting for VirtIO ring space. */ + if (need_wakeup) + wake_up(chan->vc_wq); } /** -- 1.8.3.1