• Tejun Heo's avatar
    dmatest: don't use set_freezable_with_signal() · adfa543e
    Tejun Heo authored
    Commit 981ed70d (dmatest: make dmatest threads freezable) made
    dmatest kthread use set_freezable_with_signal(); however, the
    interface is scheduled to be removed in the next merge window.
    
    The problem is that unlike userland tasks there's no default place
    which handles signal pending state and it isn't clear who owns and/or
    is responsible for clearing TIF_SIGPENDING.  For example, in the
    current code, try_to_freeze() clears TIF_SIGPENDING but it isn't sure
    whether it actually owns the TIF_SIGPENDING nor is it race-free -
    ie. the task may continue to run with TIF_SIGPENDING set after the
    freezable section.
    
    Unfortunately, we don't have wait_for_completion_freezable_timeout().
    This patch open codes it and uses wait_event_freezable_timeout()
    instead and removes timeout reloading - wait_event_freezable_timeout()
    won't return across freezing events (currently racy but fix scheduled)
    and timer doesn't decrement while the task is in freezer.  Although
    this does lose timer-reset-over-freezing, given that timeout is
    supposed to be long enough and failure to finish inside is considered
    irrecoverable, I don't think this is worth the complexity.
    
    While at it, move completion to outer scope and explain that we're
    ignoring dangling pointer problem after timeout.  This should give
    slightly better chance at avoiding oops after timeout.
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    Acked-by: default avatarDan Williams <dan.j.williams@intel.com>
    Cc: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
    Cc: Nicolas Ferre <nicolas.ferre@atmel.com>
    adfa543e
dmatest.c 17.6 KB