Received: by 2002:ac0:a5a7:0:0:0:0:0 with SMTP id m36-v6csp3385226imm; Tue, 17 Jul 2018 04:04:43 -0700 (PDT) X-Google-Smtp-Source: AAOMgpfiLNRZw6dXFWAE8SeyoaYCYsJDLwmRFvpSj56wdqRA8OF3+qS1PMXCN1QBlFuu2Hgnx8Ja X-Received: by 2002:a63:ad07:: with SMTP id g7-v6mr1130562pgf.19.1531825483077; Tue, 17 Jul 2018 04:04:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1531825483; cv=none; d=google.com; s=arc-20160816; b=GYNjuSHUkVnrZW+/VOQk9a1zMpWdK0LXZMZ1j3yM/6/7rPOeczX0mgZCZDYoULNou7 unO7aK2GE5ud5YfqHahkKMDTQGAB/THsWdvtrLuwYcacjMYJEmPAN3lUnGMRLxOUW2gO 5vQpFPwmlG3BS2ZstnPhFx2237lHlwZ2Co5pZyHA+aVRvEJjbTND+3a+xG3pnWJDuJDD 1jqtOFakUdTU+HOF+DSuQes5bAlEqbcHJOVvGNC7pLLWig7mCDFFPlw/hoqfMhh3qFRE oaxEXoHRUfZM0dKP3fGqcYMepMWUWuen244bAlmrBJRAPs5AfqhJGFctxR5H7M4L4mtV 7usg== 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=T1sAyhqd60nxLxrapt30F1o+GmfJ6KulkxOvFhIFaek=; b=mpxDxFycio6VjbMeBNw4Sl3/3NoQazvXlVPqxqInbSzoMsoVlyBhQHBRBP4g80tTXF 31HBrB0ndoEQ444K8rihEcJukR6yQ/XG0+ziUiCZ+KjPfXHxQSBiHKlD21KN+YNabvx8 5vHtPZBf5ZtfpWEX2ByEwXfOa8G+wxiUIfxEZcak8Gu3GKSNZ9W1Vfg9uAq230eBr7Yp jZ8EqQNPPmvbDlJgfsVFKjNDUNc0hFZHem3uoP4qPebcLYZp7Ueb2rtXj6twJOc7ncA9 9ePIFJQvR03lI9leo3RLDGc1k/oElUScreiqXWWme1VQDC8+Zw+G8O7h4yot8KNj463c hGTw== 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 p1-v6si670071pfe.150.2018.07.17.04.04.26; Tue, 17 Jul 2018 04:04:43 -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 S1730735AbeGQLf6 (ORCPT + 99 others); Tue, 17 Jul 2018 07:35:58 -0400 Received: from szxga05-in.huawei.com ([45.249.212.191]:9687 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1729983AbeGQLf6 (ORCPT ); Tue, 17 Jul 2018 07:35:58 -0400 Received: from DGGEMS409-HUB.china.huawei.com (unknown [172.30.72.59]) by Forcepoint Email with ESMTP id 4CFC2A9AB2C78; Tue, 17 Jul 2018 19:03:40 +0800 (CST) Received: from [127.0.0.1] (10.177.16.168) by DGGEMS409-HUB.china.huawei.com (10.3.19.209) with Microsoft SMTP Server id 14.3.382.0; Tue, 17 Jul 2018 19:03:40 +0800 To: Andrew Morton , Eric Van Hensbergen , Ron Minnich , Latchesar Ionkov CC: Linux Kernel Mailing List , , Dominique Martinet From: jiangyiwen Subject: [V9fs-developer] [PATCH v2] net/9p: Fix a deadlock case in the virtio transport Message-ID: <5B4DCD0A.8040600@huawei.com> Date: Tue, 17 Jul 2018 19:03:38 +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 | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/net/9p/trans_virtio.c b/net/9p/trans_virtio.c index 05006cb..e5fea8b 100644 --- a/net/9p/trans_virtio.c +++ b/net/9p/trans_virtio.c @@ -148,20 +148,15 @@ static void req_done(struct virtqueue *vq) 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; - } - chan->ring_bufs_avail = 1; - spin_unlock_irqrestore(&chan->lock, flags); - /* Wakeup if anyone waiting for VirtIO ring space. */ - wake_up(chan->vc_wq); + spin_lock_irqsave(&chan->lock, flags); + while ((req = virtqueue_get_buf(chan->vq, &len)) != NULL) { if (len) p9_client_cb(chan->client, req, REQ_STATUS_RCVD); } + chan->ring_bufs_avail = 1; + spin_unlock_irqrestore(&chan->lock, flags); + /* Wakeup if anyone waiting for VirtIO ring space. */ + wake_up(chan->vc_wq); } /** -- 1.8.3.1