From: "Jörn Engel" <joern@logfs.org>
To: Paul Mundt <lethal@linux-sh.org>
Cc: Adrian McMenamin <adrian@newgolddream.dyndns.info>,
Greg KH <greg@kroah.com>, dwmw2 <dwmw2@infradead.org>,
LKML <linux-kernel@vger.kernel.org>,
MTD <linux-mtd@lists.infradead.org>,
linux-sh <linux-sh@vger.kernel.org>,
Andrew Morton <akpm@osdl.org>
Subject: Re: [PATCH] 3/3 maple: update bus driver to support Dreamcast VMU
Date: Mon, 24 Mar 2008 15:46:47 +0100 [thread overview]
Message-ID: <20080324144647.GC2899@logfs.org> (raw)
In-Reply-To: <20080324033344.GB15872@linux-sh.org>
On Mon, 24 March 2008 12:33:44 +0900, Paul Mundt wrote:
>
> So here we have the same issue as in the previous patch, but with the
> mutex API instead. The entire point of adding a comment for clarity is
> that it becomes obvious what this is trying to accomplish, which it still
> isn't. Maple shouldn't require a supplemental document to detail its
> locking strategy in a way that doesn't induce blindness.
>
> The mutex_unlock() here looks very suspicious. You first try to grab the
> lock via the trylock, if it's contended, then you try to unlock it and
> then grab it again for yourself before continuing on. This sort of
> juggling looks really racy. Under what conditions will this lock be
> contended, and under what conditions is it released? If you have a
> transfer in place, you contend on the lock, and then this code suddenly
> unlocks, what happens to your queue? It seems like you are trying to lock
> down the mq for the duration of its lifetime, in addition to having a
> separate list lock for guarding against the list getting mangled from
> underneath you.
>
> It looks like you are trying to roll your own complex queuing mechanism
> in a fairly non-obvious fashion. Have you considered using things like
> the block layer qeueing for dealing with a lot of this for you? This is
> what we ended up using for OMAP mailboxes and it worked out pretty well
> (arch/arm/plat-omap/mailbox.c) there.
>
> This sort of obscure locking is going to cause you nothing but trouble in
> the long run.
As a general rule, locks should be taken and released in the same
function. That allows the locking to be easily reviewed and errors
are easy to spot for most readers.
int foo(void)
{
int err;
err = bar();
if (err)
return err;
mutex_lock(&foo_lock);
err = baz();
if (err)
return err;
mutex_unlock(&foo_lock);
return bumble();
}
In the above example, one doesn't have to think twice, the bugfix
becomes almost mechanical. But as soon as locks are taken in one
function and released in another, things get hairy.
int foo(void)
{
int err;
err = bar();
if (err)
return err;
mutex_lock(&foo_lock);
err = baz();
/* baz implicitly unlocks the mutex */
if (err)
return err;
return bumble();
}
Even with the comment, one cannot be sure.
int baz(void)
{
int err;
err = bee();
if (err)
return err;
mutex_unlock(&foo_lock);
return boo();
}
One always has to check all functions involved. If bee() returns an
error, neither foo() nor baz() will unlock the mutex. And after
changing baz() to always unlock the mutex, one next needs to check all
callers whether any of them unlock on errors. Under some circumstances
those would have been correct before, but not after. Unless...
In short, verifying the locking is about the least pleasurable thing to
do once locks are taken and released in seperate functions.
Jörn
--
He who knows others is wise.
He who knows himself is enlightened.
-- Lao Tsu
next prev parent reply other threads:[~2008-03-24 14:47 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-03-22 17:43 [PATCH] 0/3 - Add support for VMU flash memory and update maple bus driver on the SEGA Dreamcast Adrian McMenamin
2008-03-22 17:56 ` [PATCH] 1/3 mtd: add Kbuild support and makefile support for Dreamcast VMU Adrian McMenamin
2008-03-24 3:09 ` Paul Mundt
2008-03-22 18:03 ` [PATCH] 2/3 mtd: add support for flash on the SEGA Dreamcast Visual Memory Unit Adrian McMenamin
2008-03-22 18:32 ` Jörn Engel
2008-03-22 18:39 ` Adrian McMenamin
2008-03-22 18:56 ` Jörn Engel
2008-03-24 2:08 ` Paul Mundt
2008-03-24 11:21 ` Jörn Engel
2008-03-24 12:06 ` Adrian McMenamin
2008-03-24 13:21 ` Jörn Engel
2008-03-24 13:58 ` Adrian McMenamin
2008-03-24 14:10 ` Jörn Engel
2008-03-24 14:43 ` Adrian McMenamin
2008-03-24 14:46 ` Paul Mundt
2008-03-24 14:54 ` Jörn Engel
2008-03-24 18:45 ` Andrew Morton
2008-03-24 23:11 ` Adrian McMenamin
2008-03-22 18:16 ` [PATCH] 3/3 maple: update bus driver to support Dreamcast VMU Adrian McMenamin
2008-03-24 3:33 ` Paul Mundt
2008-03-24 14:46 ` Jörn Engel [this message]
2008-03-24 15:06 ` Adrian McMenamin
2008-03-24 15:29 ` Jörn Engel
2008-03-24 15:51 ` Adrian McMenamin
2008-03-24 16:04 ` Jörn Engel
2008-03-24 17:07 ` Jörn Engel
2008-03-24 17:18 ` Adrian McMenamin
2008-03-24 17:38 ` Jörn Engel
2008-03-24 17:55 ` Adrian McMenamin
2008-03-24 19:54 ` Jörn Engel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080324144647.GC2899@logfs.org \
--to=joern@logfs.org \
--cc=adrian@newgolddream.dyndns.info \
--cc=akpm@osdl.org \
--cc=dwmw2@infradead.org \
--cc=greg@kroah.com \
--cc=lethal@linux-sh.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mtd@lists.infradead.org \
--cc=linux-sh@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox