net: ipa: allocate transaction before pages when replenishing
authorAlex Elder <elder@linaro.org>
Thu, 3 Feb 2022 17:09:19 +0000 (11:09 -0600)
committerDavid S. Miller <davem@davemloft.net>
Fri, 4 Feb 2022 10:16:07 +0000 (10:16 +0000)
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>
drivers/net/ipa/ipa_endpoint.c

index a9f6d40..f8dbd43 100644 (file)
@@ -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;
 }