Received: by 2002:a05:7412:8d09:b0:fa:4c10:6cad with SMTP id bj9csp666251rdb; Tue, 16 Jan 2024 11:55:45 -0800 (PST) X-Google-Smtp-Source: AGHT+IGzix179ZFT1rIN9xl93NXZKSS2IJCyCNXBVmbUo6lAI+jom4kR1ZSkb5qt9JV+LXKUEEW4 X-Received: by 2002:a05:6214:d87:b0:681:743d:fd72 with SMTP id e7-20020a0562140d8700b00681743dfd72mr1139424qve.72.1705434944800; Tue, 16 Jan 2024 11:55:44 -0800 (PST) ARC-Seal: i=2; a=rsa-sha256; t=1705434944; cv=pass; d=google.com; s=arc-20160816; b=PesW140tMy/8uoVXAIViSDGcvuz+ZO/+IHYmVqGd6vBLdkaDntKAJbI/FuG4rRpdL7 VPiKGhsrzfo0LxTcI2FjazKV+kv0vW25GX8bx6l+4kB37a6VZDdsZ6OjjLItHYu2sfxm HstuEhYxzheugBm8B2vY+URcgV9M1Mwyzkb/kt/Qh0v4tVrMsh1uScKavoXi22RsDWPb bQRS/cDDT6yryGh56tdygf/oH/iS6RaTXRjva4OhffNLrXhWoYRk2X9IFJTcwv06qjpG c+DTIEy/ejCG8NgvEphFQIy7C/LP6is47x4PIqboTMt2vxiWkh6w3MpJzeLRCoM6NEJ/ 8odg== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=F6Wyw//HMEXUsbwcyOjaBlRAJK+jPTneSuw+CRhLq4U=; fh=orbZvWR400W3oSyyDJoJ2LKlPRPUFyAkfv3vCep5d2E=; b=C5m4uo+wIHa+zOmqY85EzTyFYy7WIsBOFz1OK2nYEW3s8nf15bz8AjCvf1Gd8TmfES +T86DaSJT190zqT0BmC6mL+FtPKMTNRBn0L+pfDteC3xyAu/lEsLhl0iPXDKE9Dp7+DK 0b3jVNuHk/AzCClUuOXjFH8b5lu9l5Eu/Y5hqA2GQRehYSMZlvFWbdVCjhHzgrpwSgeX Z81nBDIUtOa8l9x/K2A62K77RBi0Q5BdDqLZCwqQY4MDEWZfm9ISCElRtnT0h4uEm+Qh RR6svNtDPnJXmOBsHWsgrmhZkxOeUqMXhyN/Obui/yXM4ti3DFdhGwPR4VSXUrJGBUrr pDXw== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=nYcNBn4P; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-27813-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-27813-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from ny.mirrors.kernel.org (ny.mirrors.kernel.org. [147.75.199.223]) by mx.google.com with ESMTPS id w10-20020a0c9c4a000000b0067a9d364535si10306168qve.11.2024.01.16.11.55.44 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 16 Jan 2024 11:55:44 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel+bounces-27813-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) client-ip=147.75.199.223; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=nYcNBn4P; arc=pass (i=1 dkim=pass dkdomain=kernel.org); spf=pass (google.com: domain of linux-kernel+bounces-27813-linux.lists.archive=gmail.com@vger.kernel.org designates 147.75.199.223 as permitted sender) smtp.mailfrom="linux-kernel+bounces-27813-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ny.mirrors.kernel.org (Postfix) with ESMTPS id 8EA4E1C224D0 for ; Tue, 16 Jan 2024 19:55:44 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 36E792D601; Tue, 16 Jan 2024 19:44:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="nYcNBn4P" Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4A61B2D05C; Tue, 16 Jan 2024 19:44:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705434252; cv=none; b=BV/tAkW2W3ufA/9/AZUhaS+0U1OcrmkS9wHsSnTfE/j13QbDZJjXNpVhUzGYMFLC0uDqzxwaEbnUd3YLe2z8Rbxba8KygU/wRbQ1hRvRiIMamCk3TlR9tvhe+4f+byH1M0xieWSjVJbW3ToWFY47qFmrSEKxOE8EGhZwSI5sm4Y= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1705434252; c=relaxed/simple; bh=VtJF6R3jnzdnDLusu0c8DS8DNEylnVXk65G3k6SKdVU=; h=Received:DKIM-Signature:From:To:Cc:Subject:Date:Message-ID: X-Mailer:In-Reply-To:References:MIME-Version:X-stable: X-Patchwork-Hint:X-stable-base:Content-Transfer-Encoding; b=QpQO257Cx16xpTnuX3oc//rnkbLhVruBv13ON3Bl30pn4VHy0GFZUPpSzJvHqsE2dAB6/c5dx5IkJoTfL/QYscjUGqSSuE7cqM2cymm4RlIqjUB4XvT/1ED2P3ZK0DLQYrg3YuFfsVYFuG88XHuzCkNV/p80Rt+0cXiNbfwWB2c= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=nYcNBn4P; arc=none smtp.client-ip=10.30.226.201 Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1F6AAC433C7; Tue, 16 Jan 2024 19:44:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1705434251; bh=VtJF6R3jnzdnDLusu0c8DS8DNEylnVXk65G3k6SKdVU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=nYcNBn4P4AZX0FaZACXCJemgahV4cn8MkZf1KR3Ho+Gff2QM+3Uui7F+XD3BPVyq+ dHLoQogWxx1pGzjZcNEjGJVgCOCdJzd9wQewOW4krm+bL6BW0c5U7gY7zfuI/qSikQ 3doUaJ7liJtg2Y+mDcvDE6b6zsIOztKmwRsp48Tt738YQXxjvUlroZ8kdkssCdudNT 7lnnSiYfY6k9bkMvkwYs3vLe7A+pmJXnwZZgo2nrv0dCHKoW21Sn1d3M9NQJq/7TET q5qrqxBXLwDMdAEa1iskNz2ctyPBf3tMAx+bDMoCifDpCDExjuWBayoMKzdimtxk1u KkxafEbvQHtgg== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Tobias Waldekranz , Andrew Lunn , Jakub Kicinski , Sasha Levin , davem@davemloft.net, edumazet@google.com, pabeni@redhat.com, horms@kernel.org, krzysztof.kozlowski@linaro.org, robh@kernel.org, u.kleine-koenig@pengutronix.de, netdev@vger.kernel.org Subject: [PATCH AUTOSEL 6.7 043/108] net: mvmdio: Avoid excessive sleeps in polled mode Date: Tue, 16 Jan 2024 14:39:09 -0500 Message-ID: <20240116194225.250921-43-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20240116194225.250921-1-sashal@kernel.org> References: <20240116194225.250921-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-stable: review X-Patchwork-Hint: Ignore X-stable-base: Linux 6.7 Content-Transfer-Encoding: 8bit From: Tobias Waldekranz [ Upstream commit 7dd12fe34686d89c332b1a05104d18d728591f0a ] Before this change, when operating in polled mode, i.e. no IRQ is available, every individual C45 access would be hit with a 150us sleep after the bus access. For example, on a board with a CN9130 SoC connected to an MV88X3310 PHY, a single C45 read would take around 165us: root@infix:~$ mdio f212a600.mdio-mii mmd 4:1 bench 0xc003 Performed 1000 reads in 165ms By replacing the long sleep with a tighter poll loop, we observe a 10x increase in bus throughput: root@infix:~$ mdio f212a600.mdio-mii mmd 4:1 bench 0xc003 Performed 1000 reads in 15ms Signed-off-by: Tobias Waldekranz Reviewed-by: Andrew Lunn Tested-by: Andrew Lunn Link: https://lore.kernel.org/r/20231204100811.2708884-3-tobias@waldekranz.com Signed-off-by: Jakub Kicinski Signed-off-by: Sasha Levin --- drivers/net/ethernet/marvell/mvmdio.c | 53 ++++++++------------------- 1 file changed, 16 insertions(+), 37 deletions(-) diff --git a/drivers/net/ethernet/marvell/mvmdio.c b/drivers/net/ethernet/marvell/mvmdio.c index 89f26402f8fb..5f66f779e56f 100644 --- a/drivers/net/ethernet/marvell/mvmdio.c +++ b/drivers/net/ethernet/marvell/mvmdio.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -58,11 +59,6 @@ * - Armada 370 (Globalscale Mirabox): 41us to 43us (Polled) */ #define MVMDIO_SMI_TIMEOUT 1000 /* 1000us = 1ms */ -#define MVMDIO_SMI_POLL_INTERVAL_MIN 45 -#define MVMDIO_SMI_POLL_INTERVAL_MAX 55 - -#define MVMDIO_XSMI_POLL_INTERVAL_MIN 150 -#define MVMDIO_XSMI_POLL_INTERVAL_MAX 160 struct orion_mdio_dev { void __iomem *regs; @@ -84,8 +80,6 @@ enum orion_mdio_bus_type { struct orion_mdio_ops { int (*is_done)(struct orion_mdio_dev *); - unsigned int poll_interval_min; - unsigned int poll_interval_max; }; /* Wait for the SMI unit to be ready for another operation @@ -94,34 +88,23 @@ static int orion_mdio_wait_ready(const struct orion_mdio_ops *ops, struct mii_bus *bus) { struct orion_mdio_dev *dev = bus->priv; - unsigned long timeout = usecs_to_jiffies(MVMDIO_SMI_TIMEOUT); - unsigned long end = jiffies + timeout; - int timedout = 0; + unsigned long timeout; + int done; - while (1) { - if (ops->is_done(dev)) + if (dev->err_interrupt <= 0) { + if (!read_poll_timeout_atomic(ops->is_done, done, done, 2, + MVMDIO_SMI_TIMEOUT, false, dev)) + return 0; + } else { + /* wait_event_timeout does not guarantee a delay of at + * least one whole jiffie, so timeout must be no less + * than two. + */ + timeout = max(usecs_to_jiffies(MVMDIO_SMI_TIMEOUT), 2); + + if (wait_event_timeout(dev->smi_busy_wait, + ops->is_done(dev), timeout)) return 0; - else if (timedout) - break; - - if (dev->err_interrupt <= 0) { - usleep_range(ops->poll_interval_min, - ops->poll_interval_max); - - if (time_is_before_jiffies(end)) - ++timedout; - } else { - /* wait_event_timeout does not guarantee a delay of at - * least one whole jiffie, so timeout must be no less - * than two. - */ - if (timeout < 2) - timeout = 2; - wait_event_timeout(dev->smi_busy_wait, - ops->is_done(dev), timeout); - - ++timedout; - } } dev_err(bus->parent, "Timeout: SMI busy for too long\n"); @@ -135,8 +118,6 @@ static int orion_mdio_smi_is_done(struct orion_mdio_dev *dev) static const struct orion_mdio_ops orion_mdio_smi_ops = { .is_done = orion_mdio_smi_is_done, - .poll_interval_min = MVMDIO_SMI_POLL_INTERVAL_MIN, - .poll_interval_max = MVMDIO_SMI_POLL_INTERVAL_MAX, }; static int orion_mdio_smi_read(struct mii_bus *bus, int mii_id, @@ -194,8 +175,6 @@ static int orion_mdio_xsmi_is_done(struct orion_mdio_dev *dev) static const struct orion_mdio_ops orion_mdio_xsmi_ops = { .is_done = orion_mdio_xsmi_is_done, - .poll_interval_min = MVMDIO_XSMI_POLL_INTERVAL_MIN, - .poll_interval_max = MVMDIO_XSMI_POLL_INTERVAL_MAX, }; static int orion_mdio_xsmi_read_c45(struct mii_bus *bus, int mii_id, -- 2.43.0