lkml.org 
[lkml]   [2020]   [Apr]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 04/24] rcu/tree: Repeat the monitor if any free channel is busy
    Date
    It can be that one of the channels can not be detached
    due to the fact that its free channel and previous data
    has not been processed yet. From the other hand another
    channel can be successfully detached causing the monitor
    work to stop.

    To prevent that, if there are any channels are still in
    pending state after a detach attempt, just reschedule
    the monitor work.

    Signed-off-by: Uladzislau Rezki (Sony) <urezki@gmail.com>
    ---
    kernel/rcu/tree.c | 9 ++++++---
    1 file changed, 6 insertions(+), 3 deletions(-)

    diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c
    index 1487af8e11e8..0762ac06f0b7 100644
    --- a/kernel/rcu/tree.c
    +++ b/kernel/rcu/tree.c
    @@ -2995,7 +2995,7 @@ static void kfree_rcu_work(struct work_struct *work)
    static inline bool queue_kfree_rcu_work(struct kfree_rcu_cpu *krcp)
    {
    struct kfree_rcu_cpu_work *krwp;
    - bool queued = false;
    + bool repeat = false;
    int i;

    lockdep_assert_held(&krcp->lock);
    @@ -3033,11 +3033,14 @@ static inline bool queue_kfree_rcu_work(struct kfree_rcu_cpu *krcp)
    * been detached following each other, one by one.
    */
    queue_rcu_work(system_wq, &krwp->rcu_work);
    - queued = true;
    }
    +
    + /* Repeat if any "free" corresponding channel is still busy. */
    + if (krcp->bhead || krcp->head)
    + repeat = true;
    }

    - return queued;
    + return !repeat;
    }

    static inline void kfree_rcu_drain_unlock(struct kfree_rcu_cpu *krcp,
    --
    2.20.1
    \
     
     \ /
      Last update: 2020-04-28 23:00    [W:2.766 / U:0.112 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site