Commit 665ab1eb authored by Lijun Pan's avatar Lijun Pan Committed by Jakub Kicinski
Browse files

ibmvnic: rework to ensure SCRQ entry reads are properly ordered



Move the dma_rmb() between pending_scrq() and ibmvnic_next_scrq()
into the end of pending_scrq() to save the duplicated code since
this dma_rmb will be used 3 times.

Signed-off-by: default avatarLijun Pan <ljp@linux.ibm.com>
Acked-by: default avatarThomas Falcon <tlfalcon@linux.ibm.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 1a2b60f6
Loading
Loading
Loading
Loading
+11 −19
Original line number Diff line number Diff line
@@ -2444,12 +2444,6 @@ static int ibmvnic_poll(struct napi_struct *napi, int budget)

		if (!pending_scrq(adapter, rx_scrq))
			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, rx_scrq);
		rx_buff =
		    (struct ibmvnic_rx_buff *)be64_to_cpu(next->
@@ -3189,13 +3183,6 @@ static int ibmvnic_complete_tx(struct ibmvnic_adapter *adapter,
		int total_bytes = 0;
		int num_packets = 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);
		for (i = 0; i < next->tx_comp.num_comps; i++) {
			if (next->tx_comp.rcs[i])
@@ -3569,11 +3556,16 @@ static int pending_scrq(struct ibmvnic_adapter *adapter,
			struct ibmvnic_sub_crq_queue *scrq)
{
	union sub_crq *entry = &scrq->msgs[scrq->cur];
	int rc;

	if (entry->generic.first & IBMVNIC_CRQ_CMD_RSP)
		return 1;
	else
		return 0;
	rc = !!(entry->generic.first & IBMVNIC_CRQ_CMD_RSP);

	/* Ensure that the SCRQ valid flag is loaded prior to loading the
	 * contents of the SCRQ descriptor
	 */
	dma_rmb();

	return rc;
}

static union sub_crq *ibmvnic_next_scrq(struct ibmvnic_adapter *adapter,
@@ -3592,8 +3584,8 @@ static union sub_crq *ibmvnic_next_scrq(struct ibmvnic_adapter *adapter,
	}
	spin_unlock_irqrestore(&scrq->lock, flags);

	/* Ensure that the entire buffer descriptor has been
	 * loaded before reading its contents
	/* Ensure that the SCRQ valid flag is loaded prior to loading the
	 * contents of the SCRQ descriptor
	 */
	dma_rmb();