Commit b4061c13 authored by Alex Elder's avatar Alex Elder Committed by David S. Miller
Browse files

net: ipa: allocate transaction before pages when replenishing



A transaction failure only occurs if no more transactions are
available for an endpoint.  It's a very cheap test.

When replenishing an RX endpoint buffer, there's no point in
allocating pages if transactions are exhausted.  So don't bother
doing so unless the transaction allocation succeeds.

Signed-off-by: default avatarAlex Elder <elder@linaro.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a9bec7ae
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -1046,14 +1046,14 @@ static int ipa_endpoint_replenish_one(struct ipa_endpoint *endpoint)
	u32 len;
	int ret;

	trans = ipa_endpoint_trans_alloc(endpoint, 1);
	if (!trans)
		return -ENOMEM;

	buffer_size = endpoint->data->rx.buffer_size;
	page = dev_alloc_pages(get_order(buffer_size));
	if (!page)
		return -ENOMEM;

	trans = ipa_endpoint_trans_alloc(endpoint, 1);
	if (!trans)
		goto err_free_pages;
		goto err_trans_free;

	/* Offset the buffer to make space for skb headroom */
	offset = NET_SKB_PAD;
@@ -1061,7 +1061,7 @@ static int ipa_endpoint_replenish_one(struct ipa_endpoint *endpoint)

	ret = gsi_trans_page_add(trans, page, len, offset);
	if (ret)
		goto err_trans_free;
		goto err_free_pages;
	trans->data = page;	/* transaction owns page now */

	if (++endpoint->replenish_ready == IPA_REPLENISH_BATCH) {
@@ -1073,10 +1073,10 @@ static int ipa_endpoint_replenish_one(struct ipa_endpoint *endpoint)

	return 0;

err_trans_free:
	gsi_trans_free(trans);
err_free_pages:
	__free_pages(page, get_order(buffer_size));
err_trans_free:
	gsi_trans_free(trans);

	return -ENOMEM;
}