Received: by 2002:ac0:b08d:0:0:0:0:0 with SMTP id l13csp4923745imc; Mon, 25 Feb 2019 13:44:26 -0800 (PST) X-Google-Smtp-Source: AHgI3IZ7A26H8a8RkNWV07+6xXgcZcl8otINknCrMkINrfNUzMxH8aaHcE936x2huQe6IoS2JdOz X-Received: by 2002:a65:4204:: with SMTP id c4mr13738159pgq.136.1551131066703; Mon, 25 Feb 2019 13:44:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1551131066; cv=none; d=google.com; s=arc-20160816; b=qJTNdeqFUiB5sJvPkDoEQew1e7DwBvfo5vcOOj0jpb2zF4egWgYQ8MEq8qV0VfQwAZ upsm5W2qXTnMBQRbVUKOCeHoIhV7oL/EOd/CP4F3iSLBUVcZAziZxxImT/cIcshwdNYs OAt4ENb+EY+ssHAKoCjcDEzURolAhC73+ZaBtSXlRJFvMiVe2OOKsm0TpCxqV86YfBj5 WG1WNb4OYZE3RrzSU90xGWbjAB91sCO5H9lNOOHNqlOC+mp3OtylQlnHE2SQqHjexd6A GjmAZL4CgxmtaiwUpGtDWhNuom6DQnCTysHErVtpGUCSDksLRgYm4GGhKuALwj4OC5GE e20g== 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:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=D7SHzTSby5huinhJoGce6OvoHAQG0gqa/F+ye3qjxUs=; b=oVg6h+IyyYPO9wkbzUGHsOGw+iGxcQIpfN/2uCMwxBhbCgzCygveSGuQdkKJBZZdma tl8vN9vms6QhoiMUxcaONenIQM4tpbWs0DCF3PONCSoQn2vXot8l44YsFMNzSoCCStpo soLWaaHorn0vzCUC9N+z11oLMgIOmngFVBkKwPuzq3QrBoU/MmFbvqThLNUFTzzxkHIZ ZZ80cOuLy0Fe+LTp37R+u39gexlEQFHjsuCP9zdAGlosge/Jg1oYf8gyT9e/niMJc2RA X5MyjakkWVEaW/g1ElJ8Ex4uW7iPS0oMchxFsJnjk3RMFW5SS8lUySUq4vTpa8PFb6i/ l0YQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=weVb81Ke; 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 cc9si11758944plb.59.2019.02.25.13.44.11; Mon, 25 Feb 2019 13:44:26 -0800 (PST) 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; dkim=pass header.i=@kernel.org header.s=default header.b=weVb81Ke; 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 S1732333AbfBYVbg (ORCPT + 99 others); Mon, 25 Feb 2019 16:31:36 -0500 Received: from mail.kernel.org ([198.145.29.99]:37096 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731665AbfBYVbb (ORCPT ); Mon, 25 Feb 2019 16:31:31 -0500 Received: from localhost (5356596B.cm-6-7b.dynamic.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id D1FFA21841; Mon, 25 Feb 2019 21:31:29 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1551130290; bh=mgBnLn3jrMSWAVtvsK65wsfv+6fcevTCegZhiwrluLk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=weVb81Kewu7nTV94kqc/n9m0EbDTDB2Si0/TZliuUha/hAzDu/SzI3YAgG/vilpRa bhJEzXz+emeXb+a2Mb45IBGgMToLbijvryIcPBp+wNFQuN4MWrqqGlxvs8qhfJcwYD zxCrH2wHe4pXpSigeEvfCRmb0gTeGdfwvPiR8ckc= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Joao Pinto , "David S. Miller" , Giuseppe Cavallaro , Alexandre Torgue , Jose Abreu , Sasha Levin Subject: [PATCH 4.20 075/183] net: stmmac: Prevent RX starvation in stmmac_napi_poll() Date: Mon, 25 Feb 2019 22:10:48 +0100 Message-Id: <20190225195107.102335094@linuxfoundation.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190225195054.748060397@linuxfoundation.org> References: <20190225195054.748060397@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review X-Patchwork-Hint: ignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.20-stable review patch. If anyone has any objections, please let me know. ------------------ [ Upstream commit fa0be0a43f101888ac677dba31b590963eafeaa1 ] Currently, TX is given a budget which is consumed by stmmac_tx_clean() and stmmac_rx() is given the remaining non-consumed budget. This is wrong and in case we are sending a large number of packets this can starve RX because remaining budget will be low. Let's give always the same budget for RX and TX clean. While at it, check if we missed any interrupts while we were in NAPI callback by looking at DMA interrupt status. Cc: Joao Pinto Cc: David S. Miller Cc: Giuseppe Cavallaro Cc: Alexandre Torgue Signed-off-by: Jose Abreu Signed-off-by: David S. Miller Signed-off-by: Sasha Levin --- .../net/ethernet/stmicro/stmmac/stmmac_main.c | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c index fe9240e15aeac..5d83d6a7694b0 100644 --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -3525,27 +3525,28 @@ static int stmmac_napi_poll(struct napi_struct *napi, int budget) struct stmmac_channel *ch = container_of(napi, struct stmmac_channel, napi); struct stmmac_priv *priv = ch->priv_data; - int work_done = 0, work_rem = budget; + int work_done, rx_done = 0, tx_done = 0; u32 chan = ch->index; priv->xstats.napi_poll++; - if (ch->has_tx) { - int done = stmmac_tx_clean(priv, work_rem, chan); + if (ch->has_tx) + tx_done = stmmac_tx_clean(priv, budget, chan); + if (ch->has_rx) + rx_done = stmmac_rx(priv, budget, chan); - work_done += done; - work_rem -= done; - } - - if (ch->has_rx) { - int done = stmmac_rx(priv, work_rem, chan); + work_done = max(rx_done, tx_done); + work_done = min(work_done, budget); - work_done += done; - work_rem -= done; - } + if (work_done < budget && napi_complete_done(napi, work_done)) { + int stat; - if (work_done < budget && napi_complete_done(napi, work_done)) stmmac_enable_dma_irq(priv, priv->ioaddr, chan); + stat = stmmac_dma_interrupt_status(priv, priv->ioaddr, + &priv->xstats, chan); + if (stat && napi_reschedule(napi)) + stmmac_disable_dma_irq(priv, priv->ioaddr, chan); + } return work_done; } -- 2.19.1