All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vitaly Wool <vwool@ru.mvista.com>
To: David Brownell <david-b@pacbell.net>
Cc: Andrew Morton <akpm@osdl.org>,
	linux-kernel@vger.kernel.org,
	spi-devel-general@lists.sourceforge.net
Subject: Re: [spi-devel-general] [patch 2.6.15-rc5-mm2] SPI, priority inversion tweak
Date: Wed, 14 Dec 2005 00:49:58 +0300	[thread overview]
Message-ID: <439F4206.2040406@ru.mvista.com> (raw)
In-Reply-To: <200512131028.49291.david-b@pacbell.net>

So you're turning this to be unsafe if the buffer is in use, right? Funny...

David Brownell wrote:

>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
>  
>
>------------------------------------------------------------------------
>
>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);
>  
>


  reply	other threads:[~2005-12-13 21:50 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-12-13 18:28 [patch 2.6.15-rc5-mm2] SPI, priority inversion tweak David Brownell
2005-12-13 21:49 ` Vitaly Wool [this message]
2005-12-13 22:21   ` [spi-devel-general] " 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=439F4206.2040406@ru.mvista.com \
    --to=vwool@ru.mvista.com \
    --cc=akpm@osdl.org \
    --cc=david-b@pacbell.net \
    --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.