• Jassi Brar's avatar
    mailbox: avoid timer start from callback · c7dacf5b
    Jassi Brar authored
    If the txdone is done by polling, it is possible for msg_submit() to start
    the timer while txdone_hrtimer() callback is running. If the timer needs
    recheduling, it could already be enqueued by the time hrtimer_forward_now()
    is called, leading hrtimer to loudly complain.
    
    WARNING: CPU: 3 PID: 74 at kernel/time/hrtimer.c:932 hrtimer_forward+0xc4/0x110
    CPU: 3 PID: 74 Comm: kworker/u8:1 Not tainted 5.9.0-rc2-00236-gd3520067d01c-dirty #5
    Hardware name: Libre Computer AML-S805X-AC (DT)
    Workqueue: events_freezable_power_ thermal_zone_device_check
    pstate: 20000085 (nzCv daIf -PAN -UAO BTYPE=--)
    pc : hrtimer_forward+0xc4/0x110
    lr : txdone_hrtimer+0xf8/0x118
    [...]
    
    This can be fixed by not starting the timer from the callback path. Which
    requires the timer reloading as long as any message is queued on the
    channel, and not just when current tx is not done yet.
    
    Fixes: 0cc67945 ("mailbox: switch to hrtimer for tx_complete polling")
    Reported-by: default avatarDa Xue <da@libre.computer>
    Reviewed-by: default avatarSudeep Holla <sudeep.holla@arm.com>
    Tested-by: default avatarSudeep Holla <sudeep.holla@arm.com>
    Acked-by: default avatarJerome Brunet <jbrunet@baylibre.com>
    Tested-by: default avatarJerome Brunet <jbrunet@baylibre.com>
    Signed-off-by: default avatarJassi Brar <jaswinder.singh@linaro.org>
    c7dacf5b
mailbox.c 16 KB