Received: by 2002:a25:8b91:0:0:0:0:0 with SMTP id j17csp445659ybl; Tue, 28 Jan 2020 06:07:39 -0800 (PST) X-Google-Smtp-Source: APXvYqwnsJNNhlyXVt9s23o4cEDbvdB7HUsuhcaofIgSNKk6/9PNneaMmAV+MrTcVLLOjt4eNi+V X-Received: by 2002:aca:59c2:: with SMTP id n185mr2958434oib.170.1580220459657; Tue, 28 Jan 2020 06:07:39 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1580220459; cv=none; d=google.com; s=arc-20160816; b=gz+TDWlkS8jB1vNhcGyBVpvadc7lcDtGFijciWwfeRAdfa2AGDdekftAIWl60sUYA8 DivJcpUnWMuUrvKvqlXfJaDau1pSR3zbzzDEjW0zD2T7KwWY8Iq6ozPuqc2KCsVkq3M2 RqgpoTXUOsIUuHaYmvg1vhffAhtS7ZK/XHYTS+71EaSvlxz98GjExYSHbt3tDAqlIH/H W6i+1BgOpE9T2OEPNQf0lN6pPG2f1KnnCqRF4RR6lbHIJfzfzItMNea0qFtrBwBYjc0T OQS3grW3AKZRMysFd7C+Mfj+1+yY49Uaok5SJD6wCLgFjPmnnU6qCJO9u3bBF2G9zQff 4dKA== 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=kn927LonF+IYcGqSh4jVFDGgD3AuUkVlBJx6dsR4lBg=; b=LUBluEaqad585W6iKG3+f34YpIecnEcY8J/xzOntK6H/et+KdaiWuh8nA3uWYoHAYq CSHoeFX8/PPl5UuYij6UrAFrAASidldtQ27WGiOQPJbtDoPQ/58hyfQf90jOh2KfGd/7 EqdE7POMl7PGqx/KPisAjf+/ycEz9v1zm3pxogUj6a2KNp+zdkfRojWGpuVOGRPDyGsS Oc87FjVxpfKChRZ+S1T+Jo0g39+5qnYiaRHF2PdOcLs4UeVZjTzdClWprMrv4yZCtAMr Q5tVJwarhDGXxaqQCXjw3aPGl+fvQVF0VRXxJMSZ5R2U+tlEexIliBtSFAT7+NGztYsY dnXg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=NivYduP2; 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 q127si5184014oic.99.2020.01.28.06.07.26; Tue, 28 Jan 2020 06:07:39 -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=NivYduP2; 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 S1727188AbgA1OEv (ORCPT + 99 others); Tue, 28 Jan 2020 09:04:51 -0500 Received: from mail.kernel.org ([198.145.29.99]:52160 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728150AbgA1OEs (ORCPT ); Tue, 28 Jan 2020 09:04:48 -0500 Received: from localhost (83-86-89-107.cable.dynamic.v4.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 112DB2468E; Tue, 28 Jan 2020 14:04:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1580220287; bh=ucy6aDnLkTe3c9JgK6Gvzan9sG52oKX0HFs/wQaWOqk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NivYduP2uvETLQXv2FfcFioFefAZjLfJRTaSuPey77T4S6eHeL4W3+sN+wpMsL8X0 y80A5YXxb5PRNG0sy6qwzjjTn1XO9KEf7jtIqZrBCv9NbcDv1B3KZCGy5V0/B7U9Ve Dc356/A59WSo/cUGpdr9bvaHUaxLLHy3xDJ5UlPQ= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Stan Johnson , Finn Thain , "David S. Miller" Subject: [PATCH 5.4 092/104] net/sonic: Avoid needless receive descriptor EOL flag updates Date: Tue, 28 Jan 2020 15:00:53 +0100 Message-Id: <20200128135829.747224815@linuxfoundation.org> X-Mailer: git-send-email 2.25.0 In-Reply-To: <20200128135817.238524998@linuxfoundation.org> References: <20200128135817.238524998@linuxfoundation.org> User-Agent: quilt/0.66 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 From: Finn Thain commit eaabfd19b2c787bbe88dc32424b9a43d67293422 upstream. The while loop in sonic_rx() traverses the rx descriptor ring. It stops when it reaches a descriptor that the SONIC has not used. Each iteration advances the EOL flag so the SONIC can keep using more descriptors. Therefore, the while loop has no definite termination condition. The algorithm described in the National Semiconductor literature is quite different. It consumes descriptors up to the one with its EOL flag set (which will also have its "in use" flag set). All freed descriptors are then returned to the ring at once, by adjusting the EOL flags (and link pointers). Adopt the algorithm from datasheet as it's simpler, terminates quickly and avoids a lot of pointless descriptor EOL flag changes. Fixes: efcce839360f ("[PATCH] macsonic/jazzsonic network drivers update") Tested-by: Stan Johnson Signed-off-by: Finn Thain Signed-off-by: David S. Miller Signed-off-by: Greg Kroah-Hartman --- drivers/net/ethernet/natsemi/sonic.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) --- a/drivers/net/ethernet/natsemi/sonic.c +++ b/drivers/net/ethernet/natsemi/sonic.c @@ -436,6 +436,7 @@ static void sonic_rx(struct net_device * struct sonic_local *lp = netdev_priv(dev); int status; int entry = lp->cur_rx; + int prev_entry = lp->eol_rx; while (sonic_rda_get(dev, entry, SONIC_RD_IN_USE) == 0) { struct sk_buff *used_skb; @@ -516,13 +517,21 @@ static void sonic_rx(struct net_device * /* * give back the descriptor */ - sonic_rda_put(dev, entry, SONIC_RD_LINK, - sonic_rda_get(dev, entry, SONIC_RD_LINK) | SONIC_EOL); sonic_rda_put(dev, entry, SONIC_RD_IN_USE, 1); - sonic_rda_put(dev, lp->eol_rx, SONIC_RD_LINK, - sonic_rda_get(dev, lp->eol_rx, SONIC_RD_LINK) & ~SONIC_EOL); - lp->eol_rx = entry; - lp->cur_rx = entry = (entry + 1) & SONIC_RDS_MASK; + + prev_entry = entry; + entry = (entry + 1) & SONIC_RDS_MASK; + } + + lp->cur_rx = entry; + + if (prev_entry != lp->eol_rx) { + /* Advance the EOL flag to put descriptors back into service */ + sonic_rda_put(dev, prev_entry, SONIC_RD_LINK, SONIC_EOL | + sonic_rda_get(dev, prev_entry, SONIC_RD_LINK)); + sonic_rda_put(dev, lp->eol_rx, SONIC_RD_LINK, ~SONIC_EOL & + sonic_rda_get(dev, lp->eol_rx, SONIC_RD_LINK)); + lp->eol_rx = prev_entry; } /* * If any worth-while packets have been received, netif_rx()