lkml.org 
[lkml]   [2022]   [Jun]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 289/667] drm/msm/dp: fix event thread stuck in wait_event after kthread_stop()
    Date
    From: Kuogee Hsieh <quic_khsieh@quicinc.com>

    [ Upstream commit 2f9b5b3ae2eb625b75a898212a76f3b8c6d0d2b0 ]

    Event thread supposed to exit from its while loop after kthread_stop().
    However there may has possibility that event thread is pending in the
    middle of wait_event due to condition checking never become true.
    To make sure event thread exit its loop after kthread_stop(), this
    patch OR kthread_should_stop() into wait_event's condition checking
    so that event thread will exit its loop after kernal_stop().

    Changes in v2:
    -- correct spelling error at commit title

    Changes in v3:
    -- remove unnecessary parenthesis
    -- while(1) to replace while (!kthread_should_stop())

    Reported-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
    Fixes: 570d3e5d28db ("drm/msm/dp: stop event kernel thread when DP unbind")
    Signed-off-by: Kuogee Hsieh <quic_khsieh@quicinc.com>
    Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
    Reviewed-by: Stephen Boyd <swboyd@chromium.org>
    Patchwork: https://patchwork.freedesktop.org/patch/484576/
    Link: https://lore.kernel.org/r/1651595136-24312-1-git-send-email-quic_khsieh@quicinc.com
    Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/gpu/drm/msm/dp/dp_display.c | 13 +++++++++----
    1 file changed, 9 insertions(+), 4 deletions(-)

    diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c
    index 00e7d9db6199..7b624191abf1 100644
    --- a/drivers/gpu/drm/msm/dp/dp_display.c
    +++ b/drivers/gpu/drm/msm/dp/dp_display.c
    @@ -1069,15 +1069,20 @@ static int hpd_event_thread(void *data)

    dp_priv = (struct dp_display_private *)data;

    - while (!kthread_should_stop()) {
    + while (1) {
    if (timeout_mode) {
    wait_event_timeout(dp_priv->event_q,
    - (dp_priv->event_pndx == dp_priv->event_gndx),
    - EVENT_TIMEOUT);
    + (dp_priv->event_pndx == dp_priv->event_gndx) ||
    + kthread_should_stop(), EVENT_TIMEOUT);
    } else {
    wait_event_interruptible(dp_priv->event_q,
    - (dp_priv->event_pndx != dp_priv->event_gndx));
    + (dp_priv->event_pndx != dp_priv->event_gndx) ||
    + kthread_should_stop());
    }
    +
    + if (kthread_should_stop())
    + break;
    +
    spin_lock_irqsave(&dp_priv->event_lock, flag);
    todo = &dp_priv->event_list[dp_priv->event_gndx];
    if (todo->delay) {
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-06-07 20:49    [W:4.362 / U:0.260 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site