]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blob - releases/5.0.19/i2c-designware-ratelimit-transfer-when-suspended-err.patch
4.9-stable patches
[thirdparty/kernel/stable-queue.git] / releases / 5.0.19 / i2c-designware-ratelimit-transfer-when-suspended-err.patch
1 From a0dbf2a6fc82e5bdff8f5e60805879308341a227 Mon Sep 17 00:00:00 2001
2 From: Wolfram Sang <wsa+renesas@sang-engineering.com>
3 Date: Wed, 24 Apr 2019 18:16:32 +0200
4 Subject: i2c: designware: ratelimit 'transfer when suspended' errors
5
6 [ Upstream commit 6bac9bc273cdab6157ad7a2ead09400aabfc445b ]
7
8 There are two problems with dev_err() here. One: It is not ratelimited.
9 Two: We don't see which driver tried to transfer something with a
10 suspended adapter. Switch to dev_WARN_ONCE to fix both issues. Drawback
11 is that we don't see if multiple drivers are trying to transfer while
12 suspended. They need to be discovered one after the other now. This is
13 better than a high CPU load because a really broken driver might try to
14 resend endlessly.
15
16 Link: https://bugs.archlinux.org/task/62391
17 Fixes: 275154155538 ("i2c: designware: Do not allow i2c_dw_xfer() calls while suspended")
18 Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
19 Reported-by: skidnik <skidnik@gmail.com>
20 Acked-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
21 Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
22 Tested-by: skidnik <skidnik@gmail.com>
23 Signed-off-by: Wolfram Sang <wsa@the-dreams.de>
24 Signed-off-by: Sasha Levin <sashal@kernel.org>
25 ---
26 drivers/i2c/busses/i2c-designware-master.c | 3 +--
27 1 file changed, 1 insertion(+), 2 deletions(-)
28
29 diff --git a/drivers/i2c/busses/i2c-designware-master.c b/drivers/i2c/busses/i2c-designware-master.c
30 index bb8e3f1499796..d464799e40a30 100644
31 --- a/drivers/i2c/busses/i2c-designware-master.c
32 +++ b/drivers/i2c/busses/i2c-designware-master.c
33 @@ -426,8 +426,7 @@ i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
34
35 pm_runtime_get_sync(dev->dev);
36
37 - if (dev->suspended) {
38 - dev_err(dev->dev, "Error %s call while suspended\n", __func__);
39 + if (dev_WARN_ONCE(dev->dev, dev->suspended, "Transfer while suspended\n")) {
40 ret = -ESHUTDOWN;
41 goto done_nolock;
42 }
43 --
44 2.20.1
45