Messages in this thread | | | Subject | Re: [PATCH 1/4] mailbox: add support for System Control and Power Interface(SCPI) protocol | From | "Jon Medhurst (Tixy)" <> | Date | Thu, 30 Apr 2015 09:49:41 +0100 |
| |
On Wed, 2015-04-29 at 13:25 +0100, Jon Medhurst (Tixy) wrote: > diff --git a/drivers/mailbox/scpi_protocol.c > b/drivers/mailbox/scpi_protocol.c > index c74575b..5818d9b 100644 > --- a/drivers/mailbox/scpi_protocol.c > +++ b/drivers/mailbox/scpi_protocol.c > @@ -286,14 +286,23 @@ static void scpi_tx_prepare(struct mbox_client > *c, void *msg) > struct scpi_chan *ch = container_of(c, struct scpi_chan, cl); > struct scpi_shared_mem *mem = (struct scpi_shared_mem > *)ch->tx_payload; > > - mem->command = cpu_to_le32(t->cmd); > if (t->tx_buf) > memcpy_toio(mem->payload, t->tx_buf, t->tx_len); > if (t->rx_buf) { > + int token; > spin_lock_irqsave(&ch->rx_lock, flags); > + /* > + * Presumably we can do this token setting outside > + * spinlock and still be safe from concurrency? > + */
To answer my own question, yes, the four lines below can be moved up above the spin_lock_irqsave. Because we had better be safe from concurrency here as we are also writing to the channel's shared memory area.
> + do > + token = (++ch->token) & CMD_TOKEN_ID_MASK; > + while(!token); > + t->cmd |= token << CMD_TOKEN_ID_SHIFT; > list_add_tail(&t->node, &ch->rx_pending); > spin_unlock_irqrestore(&ch->rx_lock, flags); > } > + mem->command = cpu_to_le32(t->cmd); > } > > static struct scpi_xfer *get_scpi_xfer(struct scpi_chan *ch)
-- Tixy
| |