On Mon, Dec 18, 2017 at 09:48:38AM +0100, Zoltan Boszormenyi wrote: > From: Böszörményi Zoltán <zboszor@xxxxx> > > 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 resource > inconsistent resource flag usage is logged with KERN_ERR. > > v2: Fixed checkpatch.pl warnings and extended the comment > about request_declared_muxed_region. > > v3: Rebased for 4.15-rc4 > > Signed-off-by: Zoltán Böszörményi <zboszor@xxxxx> > --- > kernel/resource.c | 6 +++++- > 1 file changed, 5 insertions(+), 1 deletion(-) > > diff --git a/kernel/resource.c b/kernel/resource.c > index 05db9c4e3992..0f26f887ac33 100644 > --- a/kernel/resource.c > +++ b/kernel/resource.c > @@ -1143,6 +1143,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. > @@ -1209,7 +1210,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); With this, the muxed resource requestor will hang since the non-muxed requestor will not release the resource. I understand that you are trying to get rid of the error return, but is replacing it with a hang really better ? > add_wait_queue(&muxed_resource_wait, &wait); > write_unlock(&resource_lock); > set_current_state(TASK_UNINTERRUPTIBLE); > -- > 2.13.6 >