Revision 712f3147aee0fbbbbed2da20b21b272c5505125e authored by Linus Torvalds on 13 May 2011, 23:16:41 UTC, committed by Linus Torvalds on 14 May 2011, 17:23:44 UTC
When a register_framebuffer() call results in us removing old
conflicting framebuffers, the new registration_lock doesn't protect that
situation.  And we can't just add the same locking to the function,
because these functions call each other: register_framebuffer() calls
remove_conflicting_framebuffers, which in turn calls
unregister_framebuffer for any conflicting entry.

In order to fix it, this just creates wrapper functions around all three
functions and makes the versions that actually do the work be called
"do_xxx()", leaving just the wrapper that gets the lock and calls the
worker function.

So the rule becomes simply that "do_xxxx()" has to be called with the
lock held, and now do_register_framebuffer() can just call
do_remove_conflicting_framebuffers(), and that in turn can call
_do_unregister_framebuffer(), and there is no deadlock, and we can hold
the registration lock over the whole sequence, fixing the races.

It also makes error cases simpler, and fixes one situation where we
would return from unregister_framebuffer() without releasing the lock,
pointed out by Bruno Prémont.

Tested-by: Bruno Prémont <bonbons@linux-vserver.org>
Tested-by: Anca Emanuel <anca.emanuel@gmail.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent c47747f
Raw File
Kconfig.debug
menu "Kernel hacking"

source "lib/Kconfig.debug"

config GPROF
	bool "Enable gprof support"
	depends on DEBUG_INFO && FRAME_POINTER
	help
	  This allows profiling of a User-Mode Linux kernel with the gprof
	  utility.

	  See <http://user-mode-linux.sourceforge.net/old/gprof.html> for more
	  details.

	  If you're involved in UML kernel development and want to use gprof,
	  say Y.  If you're unsure, say N.

config GCOV
	bool "Enable gcov support"
	depends on DEBUG_INFO
	help
	  This option allows developers to retrieve coverage data from a UML
	  session.

	  See <http://user-mode-linux.sourceforge.net/old/gprof.html> for more
	  details.

	  If you're involved in UML kernel development and want to use gcov,
	  say Y.  If you're unsure, say N.

config DEBUG_STACK_USAGE
	bool "Stack utilization instrumentation"
	default N
	help
	  Track the maximum kernel stack usage - this will look at each
	  kernel stack at process exit and log it if it's the deepest
	  stack seen so far.

	  This option will slow down process creation and destruction somewhat.
endmenu
back to top