1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- From: Mark Brown <broonie@kernel.org>
- Date: Tue, 9 Dec 2014 19:46:56 +0000
- Subject: [PATCH] spi: Check to see if the device is processing a message
- before we idle
- cur_msg is updated under the queue lock and holds the message we are
- currently processing. Since currently we only ever do removals in the
- pump kthread it doesn't matter in what order we do things but we want
- to be able to push things out from the submitting thread so pull the
- check to see if we're currently handling a message before we check to
- see if the queue is idle.
- Signed-off-by: Mark Brown <broonie@kernel.org>
- ---
- --- a/drivers/spi/spi.c
- +++ b/drivers/spi/spi.c
- @@ -891,8 +891,16 @@ static void spi_pump_messages(struct kth
- bool was_busy = false;
- int ret;
-
- - /* Lock queue and check for queue work */
- + /* Lock queue */
- spin_lock_irqsave(&master->queue_lock, flags);
- +
- + /* Make sure we are not already running a message */
- + if (master->cur_msg) {
- + spin_unlock_irqrestore(&master->queue_lock, flags);
- + return;
- + }
- +
- + /* Check if the queue is idle */
- if (list_empty(&master->queue) || !master->running) {
- if (!master->busy) {
- spin_unlock_irqrestore(&master->queue_lock, flags);
- @@ -916,11 +924,6 @@ static void spi_pump_messages(struct kth
- return;
- }
-
- - /* Make sure we are not already running a message */
- - if (master->cur_msg) {
- - spin_unlock_irqrestore(&master->queue_lock, flags);
- - return;
- - }
- /* Extract head of queue */
- master->cur_msg =
- list_first_entry(&master->queue, struct spi_message, queue);
|