[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20170622132134.7200-3-zboszor@pr.hu>
Date: Thu, 22 Jun 2017 15:21:31 +0200
From: Zoltán Böszörményi
<zboszor@...hu>
To: linux-kernel@...r.kernel.org
Cc: linux-usb@...r.kernel.org, linux-watchdog@...r.kernel.org,
linux-i2c@...r.kernel.org,
Paul Menzel <paulepanter@...rs.sourceforge.net>,
Christian Fetzer <fetzer.ch@...il.com>,
Jean Delvare <jdelvare@...e.com>,
Nehal Shah <nehal-bakulchandra.shah@....com>,
Tim Small <tim@...ss.co.uk>,
Guenter Roeck <linux@...ck-us.net>, kernel@...ss.net,
wim@...ana.be, jlayton@...chiereds.net, marc.2377@...il.com,
cshorler@...glemail.com, wsa@...-dreams.de,
regressions@...mhuis.info,
Zoltán Böszörményi
<zboszor@...hu>
Subject: [PATCH 2/5 v2] Modify behaviour of request_*muxed_region()
In order to make request_*muxed_region() behave more like
mutex_lock(), a possible failure case needs to be eliminated.
When drivers do not properly share the same I/O region, e.g.
one is using request_region() and the other is using
request_muxed_region(), the kernel didn't warn the user about it.
This change modifies IORESOURCE_MUXED behaviour so it always
goes to sleep waiting for the resuorce to be freed and the
inconsistent resource flag usage is logged with KERN_ERR.
v2: Fixed checkpatch.pl warnings and extended the comment
about request_declared_muxed_region.
Signed-off-by: Zoltán Böszörményi <zboszor@...hu>
---
kernel/resource.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/kernel/resource.c b/kernel/resource.c
index 2be7029..5df2731 100644
--- a/kernel/resource.c
+++ b/kernel/resource.c
@@ -1125,6 +1125,7 @@ resource_size_t resource_alignment(struct resource *res)
*
* request_declared_muxed_region creates a new shared busy region
* described in an existing resource descriptor.
+ * It only returns if it succeeded.
*
* release_region releases a matching busy region.
* The region is only freed if it was allocated.
@@ -1191,7 +1192,10 @@ struct resource *__request_declared_region(struct resource *parent,
continue;
}
}
- if (conflict->flags & flags & IORESOURCE_MUXED) {
+ if (flags & IORESOURCE_MUXED) {
+ if (!(conflict->flags & IORESOURCE_MUXED))
+ pr_err("Resource conflict between muxed \"%s\" and non-muxed \"%s\" I/O regions!\n",
+ res->name, conflict->name);
add_wait_queue(&muxed_resource_wait, &wait);
write_unlock(&resource_lock);
set_current_state(TASK_UNINTERRUPTIBLE);
--
2.9.4
Powered by blists - more mailing lists