• Jeremy Kerr's avatar
    ps3fb: fix deadlock on kexec() · 8dab6376
    Jeremy Kerr authored
    Since the introduction of the acquire_console_sem calls in
    0333d835, kexecing can cause the
    kernel to deadlock:
    
     ps3fb_shutdown()
      -> unregister_framebuffer()
      -> fb_notifier_call_chain(FB_EVENT_FB_UNBIND)
      -> fbcon_fb_unbind()
      -> unbind_con_driver()
      -> bind_con_driver()
    	[ acquires console_sem ]
      -> fbcon_deinit()
      -> fbops->fb_release(newinfo, 0)
      -> ps3fb_release()
      -> ps3fb_sync()
    	[ acquires console_sem ]
    
    This change avoids the deadlock by moving the acquire_console_sem()
    out of ps3fb_sync(), and puts it into the two other callsites, leaving
    ps3fb_release() to call ps3fb_sync() without the console semaphore.
    
    [Geert]
      - Corrected call sequence above
      - ps3fb_release() may be called with and without console_sem held. This is an
        inconsistency that should be fixed at the fb level, but for now, try to
        acquire console_sem in ps3fb_release().
    
        I think it's safer to let ps3fb_release() try to acquire console_sem and
        not refresh the screen if it fails, than to call ps3fb_sync() without
        holding console_sem, as ps3fb_par may be modified at the same time, causing
        crashes or lockups.
    
        Besides, ps3fb_release() only calls ps3fb_sync() to refresh the screen
        when display flipping is disabled, which is an uncommon case (except during
        shutdown/kexec).
    Signed-off-by: default avatarJeremy Kerr <jk@ozlabs.org>
    Signed-off-by: default avatarGeert Uytterhoeven <Geert.Uytterhoeven@sonycom.com>
    Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    8dab6376
ps3fb.c 33.3 KB