All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] rtc-snvs: Add timeouts to avoid kernel lockups
@ 2018-03-16 18:12 Trent Piepho
  2018-04-26 20:22 ` Alexandre Belloni
  2018-05-09 20:19 ` Trent Piepho
  0 siblings, 2 replies; 7+ messages in thread
From: Trent Piepho @ 2018-03-16 18:12 UTC (permalink / raw)
  Cc: Trent Piepho, Alessandro Zummo, Alexandre Belloni, linux-rtc,
	Shawn Guo, Sascha Hauer, Fabio Estevam

In order to read correctly from asynchronously updated RTC registers, it's
necessary to read repeatedly until their values do not change from read to
read.  There is no timeout in this code and it could possibly loop
forever.

It's also necessary to wait for three RTC clock ticks for certain
operations to take effect and the driver might wait forever for this to
happen.

To avoid kernel hangs, put in timeouts.

These hangs will happen when running under qemu, which doesn't emulate the
SNVS RTC.  It could also happen if the RTC block where somehow placed into
reset or the slow speed clock that drives the RTC counter (but not the
CPU) were to stop.

The symptoms are a work queue hang on rtc_timer_do_work(), which
eventually blocks a systemd fsnotify operation that triggers a work queue
flush, causing systemd to hang and thus causing all services that should
be started by systemd, like a console getty, to fail to start or stop.

Also optimize the wait code to wait less.  It only needs to wait for the
clock to advance three ticks, not to see it change three times.

Signed-off-by: Trent Piepho <tpiepho@impinj.com>
Cc: Alessandro Zummo <a.zummo@towertech.it>
Cc: Alexandre Belloni <alexandre.belloni@free-electrons.com>
Cc: linux-rtc@vger.kernel.org
Cc: Shawn Guo <shawnguo@kernel.org>
Cc: Sascha Hauer <kernel@pengutronix.de>
Cc: Fabio Estevam <fabio.estevam@nxp.com>

---
 drivers/rtc/rtc-snvs.c | 105 ++++++++++++++++++++++++++++++++-----------------
 1 file changed, 70 insertions(+), 35 deletions(-)

diff --git a/drivers/rtc/rtc-snvs.c b/drivers/rtc/rtc-snvs.c
index d8ef9e052c4f..0e7564b9d6f2 100644
--- a/drivers/rtc/rtc-snvs.c
+++ b/drivers/rtc/rtc-snvs.c
@@ -47,49 +47,83 @@ struct snvs_rtc_data {
 	struct clk *clk;
 };
 
+/* Read 64 bit timer register, which could be in inconsistent state */
+static u64 rtc_read_lpsrt(struct snvs_rtc_data *data)
+{
+	u32 msb, lsb;
+
+	regmap_read(data->regmap, data->offset + SNVS_LPSRTCMR, &msb);
+	regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &lsb);
+	return (u64)msb << 32 | lsb;
+}
+
+/* Read the secure real time counter, taking care to deal with the cases of the
+ * counter updating while being read.
+ */
 static u32 rtc_read_lp_counter(struct snvs_rtc_data *data)
 {
 	u64 read1, read2;
-	u32 val;
+	unsigned int timeout = 100;
 
+	/* As expected, the registers might update between the read of the LSB
+	 * reg and the MSB reg.  It's also possible that one register might be
+	 * in partially modified state as well.
+	 */
+	read1 = rtc_read_lpsrt(data);
 	do {
-		regmap_read(data->regmap, data->offset + SNVS_LPSRTCMR, &val);
-		read1 = val;
-		read1 <<= 32;
-		regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &val);
-		read1 |= val;
-
-		regmap_read(data->regmap, data->offset + SNVS_LPSRTCMR, &val);
-		read2 = val;
-		read2 <<= 32;
-		regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &val);
-		read2 |= val;
-	} while (read1 != read2);
+		read2 = read1;
+		read1 = rtc_read_lpsrt(data);
+	} while (read1 != read2 && --timeout);
+	if (!timeout)
+		dev_err(&data->rtc->dev, "Timeout trying to get valid LPSRT Counter read\n");
 
 	/* Convert 47-bit counter to 32-bit raw second count */
 	return (u32) (read1 >> CNTR_TO_SECS_SH);
 }
 
-static void rtc_write_sync_lp(struct snvs_rtc_data *data)
+/* Just read the lsb from the counter, dealing with inconsistent state */
+static int rtc_read_lp_counter_lsb(struct snvs_rtc_data *data, u32 *lsb)
 {
-	u32 count1, count2, count3;
-	int i;
-
-	/* Wait for 3 CKIL cycles */
-	for (i = 0; i < 3; i++) {
-		do {
-			regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &count1);
-			regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &count2);
-		} while (count1 != count2);
-
-		/* Now wait until counter value changes */
-		do {
-			do {
-				regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &count2);
-				regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &count3);
-			} while (count2 != count3);
-		} while (count3 == count1);
+	u32 count1, count2;
+	unsigned int timeout = 100;
+
+	regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &count1);
+	do {
+		count2 = count1;
+		regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &count1);
+	} while (count1 != count2 && --timeout);
+	if (!timeout) {
+		dev_err(&data->rtc->dev, "Timeout trying to get valid LPSRT Counter read\n");
+		return -ETIMEDOUT;
 	}
+
+	*lsb = count1;
+	return 0;
+}
+
+static int rtc_write_sync_lp(struct snvs_rtc_data *data)
+{
+	u32 count1, count2;
+	u32 elapsed;
+	unsigned int timeout = 1000;
+	int ret;
+
+	ret = rtc_read_lp_counter_lsb(data, &count1);
+	if (ret)
+		return ret;
+
+	/* Wait for 3 CKIL cycles, about 61.0-91.5 µs */
+	do {
+		ret = rtc_read_lp_counter_lsb(data, &count2);
+		if (ret)
+			return ret;
+		elapsed = count2 - count1; /* wrap around _is_ handled! */
+	} while (elapsed < 3 && --timeout);
+	if (!timeout) {
+		dev_err(&data->rtc->dev, "Timeout waiting for LPSRT Counter to change\n");
+		return -ETIMEDOUT;
+	}
+	return 0;
 }
 
 static int snvs_rtc_enable(struct snvs_rtc_data *data, bool enable)
@@ -170,9 +204,7 @@ static int snvs_rtc_alarm_irq_enable(struct device *dev, unsigned int enable)
 			   (SNVS_LPCR_LPTA_EN | SNVS_LPCR_LPWUI_EN),
 			   enable ? (SNVS_LPCR_LPTA_EN | SNVS_LPCR_LPWUI_EN) : 0);
 
-	rtc_write_sync_lp(data);
-
-	return 0;
+	return rtc_write_sync_lp(data);
 }
 
 static int snvs_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
@@ -180,11 +212,14 @@ static int snvs_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
 	struct snvs_rtc_data *data = dev_get_drvdata(dev);
 	struct rtc_time *alrm_tm = &alrm->time;
 	unsigned long time;
+	int ret;
 
 	rtc_tm_to_time(alrm_tm, &time);
 
 	regmap_update_bits(data->regmap, data->offset + SNVS_LPCR, SNVS_LPCR_LPTA_EN, 0);
-	rtc_write_sync_lp(data);
+	ret = rtc_write_sync_lp(data);
+	if (ret)
+		return ret;
 	regmap_write(data->regmap, data->offset + SNVS_LPTAR, time);
 
 	/* Clear alarm interrupt status bit */
-- 
2.14.3

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

* Re: [PATCH] rtc-snvs: Add timeouts to avoid kernel lockups
  2018-03-16 18:12 [PATCH] rtc-snvs: Add timeouts to avoid kernel lockups Trent Piepho
@ 2018-04-26 20:22 ` Alexandre Belloni
  2018-05-09 20:19 ` Trent Piepho
  1 sibling, 0 replies; 7+ messages in thread
From: Alexandre Belloni @ 2018-04-26 20:22 UTC (permalink / raw)
  To: Trent Piepho
  Cc: Alessandro Zummo, linux-rtc, Shawn Guo, Sascha Hauer, Fabio Estevam

Hi Trent,

On 16/03/2018 11:12:02-0700, Trent Piepho wrote:
> In order to read correctly from asynchronously updated RTC registers, it's
> necessary to read repeatedly until their values do not change from read to
> read.  There is no timeout in this code and it could possibly loop
> forever.
> 
> It's also necessary to wait for three RTC clock ticks for certain
> operations to take effect and the driver might wait forever for this to
> happen.
> 
> To avoid kernel hangs, put in timeouts.
> 
> These hangs will happen when running under qemu, which doesn't emulate the
> SNVS RTC.  It could also happen if the RTC block where somehow placed into
> reset or the slow speed clock that drives the RTC counter (but not the
> CPU) were to stop.
> 
> The symptoms are a work queue hang on rtc_timer_do_work(), which
> eventually blocks a systemd fsnotify operation that triggers a work queue
> flush, causing systemd to hang and thus causing all services that should
> be started by systemd, like a console getty, to fail to start or stop.
> 
> Also optimize the wait code to wait less.  It only needs to wait for the
> clock to advance three ticks, not to see it change three times.
> 
> Signed-off-by: Trent Piepho <tpiepho@impinj.com>
> Cc: Alessandro Zummo <a.zummo@towertech.it>
> Cc: Alexandre Belloni <alexandre.belloni@free-electrons.com>
> Cc: linux-rtc@vger.kernel.org
> Cc: Shawn Guo <shawnguo@kernel.org>
> Cc: Sascha Hauer <kernel@pengutronix.de>
> Cc: Fabio Estevam <fabio.estevam@nxp.com>
>

Can you rebase that patch on top of rtc-next if you feel this is still
necessary? Also, it would be great to have Shawn or Fabio's ack.

Thanks!

-- 
Alexandre Belloni, Bootlin (formerly Free Electrons)
Embedded Linux and Kernel engineering
https://bootlin.com

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

* Re: [PATCH] rtc-snvs: Add timeouts to avoid kernel lockups
  2018-03-16 18:12 [PATCH] rtc-snvs: Add timeouts to avoid kernel lockups Trent Piepho
  2018-04-26 20:22 ` Alexandre Belloni
@ 2018-05-09 20:19 ` Trent Piepho
  2018-05-09 22:17   ` Bryan O'Donoghue
  2018-05-10  5:25   ` Alexandre Belloni
  1 sibling, 2 replies; 7+ messages in thread
From: Trent Piepho @ 2018-05-09 20:19 UTC (permalink / raw)
  To: a.zummo, pure.logic
  Cc: linux-rtc, alexandre.belloni, shawnguo, kernel, fabio.estevam

QnVtcC4NCg0KQmVlbiB3aGlsZSwgbm8gcmVzcG9uc2UuDQoNCkFub3RoZXIgcGF0Y2ggZnJvbSBC
cnlhbiBPJ0Rvbm9naHVlIHdlbnQgaW4gdG8gZml4IGEgcmVsYXRlZCBpc3N1ZSwgYnV0DQpJIGJl
bGlldmUgdGhpcyBwYXRjaCBzdGlsbCBmaXhlcyBhbm90aGVyIGJ1Zy4NCg0KDQpPbiBGcmksIDIw
MTgtMDMtMTYgYXQgMTE6MTIgLTA3MDAsIFRyZW50IFBpZXBobyB3cm90ZToNCj4gSW4gb3JkZXIg
dG8gcmVhZCBjb3JyZWN0bHkgZnJvbSBhc3luY2hyb25vdXNseSB1cGRhdGVkIFJUQyByZWdpc3Rl
cnMsIGl0J3MNCj4gbmVjZXNzYXJ5IHRvIHJlYWQgcmVwZWF0ZWRseSB1bnRpbCB0aGVpciB2YWx1
ZXMgZG8gbm90IGNoYW5nZSBmcm9tIHJlYWQgdG8NCj4gcmVhZC4gIFRoZXJlIGlzIG5vIHRpbWVv
dXQgaW4gdGhpcyBjb2RlIGFuZCBpdCBjb3VsZCBwb3NzaWJseSBsb29wDQo+IGZvcmV2ZXIuDQo+
IA0KPiBJdCdzIGFsc28gbmVjZXNzYXJ5IHRvIHdhaXQgZm9yIHRocmVlIFJUQyBjbG9jayB0aWNr
cyBmb3IgY2VydGFpbg0KPiBvcGVyYXRpb25zIHRvIHRha2UgZWZmZWN0IGFuZCB0aGUgZHJpdmVy
IG1pZ2h0IHdhaXQgZm9yZXZlciBmb3IgdGhpcyB0bw0KPiBoYXBwZW4uDQo+IA0KPiBUbyBhdm9p
ZCBrZXJuZWwgaGFuZ3MsIHB1dCBpbiB0aW1lb3V0cy4NCj4gDQo+IFRoZXNlIGhhbmdzIHdpbGwg
aGFwcGVuIHdoZW4gcnVubmluZyB1bmRlciBxZW11LCB3aGljaCBkb2Vzbid0IGVtdWxhdGUgdGhl
DQo+IFNOVlMgUlRDLiAgSXQgY291bGQgYWxzbyBoYXBwZW4gaWYgdGhlIFJUQyBibG9jayB3aGVy
ZSBzb21laG93IHBsYWNlZCBpbnRvDQo+IHJlc2V0IG9yIHRoZSBzbG93IHNwZWVkIGNsb2NrIHRo
YXQgZHJpdmVzIHRoZSBSVEMgY291bnRlciAoYnV0IG5vdCB0aGUNCj4gQ1BVKSB3ZXJlIHRvIHN0
b3AuDQo+IA0KPiBUaGUgc3ltcHRvbXMgYXJlIGEgd29yayBxdWV1ZSBoYW5nIG9uIHJ0Y190aW1l
cl9kb193b3JrKCksIHdoaWNoDQo+IGV2ZW50dWFsbHkgYmxvY2tzIGEgc3lzdGVtZCBmc25vdGlm
eSBvcGVyYXRpb24gdGhhdCB0cmlnZ2VycyBhIHdvcmsgcXVldWUNCj4gZmx1c2gsIGNhdXNpbmcg
c3lzdGVtZCB0byBoYW5nIGFuZCB0aHVzIGNhdXNpbmcgYWxsIHNlcnZpY2VzIHRoYXQgc2hvdWxk
DQo+IGJlIHN0YXJ0ZWQgYnkgc3lzdGVtZCwgbGlrZSBhIGNvbnNvbGUgZ2V0dHksIHRvIGZhaWwg
dG8gc3RhcnQgb3Igc3RvcC4NCj4gDQo+IEFsc28gb3B0aW1pemUgdGhlIHdhaXQgY29kZSB0byB3
YWl0IGxlc3MuICBJdCBvbmx5IG5lZWRzIHRvIHdhaXQgZm9yIHRoZQ0KPiBjbG9jayB0byBhZHZh
bmNlIHRocmVlIHRpY2tzLCBub3QgdG8gc2VlIGl0IGNoYW5nZSB0aHJlZSB0aW1lcy4NCj4gDQo+
IFNpZ25lZC1vZmYtYnk6IFRyZW50IFBpZXBobyA8dHBpZXBob0BpbXBpbmouY29tPg0KPiBDYzog
QWxlc3NhbmRybyBadW1tbyA8YS56dW1tb0B0b3dlcnRlY2guaXQ+DQo+IENjOiBBbGV4YW5kcmUg
QmVsbG9uaSA8YWxleGFuZHJlLmJlbGxvbmlAZnJlZS1lbGVjdHJvbnMuY29tPg0KPiBDYzogbGlu
dXgtcnRjQHZnZXIua2VybmVsLm9yZw0KPiBDYzogU2hhd24gR3VvIDxzaGF3bmd1b0BrZXJuZWwu
b3JnPg0KPiBDYzogU2FzY2hhIEhhdWVyIDxrZXJuZWxAcGVuZ3V0cm9uaXguZGU+DQo+IENjOiBG
YWJpbyBFc3RldmFtIDxmYWJpby5lc3RldmFtQG54cC5jb20+DQo+IA0KPiAtLS0NCj4gIGRyaXZl
cnMvcnRjL3J0Yy1zbnZzLmMgfCAxMDUgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKyst
LS0tLS0tLS0tLS0tLS0tLQ0KPiAgMSBmaWxlIGNoYW5nZWQsIDcwIGluc2VydGlvbnMoKyksIDM1
IGRlbGV0aW9ucygtKQ0KPiANCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1zbnZzLmMg
Yi9kcml2ZXJzL3J0Yy9ydGMtc252cy5jDQo+IGluZGV4IGQ4ZWY5ZTA1MmM0Zi4uMGU3NTY0Yjlk
NmYyIDEwMDY0NA0KPiAtLS0gYS9kcml2ZXJzL3J0Yy9ydGMtc252cy5jDQo+ICsrKyBiL2RyaXZl
cnMvcnRjL3J0Yy1zbnZzLmMNCj4gQEAgLTQ3LDQ5ICs0Nyw4MyBAQCBzdHJ1Y3Qgc252c19ydGNf
ZGF0YSB7DQo+ICAJc3RydWN0IGNsayAqY2xrOw0KPiAgfTsNCj4gIA0KPiArLyogUmVhZCA2NCBi
aXQgdGltZXIgcmVnaXN0ZXIsIHdoaWNoIGNvdWxkIGJlIGluIGluY29uc2lzdGVudCBzdGF0ZSAq
Lw0KPiArc3RhdGljIHU2NCBydGNfcmVhZF9scHNydChzdHJ1Y3Qgc252c19ydGNfZGF0YSAqZGF0
YSkNCj4gK3sNCj4gKwl1MzIgbXNiLCBsc2I7DQo+ICsNCj4gKwlyZWdtYXBfcmVhZChkYXRhLT5y
ZWdtYXAsIGRhdGEtPm9mZnNldCArIFNOVlNfTFBTUlRDTVIsICZtc2IpOw0KPiArCXJlZ21hcF9y
ZWFkKGRhdGEtPnJlZ21hcCwgZGF0YS0+b2Zmc2V0ICsgU05WU19MUFNSVENMUiwgJmxzYik7DQo+
ICsJcmV0dXJuICh1NjQpbXNiIDw8IDMyIHwgbHNiOw0KPiArfQ0KPiArDQo+ICsvKiBSZWFkIHRo
ZSBzZWN1cmUgcmVhbCB0aW1lIGNvdW50ZXIsIHRha2luZyBjYXJlIHRvIGRlYWwgd2l0aCB0aGUg
Y2FzZXMgb2YgdGhlDQo+ICsgKiBjb3VudGVyIHVwZGF0aW5nIHdoaWxlIGJlaW5nIHJlYWQuDQo+
ICsgKi8NCj4gIHN0YXRpYyB1MzIgcnRjX3JlYWRfbHBfY291bnRlcihzdHJ1Y3Qgc252c19ydGNf
ZGF0YSAqZGF0YSkNCj4gIHsNCj4gIAl1NjQgcmVhZDEsIHJlYWQyOw0KPiAtCXUzMiB2YWw7DQo+
ICsJdW5zaWduZWQgaW50IHRpbWVvdXQgPSAxMDA7DQo+ICANCj4gKwkvKiBBcyBleHBlY3RlZCwg
dGhlIHJlZ2lzdGVycyBtaWdodCB1cGRhdGUgYmV0d2VlbiB0aGUgcmVhZCBvZiB0aGUgTFNCDQo+
ICsJICogcmVnIGFuZCB0aGUgTVNCIHJlZy4gIEl0J3MgYWxzbyBwb3NzaWJsZSB0aGF0IG9uZSBy
ZWdpc3RlciBtaWdodCBiZQ0KPiArCSAqIGluIHBhcnRpYWxseSBtb2RpZmllZCBzdGF0ZSBhcyB3
ZWxsLg0KPiArCSAqLw0KPiArCXJlYWQxID0gcnRjX3JlYWRfbHBzcnQoZGF0YSk7DQo+ICAJZG8g
ew0KPiAtCQlyZWdtYXBfcmVhZChkYXRhLT5yZWdtYXAsIGRhdGEtPm9mZnNldCArIFNOVlNfTFBT
UlRDTVIsICZ2YWwpOw0KPiAtCQlyZWFkMSA9IHZhbDsNCj4gLQkJcmVhZDEgPDw9IDMyOw0KPiAt
CQlyZWdtYXBfcmVhZChkYXRhLT5yZWdtYXAsIGRhdGEtPm9mZnNldCArIFNOVlNfTFBTUlRDTFIs
ICZ2YWwpOw0KPiAtCQlyZWFkMSB8PSB2YWw7DQo+IC0NCj4gLQkJcmVnbWFwX3JlYWQoZGF0YS0+
cmVnbWFwLCBkYXRhLT5vZmZzZXQgKyBTTlZTX0xQU1JUQ01SLCAmdmFsKTsNCj4gLQkJcmVhZDIg
PSB2YWw7DQo+IC0JCXJlYWQyIDw8PSAzMjsNCj4gLQkJcmVnbWFwX3JlYWQoZGF0YS0+cmVnbWFw
LCBkYXRhLT5vZmZzZXQgKyBTTlZTX0xQU1JUQ0xSLCAmdmFsKTsNCj4gLQkJcmVhZDIgfD0gdmFs
Ow0KPiAtCX0gd2hpbGUgKHJlYWQxICE9IHJlYWQyKTsNCj4gKwkJcmVhZDIgPSByZWFkMTsNCj4g
KwkJcmVhZDEgPSBydGNfcmVhZF9scHNydChkYXRhKTsNCj4gKwl9IHdoaWxlIChyZWFkMSAhPSBy
ZWFkMiAmJiAtLXRpbWVvdXQpOw0KPiArCWlmICghdGltZW91dCkNCj4gKwkJZGV2X2VycigmZGF0
YS0+cnRjLT5kZXYsICJUaW1lb3V0IHRyeWluZyB0byBnZXQgdmFsaWQgTFBTUlQgQ291bnRlciBy
ZWFkXG4iKTsNCj4gIA0KPiAgCS8qIENvbnZlcnQgNDctYml0IGNvdW50ZXIgdG8gMzItYml0IHJh
dyBzZWNvbmQgY291bnQgKi8NCj4gIAlyZXR1cm4gKHUzMikgKHJlYWQxID4+IENOVFJfVE9fU0VD
U19TSCk7DQo+ICB9DQo+ICANCj4gLXN0YXRpYyB2b2lkIHJ0Y193cml0ZV9zeW5jX2xwKHN0cnVj
dCBzbnZzX3J0Y19kYXRhICpkYXRhKQ0KPiArLyogSnVzdCByZWFkIHRoZSBsc2IgZnJvbSB0aGUg
Y291bnRlciwgZGVhbGluZyB3aXRoIGluY29uc2lzdGVudCBzdGF0ZSAqLw0KPiArc3RhdGljIGlu
dCBydGNfcmVhZF9scF9jb3VudGVyX2xzYihzdHJ1Y3Qgc252c19ydGNfZGF0YSAqZGF0YSwgdTMy
ICpsc2IpDQo+ICB7DQo+IC0JdTMyIGNvdW50MSwgY291bnQyLCBjb3VudDM7DQo+IC0JaW50IGk7
DQo+IC0NCj4gLQkvKiBXYWl0IGZvciAzIENLSUwgY3ljbGVzICovDQo+IC0JZm9yIChpID0gMDsg
aSA8IDM7IGkrKykgew0KPiAtCQlkbyB7DQo+IC0JCQlyZWdtYXBfcmVhZChkYXRhLT5yZWdtYXAs
IGRhdGEtPm9mZnNldCArIFNOVlNfTFBTUlRDTFIsICZjb3VudDEpOw0KPiAtCQkJcmVnbWFwX3Jl
YWQoZGF0YS0+cmVnbWFwLCBkYXRhLT5vZmZzZXQgKyBTTlZTX0xQU1JUQ0xSLCAmY291bnQyKTsN
Cj4gLQkJfSB3aGlsZSAoY291bnQxICE9IGNvdW50Mik7DQo+IC0NCj4gLQkJLyogTm93IHdhaXQg
dW50aWwgY291bnRlciB2YWx1ZSBjaGFuZ2VzICovDQo+IC0JCWRvIHsNCj4gLQkJCWRvIHsNCj4g
LQkJCQlyZWdtYXBfcmVhZChkYXRhLT5yZWdtYXAsIGRhdGEtPm9mZnNldCArIFNOVlNfTFBTUlRD
TFIsICZjb3VudDIpOw0KPiAtCQkJCXJlZ21hcF9yZWFkKGRhdGEtPnJlZ21hcCwgZGF0YS0+b2Zm
c2V0ICsgU05WU19MUFNSVENMUiwgJmNvdW50Myk7DQo+IC0JCQl9IHdoaWxlIChjb3VudDIgIT0g
Y291bnQzKTsNCj4gLQkJfSB3aGlsZSAoY291bnQzID09IGNvdW50MSk7DQo+ICsJdTMyIGNvdW50
MSwgY291bnQyOw0KPiArCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gMTAwOw0KPiArDQo+ICsJcmVn
bWFwX3JlYWQoZGF0YS0+cmVnbWFwLCBkYXRhLT5vZmZzZXQgKyBTTlZTX0xQU1JUQ0xSLCAmY291
bnQxKTsNCj4gKwlkbyB7DQo+ICsJCWNvdW50MiA9IGNvdW50MTsNCj4gKwkJcmVnbWFwX3JlYWQo
ZGF0YS0+cmVnbWFwLCBkYXRhLT5vZmZzZXQgKyBTTlZTX0xQU1JUQ0xSLCAmY291bnQxKTsNCj4g
Kwl9IHdoaWxlIChjb3VudDEgIT0gY291bnQyICYmIC0tdGltZW91dCk7DQo+ICsJaWYgKCF0aW1l
b3V0KSB7DQo+ICsJCWRldl9lcnIoJmRhdGEtPnJ0Yy0+ZGV2LCAiVGltZW91dCB0cnlpbmcgdG8g
Z2V0IHZhbGlkIExQU1JUIENvdW50ZXIgcmVhZFxuIik7DQo+ICsJCXJldHVybiAtRVRJTUVET1VU
Ow0KPiAgCX0NCj4gKw0KPiArCSpsc2IgPSBjb3VudDE7DQo+ICsJcmV0dXJuIDA7DQo+ICt9DQo+
ICsNCj4gK3N0YXRpYyBpbnQgcnRjX3dyaXRlX3N5bmNfbHAoc3RydWN0IHNudnNfcnRjX2RhdGEg
KmRhdGEpDQo+ICt7DQo+ICsJdTMyIGNvdW50MSwgY291bnQyOw0KPiArCXUzMiBlbGFwc2VkOw0K
PiArCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gMTAwMDsNCj4gKwlpbnQgcmV0Ow0KPiArDQo+ICsJ
cmV0ID0gcnRjX3JlYWRfbHBfY291bnRlcl9sc2IoZGF0YSwgJmNvdW50MSk7DQo+ICsJaWYgKHJl
dCkNCj4gKwkJcmV0dXJuIHJldDsNCj4gKw0KPiArCS8qIFdhaXQgZm9yIDMgQ0tJTCBjeWNsZXMs
IGFib3V0IDYxLjAtOTEuNSDCtXMgKi8NCj4gKwlkbyB7DQo+ICsJCXJldCA9IHJ0Y19yZWFkX2xw
X2NvdW50ZXJfbHNiKGRhdGEsICZjb3VudDIpOw0KPiArCQlpZiAocmV0KQ0KPiArCQkJcmV0dXJu
IHJldDsNCj4gKwkJZWxhcHNlZCA9IGNvdW50MiAtIGNvdW50MTsgLyogd3JhcCBhcm91bmQgX2lz
XyBoYW5kbGVkISAqLw0KPiArCX0gd2hpbGUgKGVsYXBzZWQgPCAzICYmIC0tdGltZW91dCk7DQo+
ICsJaWYgKCF0aW1lb3V0KSB7DQo+ICsJCWRldl9lcnIoJmRhdGEtPnJ0Yy0+ZGV2LCAiVGltZW91
dCB3YWl0aW5nIGZvciBMUFNSVCBDb3VudGVyIHRvIGNoYW5nZVxuIik7DQo+ICsJCXJldHVybiAt
RVRJTUVET1VUOw0KPiArCX0NCj4gKwlyZXR1cm4gMDsNCj4gIH0NCj4gIA0KPiAgc3RhdGljIGlu
dCBzbnZzX3J0Y19lbmFibGUoc3RydWN0IHNudnNfcnRjX2RhdGEgKmRhdGEsIGJvb2wgZW5hYmxl
KQ0KPiBAQCAtMTcwLDkgKzIwNCw3IEBAIHN0YXRpYyBpbnQgc252c19ydGNfYWxhcm1faXJxX2Vu
YWJsZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBlbmFibGUpDQo+ICAJCQkgICAo
U05WU19MUENSX0xQVEFfRU4gfCBTTlZTX0xQQ1JfTFBXVUlfRU4pLA0KPiAgCQkJICAgZW5hYmxl
ID8gKFNOVlNfTFBDUl9MUFRBX0VOIHwgU05WU19MUENSX0xQV1VJX0VOKSA6IDApOw0KPiAgDQo+
IC0JcnRjX3dyaXRlX3N5bmNfbHAoZGF0YSk7DQo+IC0NCj4gLQlyZXR1cm4gMDsNCj4gKwlyZXR1
cm4gcnRjX3dyaXRlX3N5bmNfbHAoZGF0YSk7DQo+ICB9DQo+ICANCj4gIHN0YXRpYyBpbnQgc252
c19ydGNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHJ0Y193a2Fscm0gKmFs
cm0pDQo+IEBAIC0xODAsMTEgKzIxMiwxNCBAQCBzdGF0aWMgaW50IHNudnNfcnRjX3NldF9hbGFy
bShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBydGNfd2thbHJtICphbHJtKQ0KPiAgCXN0cnVj
dCBzbnZzX3J0Y19kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRldik7DQo+ICAJc3RydWN0
IHJ0Y190aW1lICphbHJtX3RtID0gJmFscm0tPnRpbWU7DQo+ICAJdW5zaWduZWQgbG9uZyB0aW1l
Ow0KPiArCWludCByZXQ7DQo+ICANCj4gIAlydGNfdG1fdG9fdGltZShhbHJtX3RtLCAmdGltZSk7
DQo+ICANCj4gIAlyZWdtYXBfdXBkYXRlX2JpdHMoZGF0YS0+cmVnbWFwLCBkYXRhLT5vZmZzZXQg
KyBTTlZTX0xQQ1IsIFNOVlNfTFBDUl9MUFRBX0VOLCAwKTsNCj4gLQlydGNfd3JpdGVfc3luY19s
cChkYXRhKTsNCj4gKwlyZXQgPSBydGNfd3JpdGVfc3luY19scChkYXRhKTsNCj4gKwlpZiAocmV0
KQ0KPiArCQlyZXR1cm4gcmV0Ow0KPiAgCXJlZ21hcF93cml0ZShkYXRhLT5yZWdtYXAsIGRhdGEt
Pm9mZnNldCArIFNOVlNfTFBUQVIsIHRpbWUpOw0KPiAgDQo+ICAJLyogQ2xlYXIgYWxhcm0gaW50
ZXJydXB0IHN0YXR1cyBiaXQgKi8=

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

* Re: [PATCH] rtc-snvs: Add timeouts to avoid kernel lockups
  2018-05-09 20:19 ` Trent Piepho
@ 2018-05-09 22:17   ` Bryan O'Donoghue
  2018-05-11 18:26     ` Trent Piepho
  2018-05-10  5:25   ` Alexandre Belloni
  1 sibling, 1 reply; 7+ messages in thread
From: Bryan O'Donoghue @ 2018-05-09 22:17 UTC (permalink / raw)
  To: Trent Piepho, a.zummo
  Cc: linux-rtc, alexandre.belloni, shawnguo, kernel, fabio.estevam

On 09/05/18 21:19, Trent Piepho wrote:
> Bump.
> 
> Been while, no response.
> 
> Another patch from Bryan O'Donoghue went in to fix a related issue, but
> I believe this patch still fixes another bug.
> 
> 
> On Fri, 2018-03-16 at 11:12 -0700, Trent Piepho wrote:
>> In order to read correctly from asynchronously updated RTC registers, it's
>> necessary to read repeatedly until their values do not change from read to
>> read.  There is no timeout in this code and it could possibly loop
>> forever.
>>
>> It's also necessary to wait for three RTC clock ticks for certain
>> operations to take effect and the driver might wait forever for this to
>> happen.
>>
>> To avoid kernel hangs, put in timeouts.
>>
>> These hangs will happen when running under qemu, which doesn't emulate the
>> SNVS RTC.  

The tip of tree should detect this now though. Since QEMU doesn't 
emulate the RTC, enabling it will fail and the driver will bug out.

>> It could also happen if the RTC block where somehow placed into
>> reset or the slow speed clock that drives the RTC counter (but not the
>> CPU) were to stop.

Can that happen ?

>> The symptoms are a work queue hang on rtc_timer_do_work(), which
>> eventually blocks a systemd fsnotify operation that triggers a work queue
>> flush, causing systemd to hang and thus causing all services that should
>> be started by systemd, like a console getty, to fail to start or stop.

Mmm. While I agree with you that looping forever is a bad thing, I 
wonder do we have an actual case either on hardware or in QEMU we can 
show this happening ?

If not then the additional counter represents extra cycles we don't need 
to spend.

>> Also optimize the wait code to wait less.  It only needs to wait for the
>> clock to advance three ticks, not to see it change three times.

Right so I think this should be split out into its own patch and 
progressed with since you'd end up with a nice bit of optimisation then.

On the substance of timing out the reads TBH I'm not convinced, on the 
'also' part of your patch - I think that should be made into a separate 
patch and submitted - since it looks like a logical and desirable change 
to me.

BTW I test your patch and it didn't break anything, not convinced we 
need that timeout though.

>>
>> Signed-off-by: Trent Piepho <tpiepho@impinj.com>
>> Cc: Alessandro Zummo <a.zummo@towertech.it>
>> Cc: Alexandre Belloni <alexandre.belloni@free-electrons.com>
>> Cc: linux-rtc@vger.kernel.org
>> Cc: Shawn Guo <shawnguo@kernel.org>
>> Cc: Sascha Hauer <kernel@pengutronix.de>
>> Cc: Fabio Estevam <fabio.estevam@nxp.com>
>>
>> ---
>>   drivers/rtc/rtc-snvs.c | 105 ++++++++++++++++++++++++++++++++-----------------
>>   1 file changed, 70 insertions(+), 35 deletions(-)
>>
>> diff --git a/drivers/rtc/rtc-snvs.c b/drivers/rtc/rtc-snvs.c
>> index d8ef9e052c4f..0e7564b9d6f2 100644
>> --- a/drivers/rtc/rtc-snvs.c
>> +++ b/drivers/rtc/rtc-snvs.c
>> @@ -47,49 +47,83 @@ struct snvs_rtc_data {
>>   	struct clk *clk;
>>   };
>>   
>> +/* Read 64 bit timer register, which could be in inconsistent state */
>> +static u64 rtc_read_lpsrt(struct snvs_rtc_data *data)
>> +{
>> +	u32 msb, lsb;
>> +
>> +	regmap_read(data->regmap, data->offset + SNVS_LPSRTCMR, &msb);
>> +	regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &lsb);
>> +	return (u64)msb << 32 | lsb;
>> +}
>> +
>> +/* Read the secure real time counter, taking care to deal with the cases of the
>> + * counter updating while being read.
>> + */
>>   static u32 rtc_read_lp_counter(struct snvs_rtc_data *data)
>>   {
>>   	u64 read1, read2;
>> -	u32 val;
>> +	unsigned int timeout = 100;
>>   
>> +	/* As expected, the registers might update between the read of the LSB
>> +	 * reg and the MSB reg.  It's also possible that one register might be
>> +	 * in partially modified state as well.
>> +	 */
>> +	read1 = rtc_read_lpsrt(data);
>>   	do {
>> -		regmap_read(data->regmap, data->offset + SNVS_LPSRTCMR, &val);
>> -		read1 = val;
>> -		read1 <<= 32;
>> -		regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &val);
>> -		read1 |= val;
>> -
>> -		regmap_read(data->regmap, data->offset + SNVS_LPSRTCMR, &val);
>> -		read2 = val;
>> -		read2 <<= 32;
>> -		regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &val);
>> -		read2 |= val;
>> -	} while (read1 != read2);
>> +		read2 = read1;
>> +		read1 = rtc_read_lpsrt(data);
>> +	} while (read1 != read2 && --timeout);
>> +	if (!timeout)
>> +		dev_err(&data->rtc->dev, "Timeout trying to get valid LPSRT Counter read\n");
>>   
>>   	/* Convert 47-bit counter to 32-bit raw second count */
>>   	return (u32) (read1 >> CNTR_TO_SECS_SH);
>>   }
>>   
>> -static void rtc_write_sync_lp(struct snvs_rtc_data *data)
>> +/* Just read the lsb from the counter, dealing with inconsistent state */
>> +static int rtc_read_lp_counter_lsb(struct snvs_rtc_data *data, u32 *lsb)
>>   {
>> -	u32 count1, count2, count3;
>> -	int i;
>> -
>> -	/* Wait for 3 CKIL cycles */
>> -	for (i = 0; i < 3; i++) {
>> -		do {
>> -			regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &count1);
>> -			regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &count2);
>> -		} while (count1 != count2);
>> -
>> -		/* Now wait until counter value changes */
>> -		do {
>> -			do {
>> -				regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &count2);
>> -				regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &count3);
>> -			} while (count2 != count3);
>> -		} while (count3 == count1);
>> +	u32 count1, count2;
>> +	unsigned int timeout = 100;
>> +
>> +	regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &count1);
>> +	do {
>> +		count2 = count1;
>> +		regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &count1);
>> +	} while (count1 != count2 && --timeout);
>> +	if (!timeout) {
>> +		dev_err(&data->rtc->dev, "Timeout trying to get valid LPSRT Counter read\n");
>> +		return -ETIMEDOUT;
>>   	}
>> +
>> +	*lsb = count1;
>> +	return 0;
>> +}
>> +
>> +static int rtc_write_sync_lp(struct snvs_rtc_data *data)
>> +{
>> +	u32 count1, count2;
>> +	u32 elapsed;
>> +	unsigned int timeout = 1000;
>> +	int ret;
>> +
>> +	ret = rtc_read_lp_counter_lsb(data, &count1);
>> +	if (ret)
>> +		return ret;
>> +
>> +	/* Wait for 3 CKIL cycles, about 61.0-91.5 µs */
>> +	do {
>> +		ret = rtc_read_lp_counter_lsb(data, &count2);
>> +		if (ret)
>> +			return ret;
>> +		elapsed = count2 - count1; /* wrap around _is_ handled! */
>> +	} while (elapsed < 3 && --timeout);
>> +	if (!timeout) {
>> +		dev_err(&data->rtc->dev, "Timeout waiting for LPSRT Counter to change\n");
>> +		return -ETIMEDOUT;
>> +	}
>> +	return 0;
>>   }
>>   
>>   static int snvs_rtc_enable(struct snvs_rtc_data *data, bool enable)
>> @@ -170,9 +204,7 @@ static int snvs_rtc_alarm_irq_enable(struct device *dev, unsigned int enable)
>>   			   (SNVS_LPCR_LPTA_EN | SNVS_LPCR_LPWUI_EN),
>>   			   enable ? (SNVS_LPCR_LPTA_EN | SNVS_LPCR_LPWUI_EN) : 0);
>>   
>> -	rtc_write_sync_lp(data);
>> -
>> -	return 0;
>> +	return rtc_write_sync_lp(data);
>>   }
>>   
>>   static int snvs_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
>> @@ -180,11 +212,14 @@ static int snvs_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
>>   	struct snvs_rtc_data *data = dev_get_drvdata(dev);
>>   	struct rtc_time *alrm_tm = &alrm->time;
>>   	unsigned long time;
>> +	int ret;
>>   
>>   	rtc_tm_to_time(alrm_tm, &time);
>>   
>>   	regmap_update_bits(data->regmap, data->offset + SNVS_LPCR, SNVS_LPCR_LPTA_EN, 0);
>> -	rtc_write_sync_lp(data);
>> +	ret = rtc_write_sync_lp(data);
>> +	if (ret)
>> +		return ret;
>>   	regmap_write(data->regmap, data->offset + SNVS_LPTAR, time);
>>   
>>   	/* Clear alarm interrupt status bit */

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

* Re: [PATCH] rtc-snvs: Add timeouts to avoid kernel lockups
  2018-05-09 20:19 ` Trent Piepho
  2018-05-09 22:17   ` Bryan O'Donoghue
@ 2018-05-10  5:25   ` Alexandre Belloni
  2018-05-16 23:36     ` Trent Piepho
  1 sibling, 1 reply; 7+ messages in thread
From: Alexandre Belloni @ 2018-05-10  5:25 UTC (permalink / raw)
  To: Trent Piepho
  Cc: a.zummo, pure.logic, linux-rtc, shawnguo, kernel, fabio.estevam

Hi,

On 09/05/2018 20:19:26+0000, Trent Piepho wrote:
> Bump.
> 
> Been while, no response.
> 
> Another patch from Bryan O'Donoghue went in to fix a related issue, but
> I believe this patch still fixes another bug.
> 

On April 26, 2018, I've asked whether you could rebased on top of
rtc-next.

> 
> On Fri, 2018-03-16 at 11:12 -0700, Trent Piepho wrote:
> > In order to read correctly from asynchronously updated RTC registers, it's
> > necessary to read repeatedly until their values do not change from read to
> > read.  There is no timeout in this code and it could possibly loop
> > forever.
> > 
> > It's also necessary to wait for three RTC clock ticks for certain
> > operations to take effect and the driver might wait forever for this to
> > happen.
> > 
> > To avoid kernel hangs, put in timeouts.
> > 
> > These hangs will happen when running under qemu, which doesn't emulate the
> > SNVS RTC.  It could also happen if the RTC block where somehow placed into
> > reset or the slow speed clock that drives the RTC counter (but not the
> > CPU) were to stop.
> > 
> > The symptoms are a work queue hang on rtc_timer_do_work(), which
> > eventually blocks a systemd fsnotify operation that triggers a work queue
> > flush, causing systemd to hang and thus causing all services that should
> > be started by systemd, like a console getty, to fail to start or stop.
> > 
> > Also optimize the wait code to wait less.  It only needs to wait for the
> > clock to advance three ticks, not to see it change three times.
> > 
> > Signed-off-by: Trent Piepho <tpiepho@impinj.com>
> > Cc: Alessandro Zummo <a.zummo@towertech.it>
> > Cc: Alexandre Belloni <alexandre.belloni@free-electrons.com>
> > Cc: linux-rtc@vger.kernel.org
> > Cc: Shawn Guo <shawnguo@kernel.org>
> > Cc: Sascha Hauer <kernel@pengutronix.de>
> > Cc: Fabio Estevam <fabio.estevam@nxp.com>
> > 
> > ---
> >  drivers/rtc/rtc-snvs.c | 105 ++++++++++++++++++++++++++++++++-----------------
> >  1 file changed, 70 insertions(+), 35 deletions(-)
> > 
> > diff --git a/drivers/rtc/rtc-snvs.c b/drivers/rtc/rtc-snvs.c
> > index d8ef9e052c4f..0e7564b9d6f2 100644
> > --- a/drivers/rtc/rtc-snvs.c
> > +++ b/drivers/rtc/rtc-snvs.c
> > @@ -47,49 +47,83 @@ struct snvs_rtc_data {
> >  	struct clk *clk;
> >  };
> >  
> > +/* Read 64 bit timer register, which could be in inconsistent state */
> > +static u64 rtc_read_lpsrt(struct snvs_rtc_data *data)
> > +{
> > +	u32 msb, lsb;
> > +
> > +	regmap_read(data->regmap, data->offset + SNVS_LPSRTCMR, &msb);
> > +	regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &lsb);
> > +	return (u64)msb << 32 | lsb;
> > +}
> > +
> > +/* Read the secure real time counter, taking care to deal with the cases of the
> > + * counter updating while being read.
> > + */
> >  static u32 rtc_read_lp_counter(struct snvs_rtc_data *data)
> >  {
> >  	u64 read1, read2;
> > -	u32 val;
> > +	unsigned int timeout = 100;
> >  
> > +	/* As expected, the registers might update between the read of the LSB
> > +	 * reg and the MSB reg.  It's also possible that one register might be
> > +	 * in partially modified state as well.
> > +	 */
> > +	read1 = rtc_read_lpsrt(data);
> >  	do {
> > -		regmap_read(data->regmap, data->offset + SNVS_LPSRTCMR, &val);
> > -		read1 = val;
> > -		read1 <<= 32;
> > -		regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &val);
> > -		read1 |= val;
> > -
> > -		regmap_read(data->regmap, data->offset + SNVS_LPSRTCMR, &val);
> > -		read2 = val;
> > -		read2 <<= 32;
> > -		regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &val);
> > -		read2 |= val;
> > -	} while (read1 != read2);
> > +		read2 = read1;
> > +		read1 = rtc_read_lpsrt(data);
> > +	} while (read1 != read2 && --timeout);
> > +	if (!timeout)
> > +		dev_err(&data->rtc->dev, "Timeout trying to get valid LPSRT Counter read\n");
> >  
> >  	/* Convert 47-bit counter to 32-bit raw second count */
> >  	return (u32) (read1 >> CNTR_TO_SECS_SH);
> >  }
> >  
> > -static void rtc_write_sync_lp(struct snvs_rtc_data *data)
> > +/* Just read the lsb from the counter, dealing with inconsistent state */
> > +static int rtc_read_lp_counter_lsb(struct snvs_rtc_data *data, u32 *lsb)
> >  {
> > -	u32 count1, count2, count3;
> > -	int i;
> > -
> > -	/* Wait for 3 CKIL cycles */
> > -	for (i = 0; i < 3; i++) {
> > -		do {
> > -			regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &count1);
> > -			regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &count2);
> > -		} while (count1 != count2);
> > -
> > -		/* Now wait until counter value changes */
> > -		do {
> > -			do {
> > -				regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &count2);
> > -				regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &count3);
> > -			} while (count2 != count3);
> > -		} while (count3 == count1);
> > +	u32 count1, count2;
> > +	unsigned int timeout = 100;
> > +
> > +	regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &count1);
> > +	do {
> > +		count2 = count1;
> > +		regmap_read(data->regmap, data->offset + SNVS_LPSRTCLR, &count1);
> > +	} while (count1 != count2 && --timeout);
> > +	if (!timeout) {
> > +		dev_err(&data->rtc->dev, "Timeout trying to get valid LPSRT Counter read\n");
> > +		return -ETIMEDOUT;
> >  	}
> > +
> > +	*lsb = count1;
> > +	return 0;
> > +}
> > +
> > +static int rtc_write_sync_lp(struct snvs_rtc_data *data)
> > +{
> > +	u32 count1, count2;
> > +	u32 elapsed;
> > +	unsigned int timeout = 1000;
> > +	int ret;
> > +
> > +	ret = rtc_read_lp_counter_lsb(data, &count1);
> > +	if (ret)
> > +		return ret;
> > +
> > +	/* Wait for 3 CKIL cycles, about 61.0-91.5 µs */
> > +	do {
> > +		ret = rtc_read_lp_counter_lsb(data, &count2);
> > +		if (ret)
> > +			return ret;
> > +		elapsed = count2 - count1; /* wrap around _is_ handled! */
> > +	} while (elapsed < 3 && --timeout);
> > +	if (!timeout) {
> > +		dev_err(&data->rtc->dev, "Timeout waiting for LPSRT Counter to change\n");
> > +		return -ETIMEDOUT;
> > +	}
> > +	return 0;
> >  }
> >  
> >  static int snvs_rtc_enable(struct snvs_rtc_data *data, bool enable)
> > @@ -170,9 +204,7 @@ static int snvs_rtc_alarm_irq_enable(struct device *dev, unsigned int enable)
> >  			   (SNVS_LPCR_LPTA_EN | SNVS_LPCR_LPWUI_EN),
> >  			   enable ? (SNVS_LPCR_LPTA_EN | SNVS_LPCR_LPWUI_EN) : 0);
> >  
> > -	rtc_write_sync_lp(data);
> > -
> > -	return 0;
> > +	return rtc_write_sync_lp(data);
> >  }
> >  
> >  static int snvs_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
> > @@ -180,11 +212,14 @@ static int snvs_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
> >  	struct snvs_rtc_data *data = dev_get_drvdata(dev);
> >  	struct rtc_time *alrm_tm = &alrm->time;
> >  	unsigned long time;
> > +	int ret;
> >  
> >  	rtc_tm_to_time(alrm_tm, &time);
> >  
> >  	regmap_update_bits(data->regmap, data->offset + SNVS_LPCR, SNVS_LPCR_LPTA_EN, 0);
> > -	rtc_write_sync_lp(data);
> > +	ret = rtc_write_sync_lp(data);
> > +	if (ret)
> > +		return ret;
> >  	regmap_write(data->regmap, data->offset + SNVS_LPTAR, time);
> >  
> >  	/* Clear alarm interrupt status bit */

-- 
Alexandre Belloni, Bootlin (formerly Free Electrons)
Embedded Linux and Kernel engineering
https://bootlin.com

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

* Re: [PATCH] rtc-snvs: Add timeouts to avoid kernel lockups
  2018-05-09 22:17   ` Bryan O'Donoghue
@ 2018-05-11 18:26     ` Trent Piepho
  0 siblings, 0 replies; 7+ messages in thread
From: Trent Piepho @ 2018-05-11 18:26 UTC (permalink / raw)
  To: a.zummo, pure.logic
  Cc: linux-rtc, alexandre.belloni, shawnguo, kernel, fabio.estevam

T24gV2VkLCAyMDE4LTA1LTA5IGF0IDIzOjE3ICswMTAwLCBCcnlhbiBPJ0Rvbm9naHVlIHdyb3Rl
Og0KPiBPbiAwOS8wNS8xOCAyMToxOSwgVHJlbnQgUGllcGhvIHdyb3RlOg0KPiA+IA0KPiA+ID4g
SXQncyBhbHNvIG5lY2Vzc2FyeSB0byB3YWl0IGZvciB0aHJlZSBSVEMgY2xvY2sgdGlja3MgZm9y
IGNlcnRhaW4NCj4gPiA+IG9wZXJhdGlvbnMgdG8gdGFrZSBlZmZlY3QgYW5kIHRoZSBkcml2ZXIg
bWlnaHQgd2FpdCBmb3JldmVyIGZvciB0aGlzIHRvDQo+ID4gPiBoYXBwZW4uDQo+ID4gPiANCj4g
PiA+IFRvIGF2b2lkIGtlcm5lbCBoYW5ncywgcHV0IGluIHRpbWVvdXRzLg0KPiA+ID4gDQo+ID4g
PiBUaGVzZSBoYW5ncyB3aWxsIGhhcHBlbiB3aGVuIHJ1bm5pbmcgdW5kZXIgcWVtdSwgd2hpY2gg
ZG9lc24ndCBlbXVsYXRlIHRoZQ0KPiA+ID4gU05WUyBSVEMuICANCj4gDQo+IFRoZSB0aXAgb2Yg
dHJlZSBzaG91bGQgZGV0ZWN0IHRoaXMgbm93IHRob3VnaC4gU2luY2UgUUVNVSBkb2Vzbid0IA0K
PiBlbXVsYXRlIHRoZSBSVEMsIGVuYWJsaW5nIGl0IHdpbGwgZmFpbCBhbmQgdGhlIGRyaXZlciB3
aWxsIGJ1ZyBvdXQuDQoNClllcywgdGhpcyBpcyB3aGF0IGhhcHBlbnMuICBXaXRoIGp1c3QgbXkg
cGF0Y2gsIHRoZSBkcml2ZXIgd291bGQgbG9hZA0KYnV0IGNsb2NrIG9wZXJhdGlvbnMgd291bGQg
cmV0dXJuIGVycm9ycyBhbmQgdGhlcmUgd291bGQgYmUga2VybmVsIGxvZw0KbWVzc2FnZXMgYWJv
dXQgdGhlIHNydGMuDQoNCkluIHNvbWUgd2F5cywgSSBsaWtlZCB0aGF0IGJlaGF2aW9yIGJldHRl
ci4gIEl0IGFsbG93ZWQgY29kZSB0aGF0IHVzZWQNCnRoZSBydGMgdG8gcnVuIGluIHFlbXUgYW5k
IGFsbG93ZWQgb25lIHRvIHRlc3QgcnRjIGZhaWx1cmUgcGF0aHMuICBPbmUNCmNvdWxkIHRlc3Qg
dGhhdCB0aGUgZGV2aWNlIHdvdWxkIGdldCB0aW1lIHZpYSBOVFAsIHRyaWVzIHRvIHNldCB0aGUN
ClJUQywgZmFpbCwgYW5kIGRldGVjdCB0aGUgZmFpbHVyZS4NCg0KQnV0IHRoZSByZWFsIGFuc3dl
ciBpcyB0byBlbXVsYXRlIHRoZSBzbnZzLXNydGMgaW4gcWVtdSwgd2hpY2ggaXMNCnNvbWV0aGlu
ZyB3ZSd2ZSBiZWVuIHdvcmtpbmcgb24sIGFsb25nIHdpdGggdGhlIG90aGVyIHVuZW11bGF0ZWQg
c252cw0KaGFyZHdhcmUgd2UgdXNlLg0KDQo+ID4gPiBJdCBjb3VsZCBhbHNvIGhhcHBlbiBpZiB0
aGUgUlRDIGJsb2NrIHdoZXJlIHNvbWVob3cgcGxhY2VkIGludG8NCj4gPiA+IHJlc2V0IG9yIHRo
ZSBzbG93IHNwZWVkIGNsb2NrIHRoYXQgZHJpdmVzIHRoZSBSVEMgY291bnRlciAoYnV0IG5vdCB0
aGUNCj4gPiA+IENQVSkgd2VyZSB0byBzdG9wLg0KPiANCj4gQ2FuIHRoYXQgaGFwcGVuID8NCg0K
WWVzLiAgU2VlIFNSVENfSU5WX0VOIGluIExQQ1I6DQoNCiAgICBJZiB0aGlzIGJpdCBpcyAxLCBp
biB0aGUgY2FzZSBvZiBhIHNlY3VyaXR5IHZpb2xhdGlvbiB0aGUgU1JUQyBzdG9wcw0KICAgIGNv
dW50aW5nDQoNCkFuZCBpbmRlZWQgYWZ0ZXIgc2V0dGluZyB1cCBhIHRhbXBlciBzd2l0Y2ggYW5k
IHRyaWdnZXJpbmcgaXQsIHRoZSBTUlRDDQp3aWxsIHN0b3AgY291bnRpbmcgYW5kIHRoZSBrZXJu
ZWwgc3J0YyBkcml2ZXIgd2lsbCBnbyBvZmYgaW50byBhbg0KaW5maW5pdGUgbG9vcC4NCg0KPiA+
ID4gVGhlIHN5bXB0b21zIGFyZSBhIHdvcmsgcXVldWUgaGFuZyBvbiBydGNfdGltZXJfZG9fd29y
aygpLCB3aGljaA0KPiA+ID4gZXZlbnR1YWxseSBibG9ja3MgYSBzeXN0ZW1kIGZzbm90aWZ5IG9w
ZXJhdGlvbiB0aGF0IHRyaWdnZXJzIGEgd29yayBxdWV1ZQ0KPiA+ID4gZmx1c2gsIGNhdXNpbmcg
c3lzdGVtZCB0byBoYW5nIGFuZCB0aHVzIGNhdXNpbmcgYWxsIHNlcnZpY2VzIHRoYXQgc2hvdWxk
DQo+ID4gPiBiZSBzdGFydGVkIGJ5IHN5c3RlbWQsIGxpa2UgYSBjb25zb2xlIGdldHR5LCB0byBm
YWlsIHRvIHN0YXJ0IG9yIHN0b3AuDQo+IA0KPiBNbW0uIFdoaWxlIEkgYWdyZWUgd2l0aCB5b3Ug
dGhhdCBsb29waW5nIGZvcmV2ZXIgaXMgYSBiYWQgdGhpbmcsIEkgDQo+IHdvbmRlciBkbyB3ZSBo
YXZlIGFuIGFjdHVhbCBjYXNlIGVpdGhlciBvbiBoYXJkd2FyZSBvciBpbiBRRU1VIHdlIGNhbiAN
Cj4gc2hvdyB0aGlzIGhhcHBlbmluZyA/DQoNCkkgdGhpbmsgaXQncyBzYWZlciB0byBqdXN0IG5l
dmVyIGNvZGUgYW4gaW5maW5pdGUgbG9vcCBvbiBoYXJkd2FyZQ0Kc3RhdHVzLg0KDQpJdCBzaG91
bGRuJ3QgYmUgbmVjZXNzYXJ5IHRvIGZvcmNlIHNvbWVvbmUgb24gYSBuZXcgU29DIHRvIGZpZ3Vy
ZSBvdXQNCndoZXJlIHRoZWlyIGhhcmQgdG8gcmVwcm9kdWNlIGtlcm5lbCBoYW5nIGlzIGZyb20g
YmVmb3JlIG1ha2luZyB3aGF0IGlzDQplYXN5IGZpeCwgdG8gY29kaW5nIHVzaW5nIGEgcGF0dGVy
biBrbm93biB0byBjYXVzZSBwcm9ibGVtcyBhbmQgYWxyZWFkeQ0KaWRlbnRpZmllZC4NCg0KPiBJ
ZiBub3QgdGhlbiB0aGUgYWRkaXRpb25hbCBjb3VudGVyIHJlcHJlc2VudHMgZXh0cmEgY3ljbGVz
IHdlIGRvbid0IG5lZWQgDQo+IHRvIHNwZW5kLg0KDQpOb3QgbmVjZXNzYXJpbHkuICBJZiB3ZSBh
cmUgd2FpdGluZyBmb3IgYSByZWdpc3RlciB0byBjaGFuZ2UsIHRoZW4gaXQNCndpbGwgdGFrZSBh
cyBsb25nIGFzIGl0IHRha2VzIHRvIGNoYW5nZS4gIEFkZGluZyBhbiBhZGRpdGlvbmFsDQppbnN0
cnVjdGlvbiB0byB0aGUgd2FpdCBsb29wIGRvZXNuJ3QgbWFrZSB0aGUgaGFyZHdhcmUgdGFrZSBs
b25nZXIuDQoNCj4gDQo+ID4gPiBBbHNvIG9wdGltaXplIHRoZSB3YWl0IGNvZGUgdG8gd2FpdCBs
ZXNzLiAgSXQgb25seSBuZWVkcyB0byB3YWl0IGZvciB0aGUNCj4gPiA+IGNsb2NrIHRvIGFkdmFu
Y2UgdGhyZWUgdGlja3MsIG5vdCB0byBzZWUgaXQgY2hhbmdlIHRocmVlIHRpbWVzLg0KPiANCj4g
UmlnaHQgc28gSSB0aGluayB0aGlzIHNob3VsZCBiZSBzcGxpdCBvdXQgaW50byBpdHMgb3duIHBh
dGNoIGFuZCANCj4gcHJvZ3Jlc3NlZCB3aXRoIHNpbmNlIHlvdSdkIGVuZCB1cCB3aXRoIGEgbmlj
ZSBiaXQgb2Ygb3B0aW1pc2F0aW9uIHRoZW4uDQo+IA0KPiBPbiB0aGUgc3Vic3RhbmNlIG9mIHRp
bWluZyBvdXQgdGhlIHJlYWRzIFRCSCBJJ20gbm90IGNvbnZpbmNlZCwgb24gdGhlIA0KPiAnYWxz
bycgcGFydCBvZiB5b3VyIHBhdGNoIC0gSSB0aGluayB0aGF0IHNob3VsZCBiZSBtYWRlIGludG8g
YSBzZXBhcmF0ZSANCj4gcGF0Y2ggYW5kIHN1Ym1pdHRlZCAtIHNpbmNlIGl0IGxvb2tzIGxpa2Ug
YSBsb2dpY2FsIGFuZCBkZXNpcmFibGUgY2hhbmdlIA0KPiB0byBtZS4NCj4gDQo+IEJUVyBJIHRl
c3QgeW91ciBwYXRjaCBhbmQgaXQgZGlkbid0IGJyZWFrIGFueXRoaW5nLCBub3QgY29udmluY2Vk
IHdlIA0KPiBuZWVkIHRoYXQgdGltZW91dCB0aG91Z2guDQo+IA0KPiA+ID4gDQo+ID4gPiBTaWdu
ZWQtb2ZmLWJ5OiBUcmVudCBQaWVwaG8gPHRwaWVwaG9AaW1waW5qLmNvbT4NCj4gPiA+IENjOiBB
bGVzc2FuZHJvIFp1bW1vIDxhLnp1bW1vQHRvd2VydGVjaC5pdD4NCj4gPiA+IENjOiBBbGV4YW5k
cmUgQmVsbG9uaSA8YWxleGFuZHJlLmJlbGxvbmlAZnJlZS1lbGVjdHJvbnMuY29tPg0KPiA+ID4g
Q2M6IGxpbnV4LXJ0Y0B2Z2VyLmtlcm5lbC5vcmcNCj4gPiA+IENjOiBTaGF3biBHdW8gPHNoYXdu
Z3VvQGtlcm5lbC5vcmc+DQo+ID4gPiBDYzogU2FzY2hhIEhhdWVyIDxrZXJuZWxAcGVuZ3V0cm9u
aXguZGU+DQo+ID4gPiBDYzogRmFiaW8gRXN0ZXZhbSA8ZmFiaW8uZXN0ZXZhbUBueHAuY29tPg0K
PiA+ID4gDQo+ID4gPiAtLS0NCj4gPiA+ICAgZHJpdmVycy9ydGMvcnRjLXNudnMuYyB8IDEwNSAr
KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0tLS0tDQo+ID4gPiAg
IDEgZmlsZSBjaGFuZ2VkLCA3MCBpbnNlcnRpb25zKCspLCAzNSBkZWxldGlvbnMoLSkNCj4gPiA+
IA0KPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvcnRjL3J0Yy1zbnZzLmMgYi9kcml2ZXJzL3J0
Yy9ydGMtc252cy5jDQo+ID4gPiBpbmRleCBkOGVmOWUwNTJjNGYuLjBlNzU2NGI5ZDZmMiAxMDA2
NDQNCj4gPiA+IC0tLSBhL2RyaXZlcnMvcnRjL3J0Yy1zbnZzLmMNCj4gPiA+ICsrKyBiL2RyaXZl
cnMvcnRjL3J0Yy1zbnZzLmMNCj4gPiA+IEBAIC00Nyw0OSArNDcsODMgQEAgc3RydWN0IHNudnNf
cnRjX2RhdGEgew0KPiA+ID4gICAJc3RydWN0IGNsayAqY2xrOw0KPiA+ID4gICB9Ow0KPiA+ID4g
ICANCj4gPiA+ICsvKiBSZWFkIDY0IGJpdCB0aW1lciByZWdpc3Rlciwgd2hpY2ggY291bGQgYmUg
aW4gaW5jb25zaXN0ZW50IHN0YXRlICovDQo+ID4gPiArc3RhdGljIHU2NCBydGNfcmVhZF9scHNy
dChzdHJ1Y3Qgc252c19ydGNfZGF0YSAqZGF0YSkNCj4gPiA+ICt7DQo+ID4gPiArCXUzMiBtc2Is
IGxzYjsNCj4gPiA+ICsNCj4gPiA+ICsJcmVnbWFwX3JlYWQoZGF0YS0+cmVnbWFwLCBkYXRhLT5v
ZmZzZXQgKyBTTlZTX0xQU1JUQ01SLCAmbXNiKTsNCj4gPiA+ICsJcmVnbWFwX3JlYWQoZGF0YS0+
cmVnbWFwLCBkYXRhLT5vZmZzZXQgKyBTTlZTX0xQU1JUQ0xSLCAmbHNiKTsNCj4gPiA+ICsJcmV0
dXJuICh1NjQpbXNiIDw8IDMyIHwgbHNiOw0KPiA+ID4gK30NCj4gPiA+ICsNCj4gPiA+ICsvKiBS
ZWFkIHRoZSBzZWN1cmUgcmVhbCB0aW1lIGNvdW50ZXIsIHRha2luZyBjYXJlIHRvIGRlYWwgd2l0
aCB0aGUgY2FzZXMgb2YgdGhlDQo+ID4gPiArICogY291bnRlciB1cGRhdGluZyB3aGlsZSBiZWlu
ZyByZWFkLg0KPiA+ID4gKyAqLw0KPiA+ID4gICBzdGF0aWMgdTMyIHJ0Y19yZWFkX2xwX2NvdW50
ZXIoc3RydWN0IHNudnNfcnRjX2RhdGEgKmRhdGEpDQo+ID4gPiAgIHsNCj4gPiA+ICAgCXU2NCBy
ZWFkMSwgcmVhZDI7DQo+ID4gPiAtCXUzMiB2YWw7DQo+ID4gPiArCXVuc2lnbmVkIGludCB0aW1l
b3V0ID0gMTAwOw0KPiA+ID4gICANCj4gPiA+ICsJLyogQXMgZXhwZWN0ZWQsIHRoZSByZWdpc3Rl
cnMgbWlnaHQgdXBkYXRlIGJldHdlZW4gdGhlIHJlYWQgb2YgdGhlIExTQg0KPiA+ID4gKwkgKiBy
ZWcgYW5kIHRoZSBNU0IgcmVnLiAgSXQncyBhbHNvIHBvc3NpYmxlIHRoYXQgb25lIHJlZ2lzdGVy
IG1pZ2h0IGJlDQo+ID4gPiArCSAqIGluIHBhcnRpYWxseSBtb2RpZmllZCBzdGF0ZSBhcyB3ZWxs
Lg0KPiA+ID4gKwkgKi8NCj4gPiA+ICsJcmVhZDEgPSBydGNfcmVhZF9scHNydChkYXRhKTsNCj4g
PiA+ICAgCWRvIHsNCj4gPiA+IC0JCXJlZ21hcF9yZWFkKGRhdGEtPnJlZ21hcCwgZGF0YS0+b2Zm
c2V0ICsgU05WU19MUFNSVENNUiwgJnZhbCk7DQo+ID4gPiAtCQlyZWFkMSA9IHZhbDsNCj4gPiA+
IC0JCXJlYWQxIDw8PSAzMjsNCj4gPiA+IC0JCXJlZ21hcF9yZWFkKGRhdGEtPnJlZ21hcCwgZGF0
YS0+b2Zmc2V0ICsgU05WU19MUFNSVENMUiwgJnZhbCk7DQo+ID4gPiAtCQlyZWFkMSB8PSB2YWw7
DQo+ID4gPiAtDQo+ID4gPiAtCQlyZWdtYXBfcmVhZChkYXRhLT5yZWdtYXAsIGRhdGEtPm9mZnNl
dCArIFNOVlNfTFBTUlRDTVIsICZ2YWwpOw0KPiA+ID4gLQkJcmVhZDIgPSB2YWw7DQo+ID4gPiAt
CQlyZWFkMiA8PD0gMzI7DQo+ID4gPiAtCQlyZWdtYXBfcmVhZChkYXRhLT5yZWdtYXAsIGRhdGEt
Pm9mZnNldCArIFNOVlNfTFBTUlRDTFIsICZ2YWwpOw0KPiA+ID4gLQkJcmVhZDIgfD0gdmFsOw0K
PiA+ID4gLQl9IHdoaWxlIChyZWFkMSAhPSByZWFkMik7DQo+ID4gPiArCQlyZWFkMiA9IHJlYWQx
Ow0KPiA+ID4gKwkJcmVhZDEgPSBydGNfcmVhZF9scHNydChkYXRhKTsNCj4gPiA+ICsJfSB3aGls
ZSAocmVhZDEgIT0gcmVhZDIgJiYgLS10aW1lb3V0KTsNCj4gPiA+ICsJaWYgKCF0aW1lb3V0KQ0K
PiA+ID4gKwkJZGV2X2VycigmZGF0YS0+cnRjLT5kZXYsICJUaW1lb3V0IHRyeWluZyB0byBnZXQg
dmFsaWQgTFBTUlQgQ291bnRlciByZWFkXG4iKTsNCj4gPiA+ICAgDQo+ID4gPiAgIAkvKiBDb252
ZXJ0IDQ3LWJpdCBjb3VudGVyIHRvIDMyLWJpdCByYXcgc2Vjb25kIGNvdW50ICovDQo+ID4gPiAg
IAlyZXR1cm4gKHUzMikgKHJlYWQxID4+IENOVFJfVE9fU0VDU19TSCk7DQo+ID4gPiAgIH0NCj4g
PiA+ICAgDQo+ID4gPiAtc3RhdGljIHZvaWQgcnRjX3dyaXRlX3N5bmNfbHAoc3RydWN0IHNudnNf
cnRjX2RhdGEgKmRhdGEpDQo+ID4gPiArLyogSnVzdCByZWFkIHRoZSBsc2IgZnJvbSB0aGUgY291
bnRlciwgZGVhbGluZyB3aXRoIGluY29uc2lzdGVudCBzdGF0ZSAqLw0KPiA+ID4gK3N0YXRpYyBp
bnQgcnRjX3JlYWRfbHBfY291bnRlcl9sc2Ioc3RydWN0IHNudnNfcnRjX2RhdGEgKmRhdGEsIHUz
MiAqbHNiKQ0KPiA+ID4gICB7DQo+ID4gPiAtCXUzMiBjb3VudDEsIGNvdW50MiwgY291bnQzOw0K
PiA+ID4gLQlpbnQgaTsNCj4gPiA+IC0NCj4gPiA+IC0JLyogV2FpdCBmb3IgMyBDS0lMIGN5Y2xl
cyAqLw0KPiA+ID4gLQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7DQo+ID4gPiAtCQlkbyB7DQo+
ID4gPiAtCQkJcmVnbWFwX3JlYWQoZGF0YS0+cmVnbWFwLCBkYXRhLT5vZmZzZXQgKyBTTlZTX0xQ
U1JUQ0xSLCAmY291bnQxKTsNCj4gPiA+IC0JCQlyZWdtYXBfcmVhZChkYXRhLT5yZWdtYXAsIGRh
dGEtPm9mZnNldCArIFNOVlNfTFBTUlRDTFIsICZjb3VudDIpOw0KPiA+ID4gLQkJfSB3aGlsZSAo
Y291bnQxICE9IGNvdW50Mik7DQo+ID4gPiAtDQo+ID4gPiAtCQkvKiBOb3cgd2FpdCB1bnRpbCBj
b3VudGVyIHZhbHVlIGNoYW5nZXMgKi8NCj4gPiA+IC0JCWRvIHsNCj4gPiA+IC0JCQlkbyB7DQo+
ID4gPiAtCQkJCXJlZ21hcF9yZWFkKGRhdGEtPnJlZ21hcCwgZGF0YS0+b2Zmc2V0ICsgU05WU19M
UFNSVENMUiwgJmNvdW50Mik7DQo+ID4gPiAtCQkJCXJlZ21hcF9yZWFkKGRhdGEtPnJlZ21hcCwg
ZGF0YS0+b2Zmc2V0ICsgU05WU19MUFNSVENMUiwgJmNvdW50Myk7DQo+ID4gPiAtCQkJfSB3aGls
ZSAoY291bnQyICE9IGNvdW50Myk7DQo+ID4gPiAtCQl9IHdoaWxlIChjb3VudDMgPT0gY291bnQx
KTsNCj4gPiA+ICsJdTMyIGNvdW50MSwgY291bnQyOw0KPiA+ID4gKwl1bnNpZ25lZCBpbnQgdGlt
ZW91dCA9IDEwMDsNCj4gPiA+ICsNCj4gPiA+ICsJcmVnbWFwX3JlYWQoZGF0YS0+cmVnbWFwLCBk
YXRhLT5vZmZzZXQgKyBTTlZTX0xQU1JUQ0xSLCAmY291bnQxKTsNCj4gPiA+ICsJZG8gew0KPiA+
ID4gKwkJY291bnQyID0gY291bnQxOw0KPiA+ID4gKwkJcmVnbWFwX3JlYWQoZGF0YS0+cmVnbWFw
LCBkYXRhLT5vZmZzZXQgKyBTTlZTX0xQU1JUQ0xSLCAmY291bnQxKTsNCj4gPiA+ICsJfSB3aGls
ZSAoY291bnQxICE9IGNvdW50MiAmJiAtLXRpbWVvdXQpOw0KPiA+ID4gKwlpZiAoIXRpbWVvdXQp
IHsNCj4gPiA+ICsJCWRldl9lcnIoJmRhdGEtPnJ0Yy0+ZGV2LCAiVGltZW91dCB0cnlpbmcgdG8g
Z2V0IHZhbGlkIExQU1JUIENvdW50ZXIgcmVhZFxuIik7DQo+ID4gPiArCQlyZXR1cm4gLUVUSU1F
RE9VVDsNCj4gPiA+ICAgCX0NCj4gPiA+ICsNCj4gPiA+ICsJKmxzYiA9IGNvdW50MTsNCj4gPiA+
ICsJcmV0dXJuIDA7DQo+ID4gPiArfQ0KPiA+ID4gKw0KPiA+ID4gK3N0YXRpYyBpbnQgcnRjX3dy
aXRlX3N5bmNfbHAoc3RydWN0IHNudnNfcnRjX2RhdGEgKmRhdGEpDQo+ID4gPiArew0KPiA+ID4g
Kwl1MzIgY291bnQxLCBjb3VudDI7DQo+ID4gPiArCXUzMiBlbGFwc2VkOw0KPiA+ID4gKwl1bnNp
Z25lZCBpbnQgdGltZW91dCA9IDEwMDA7DQo+ID4gPiArCWludCByZXQ7DQo+ID4gPiArDQo+ID4g
PiArCXJldCA9IHJ0Y19yZWFkX2xwX2NvdW50ZXJfbHNiKGRhdGEsICZjb3VudDEpOw0KPiA+ID4g
KwlpZiAocmV0KQ0KPiA+ID4gKwkJcmV0dXJuIHJldDsNCj4gPiA+ICsNCj4gPiA+ICsJLyogV2Fp
dCBmb3IgMyBDS0lMIGN5Y2xlcywgYWJvdXQgNjEuMC05MS41IMK1cyAqLw0KPiA+ID4gKwlkbyB7
DQo+ID4gPiArCQlyZXQgPSBydGNfcmVhZF9scF9jb3VudGVyX2xzYihkYXRhLCAmY291bnQyKTsN
Cj4gPiA+ICsJCWlmIChyZXQpDQo+ID4gPiArCQkJcmV0dXJuIHJldDsNCj4gPiA+ICsJCWVsYXBz
ZWQgPSBjb3VudDIgLSBjb3VudDE7IC8qIHdyYXAgYXJvdW5kIF9pc18gaGFuZGxlZCEgKi8NCj4g
PiA+ICsJfSB3aGlsZSAoZWxhcHNlZCA8IDMgJiYgLS10aW1lb3V0KTsNCj4gPiA+ICsJaWYgKCF0
aW1lb3V0KSB7DQo+ID4gPiArCQlkZXZfZXJyKCZkYXRhLT5ydGMtPmRldiwgIlRpbWVvdXQgd2Fp
dGluZyBmb3IgTFBTUlQgQ291bnRlciB0byBjaGFuZ2VcbiIpOw0KPiA+ID4gKwkJcmV0dXJuIC1F
VElNRURPVVQ7DQo+ID4gPiArCX0NCj4gPiA+ICsJcmV0dXJuIDA7DQo+ID4gPiAgIH0NCj4gPiA+
ICAgDQo+ID4gPiAgIHN0YXRpYyBpbnQgc252c19ydGNfZW5hYmxlKHN0cnVjdCBzbnZzX3J0Y19k
YXRhICpkYXRhLCBib29sIGVuYWJsZSkNCj4gPiA+IEBAIC0xNzAsOSArMjA0LDcgQEAgc3RhdGlj
IGludCBzbnZzX3J0Y19hbGFybV9pcnFfZW5hYmxlKHN0cnVjdCBkZXZpY2UgKmRldiwgdW5zaWdu
ZWQgaW50IGVuYWJsZSkNCj4gPiA+ICAgCQkJICAgKFNOVlNfTFBDUl9MUFRBX0VOIHwgU05WU19M
UENSX0xQV1VJX0VOKSwNCj4gPiA+ICAgCQkJICAgZW5hYmxlID8gKFNOVlNfTFBDUl9MUFRBX0VO
IHwgU05WU19MUENSX0xQV1VJX0VOKSA6IDApOw0KPiA+ID4gICANCj4gPiA+IC0JcnRjX3dyaXRl
X3N5bmNfbHAoZGF0YSk7DQo+ID4gPiAtDQo+ID4gPiAtCXJldHVybiAwOw0KPiA+ID4gKwlyZXR1
cm4gcnRjX3dyaXRlX3N5bmNfbHAoZGF0YSk7DQo+ID4gPiAgIH0NCj4gPiA+ICAgDQo+ID4gPiAg
IHN0YXRpYyBpbnQgc252c19ydGNfc2V0X2FsYXJtKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0
IHJ0Y193a2Fscm0gKmFscm0pDQo+ID4gPiBAQCAtMTgwLDExICsyMTIsMTQgQEAgc3RhdGljIGlu
dCBzbnZzX3J0Y19zZXRfYWxhcm0oc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcnRjX3drYWxy
bSAqYWxybSkNCj4gPiA+ICAgCXN0cnVjdCBzbnZzX3J0Y19kYXRhICpkYXRhID0gZGV2X2dldF9k
cnZkYXRhKGRldik7DQo+ID4gPiAgIAlzdHJ1Y3QgcnRjX3RpbWUgKmFscm1fdG0gPSAmYWxybS0+
dGltZTsNCj4gPiA+ICAgCXVuc2lnbmVkIGxvbmcgdGltZTsNCj4gPiA+ICsJaW50IHJldDsNCj4g
PiA+ICAgDQo+ID4gPiAgIAlydGNfdG1fdG9fdGltZShhbHJtX3RtLCAmdGltZSk7DQo+ID4gPiAg
IA0KPiA+ID4gICAJcmVnbWFwX3VwZGF0ZV9iaXRzKGRhdGEtPnJlZ21hcCwgZGF0YS0+b2Zmc2V0
ICsgU05WU19MUENSLCBTTlZTX0xQQ1JfTFBUQV9FTiwgMCk7DQo+ID4gPiAtCXJ0Y193cml0ZV9z
eW5jX2xwKGRhdGEpOw0KPiA+ID4gKwlyZXQgPSBydGNfd3JpdGVfc3luY19scChkYXRhKTsNCj4g
PiA+ICsJaWYgKHJldCkNCj4gPiA+ICsJCXJldHVybiByZXQ7DQo+ID4gPiAgIAlyZWdtYXBfd3Jp
dGUoZGF0YS0+cmVnbWFwLCBkYXRhLT5vZmZzZXQgKyBTTlZTX0xQVEFSLCB0aW1lKTsNCj4gPiA+
ICAgDQo+ID4gPiAgIAkvKiBDbGVhciBhbGFybSBpbnRlcnJ1cHQgc3RhdHVzIGJpdCAqLw0KPiAN
Cj4g

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

* Re: [PATCH] rtc-snvs: Add timeouts to avoid kernel lockups
  2018-05-10  5:25   ` Alexandre Belloni
@ 2018-05-16 23:36     ` Trent Piepho
  0 siblings, 0 replies; 7+ messages in thread
From: Trent Piepho @ 2018-05-16 23:36 UTC (permalink / raw)
  To: alexandre.belloni; +Cc: linux-rtc

T24gVGh1LCAyMDE4LTA1LTEwIGF0IDA3OjI1ICswMjAwLCBBbGV4YW5kcmUgQmVsbG9uaSB3cm90
ZToNCj4gSGksDQo+IA0KPiBPbiAwOS8wNS8yMDE4IDIwOjE5OjI2KzAwMDAsIFRyZW50IFBpZXBo
byB3cm90ZToNCj4gPiBCdW1wLg0KPiA+IA0KPiA+IEJlZW4gd2hpbGUsIG5vIHJlc3BvbnNlLg0K
PiA+IA0KPiA+IEFub3RoZXIgcGF0Y2ggZnJvbSBCcnlhbiBPJ0Rvbm9naHVlIHdlbnQgaW4gdG8g
Zml4IGEgcmVsYXRlZCBpc3N1ZSwgYnV0DQo+ID4gSSBiZWxpZXZlIHRoaXMgcGF0Y2ggc3RpbGwg
Zml4ZXMgYW5vdGhlciBidWcuDQo+ID4gDQo+IA0KPiBPbiBBcHJpbCAyNiwgMjAxOCwgSSd2ZSBh
c2tlZCB3aGV0aGVyIHlvdSBjb3VsZCByZWJhc2VkIG9uIHRvcCBvZg0KPiBydGMtbmV4dC4NCj4g
DQoNClNvcnJ5LCBkaWRuJ3QgZ2V0IHRoYXQgZW1haWwgYW5kIHNvbWVob3cgSSBkaWRuJ3Qgc2Vl
IHRoZSBjb21tZW50IG9uIA0KcGF0Y2h3b3JrLiAgV2lsbCByZXNlbmQuICBEb24ndCB0aGluayBh
bnkgY29kZSBjaGFuZ2VkIGJ1dCBJJ2xsIGFtZW5kDQp0aGUgY29tbWl0IG1lc3NhZ2Uu

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

end of thread, other threads:[~2018-05-16 23:36 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-03-16 18:12 [PATCH] rtc-snvs: Add timeouts to avoid kernel lockups Trent Piepho
2018-04-26 20:22 ` Alexandre Belloni
2018-05-09 20:19 ` Trent Piepho
2018-05-09 22:17   ` Bryan O'Donoghue
2018-05-11 18:26     ` Trent Piepho
2018-05-10  5:25   ` Alexandre Belloni
2018-05-16 23:36     ` Trent Piepho

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.