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: Alex Elder <elder@linaro.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
a9bec7ae70
commit
b4061c136b
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user