forked from Minki/linux
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 (crq->valid & 0x80) {
|
||||||
if (++queue->cur == queue->size)
|
if (++queue->cur == queue->size)
|
||||||
queue->cur = 0;
|
queue->cur = 0;
|
||||||
|
|
||||||
|
/* Ensure the read of the valid bit occurs before reading any
|
||||||
|
* other bits of the CRQ entry
|
||||||
|
*/
|
||||||
|
rmb();
|
||||||
} else
|
} else
|
||||||
crq = NULL;
|
crq = NULL;
|
||||||
spin_unlock_irqrestore(&queue->lock, flags);
|
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);
|
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);
|
return plpar_hcall_norets(H_SEND_CRQ, vdev->unit_address, word1, word2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user