lkml.org 
[lkml]   [2019]   [Jan]   [11]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 036/105] net: hns: Free irq when exit from abnormal branch
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    [ Upstream commit c82bd077e1ba3dd586569c733dc6d3dd4b0e43cd ]

    1.In "hns_nic_init_irq", if request irq fail at index i,
    the function return directly without releasing irq resources
    that already requested.

    2.In "hns_nic_net_up" after "hns_nic_init_irq",
    if exceptional branch occurs, irqs that already requested
    are not release.

    Signed-off-by: Yonglong Liu <liuyonglong@huawei.com>
    Signed-off-by: Peng Li <lipeng321@huawei.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/ethernet/hisilicon/hns/hns_enet.c | 23 ++++++++++++++++++-
    1 file changed, 22 insertions(+), 1 deletion(-)

    diff --git a/drivers/net/ethernet/hisilicon/hns/hns_enet.c b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
    index 801fbcebfbaa..bcd9aaba09b3 100644
    --- a/drivers/net/ethernet/hisilicon/hns/hns_enet.c
    +++ b/drivers/net/ethernet/hisilicon/hns/hns_enet.c
    @@ -1384,6 +1384,22 @@ static int hns_nic_init_affinity_mask(int q_num, int ring_idx,
    return cpu;
    }

    +static void hns_nic_free_irq(int q_num, struct hns_nic_priv *priv)
    +{
    + int i;
    +
    + for (i = 0; i < q_num * 2; i++) {
    + if (priv->ring_data[i].ring->irq_init_flag == RCB_IRQ_INITED) {
    + irq_set_affinity_hint(priv->ring_data[i].ring->irq,
    + NULL);
    + free_irq(priv->ring_data[i].ring->irq,
    + &priv->ring_data[i]);
    + priv->ring_data[i].ring->irq_init_flag =
    + RCB_IRQ_NOT_INITED;
    + }
    + }
    +}
    +
    static int hns_nic_init_irq(struct hns_nic_priv *priv)
    {
    struct hnae_handle *h = priv->ae_handle;
    @@ -1409,7 +1425,7 @@ static int hns_nic_init_irq(struct hns_nic_priv *priv)
    if (ret) {
    netdev_err(priv->netdev, "request irq(%d) fail\n",
    rd->ring->irq);
    - return ret;
    + goto out_free_irq;
    }
    disable_irq(rd->ring->irq);

    @@ -1424,6 +1440,10 @@ static int hns_nic_init_irq(struct hns_nic_priv *priv)
    }

    return 0;
    +
    +out_free_irq:
    + hns_nic_free_irq(h->q_num, priv);
    + return ret;
    }

    static int hns_nic_net_up(struct net_device *ndev)
    @@ -1471,6 +1491,7 @@ static int hns_nic_net_up(struct net_device *ndev)
    for (j = i - 1; j >= 0; j--)
    hns_nic_ring_close(ndev, j);

    + hns_nic_free_irq(h->q_num, priv);
    set_bit(NIC_STATE_DOWN, &priv->state);

    return ret;
    --
    2.19.1


    \
     
     \ /
      Last update: 2019-01-11 16:03    [W:4.302 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site