I made the condition of the wait_event_timeout call in
gm12u320_fb_update_work a helper which takes a mutex to make sure
that any writes to fb_update.run or fb_update.fb from other CPU cores
are seen before the check is done.

This is not necessary as the wait_event helpers contain the necessary
barriers for this themselves.

More over it is harmfull since by the time the check is done the task
is no longer in the TASK_RUNNING state and calling mutex_lock while not
in task-running is not allowed, leading to this warning when the kernel
is build with some extra locking checks enabled:

[11947.450011] do not call blocking ops when !TASK_RUNNING; state=2 set at
               [<00000000e4306de6>] prepare_to_wait_event+0x61/0x190

This commit fixes this by dropping the helper and simply directly
checking the condition (without unnecessary locking) in the
wait_event_timeout call.

Signed-off-by: Hans de Goede <[email protected]>
---
 drivers/gpu/drm/tiny/gm12u320.c | 14 ++------------
 1 file changed, 2 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/tiny/gm12u320.c b/drivers/gpu/drm/tiny/gm12u320.c
index 4c47aa4de09b..4d66765b1125 100644
--- a/drivers/gpu/drm/tiny/gm12u320.c
+++ b/drivers/gpu/drm/tiny/gm12u320.c
@@ -342,17 +342,6 @@ static void gm12u320_copy_fb_to_blocks(struct 
gm12u320_device *gm12u320)
        mutex_unlock(&gm12u320->fb_update.lock);
 }
 
-static int gm12u320_fb_update_ready(struct gm12u320_device *gm12u320)
-{
-       int ret;
-
-       mutex_lock(&gm12u320->fb_update.lock);
-       ret = !gm12u320->fb_update.run || gm12u320->fb_update.fb != NULL;
-       mutex_unlock(&gm12u320->fb_update.lock);
-
-       return ret;
-}
-
 static void gm12u320_fb_update_work(struct work_struct *work)
 {
        struct gm12u320_device *gm12u320 =
@@ -426,7 +415,8 @@ static void gm12u320_fb_update_work(struct work_struct 
*work)
                 * switches back to showing its logo.
                 */
                wait_event_timeout(gm12u320->fb_update.waitq,
-                                  gm12u320_fb_update_ready(gm12u320),
+                                  !gm12u320->fb_update.run ||
+                                       gm12u320->fb_update.fb != NULL,
                                   IDLE_TIMEOUT);
        }
        return;
-- 
2.22.0

_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to