From: David Brownell <david-b@pacbell.net>
To: Vitaly Wool <vwool@ru.mvista.com>
Cc: linux-kernel@vger.kernel.org, dpervushin@gmail.com,
akpm@osdl.org, greg@kroah.com, basicmark@yahoo.com,
komal_shah802003@yahoo.com, stephen@streetfiresound.com,
spi-devel-general@lists.sourceforge.net, Joachim_Jaeger@digi.com
Subject: Re: [spi-devel-general] Re: [PATCH 2.6-git] SPI core refresh
Date: Sun, 11 Dec 2005 12:17:32 -0800 [thread overview]
Message-ID: <200512111217.33009.david-b@pacbell.net> (raw)
In-Reply-To: <439C5BE7.3030503@ru.mvista.com>
> > The benefit you're talking about is that you don't have to use
> > heavyweight memory allocation. But... the transfer is basically async
> > so spi->master->transfer will need to copy your message structure to
> > its own-allocated structure so some memory copying will occur as this
Incorrect, as you note below.
> > might be an async transfer (and therefore the stack-allocated message
> > may be freed at some point when it's yet used!)
> > So your model implies concealed double message allocation/copying,
> > doesn't it?
> > And if I'm wrong, can you please explain me this?
>
> Oh, now looks like I understood what is meant. If a function uses
> stack-allocated messages, it should ensure that it will not exit until
> the message is processed (shouldn't it be documented somewhere?).
It is documented, but I'll make sure it comes up in a few more of the
places this confusion might arise. It's a fairly basic rule for
C programming: don't use pointers after they become invalid by
means of freeing back to the heap, or invalidating a stack frame.
> But
> this solves the problem only partially since this technique fits only
> the synchronous transfers.
Synchronous transfers can easily use stack allocation for
the descriptions, yes.
Not that they need to ... the ads7846 driver allocates its
spi_message and spi_transfer objects on the heap both for
synchronous operations (temperature and voltage sensing) and
for asynch ones (touchscreen tracking from timer and irq).
> Functions targeting async transfers will anyway have to kmalloc the
> memory for message structure which makes your approach not really more
> lightweight then ours.
If you measure the number of error/fault cases when you ask how
lightweight an API is, it's clearly lighter weight to allow for
example one kzalloc -(with spi_message and its N spi_transfer
descriptors, plus possibly other driver state) rather than to
require many of them. Just one fault path to write -- and debug.
My usual rule of thumb is that 1/3 of code (by lines) must handle
fault cases. So APIs requiring more fault handling require more
driver code ... not lightweight! That was a help, when fitting
into a tight size budget. (As appropriate to what's more or less
a shift register API, needing to run quickly in uCLinux and such.)
Plus, letting the driver do the kzalloc means there's no new API.
No-new-API is another way to promote lighter weight systems. ;)
That said ... I know some people _do_ like krefcounted APIs that
do that kind of stuff. Strongly. Greg's been silent here other
than pointing out that your request alloc was too fat to inline.
Mine is trivially inlined, but not refcounted. Likely there's a
happy middle ground, maybe
mesg = spi_message_alloc(struct spi_device *, unsigned ntrans);
mesg = spi_message_get(mesg);
spi_message_put();
Or whatever. Just add a kref to spi_message, and patch against
the current mm set (to the core and both drivers, but not
necessarily the spi_bitbang stuff).
- Dave
next prev parent reply other threads:[~2005-12-11 20:17 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-12-01 16:11 [PATCH 2.6-git] SPI core refresh Vitaly Wool
2005-12-01 16:18 ` [PATCH 2.6-git] MTD/SPI dataflash driver Vitaly Wool
2005-12-01 18:33 ` David Brownell
2005-12-02 6:01 ` Vitaly Wool
2005-12-02 22:07 ` David Brownell
2005-12-01 16:21 ` [PATCH 2.6-git] SPI core refresh Russell King
2005-12-01 16:30 ` Vitaly Wool
2005-12-01 18:04 ` Stephen Street
2005-12-01 18:22 ` Greg KH
2005-12-02 6:06 ` Vitaly Wool
2005-12-02 18:50 ` Mark Underwood
2005-12-02 20:13 ` Greg KH
2005-12-05 18:01 ` Vitaly Wool
2005-12-08 1:59 ` David Brownell
2005-12-08 6:33 ` Vitaly Wool
2005-12-09 22:55 ` David Brownell
2005-12-10 11:15 ` Vitaly Wool
2005-12-11 12:36 ` Vitaly Wool
2005-12-11 17:03 ` [spi-devel-general] " Vitaly Wool
2005-12-11 20:17 ` David Brownell [this message]
2005-12-11 22:13 ` Vitaly Wool
2005-12-11 23:54 ` David Brownell
2005-12-12 7:09 ` Vitaly Wool
2005-12-11 22:15 ` Vitaly Wool
2005-12-11 22:18 ` Vitaly Wool
-- strict thread matches above, loose matches on Subject: below --
2005-12-03 17:10 Mark Underwood
2005-12-03 19:19 ` [spi-devel-general] " Vitaly Wool
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=200512111217.33009.david-b@pacbell.net \
--to=david-b@pacbell.net \
--cc=Joachim_Jaeger@digi.com \
--cc=akpm@osdl.org \
--cc=basicmark@yahoo.com \
--cc=dpervushin@gmail.com \
--cc=greg@kroah.com \
--cc=komal_shah802003@yahoo.com \
--cc=linux-kernel@vger.kernel.org \
--cc=spi-devel-general@lists.sourceforge.net \
--cc=stephen@streetfiresound.com \
--cc=vwool@ru.mvista.com \
/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