• O
    V4L/DVB (5818): CinergyT2: fix flush_workqueue() vs work->func() deadlock · 1e4597e8
    Oleg Nesterov 提交于
    Spotted and tested by Thomas Sattler <tsattler@gmx.de>.
    
    cinergyT2.c does cancel_delayed_work() + flush_scheduled_work() while
    holding cinergyt2->sem. This leads to deadlock because work->func()
    needs the same mutex to complete. Another bug is that this code in fact
    can't reliably stop the re-arming delayed_work.
    
    Convert this code to use cancel_rearming_delayed_work() and move it
    out of ->sem. Another mutex, ->wq_sem, was added to protect against the
    concurrent open/resume.
    
    This patch is a horrible hack to fix the lockup which happens in practice.
    As Dmitry Torokhov pointed out this driver has other problems and needs
    further changes.
    Signed-off-by: NOleg Nesterov <oleg@tv-sign.ru>
    Signed-off-by: NMauro Carvalho Chehab <mchehab@infradead.org>
    1e4597e8
cinergyT2.c 28.5 KB