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 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html