lkml.org 
[lkml]   [2021]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 279/575] ath11k: fix some sleeping in atomic bugs
    Date
    From: Dan Carpenter <dan.carpenter@oracle.com>

    [ Upstream commit aadf7c81a0771b8f1c97dabca6a48bae1b387779 ]

    The ath11k_dbring_bufs_replenish() and ath11k_dbring_fill_bufs()
    take a "gfp" parameter but they since they take spinlocks, the
    allocations they do have to be atomic. This causes a bug because
    ath11k_dbring_buf_setup passes GFP_KERNEL for the gfp flags.

    The fix is to use GFP_ATOMIC and remove the unused parameters.

    Fixes: bd6478559e27 ("ath11k: Add direct buffer ring support")
    Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
    Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
    Link: https://lore.kernel.org/r/20210812070434.GE31863@kili
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/wireless/ath/ath11k/dbring.c | 16 +++++++---------
    1 file changed, 7 insertions(+), 9 deletions(-)

    diff --git a/drivers/net/wireless/ath/ath11k/dbring.c b/drivers/net/wireless/ath/ath11k/dbring.c
    index 5e1f5437b4185..fd98ba5b1130b 100644
    --- a/drivers/net/wireless/ath/ath11k/dbring.c
    +++ b/drivers/net/wireless/ath/ath11k/dbring.c
    @@ -8,8 +8,7 @@

    static int ath11k_dbring_bufs_replenish(struct ath11k *ar,
    struct ath11k_dbring *ring,
    - struct ath11k_dbring_element *buff,
    - gfp_t gfp)
    + struct ath11k_dbring_element *buff)
    {
    struct ath11k_base *ab = ar->ab;
    struct hal_srng *srng;
    @@ -35,7 +34,7 @@ static int ath11k_dbring_bufs_replenish(struct ath11k *ar,
    goto err;

    spin_lock_bh(&ring->idr_lock);
    - buf_id = idr_alloc(&ring->bufs_idr, buff, 0, ring->bufs_max, gfp);
    + buf_id = idr_alloc(&ring->bufs_idr, buff, 0, ring->bufs_max, GFP_ATOMIC);
    spin_unlock_bh(&ring->idr_lock);
    if (buf_id < 0) {
    ret = -ENOBUFS;
    @@ -72,8 +71,7 @@ err:
    }

    static int ath11k_dbring_fill_bufs(struct ath11k *ar,
    - struct ath11k_dbring *ring,
    - gfp_t gfp)
    + struct ath11k_dbring *ring)
    {
    struct ath11k_dbring_element *buff;
    struct hal_srng *srng;
    @@ -92,11 +90,11 @@ static int ath11k_dbring_fill_bufs(struct ath11k *ar,
    size = sizeof(*buff) + ring->buf_sz + align - 1;

    while (num_remain > 0) {
    - buff = kzalloc(size, gfp);
    + buff = kzalloc(size, GFP_ATOMIC);
    if (!buff)
    break;

    - ret = ath11k_dbring_bufs_replenish(ar, ring, buff, gfp);
    + ret = ath11k_dbring_bufs_replenish(ar, ring, buff);
    if (ret) {
    ath11k_warn(ar->ab, "failed to replenish db ring num_remain %d req_ent %d\n",
    num_remain, req_entries);
    @@ -176,7 +174,7 @@ int ath11k_dbring_buf_setup(struct ath11k *ar,
    ring->hp_addr = ath11k_hal_srng_get_hp_addr(ar->ab, srng);
    ring->tp_addr = ath11k_hal_srng_get_tp_addr(ar->ab, srng);

    - ret = ath11k_dbring_fill_bufs(ar, ring, GFP_KERNEL);
    + ret = ath11k_dbring_fill_bufs(ar, ring);

    return ret;
    }
    @@ -322,7 +320,7 @@ int ath11k_dbring_buffer_release_event(struct ath11k_base *ab,
    }

    memset(buff, 0, size);
    - ath11k_dbring_bufs_replenish(ar, ring, buff, GFP_ATOMIC);
    + ath11k_dbring_bufs_replenish(ar, ring, buff);
    }

    spin_unlock_bh(&srng->lock);
    --
    2.33.0


    \
     
     \ /
      Last update: 2021-11-15 21:05    [W:2.689 / U:1.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site