stable.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH] rtc-cmos: take rtc_lock while accessing CMOS
@ 2021-08-30 17:25 Mateusz Jończyk
  2021-08-31 23:20 ` Nobuhiro Iwamatsu
  0 siblings, 1 reply; 2+ messages in thread
From: Mateusz Jończyk @ 2021-08-30 17:25 UTC (permalink / raw)
  To: linux-rtc
  Cc: Mateusz Jończyk, Alessandro Zummo, Alexandre Belloni, stable

Reading from the CMOS involves writing to the index register and then
reading from the data register. Therefore access to the CMOS has to be
serialized with a spinlock. An invocation in cmos_set_alarm was not
serialized with rtc_lock, fix this.

Use spin_lock_irq() like the rest of the function.

Nothing in kernel modifies the RTC_DM_BINARY bit, so use a separate pair
of spin_lock_irq() / spin_unlock_irq() before doing the math.

Signed-off-by: Mateusz Jończyk <mat.jonczyk@o2.pl>
Cc: Alessandro Zummo <a.zummo@towertech.it>
Cc: Alexandre Belloni <alexandre.belloni@bootlin.com>
Cc: stable@vger.kernel.org
---
 drivers/rtc/rtc-cmos.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c
index 0fa66d1039b9..e6ff0fb7591b 100644
--- a/drivers/rtc/rtc-cmos.c
+++ b/drivers/rtc/rtc-cmos.c
@@ -463,7 +463,10 @@ static int cmos_set_alarm(struct device *dev, struct rtc_wkalrm *t)
 	min = t->time.tm_min;
 	sec = t->time.tm_sec;
 
+	spin_lock_irq(&rtc_lock);
 	rtc_control = CMOS_READ(RTC_CONTROL);
+	spin_unlock_irq(&rtc_lock);
+
 	if (!(rtc_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) {
 		/* Writing 0xff means "don't care" or "match all".  */
 		mon = (mon <= 12) ? bin2bcd(mon) : 0xff;
-- 
2.25.1


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] rtc-cmos: take rtc_lock while accessing CMOS
  2021-08-30 17:25 [PATCH] rtc-cmos: take rtc_lock while accessing CMOS Mateusz Jończyk
@ 2021-08-31 23:20 ` Nobuhiro Iwamatsu
  0 siblings, 0 replies; 2+ messages in thread
From: Nobuhiro Iwamatsu @ 2021-08-31 23:20 UTC (permalink / raw)
  To: Mateusz Jończyk
  Cc: linux-rtc, Alessandro Zummo, Alexandre Belloni, stable

Hi,

2021年8月31日(火) 2:26 Mateusz Jończyk <mat.jonczyk@o2.pl>:
>
> Reading from the CMOS involves writing to the index register and then
> reading from the data register. Therefore access to the CMOS has to be
> serialized with a spinlock. An invocation in cmos_set_alarm was not
> serialized with rtc_lock, fix this.
>
> Use spin_lock_irq() like the rest of the function.
>
> Nothing in kernel modifies the RTC_DM_BINARY bit, so use a separate pair
> of spin_lock_irq() / spin_unlock_irq() before doing the math.
>
> Signed-off-by: Mateusz Jończyk <mat.jonczyk@o2.pl>
> Cc: Alessandro Zummo <a.zummo@towertech.it>
> Cc: Alexandre Belloni <alexandre.belloni@bootlin.com>
> Cc: stable@vger.kernel.org
> ---
>  drivers/rtc/rtc-cmos.c | 3 +++
>  1 file changed, 3 insertions(+)

Reviewed-by: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>

Best regards,
  Nobuhiro

>
> diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c
> index 0fa66d1039b9..e6ff0fb7591b 100644
> --- a/drivers/rtc/rtc-cmos.c
> +++ b/drivers/rtc/rtc-cmos.c
> @@ -463,7 +463,10 @@ static int cmos_set_alarm(struct device *dev, struct rtc_wkalrm *t)
>         min = t->time.tm_min;
>         sec = t->time.tm_sec;
>
> +       spin_lock_irq(&rtc_lock);
>         rtc_control = CMOS_READ(RTC_CONTROL);
> +       spin_unlock_irq(&rtc_lock);
> +
>         if (!(rtc_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) {
>                 /* Writing 0xff means "don't care" or "match all".  */
>                 mon = (mon <= 12) ? bin2bcd(mon) : 0xff;
> --
> 2.25.1
>


-- 
Nobuhiro Iwamatsu
   iwamatsu at {nigauri.org / debian.org}
   GPG ID: 40AD1FA6

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2021-08-31 23:20 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-08-30 17:25 [PATCH] rtc-cmos: take rtc_lock while accessing CMOS Mateusz Jończyk
2021-08-31 23:20 ` Nobuhiro Iwamatsu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).