From patchwork Tue Nov 15 15:10:22 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhang Changzhong X-Patchwork-Id: 20423 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:6687:0:0:0:0:0 with SMTP id l7csp2774143wru; Tue, 15 Nov 2022 06:58:04 -0800 (PST) X-Google-Smtp-Source: AA0mqf6OviQ9bdDHFVYWnDPEdE8dPySbLuHudjfXnAptQBHmFENC9eZ9fImvalpOqjaYMwi8qxf8 X-Received: by 2002:a17:902:e013:b0:184:cb7e:ba36 with SMTP id o19-20020a170902e01300b00184cb7eba36mr4436314plo.57.1668524284413; Tue, 15 Nov 2022 06:58:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1668524284; cv=none; d=google.com; s=arc-20160816; b=dC9bhFXjtJ5XNl+bDejBX4ejhSbu250mfLZWmKpTq+PCUpzPHbkB9AViblvKm78ozx ++2psdsp+vJ+AL36ZLRhFz6cyI6klPI4eLBnHCGTzY0vvavFAHKsTO9gUiUy9UV3Iamj T3TSH3x0Ufbu4J4Rd2LasCikm7Y5qe1XudJKptfqR7Ov4i5ZzXouTmbanmUWWN9MZsag kJK4YpinQJzVTZgVhk7bzltK4ZKaQRgHAld6IJhpAL3XFsyjFSzz6atPvGBTCK6WL5Cz MY7LV82+qeZriGVaw5t1r9zMMFIUD+amuI/UzpOEmNYdrrQJmdJjW5Ue5KbqQf38LhhD X8kg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:references:in-reply-to:message-id :date:subject:cc:to:from; bh=U7ucAtTaHW+4JG334guRb/AGJ3rIET7XZyBCCadjci0=; b=Jc5381rKDkhMYH+QPrNWu4Al6bl82LSI8eApfw9T2wIxwCA3tzMozT+fq6PqjKHyRr nD/wo3RVxwovSvcBnAcWCHzozeNiDRydQtmni8U0pkVXuXzhuHaMy0RNcQjDGjFMTEU4 6UA9zc5CDk5I7duVAZqrpdsdiOjrsCbMeNHtQowDA8PoBcgwfkaSNp56UUZOQW1G8bs6 D/e4E0+504Dl4qELBrEUNXG2drX2EuIUazdo3DJf5IELuwrvky271+gYTT3SwfZaOD1E XbMwtJqB7CSBbFxzLHT5AIiQIQ316L8mUj/7xhlmmLHbKDvKIb/DjryKcFtwqtPAfxYU RoYw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id s10-20020a65690a000000b0046ecbfda052si13180557pgq.389.2022.11.15.06.57.50; Tue, 15 Nov 2022 06:58:04 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229552AbiKOOvb (ORCPT + 99 others); Tue, 15 Nov 2022 09:51:31 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36390 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229573AbiKOOvZ (ORCPT ); Tue, 15 Nov 2022 09:51:25 -0500 Received: from szxga02-in.huawei.com (szxga02-in.huawei.com [45.249.212.188]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 94A4C24BE9; Tue, 15 Nov 2022 06:51:24 -0800 (PST) Received: from dggpeml500023.china.huawei.com (unknown [172.30.72.57]) by szxga02-in.huawei.com (SkyGuard) with ESMTP id 4NBTdN4208zRpBQ; Tue, 15 Nov 2022 22:51:04 +0800 (CST) Received: from dggpeml500006.china.huawei.com (7.185.36.76) by dggpeml500023.china.huawei.com (7.185.36.114) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.31; Tue, 15 Nov 2022 22:51:22 +0800 Received: from localhost.localdomain (10.175.112.70) by dggpeml500006.china.huawei.com (7.185.36.76) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.31; Tue, 15 Nov 2022 22:51:22 +0800 From: Zhang Changzhong To: , , , , , CC: , , Subject: [PATCH net v2 1/3] net: nixge: fix potential memory leak in nixge_start_xmit() Date: Tue, 15 Nov 2022 23:10:22 +0800 Message-ID: <1668525024-38409-2-git-send-email-zhangchangzhong@huawei.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1668525024-38409-1-git-send-email-zhangchangzhong@huawei.com> References: <1668525024-38409-1-git-send-email-zhangchangzhong@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.175.112.70] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To dggpeml500006.china.huawei.com (7.185.36.76) X-CFilter-Loop: Reflected X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1749574519659434392?= X-GMAIL-MSGID: =?utf-8?q?1749574519659434392?= The nixge_start_xmit() returns NETDEV_TX_OK but does not free skb in case of dma_map_single() fails, which leads to memory leak. Fix it by adding dev_kfree_skb_any() when dma_map_single() fails. Fixes: 492caffa8a1a ("net: ethernet: nixge: Add support for National Instruments XGE netdev") Signed-off-by: Zhang Changzhong Reviewed-by: Francois Romieu --- drivers/net/ethernet/ni/nixge.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/ni/nixge.c b/drivers/net/ethernet/ni/nixge.c index 19d043b..d8cd520 100644 --- a/drivers/net/ethernet/ni/nixge.c +++ b/drivers/net/ethernet/ni/nixge.c @@ -526,8 +526,10 @@ static netdev_tx_t nixge_start_xmit(struct sk_buff *skb, cur_phys = dma_map_single(ndev->dev.parent, skb->data, skb_headlen(skb), DMA_TO_DEVICE); - if (dma_mapping_error(ndev->dev.parent, cur_phys)) + if (dma_mapping_error(ndev->dev.parent, cur_phys)) { + dev_kfree_skb_any(skb); goto drop; + } nixge_hw_dma_bd_set_phys(cur_p, cur_phys); cur_p->cntrl = skb_headlen(skb) | XAXIDMA_BD_CTRL_TXSOF_MASK; From patchwork Tue Nov 15 15:10:23 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhang Changzhong X-Patchwork-Id: 20421 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:6687:0:0:0:0:0 with SMTP id l7csp2773820wru; Tue, 15 Nov 2022 06:57:17 -0800 (PST) X-Google-Smtp-Source: AA0mqf6hSUclRocsE7VoK4udmoG6y2FKuisjkspEpCpAgVuaksVtpeoHJgsmCsvALsF9SXnqMu2E X-Received: by 2002:a63:4e53:0:b0:473:f7fb:d2c7 with SMTP id o19-20020a634e53000000b00473f7fbd2c7mr16298063pgl.535.1668524237115; Tue, 15 Nov 2022 06:57:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1668524237; cv=none; d=google.com; s=arc-20160816; b=vI1Eb5kklX2WcohCT6svwcgEDcTSPt0rdLG6CLZVW/MkBnEUcNCpelt4Tfbc+QLAeb MdUhP6z+4owTC7GNCO//I+Z4L1RQPxOJnUU+ZO7WOfVJ8Y1T9rBwZ3AxJT1Bjp5Bl0kX l1tFkFOnii9qs7iU2lD37673FdZzwsR5Zl4htd5rLmkoBz1HPfEk3aVkS7/jAnnzl4jK uiZCOwYfjwX/qNjmr7/LiAFxZuA3IxJ/mTP+hWLW/Vpe7yQzXbRrBAUoZUL3aesupJDm vWawwLmqSuy7oNNxwwsi6VMp9T/idVivDHunjh4WPPKmMbRGVw61LBEz2JKeWXJ1gb4w L+8w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:references:in-reply-to:message-id :date:subject:cc:to:from; bh=EU/3fhXW9ARUActm+PaU1dLMivs9vjSktz7zVje4WCM=; b=RkKgkhp+A8hl4yEDk5GROna34ybYYJjKpTzDEyqhqLHVo1HTQ2+N2QqOwOu34dmN5I /Grn4jzKS32AeRpOpkKXikGGwocAP2jl6IdE+opNS7+XnBOW7um7KSfcffHnnqmGjmtL GbdGMiRJSFafmZ4tcOEGxNkSNYBHmGMJldl4HgPdPBIBsXD23MC0CgaTY1ULit01RhAv RLhe0TG52jsNNpmZGYRmgAe71FZ9/nKeru8DeEnJThwytQ8j/OyANuYqQd4c3lu1MzMC X+ZUBpHgtGMu3m0IkOWiOGolxU3XzbEQZ1lDHNcyvzNfJgjUzbRsEoEk21nhufUECuAW ze5Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id i1-20020a6551c1000000b0047030c28b16si13308583pgq.184.2022.11.15.06.57.03; Tue, 15 Nov 2022 06:57:17 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230177AbiKOOvk (ORCPT + 99 others); Tue, 15 Nov 2022 09:51:40 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36412 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229546AbiKOOv2 (ORCPT ); Tue, 15 Nov 2022 09:51:28 -0500 Received: from szxga02-in.huawei.com (szxga02-in.huawei.com [45.249.212.188]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 48C6124BE9; Tue, 15 Nov 2022 06:51:27 -0800 (PST) Received: from dggpeml500026.china.huawei.com (unknown [172.30.72.53]) by szxga02-in.huawei.com (SkyGuard) with ESMTP id 4NBTd93QlTzHvsR; Tue, 15 Nov 2022 22:50:53 +0800 (CST) Received: from dggpeml500006.china.huawei.com (7.185.36.76) by dggpeml500026.china.huawei.com (7.185.36.106) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.31; Tue, 15 Nov 2022 22:51:23 +0800 Received: from localhost.localdomain (10.175.112.70) by dggpeml500006.china.huawei.com (7.185.36.76) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.31; Tue, 15 Nov 2022 22:51:22 +0800 From: Zhang Changzhong To: , , , , , CC: , , Subject: [PATCH net v2 2/3] net: nixge: avoid overwriting buffer descriptor Date: Tue, 15 Nov 2022 23:10:23 +0800 Message-ID: <1668525024-38409-3-git-send-email-zhangchangzhong@huawei.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1668525024-38409-1-git-send-email-zhangchangzhong@huawei.com> References: <1668525024-38409-1-git-send-email-zhangchangzhong@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.175.112.70] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To dggpeml500006.china.huawei.com (7.185.36.76) X-CFilter-Loop: Reflected X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1749574470280514511?= X-GMAIL-MSGID: =?utf-8?q?1749574470280514511?= The check on the number of available BDs is incorrect because BDs are required not only for frags but also for skb. This may result in overwriting BD that is still in use. Fixes: 492caffa8a1a ("net: ethernet: nixge: Add support for National Instruments XGE netdev") Signed-off-by: Zhang Changzhong Reviewed-by: Francois Romieu --- drivers/net/ethernet/ni/nixge.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/ethernet/ni/nixge.c b/drivers/net/ethernet/ni/nixge.c index d8cd520..91b7ebc 100644 --- a/drivers/net/ethernet/ni/nixge.c +++ b/drivers/net/ethernet/ni/nixge.c @@ -518,7 +518,7 @@ static netdev_tx_t nixge_start_xmit(struct sk_buff *skb, cur_p = &priv->tx_bd_v[priv->tx_bd_tail]; tx_skb = &priv->tx_skb[priv->tx_bd_tail]; - if (nixge_check_tx_bd_space(priv, num_frag)) { + if (nixge_check_tx_bd_space(priv, num_frag + 1)) { if (!netif_queue_stopped(ndev)) netif_stop_queue(ndev); return NETDEV_TX_OK; From patchwork Tue Nov 15 15:10:24 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhang Changzhong X-Patchwork-Id: 20420 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:6687:0:0:0:0:0 with SMTP id l7csp2773803wru; Tue, 15 Nov 2022 06:57:14 -0800 (PST) X-Google-Smtp-Source: AA0mqf7hVBAMrhOXjHG9HyDfUwpZHblwHoNm9p2YP/LV6OeSi8L/xDwLqEkiujjiy5tbl3teuah9 X-Received: by 2002:a62:5e47:0:b0:563:1ae2:6daf with SMTP id s68-20020a625e47000000b005631ae26dafmr19098768pfb.71.1668524234361; Tue, 15 Nov 2022 06:57:14 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1668524234; cv=none; d=google.com; s=arc-20160816; b=HIyf95e+ZB1fMJWVa/KRgGTHq10sdrMa5PLPqofs+tom5pEQHD4ZBsksoOOVWQ+f15 ZbvoIBuKzB2DEvx79mEd+qQyberu1wKuBIo1Z9WkwcaJj0wUjtBY640dkNaDmKFi7h7j dE+UUrqQPna9TO6uNLEijLeWHFEX9XN7RmQy2D8XBfox/n+hZfwtDvqHjcwKeqQ54sdA ZF78+p4hME7a1Ylnluk7Ylt8ydYWEzAploIowbrv9zzRq6g28v4RdMG5vrHL/03DIKHX r3y8Zm/jC2tiUvT6qB+P5/9g1iufdh7QBs8vZ+43IZV8zXgcjwfMlZBa4wlhj49a5bZQ sQTg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:references:in-reply-to:message-id :date:subject:cc:to:from; bh=sY1pJG92TUkDgdSZ+sUiKL891FAFfyGwgIFH6fhI9/Q=; b=CICnAsppNg/z8MdfIifaq/mzuqn8kGTA7iNDOvPjJkPeWglU3gAmyX4IQczPZB9N1M mvRjTQP5Kmu+EaazHImLJ5bqhrRmt1D6r3PhHliBB/M1kl8uy8nkITxH0vxNEtrIyauw WBqzQZfsZX8xGsvImfVIeTbHQQl/DRTjErWtN/rfor/qFHz4w5OxhmHsSC04d7h6wvyU Kl3vEc7M/Ns37qOLGWjML2D+ELi12WvNBP1q0t6ECVECB3jJWy/rBQ4l+GVuun8xIC20 ZPvafBJ8BM1bjwTmZBqM1djN4mQyoXCmI/rNLmSCMCYoR3CltdkRvFsNihaB6GtN2RT4 6FCg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id 22-20020a630f56000000b00462c469b730si12734879pgp.648.2022.11.15.06.57.00; Tue, 15 Nov 2022 06:57:14 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=huawei.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232301AbiKOOvf (ORCPT + 99 others); Tue, 15 Nov 2022 09:51:35 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36402 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230106AbiKOOv1 (ORCPT ); Tue, 15 Nov 2022 09:51:27 -0500 Received: from szxga01-in.huawei.com (szxga01-in.huawei.com [45.249.212.187]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 25E2622500; Tue, 15 Nov 2022 06:51:26 -0800 (PST) Received: from dggpeml500025.china.huawei.com (unknown [172.30.72.56]) by szxga01-in.huawei.com (SkyGuard) with ESMTP id 4NBTdL51DqzmVt7; Tue, 15 Nov 2022 22:51:02 +0800 (CST) Received: from dggpeml500006.china.huawei.com (7.185.36.76) by dggpeml500025.china.huawei.com (7.185.36.35) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.31; Tue, 15 Nov 2022 22:51:23 +0800 Received: from localhost.localdomain (10.175.112.70) by dggpeml500006.china.huawei.com (7.185.36.76) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.31; Tue, 15 Nov 2022 22:51:23 +0800 From: Zhang Changzhong To: , , , , , CC: , , Subject: [PATCH net v2 3/3] net: nixge: fix tx queue handling Date: Tue, 15 Nov 2022 23:10:24 +0800 Message-ID: <1668525024-38409-4-git-send-email-zhangchangzhong@huawei.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1668525024-38409-1-git-send-email-zhangchangzhong@huawei.com> References: <1668525024-38409-1-git-send-email-zhangchangzhong@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.175.112.70] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To dggpeml500006.china.huawei.com (7.185.36.76) X-CFilter-Loop: Reflected X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_MED, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1749574467900132154?= X-GMAIL-MSGID: =?utf-8?q?1749574467900132154?= Currently the driver check for available space at the beginning of nixge_start_xmit(), and when there is not enough space for this packet, it returns NETDEV_TX_OK, which casues packet loss and memory leak. Instead the queue should be stopped after the packet is added to the BD when there may not be enough space for next packet. In addition, the queue should be wakeup only if there is enough space for a packet with max frags. Fixes: 492caffa8a1a ("net: ethernet: nixge: Add support for National Instruments XGE netdev") Signed-off-by: Zhang Changzhong --- drivers/net/ethernet/ni/nixge.c | 54 +++++++++++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 16 deletions(-) diff --git a/drivers/net/ethernet/ni/nixge.c b/drivers/net/ethernet/ni/nixge.c index 91b7ebc..3776a03 100644 --- a/drivers/net/ethernet/ni/nixge.c +++ b/drivers/net/ethernet/ni/nixge.c @@ -457,6 +457,17 @@ static void nixge_tx_skb_unmap(struct nixge_priv *priv, } } +static int nixge_check_tx_bd_space(struct nixge_priv *priv, + int num_frag) +{ + struct nixge_hw_dma_bd *cur_p; + + cur_p = &priv->tx_bd_v[(priv->tx_bd_tail + num_frag) % TX_BD_NUM]; + if (cur_p->status & XAXIDMA_BD_STS_ALL_MASK) + return NETDEV_TX_BUSY; + return 0; +} + static void nixge_start_xmit_done(struct net_device *ndev) { struct nixge_priv *priv = netdev_priv(ndev); @@ -488,19 +499,13 @@ static void nixge_start_xmit_done(struct net_device *ndev) ndev->stats.tx_packets += packets; ndev->stats.tx_bytes += size; - if (packets) - netif_wake_queue(ndev); -} - -static int nixge_check_tx_bd_space(struct nixge_priv *priv, - int num_frag) -{ - struct nixge_hw_dma_bd *cur_p; + if (packets) { + /* Matches barrier in nixge_start_xmit */ + smp_mb(); - cur_p = &priv->tx_bd_v[(priv->tx_bd_tail + num_frag) % TX_BD_NUM]; - if (cur_p->status & XAXIDMA_BD_STS_ALL_MASK) - return NETDEV_TX_BUSY; - return 0; + if (!nixge_check_tx_bd_space(priv, MAX_SKB_FRAGS + 1)) + netif_wake_queue(ndev); + } } static netdev_tx_t nixge_start_xmit(struct sk_buff *skb, @@ -518,10 +523,15 @@ static netdev_tx_t nixge_start_xmit(struct sk_buff *skb, cur_p = &priv->tx_bd_v[priv->tx_bd_tail]; tx_skb = &priv->tx_skb[priv->tx_bd_tail]; - if (nixge_check_tx_bd_space(priv, num_frag + 1)) { - if (!netif_queue_stopped(ndev)) - netif_stop_queue(ndev); - return NETDEV_TX_OK; + if (unlikely(nixge_check_tx_bd_space(priv, num_frag + 1))) { + /* Should not happen as last start_xmit call should have + * checked for sufficient space and queue should only be + * woken when sufficient space is available. + */ + netif_stop_queue(ndev); + if (net_ratelimit()) + netdev_err(ndev, "BUG! TX Ring full when queue awake!\n"); + return NETDEV_TX_BUSY; } cur_phys = dma_map_single(ndev->dev.parent, skb->data, @@ -572,6 +582,18 @@ static netdev_tx_t nixge_start_xmit(struct sk_buff *skb, ++priv->tx_bd_tail; priv->tx_bd_tail %= TX_BD_NUM; + /* Stop queue if next transmit may not have space */ + if (nixge_check_tx_bd_space(priv, MAX_SKB_FRAGS + 1)) { + netif_stop_queue(ndev); + + /* Matches barrier in nixge_start_xmit_done */ + smp_mb(); + + /* Space might have just been freed - check again */ + if (!nixge_check_tx_bd_space(priv, MAX_SKB_FRAGS + 1)) + netif_wake_queue(ndev); + } + return NETDEV_TX_OK; frag_err: for (; ii > 0; ii--) {