lkml.org 
[lkml]   [2018]   [Apr]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL for 3.18 030/101] net_sched: move tcf_lock down after gen_replace_estimator()
    Date
    From: WANG Cong <xiyou.wangcong@gmail.com>

    [ Upstream commit 74030603dfd9f76c0f279f19f1dd1ee3028fee7a ]

    Laura reported a sleep-in-atomic kernel warning inside
    tcf_act_police_init() which calls gen_replace_estimator() with
    spinlock protection.

    It is not necessary in this case, we already have RTNL lock here
    so it is enough to protect concurrent writers. For the reader,
    i.e. tcf_act_police(), it needs to make decision based on this
    rate estimator, in the worst case we drop more/less packets than
    necessary while changing the rate in parallel, it is still acceptable.

    Reported-by: Laura Abbott <labbott@redhat.com>
    Reported-by: Nick Huber <nicholashuber@gmail.com>
    Cc: Jamal Hadi Salim <jhs@mojatatu.com>
    Signed-off-by: Cong Wang <xiyou.wangcong@gmail.com>
    Acked-by: Jamal Hadi Salim <jhs@mojatatu.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    ---
    net/sched/act_police.c | 8 +++-----
    1 file changed, 3 insertions(+), 5 deletions(-)

    diff --git a/net/sched/act_police.c b/net/sched/act_police.c
    index 69791ca77a05..1a25d25b9a56 100644
    --- a/net/sched/act_police.c
    +++ b/net/sched/act_police.c
    @@ -176,21 +176,21 @@ override:
    }
    }

    - spin_lock_bh(&police->tcf_lock);
    if (est) {
    err = gen_replace_estimator(&police->tcf_bstats, NULL,
    &police->tcf_rate_est,
    &police->tcf_lock, est);
    if (err)
    - goto failure_unlock;
    + goto failure;
    } else if (tb[TCA_POLICE_AVRATE] &&
    (ret == ACT_P_CREATED ||
    !gen_estimator_active(&police->tcf_bstats,
    &police->tcf_rate_est))) {
    err = -EINVAL;
    - goto failure_unlock;
    + goto failure;
    }

    + spin_lock_bh(&police->tcf_lock);
    /* No failure allowed after this point */
    police->tcfp_mtu = parm->mtu;
    if (police->tcfp_mtu == 0) {
    @@ -242,8 +242,6 @@ override:
    a->priv = police;
    return ret;

    -failure_unlock:
    - spin_unlock_bh(&police->tcf_lock);
    failure:
    qdisc_put_rtab(P_tab);
    qdisc_put_rtab(R_tab);
    --
    2.15.1
    \
     
     \ /
      Last update: 2018-04-09 02:59    [W:4.045 / U:0.192 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site