ionic: move irq request to qcq alloc
authorShannon Nelson <snelson@pensando.io>
Sat, 28 Mar 2020 03:14:44 +0000 (20:14 -0700)
committerDavid S. Miller <davem@davemloft.net>
Mon, 30 Mar 2020 18:40:50 +0000 (11:40 -0700)
Move the irq request and free out of the qcq_init and deinit
and into the alloc and free routines where they belong for
better resource management.

Signed-off-by: Shannon Nelson <snelson@pensando.io>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/pensando/ionic/ionic_lif.c

index a6f2ff56098d566d0b6e6f7542b6cb99f043d3f5..fb62d78e41d99aab13d7922acdf77e2f14254b10 100644 (file)
@@ -266,7 +266,6 @@ static void ionic_lif_quiesce(struct ionic_lif *lif)
 static void ionic_lif_qcq_deinit(struct ionic_lif *lif, struct ionic_qcq *qcq)
 {
        struct ionic_dev *idev = &lif->ionic->idev;
-       struct device *dev = lif->ionic->dev;
 
        if (!qcq)
                return;
@@ -277,10 +276,7 @@ static void ionic_lif_qcq_deinit(struct ionic_lif *lif, struct ionic_qcq *qcq)
        if (qcq->flags & IONIC_QCQ_F_INTR) {
                ionic_intr_mask(idev->intr_ctrl, qcq->intr.index,
                                IONIC_INTR_MASK_SET);
-               irq_set_affinity_hint(qcq->intr.vector, NULL);
-               devm_free_irq(dev, qcq->intr.vector, &qcq->napi);
                netif_napi_del(&qcq->napi);
-               qcq->intr.vector = 0;
        }
 
        qcq->flags &= ~IONIC_QCQ_F_INITED;
@@ -299,8 +295,12 @@ static void ionic_qcq_free(struct ionic_lif *lif, struct ionic_qcq *qcq)
        qcq->base = NULL;
        qcq->base_pa = 0;
 
-       if (qcq->flags & IONIC_QCQ_F_INTR)
+       if (qcq->flags & IONIC_QCQ_F_INTR) {
+               irq_set_affinity_hint(qcq->intr.vector, NULL);
+               devm_free_irq(dev, qcq->intr.vector, &qcq->napi);
+               qcq->intr.vector = 0;
                ionic_intr_free(lif, qcq->intr.index);
+       }
 
        devm_kfree(dev, qcq->cq.info);
        qcq->cq.info = NULL;
@@ -432,6 +432,12 @@ static int ionic_qcq_alloc(struct ionic_lif *lif, unsigned int type,
                ionic_intr_mask_assert(idev->intr_ctrl, new->intr.index,
                                       IONIC_INTR_MASK_SET);
 
+               err = ionic_request_irq(lif, new);
+               if (err) {
+                       netdev_warn(lif->netdev, "irq request failed %d\n", err);
+                       goto err_out_free_intr;
+               }
+
                new->intr.cpu = cpumask_local_spread(new->intr.index,
                                                     dev_to_node(dev));
                if (new->intr.cpu != -1)
@@ -446,13 +452,13 @@ static int ionic_qcq_alloc(struct ionic_lif *lif, unsigned int type,
        if (!new->cq.info) {
                netdev_err(lif->netdev, "Cannot allocate completion queue info\n");
                err = -ENOMEM;
-               goto err_out_free_intr;
+               goto err_out_free_irq;
        }
 
        err = ionic_cq_init(lif, &new->cq, &new->intr, num_descs, cq_desc_size);
        if (err) {
                netdev_err(lif->netdev, "Cannot initialize completion queue\n");
-               goto err_out_free_intr;
+               goto err_out_free_irq;
        }
 
        new->base = dma_alloc_coherent(dev, total_size, &new->base_pa,
@@ -460,7 +466,7 @@ static int ionic_qcq_alloc(struct ionic_lif *lif, unsigned int type,
        if (!new->base) {
                netdev_err(lif->netdev, "Cannot allocate queue DMA memory\n");
                err = -ENOMEM;
-               goto err_out_free_intr;
+               goto err_out_free_irq;
        }
 
        new->total_size = total_size;
@@ -486,8 +492,12 @@ static int ionic_qcq_alloc(struct ionic_lif *lif, unsigned int type,
 
        return 0;
 
+err_out_free_irq:
+       if (flags & IONIC_QCQ_F_INTR)
+               devm_free_irq(dev, new->intr.vector, &new->napi);
 err_out_free_intr:
-       ionic_intr_free(lif, new->intr.index);
+       if (flags & IONIC_QCQ_F_INTR)
+               ionic_intr_free(lif, new->intr.index);
 err_out:
        dev_err(dev, "qcq alloc of %s%d failed %d\n", name, index, err);
        return err;
@@ -664,12 +674,6 @@ static int ionic_lif_rxq_init(struct ionic_lif *lif, struct ionic_qcq *qcq)
        netif_napi_add(lif->netdev, &qcq->napi, ionic_rx_napi,
                       NAPI_POLL_WEIGHT);
 
-       err = ionic_request_irq(lif, qcq);
-       if (err) {
-               netif_napi_del(&qcq->napi);
-               return err;
-       }
-
        qcq->flags |= IONIC_QCQ_F_INITED;
 
        return 0;
@@ -2141,13 +2145,6 @@ static int ionic_lif_adminq_init(struct ionic_lif *lif)
        netif_napi_add(lif->netdev, &qcq->napi, ionic_adminq_napi,
                       NAPI_POLL_WEIGHT);
 
-       err = ionic_request_irq(lif, qcq);
-       if (err) {
-               netdev_warn(lif->netdev, "adminq irq request failed %d\n", err);
-               netif_napi_del(&qcq->napi);
-               return err;
-       }
-
        napi_enable(&qcq->napi);
 
        if (qcq->flags & IONIC_QCQ_F_INTR)