From: David Brownell <david-b@pacbell.net>
To: Andrew Morton <akpm@osdl.org>, linux-kernel@vger.kernel.org
Cc: spi-devel-general@lists.sourceforge.net
Subject: [patch 2.6.15-rc5-mm2] SPI, priority inversion tweak
Date: Tue, 13 Dec 2005 10:28:49 -0800 [thread overview]
Message-ID: <200512131028.49291.david-b@pacbell.net> (raw)
[-- Attachment #1: Type: text/plain, Size: 207 bytes --]
This is an updated version of the patch from Mark Underwood, handling
the no-memory case better and using SLAB_KERNEL not SLAB_ATOMIC.
Please apply it on top of the current SPI code in the MM tree.
- Dave
[-- Attachment #2: spi-kmalloc.patch --]
[-- Type: text/x-diff, Size: 1522 bytes --]
Update the SPI framework to remove a potential priority inversion case by
reverting to kmalloc if the pre-allocated DMA-safe buffer isn't available.
From: Mark Underwood <basicmark@yahoo.com>
Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
--- g26.orig/drivers/spi/spi.c 2005-12-11 11:06:38.000000000 -0800
+++ g26/drivers/spi/spi.c 2005-12-13 09:56:22.000000000 -0800
@@ -541,22 +541,30 @@ int spi_write_then_read(struct spi_devic
int status;
struct spi_message message;
struct spi_transfer x[2];
+ u8 *local_buf;
/* Use preallocated DMA-safe buffer. We can't avoid copying here,
* (as a pure convenience thing), but we can keep heap costs
- * out of the hot path.
+ * out of the hot path ...
*/
if ((n_tx + n_rx) > SPI_BUFSIZ)
return -EINVAL;
- down(&lock);
+ /* ... unless someone else is using the pre-allocated buffer */
+ if (down_trylock(&lock)) {
+ local_buf = kmalloc(SPI_BUFSIZ, GFP_KERNEL);
+ if (!local_buf)
+ return -ENOMEM;
+ } else
+ local_buf = buf;
+
memset(x, 0, sizeof x);
- memcpy(buf, txbuf, n_tx);
- x[0].tx_buf = buf;
+ memcpy(local_buf, txbuf, n_tx);
+ x[0].tx_buf = local_buf;
x[0].len = n_tx;
- x[1].rx_buf = buf + n_tx;
+ x[1].rx_buf = local_buf + n_tx;
x[1].len = n_rx;
/* do the i/o */
@@ -568,7 +576,11 @@ int spi_write_then_read(struct spi_devic
status = message.status;
}
- up(&lock);
+ if (x[0].tx_buf == buf)
+ up(&lock);
+ else
+ kfree(local_buf);
+
return status;
}
EXPORT_SYMBOL_GPL(spi_write_then_read);
next reply other threads:[~2005-12-13 19:05 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-12-13 18:28 David Brownell [this message]
2005-12-13 21:49 ` [spi-devel-general] [patch 2.6.15-rc5-mm2] SPI, priority inversion tweak Vitaly Wool
2005-12-13 22:21 ` David Brownell
2005-12-14 6:43 ` Vitaly Wool
2005-12-14 6:47 ` 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=200512131028.49291.david-b@pacbell.net \
--to=david-b@pacbell.net \
--cc=akpm@osdl.org \
--cc=linux-kernel@vger.kernel.org \
--cc=spi-devel-general@lists.sourceforge.net \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.