From mboxrd@z Thu Jan 1 00:00:00 1970 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 898A220D51C; Wed, 4 Dec 2024 23:35:47 +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=1733355347; cv=none; b=EiIx+cJ0PxGxSlGyCgfoOvJTC4T9U32IQPrcUpoSy/tlzgVMbNDvCrAeBjRCjYrUY8YwUvZTcPULsrOSrLvDxdjvHqk17JCrC4NBZYRTz0mB3M3jBm/KlslZMhlkQSCjQHS5paM9j+ENdfkjURowXYytB6X3KFXlxjsFTwI8nA8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1733355347; c=relaxed/simple; bh=bD/RNP/wZcE8mx//XWXRtjbINcRDinSfXo0ShkmlNoc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=jNn+64teJgfO0+7CIzwlXGjguYdSnp/PpKWzHq7lGeNjFY0EWeWG70Z0JHvgKY/ePO4DT9jkRleBbFWzmdBW4Zhfs3CG5WO75OhwHM3qEzUC+4edR/xedwIlhvvv8brHAGVD/G7M3Dz0PlNTcUkJTn+KkpjF9CTZs5+HMhXNDvc= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=tDu0L5KP; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="tDu0L5KP" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 34EF1C4CECD; Wed, 4 Dec 2024 23:35:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1733355347; bh=bD/RNP/wZcE8mx//XWXRtjbINcRDinSfXo0ShkmlNoc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=tDu0L5KPwsfInIDjZAq4B5cQGkB/+5lxtqZMFGhV9jFdDGdLdJ5pKanGWTz6tnNJB rCQsemsMmdmOpOoyHwJiRQ2K/pLUhC6pk59CF9rdmhrJe6MiTUTF9A5MKIu5W05TzE fkSpG2IUnjghly4MRgHSR4RMZwjWCrGsgnY7Yk4nSE5j4S5E5t5BNQXFhHyLOqh98D suWPam2TsndkGIdzHQpSQjHx8nTX2cR+NHD14AthKFU1WTos1xk8JHh1u9wYJ3w7fs A92t6u2bnQTxHqvQrAfexgun/Cy0HgIHlWWOQUTAX/DkfFx7sQf/APMegYsdwc5Ei5 3vV6WnijVRzeA== From: Sasha Levin To: linux-kernel@vger.kernel.org, stable@vger.kernel.org Cc: Dmitry Torokhov , =?UTF-8?q?Mateusz=20Jo=C5=84czyk?= , Alexandre Belloni , Sasha Levin , linux-rtc@vger.kernel.org Subject: [PATCH AUTOSEL 6.6 2/6] rtc: cmos: avoid taking rtc_lock for extended period of time Date: Wed, 4 Dec 2024 17:24:11 -0500 Message-ID: <20241204222425.2250046-2-sashal@kernel.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20241204222425.2250046-1-sashal@kernel.org> References: <20241204222425.2250046-1-sashal@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 X-stable: review X-Patchwork-Hint: Ignore X-stable-base: Linux 6.6.63 Content-Transfer-Encoding: 8bit From: Dmitry Torokhov [ Upstream commit 0a6efab33eab4e973db26d9f90c3e97a7a82e399 ] On my device reading entirety of /sys/devices/pnp0/00:03/cmos_nvram0/nvmem takes about 9 msec during which time interrupts are off on the CPU that does the read and the thread that performs the read can not be migrated or preempted by another higher priority thread (RT or not). Allow readers and writers be preempted by taking and releasing rtc_lock spinlock for each individual byte read or written rather than once per read/write request. Signed-off-by: Dmitry Torokhov Reviewed-by: Mateusz Jończyk Link: https://lore.kernel.org/r/Zxv8QWR21AV4ztC5@google.com Signed-off-by: Alexandre Belloni Signed-off-by: Sasha Levin --- drivers/rtc/rtc-cmos.c | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c index 35dca2accbb8d..5849d2970bba4 100644 --- a/drivers/rtc/rtc-cmos.c +++ b/drivers/rtc/rtc-cmos.c @@ -645,18 +645,17 @@ static int cmos_nvram_read(void *priv, unsigned int off, void *val, unsigned char *buf = val; off += NVRAM_OFFSET; - spin_lock_irq(&rtc_lock); - for (; count; count--, off++) { + for (; count; count--, off++, buf++) { + guard(spinlock_irq)(&rtc_lock); if (off < 128) - *buf++ = CMOS_READ(off); + *buf = CMOS_READ(off); else if (can_bank2) - *buf++ = cmos_read_bank2(off); + *buf = cmos_read_bank2(off); else - break; + return -EIO; } - spin_unlock_irq(&rtc_lock); - return count ? -EIO : 0; + return 0; } static int cmos_nvram_write(void *priv, unsigned int off, void *val, @@ -671,23 +670,23 @@ static int cmos_nvram_write(void *priv, unsigned int off, void *val, * NVRAM to update, updating checksums is also part of its job. */ off += NVRAM_OFFSET; - spin_lock_irq(&rtc_lock); - for (; count; count--, off++) { + for (; count; count--, off++, buf++) { /* don't trash RTC registers */ if (off == cmos->day_alrm || off == cmos->mon_alrm || off == cmos->century) - buf++; - else if (off < 128) - CMOS_WRITE(*buf++, off); + continue; + + guard(spinlock_irq)(&rtc_lock); + if (off < 128) + CMOS_WRITE(*buf, off); else if (can_bank2) - cmos_write_bank2(*buf++, off); + cmos_write_bank2(*buf, off); else - break; + return -EIO; } - spin_unlock_irq(&rtc_lock); - return count ? -EIO : 0; + return 0; } /*----------------------------------------------------------------*/ -- 2.43.0