lkml.org 
[lkml]   [2020]   [Jun]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 050/261] ice: Fix for memory leaks and modify ICE_FREE_CQ_BUFS
    Date
    From: Surabhi Boob <surabhi.boob@intel.com>

    [ Upstream commit 68d270783742783f96e89ef92ac24ab3c7fb1d31 ]

    Handle memory leaks during control queue initialization and
    buffer allocation failures. The macro ICE_FREE_CQ_BUFS is modified to
    re-use for this fix.

    Signed-off-by: Surabhi Boob <surabhi.boob@intel.com>
    Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
    Tested-by: Andrew Bowers <andrewx.bowers@intel.com>
    Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/ethernet/intel/ice/ice_controlq.c | 49 +++++++++++--------
    1 file changed, 28 insertions(+), 21 deletions(-)

    diff --git a/drivers/net/ethernet/intel/ice/ice_controlq.c b/drivers/net/ethernet/intel/ice/ice_controlq.c
    index c68709c7ef81..2e9c97bad3c3 100644
    --- a/drivers/net/ethernet/intel/ice/ice_controlq.c
    +++ b/drivers/net/ethernet/intel/ice/ice_controlq.c
    @@ -199,7 +199,9 @@ unwind_alloc_rq_bufs:
    cq->rq.r.rq_bi[i].pa = 0;
    cq->rq.r.rq_bi[i].size = 0;
    }
    + cq->rq.r.rq_bi = NULL;
    devm_kfree(ice_hw_to_dev(hw), cq->rq.dma_head);
    + cq->rq.dma_head = NULL;

    return ICE_ERR_NO_MEMORY;
    }
    @@ -245,7 +247,9 @@ unwind_alloc_sq_bufs:
    cq->sq.r.sq_bi[i].pa = 0;
    cq->sq.r.sq_bi[i].size = 0;
    }
    + cq->sq.r.sq_bi = NULL;
    devm_kfree(ice_hw_to_dev(hw), cq->sq.dma_head);
    + cq->sq.dma_head = NULL;

    return ICE_ERR_NO_MEMORY;
    }
    @@ -304,6 +308,28 @@ ice_cfg_rq_regs(struct ice_hw *hw, struct ice_ctl_q_info *cq)
    return 0;
    }

    +#define ICE_FREE_CQ_BUFS(hw, qi, ring) \
    +do { \
    + int i; \
    + /* free descriptors */ \
    + if ((qi)->ring.r.ring##_bi) \
    + for (i = 0; i < (qi)->num_##ring##_entries; i++) \
    + if ((qi)->ring.r.ring##_bi[i].pa) { \
    + dmam_free_coherent(ice_hw_to_dev(hw), \
    + (qi)->ring.r.ring##_bi[i].size, \
    + (qi)->ring.r.ring##_bi[i].va, \
    + (qi)->ring.r.ring##_bi[i].pa); \
    + (qi)->ring.r.ring##_bi[i].va = NULL;\
    + (qi)->ring.r.ring##_bi[i].pa = 0;\
    + (qi)->ring.r.ring##_bi[i].size = 0;\
    + } \
    + /* free the buffer info list */ \
    + if ((qi)->ring.cmd_buf) \
    + devm_kfree(ice_hw_to_dev(hw), (qi)->ring.cmd_buf); \
    + /* free DMA head */ \
    + devm_kfree(ice_hw_to_dev(hw), (qi)->ring.dma_head); \
    +} while (0)
    +
    /**
    * ice_init_sq - main initialization routine for Control ATQ
    * @hw: pointer to the hardware structure
    @@ -357,6 +383,7 @@ static enum ice_status ice_init_sq(struct ice_hw *hw, struct ice_ctl_q_info *cq)
    goto init_ctrlq_exit;

    init_ctrlq_free_rings:
    + ICE_FREE_CQ_BUFS(hw, cq, sq);
    ice_free_cq_ring(hw, &cq->sq);

    init_ctrlq_exit:
    @@ -416,33 +443,13 @@ static enum ice_status ice_init_rq(struct ice_hw *hw, struct ice_ctl_q_info *cq)
    goto init_ctrlq_exit;

    init_ctrlq_free_rings:
    + ICE_FREE_CQ_BUFS(hw, cq, rq);
    ice_free_cq_ring(hw, &cq->rq);

    init_ctrlq_exit:
    return ret_code;
    }

    -#define ICE_FREE_CQ_BUFS(hw, qi, ring) \
    -do { \
    - int i; \
    - /* free descriptors */ \
    - for (i = 0; i < (qi)->num_##ring##_entries; i++) \
    - if ((qi)->ring.r.ring##_bi[i].pa) { \
    - dmam_free_coherent(ice_hw_to_dev(hw), \
    - (qi)->ring.r.ring##_bi[i].size,\
    - (qi)->ring.r.ring##_bi[i].va,\
    - (qi)->ring.r.ring##_bi[i].pa);\
    - (qi)->ring.r.ring##_bi[i].va = NULL; \
    - (qi)->ring.r.ring##_bi[i].pa = 0; \
    - (qi)->ring.r.ring##_bi[i].size = 0; \
    - } \
    - /* free the buffer info list */ \
    - if ((qi)->ring.cmd_buf) \
    - devm_kfree(ice_hw_to_dev(hw), (qi)->ring.cmd_buf); \
    - /* free DMA head */ \
    - devm_kfree(ice_hw_to_dev(hw), (qi)->ring.dma_head); \
    -} while (0)
    -
    /**
    * ice_shutdown_sq - shutdown the Control ATQ
    * @hw: pointer to the hardware structure
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-06-19 18:10    [W:3.931 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site