mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-18 01:34:14 +08:00
ibmvnic: Ensure that SCRQ entry reads are correctly ordered
Ensure that received Subordinate Command-Response Queue (SCRQ)
entries are properly read in order by the driver. These queues
are used in the ibmvnic device to process RX buffer and TX completion
descriptors. dma_rmb barriers have been added after checking for a
pending descriptor to ensure the correct descriptor entry is checked
and after reading the SCRQ descriptor to ensure the entire
descriptor is read before processing.
Fixes: 032c5e8284
("Driver for IBM System i/p VNIC protocol")
Signed-off-by: Thomas Falcon <tlfalcon@linux.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
237f977ab9
commit
b71ec95223
@ -2404,6 +2404,12 @@ restart_poll:
|
|||||||
|
|
||||||
if (!pending_scrq(adapter, adapter->rx_scrq[scrq_num]))
|
if (!pending_scrq(adapter, adapter->rx_scrq[scrq_num]))
|
||||||
break;
|
break;
|
||||||
|
/* The queue entry at the current index is peeked at above
|
||||||
|
* to determine that there is a valid descriptor awaiting
|
||||||
|
* processing. We want to be sure that the current slot
|
||||||
|
* holds a valid descriptor before reading its contents.
|
||||||
|
*/
|
||||||
|
dma_rmb();
|
||||||
next = ibmvnic_next_scrq(adapter, adapter->rx_scrq[scrq_num]);
|
next = ibmvnic_next_scrq(adapter, adapter->rx_scrq[scrq_num]);
|
||||||
rx_buff =
|
rx_buff =
|
||||||
(struct ibmvnic_rx_buff *)be64_to_cpu(next->
|
(struct ibmvnic_rx_buff *)be64_to_cpu(next->
|
||||||
@ -3113,6 +3119,13 @@ restart_loop:
|
|||||||
unsigned int pool = scrq->pool_index;
|
unsigned int pool = scrq->pool_index;
|
||||||
int num_entries = 0;
|
int num_entries = 0;
|
||||||
|
|
||||||
|
/* The queue entry at the current index is peeked at above
|
||||||
|
* to determine that there is a valid descriptor awaiting
|
||||||
|
* processing. We want to be sure that the current slot
|
||||||
|
* holds a valid descriptor before reading its contents.
|
||||||
|
*/
|
||||||
|
dma_rmb();
|
||||||
|
|
||||||
next = ibmvnic_next_scrq(adapter, scrq);
|
next = ibmvnic_next_scrq(adapter, scrq);
|
||||||
for (i = 0; i < next->tx_comp.num_comps; i++) {
|
for (i = 0; i < next->tx_comp.num_comps; i++) {
|
||||||
if (next->tx_comp.rcs[i]) {
|
if (next->tx_comp.rcs[i]) {
|
||||||
@ -3513,6 +3526,11 @@ static union sub_crq *ibmvnic_next_scrq(struct ibmvnic_adapter *adapter,
|
|||||||
}
|
}
|
||||||
spin_unlock_irqrestore(&scrq->lock, flags);
|
spin_unlock_irqrestore(&scrq->lock, flags);
|
||||||
|
|
||||||
|
/* Ensure that the entire buffer descriptor has been
|
||||||
|
* loaded before reading its contents
|
||||||
|
*/
|
||||||
|
dma_rmb();
|
||||||
|
|
||||||
return entry;
|
return entry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user