]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/5.1.3/i2c-core-ratelimit-transfer-when-suspended-errors.patch
Linux 5.1.3
[thirdparty/kernel/stable-queue.git] / releases / 5.1.3 / i2c-core-ratelimit-transfer-when-suspended-errors.patch
CommitLineData
01e516ea
GKH
1From 4db61c2a16fce2ef85d82751de4ba43a39347cfb Mon Sep 17 00:00:00 2001
2From: Wolfram Sang <wsa+renesas@sang-engineering.com>
3Date: Thu, 25 Apr 2019 16:19:47 +0200
4Subject: i2c: core: ratelimit 'transfer when suspended' errors
5
6From: Wolfram Sang <wsa+renesas@sang-engineering.com>
7
8commit 4db61c2a16fce2ef85d82751de4ba43a39347cfb upstream.
9
10There are two problems with WARN_ON() here. One: It is not ratelimited.
11Two: We don't see which adapter was used when trying to transfer
12something when already suspended. Implement a custom ratelimit once per
13adapter and use dev_WARN there. This fixes both issues. Drawback is that
14we don't see if multiple drivers are trying to transfer with the same
15adapter while suspended. They need to be discovered one after the other
16now. This is better than a high CPU load because a really broken driver
17might try to resend endlessly.
18
19Fixes: 9ac6cb5fbb17 ("i2c: add suspended flag and accessors for i2c adapters")
20Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
21Reviewed-by: Simon Horman <horms+renesas@verge.net.au>
22Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
23Cc: stable@vger.kernel.org # v5.1+
24Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
25
26---
27 drivers/i2c/i2c-core-base.c | 5 ++++-
28 include/linux/i2c.h | 3 ++-
29 2 files changed, 6 insertions(+), 2 deletions(-)
30
31--- a/drivers/i2c/i2c-core-base.c
32+++ b/drivers/i2c/i2c-core-base.c
33@@ -1871,8 +1871,11 @@ int __i2c_transfer(struct i2c_adapter *a
34
35 if (WARN_ON(!msgs || num < 1))
36 return -EINVAL;
37- if (WARN_ON(test_bit(I2C_ALF_IS_SUSPENDED, &adap->locked_flags)))
38+ if (test_bit(I2C_ALF_IS_SUSPENDED, &adap->locked_flags)) {
39+ if (!test_and_set_bit(I2C_ALF_SUSPEND_REPORTED, &adap->locked_flags))
40+ dev_WARN(&adap->dev, "Transfer while suspended\n");
41 return -ESHUTDOWN;
42+ }
43
44 if (adap->quirks && i2c_check_for_quirks(adap, msgs, num))
45 return -EOPNOTSUPP;
46--- a/include/linux/i2c.h
47+++ b/include/linux/i2c.h
48@@ -682,7 +682,8 @@ struct i2c_adapter {
49 int retries;
50 struct device dev; /* the adapter device */
51 unsigned long locked_flags; /* owned by the I2C core */
52-#define I2C_ALF_IS_SUSPENDED 0
53+#define I2C_ALF_IS_SUSPENDED 0
54+#define I2C_ALF_SUSPEND_REPORTED 1
55
56 int nr;
57 char name[48];