ibmvscsi: Add memory barriers for send / receive
Add a memory barrier prior to sending a new command to the VIOS to ensure the VIOS does not receive stale data in the command buffer. Also add a memory barrier when processing the CRQ for completed commands. Signed-off-by: Brian King <brking@linux.vnet.ibm.com> Acked-by: Nathan Fontenot <nfont@linux.vnet.ibm.com> Cc: stable@vger.kernel.org Signed-off-by: Christoph Hellwig <hch@lst.de>
This commit is contained in:
parent
9ee755974b
commit
7114aae027
|
@ -185,6 +185,11 @@ static struct viosrp_crq *crq_queue_next_crq(struct crq_queue *queue)
|
|||
if (crq->valid & 0x80) {
|
||||
if (++queue->cur == queue->size)
|
||||
queue->cur = 0;
|
||||
|
||||
/* Ensure the read of the valid bit occurs before reading any
|
||||
* other bits of the CRQ entry
|
||||
*/
|
||||
rmb();
|
||||
} else
|
||||
crq = NULL;
|
||||
spin_unlock_irqrestore(&queue->lock, flags);
|
||||
|
@ -203,6 +208,11 @@ static int ibmvscsi_send_crq(struct ibmvscsi_host_data *hostdata,
|
|||
{
|
||||
struct vio_dev *vdev = to_vio_dev(hostdata->dev);
|
||||
|
||||
/*
|
||||
* Ensure the command buffer is flushed to memory before handing it
|
||||
* over to the VIOS to prevent it from fetching any stale data.
|
||||
*/
|
||||
mb();
|
||||
return plpar_hcall_norets(H_SEND_CRQ, vdev->unit_address, word1, word2);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue