]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
octeontx2-pf: Add new APIs for queue memory alloc/free.
authorGeetha sowjanya <gakula@marvell.com>
Wed, 23 Oct 2024 16:18:41 +0000 (21:48 +0530)
committerJakub Kicinski <kuba@kernel.org>
Thu, 31 Oct 2024 00:50:32 +0000 (17:50 -0700)
Group the queue(RX/TX/CQ) memory allocation and free code to single APIs.

Signed-off-by: Geetha sowjanya <gakula@marvell.com>
Reviewed-by: Pavan Chebbi <pavan.chebbi@broadcom.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/20241023161843.15543-3-gakula@marvell.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/marvell/octeontx2/nic/otx2_common.h
drivers/net/ethernet/marvell/octeontx2/nic/otx2_pf.c

index a47001a2b93f980f7d0deaa67ba1c44d5a337264..df548aeffecf240797e364367f7c8ae0d17e3120 100644 (file)
@@ -997,6 +997,8 @@ int otx2_pool_init(struct otx2_nic *pfvf, u16 pool_id,
 int otx2_aura_init(struct otx2_nic *pfvf, int aura_id,
                   int pool_id, int numptrs);
 int otx2_init_rsrc(struct pci_dev *pdev, struct otx2_nic *pf);
+void otx2_free_queue_mem(struct otx2_qset *qset);
+int otx2_alloc_queue_mem(struct otx2_nic *pf);
 
 /* RSS configuration APIs*/
 int otx2_rss_init(struct otx2_nic *pfvf);
index 180a16b42ac3be7c76216893b1a907389c5bc4ae..1185f1bdfa014c0d4787dc3073be305330ff6fff 100644 (file)
@@ -1770,15 +1770,23 @@ static void otx2_dim_work(struct work_struct *w)
        dim->state = DIM_START_MEASURE;
 }
 
-int otx2_open(struct net_device *netdev)
+void otx2_free_queue_mem(struct otx2_qset *qset)
+{
+       kfree(qset->sq);
+       qset->sq = NULL;
+       kfree(qset->cq);
+       qset->cq = NULL;
+       kfree(qset->rq);
+       qset->rq = NULL;
+       kfree(qset->napi);
+       qset->napi = NULL;
+}
+
+int otx2_alloc_queue_mem(struct otx2_nic *pf)
 {
-       struct otx2_nic *pf = netdev_priv(netdev);
-       struct otx2_cq_poll *cq_poll = NULL;
        struct otx2_qset *qset = &pf->qset;
-       int err = 0, qidx, vec;
-       char *irq_name;
+       struct otx2_cq_poll *cq_poll;
 
-       netif_carrier_off(netdev);
 
        /* RQ and SQs are mapped to different CQs,
         * so find out max CQ IRQs (i.e CINTs) needed.
@@ -1798,7 +1806,6 @@ int otx2_open(struct net_device *netdev)
        /* CQ size of SQ */
        qset->sqe_cnt = qset->sqe_cnt ? qset->sqe_cnt : Q_COUNT(Q_SIZE_4K);
 
-       err = -ENOMEM;
        qset->cq = kcalloc(pf->qset.cq_cnt,
                           sizeof(struct otx2_cq_queue), GFP_KERNEL);
        if (!qset->cq)
@@ -1814,6 +1821,27 @@ int otx2_open(struct net_device *netdev)
        if (!qset->rq)
                goto err_free_mem;
 
+       return 0;
+
+err_free_mem:
+       otx2_free_queue_mem(qset);
+       return -ENOMEM;
+}
+
+int otx2_open(struct net_device *netdev)
+{
+       struct otx2_nic *pf = netdev_priv(netdev);
+       struct otx2_cq_poll *cq_poll = NULL;
+       struct otx2_qset *qset = &pf->qset;
+       int err = 0, qidx, vec;
+       char *irq_name;
+
+       netif_carrier_off(netdev);
+
+       err = otx2_alloc_queue_mem(pf);
+       if (err)
+               return err;
+
        err = otx2_init_hw_resources(pf);
        if (err)
                goto err_free_mem;
@@ -1979,10 +2007,7 @@ err_disable_napi:
        otx2_disable_napi(pf);
        otx2_free_hw_resources(pf);
 err_free_mem:
-       kfree(qset->sq);
-       kfree(qset->cq);
-       kfree(qset->rq);
-       kfree(qset->napi);
+       otx2_free_queue_mem(qset);
        return err;
 }
 EXPORT_SYMBOL(otx2_open);
@@ -2047,11 +2072,7 @@ int otx2_stop(struct net_device *netdev)
        for (qidx = 0; qidx < netdev->num_tx_queues; qidx++)
                netdev_tx_reset_queue(netdev_get_tx_queue(netdev, qidx));
 
-
-       kfree(qset->sq);
-       kfree(qset->cq);
-       kfree(qset->rq);
-       kfree(qset->napi);
+       otx2_free_queue_mem(qset);
        /* Do not clear RQ/SQ ringsize settings */
        memset_startat(qset, 0, sqe_cnt);
        return 0;