From: "Jörn Engel" <joern@logfs.org>
To: Adrian McMenamin <adrian@newgolddream.dyndns.info>
Cc: Andrew Morton <akpm@osdl.org>,
linux-sh <linux-sh@vger.kernel.org>, Greg KH <greg@kroah.com>,
LKML <linux-kernel@vger.kernel.org>,
Paul Mundt <lethal@linux-sh.org>,
MTD <linux-mtd@lists.infradead.org>, dwmw2 <dwmw2@infradead.org>
Subject: Re: [PATCH] 3/3 maple: update bus driver to support Dreamcast VMU
Date: Mon, 24 Mar 2008 20:54:00 +0100 [thread overview]
Message-ID: <20080324195359.GJ2899@logfs.org> (raw)
In-Reply-To: <1206381351.7543.15.camel@localhost.localdomain>
On Mon, 24 March 2008 17:55:51 +0000, Adrian McMenamin wrote:
>
> The problem is that the hardware does not support another callback. In
> any case while you are right that the function might be called as second
> time, in the original code it will sleep while waiting for the lock,
> which is allocated per device.
>
> On the second patch - aiui completions do an uninterruptible wait, that
> means they are surely not a good choice for this - especially as the
> device could be unplugged at any time. (Admittedly my documentation
> migght be of date here)
Neither of those two problem should be visible for the mtd driver. The
usual way how bus driver are implemented is something like this:
struct foo_request {
void *data;
loff_t ofs;
size_t len;
void (*complete)(struct foo_request);
void *private;
};
int do_request(struct foo_request *rq)
{
/* deal with hardware somehow */
rq->complete(rq);
}
With such infrastructure your mtd driver could look roughly like this:
static void read_complete(struct foo_request *rq)
{
complete(rq->private);
}
static int foo_read(struct mtd_info *mtd, loff_t ofs, size_t len, size_t *retlen, u_char *buf)
{
struct foo_dev = mtd->private;
struct foo_request *rq;
DECLARE_COMPLETION_ONSTACK(complete);
int err;
rq = kmalloc(sizeof(*rq), GFP_KERNEL);
if (!rq)
return -ENOMEM;
/* fill in appropriate values for rq->data, rq->ofs and rq->len */
rq->private = &complete;
rq->complete = read_complete;
err = do_request(rq);
if (err)
goto out;
wait_for_completion(&complete);
/* copy read data into buf, set retlen */
out:
kfree(rq);
return err;
}
Throw in a loop if you need several hardware accesses to fulfil large
reads. But that's it. You don't need any locking in the mtd driver at
all. Ownership is clearly defined. Between kmalloc() and do_request()
rq belongs to foo_read(). Between do_request() and the call to
read_complete() it belongs to the bus driver. After completion it
belongs to foo_read() again. No race window, no complicated locking.
If your hardware can only handle a finite number of requests at a time,
you can queue requests in do_request(). The caller should not know or
care about it - apart from declaring the completion variable and waiting
on it.
The goal of my patches was to move your code towards such a design.
Alas, my time is limited and my girlfriend already unhappy as it is -
you will have to continue without me. If in doubt, take a look at the
usb code and try to mimic that. drivers/mtd/nand/alauda.c uses usb to
talk to the hardware and roughly follows what I described above.
Jörn
--
Chance favors only the prepared mind.
-- Louis Pasteur
prev parent reply other threads:[~2008-03-24 19:54 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
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 [this message]
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=20080324195359.GJ2899@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;
as well as URLs for NNTP newsgroup(s).