Calling del_timer_sync() on an uninitialized timer leads to a never ending loop in lock_timer_base() that spins checking for a non-NULL timer base. Add an assertion to debugobjects to catch usage of uninitialized objects so that we can initialize timers in the del_timer_sync() path before it calls lock_timer_base(). [ sboyd@codeaurora.org: Clarify commit message ] Signed-off-by: Christine Chan <cschan@codeaurora.org> Signed-off-by: Stephen Boyd <sboyd@codeaurora.org> Cc: John Stultz <john.stultz@linaro.org> Link: http://lkml.kernel.org/r/1320724108-20788-3-git-send-email-sboyd@codeaurora.org Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
		
			
				
	
	
		
			441 lines
		
	
	
	
		
			16 KiB
			
		
	
	
	
		
			XML
		
	
	
	
	
	
			
		
		
	
	
			441 lines
		
	
	
	
		
			16 KiB
			
		
	
	
	
		
			XML
		
	
	
	
	
	
<?xml version="1.0" encoding="UTF-8"?>
 | 
						|
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
 | 
						|
	"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" []>
 | 
						|
 | 
						|
<book id="debug-objects-guide">
 | 
						|
 <bookinfo>
 | 
						|
  <title>Debug objects life time</title>
 | 
						|
 | 
						|
  <authorgroup>
 | 
						|
   <author>
 | 
						|
    <firstname>Thomas</firstname>
 | 
						|
    <surname>Gleixner</surname>
 | 
						|
    <affiliation>
 | 
						|
     <address>
 | 
						|
      <email>tglx@linutronix.de</email>
 | 
						|
     </address>
 | 
						|
    </affiliation>
 | 
						|
   </author>
 | 
						|
  </authorgroup>
 | 
						|
 | 
						|
  <copyright>
 | 
						|
   <year>2008</year>
 | 
						|
   <holder>Thomas Gleixner</holder>
 | 
						|
  </copyright>
 | 
						|
 | 
						|
  <legalnotice>
 | 
						|
   <para>
 | 
						|
     This documentation is free software; you can redistribute
 | 
						|
     it and/or modify it under the terms of the GNU General Public
 | 
						|
     License version 2 as published by the Free Software Foundation.
 | 
						|
   </para>
 | 
						|
 | 
						|
   <para>
 | 
						|
     This program is distributed in the hope that it will be
 | 
						|
     useful, but WITHOUT ANY WARRANTY; without even the implied
 | 
						|
     warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 | 
						|
     See the GNU General Public License for more details.
 | 
						|
   </para>
 | 
						|
 | 
						|
   <para>
 | 
						|
     You should have received a copy of the GNU General Public
 | 
						|
     License along with this program; if not, write to the Free
 | 
						|
     Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 | 
						|
     MA 02111-1307 USA
 | 
						|
   </para>
 | 
						|
 | 
						|
   <para>
 | 
						|
     For more details see the file COPYING in the source
 | 
						|
     distribution of Linux.
 | 
						|
   </para>
 | 
						|
  </legalnotice>
 | 
						|
 </bookinfo>
 | 
						|
 | 
						|
<toc></toc>
 | 
						|
 | 
						|
  <chapter id="intro">
 | 
						|
    <title>Introduction</title>
 | 
						|
    <para>
 | 
						|
      debugobjects is a generic infrastructure to track the life time
 | 
						|
      of kernel objects and validate the operations on those.
 | 
						|
    </para>
 | 
						|
    <para>
 | 
						|
      debugobjects is useful to check for the following error patterns:
 | 
						|
	<itemizedlist>
 | 
						|
	  <listitem><para>Activation of uninitialized objects</para></listitem>
 | 
						|
	  <listitem><para>Initialization of active objects</para></listitem>
 | 
						|
	  <listitem><para>Usage of freed/destroyed objects</para></listitem>
 | 
						|
	</itemizedlist>
 | 
						|
    </para>
 | 
						|
    <para>
 | 
						|
      debugobjects is not changing the data structure of the real
 | 
						|
      object so it can be compiled in with a minimal runtime impact
 | 
						|
      and enabled on demand with a kernel command line option.
 | 
						|
    </para>
 | 
						|
  </chapter>
 | 
						|
 | 
						|
  <chapter id="howto">
 | 
						|
    <title>Howto use debugobjects</title>
 | 
						|
    <para>
 | 
						|
      A kernel subsystem needs to provide a data structure which
 | 
						|
      describes the object type and add calls into the debug code at
 | 
						|
      appropriate places. The data structure to describe the object
 | 
						|
      type needs at minimum the name of the object type. Optional
 | 
						|
      functions can and should be provided to fixup detected problems
 | 
						|
      so the kernel can continue to work and the debug information can
 | 
						|
      be retrieved from a live system instead of hard core debugging
 | 
						|
      with serial consoles and stack trace transcripts from the
 | 
						|
      monitor.
 | 
						|
    </para>
 | 
						|
    <para>
 | 
						|
      The debug calls provided by debugobjects are:
 | 
						|
      <itemizedlist>
 | 
						|
	<listitem><para>debug_object_init</para></listitem>
 | 
						|
	<listitem><para>debug_object_init_on_stack</para></listitem>
 | 
						|
	<listitem><para>debug_object_activate</para></listitem>
 | 
						|
	<listitem><para>debug_object_deactivate</para></listitem>
 | 
						|
	<listitem><para>debug_object_destroy</para></listitem>
 | 
						|
	<listitem><para>debug_object_free</para></listitem>
 | 
						|
	<listitem><para>debug_object_assert_init</para></listitem>
 | 
						|
      </itemizedlist>
 | 
						|
      Each of these functions takes the address of the real object and
 | 
						|
      a pointer to the object type specific debug description
 | 
						|
      structure.
 | 
						|
    </para>
 | 
						|
    <para>
 | 
						|
      Each detected error is reported in the statistics and a limited
 | 
						|
      number of errors are printk'ed including a full stack trace.
 | 
						|
    </para>
 | 
						|
    <para>
 | 
						|
      The statistics are available via /sys/kernel/debug/debug_objects/stats.
 | 
						|
      They provide information about the number of warnings and the
 | 
						|
      number of successful fixups along with information about the
 | 
						|
      usage of the internal tracking objects and the state of the
 | 
						|
      internal tracking objects pool.
 | 
						|
    </para>
 | 
						|
  </chapter>
 | 
						|
  <chapter id="debugfunctions">
 | 
						|
    <title>Debug functions</title>
 | 
						|
    <sect1 id="prototypes">
 | 
						|
      <title>Debug object function reference</title>
 | 
						|
!Elib/debugobjects.c
 | 
						|
    </sect1>
 | 
						|
    <sect1 id="debug_object_init">
 | 
						|
      <title>debug_object_init</title>
 | 
						|
      <para>
 | 
						|
	This function is called whenever the initialization function
 | 
						|
	of a real object is called.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	When the real object is already tracked by debugobjects it is
 | 
						|
	checked, whether the object can be initialized.  Initializing
 | 
						|
	is not allowed for active and destroyed objects. When
 | 
						|
	debugobjects detects an error, then it calls the fixup_init
 | 
						|
	function of the object type description structure if provided
 | 
						|
	by the caller. The fixup function can correct the problem
 | 
						|
	before the real initialization of the object happens. E.g. it
 | 
						|
	can deactivate an active object in order to prevent damage to
 | 
						|
	the subsystem.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	When the real object is not yet tracked by debugobjects,
 | 
						|
	debugobjects allocates a tracker object for the real object
 | 
						|
	and sets the tracker object state to ODEBUG_STATE_INIT. It
 | 
						|
	verifies that the object is not on the callers stack. If it is
 | 
						|
	on the callers stack then a limited number of warnings
 | 
						|
	including a full stack trace is printk'ed. The calling code
 | 
						|
	must use debug_object_init_on_stack() and remove the object
 | 
						|
	before leaving the function which allocated it. See next
 | 
						|
	section.
 | 
						|
      </para>
 | 
						|
    </sect1>
 | 
						|
 | 
						|
    <sect1 id="debug_object_init_on_stack">
 | 
						|
      <title>debug_object_init_on_stack</title>
 | 
						|
      <para>
 | 
						|
	This function is called whenever the initialization function
 | 
						|
	of a real object which resides on the stack is called.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	When the real object is already tracked by debugobjects it is
 | 
						|
	checked, whether the object can be initialized. Initializing
 | 
						|
	is not allowed for active and destroyed objects. When
 | 
						|
	debugobjects detects an error, then it calls the fixup_init
 | 
						|
	function of the object type description structure if provided
 | 
						|
	by the caller. The fixup function can correct the problem
 | 
						|
	before the real initialization of the object happens. E.g. it
 | 
						|
	can deactivate an active object in order to prevent damage to
 | 
						|
	the subsystem.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	When the real object is not yet tracked by debugobjects
 | 
						|
	debugobjects allocates a tracker object for the real object
 | 
						|
	and sets the tracker object state to ODEBUG_STATE_INIT. It
 | 
						|
	verifies that the object is on the callers stack.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	An object which is on the stack must be removed from the
 | 
						|
	tracker by calling debug_object_free() before the function
 | 
						|
	which allocates the object returns. Otherwise we keep track of
 | 
						|
	stale objects.
 | 
						|
      </para>
 | 
						|
    </sect1>
 | 
						|
 | 
						|
    <sect1 id="debug_object_activate">
 | 
						|
      <title>debug_object_activate</title>
 | 
						|
      <para>
 | 
						|
	This function is called whenever the activation function of a
 | 
						|
	real object is called.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	When the real object is already tracked by debugobjects it is
 | 
						|
	checked, whether the object can be activated.  Activating is
 | 
						|
	not allowed for active and destroyed objects. When
 | 
						|
	debugobjects detects an error, then it calls the
 | 
						|
	fixup_activate function of the object type description
 | 
						|
	structure if provided by the caller. The fixup function can
 | 
						|
	correct the problem before the real activation of the object
 | 
						|
	happens. E.g. it can deactivate an active object in order to
 | 
						|
	prevent damage to the subsystem.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	When the real object is not yet tracked by debugobjects then
 | 
						|
	the fixup_activate function is called if available. This is
 | 
						|
	necessary to allow the legitimate activation of statically
 | 
						|
	allocated and initialized objects. The fixup function checks
 | 
						|
	whether the object is valid and calls the debug_objects_init()
 | 
						|
	function to initialize the tracking of this object.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	When the activation is legitimate, then the state of the
 | 
						|
	associated tracker object is set to ODEBUG_STATE_ACTIVE.
 | 
						|
      </para>
 | 
						|
    </sect1>
 | 
						|
 | 
						|
    <sect1 id="debug_object_deactivate">
 | 
						|
      <title>debug_object_deactivate</title>
 | 
						|
      <para>
 | 
						|
	This function is called whenever the deactivation function of
 | 
						|
	a real object is called.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	When the real object is tracked by debugobjects it is checked,
 | 
						|
	whether the object can be deactivated. Deactivating is not
 | 
						|
	allowed for untracked or destroyed objects.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	When the deactivation is legitimate, then the state of the
 | 
						|
	associated tracker object is set to ODEBUG_STATE_INACTIVE.
 | 
						|
      </para>
 | 
						|
    </sect1>
 | 
						|
 | 
						|
    <sect1 id="debug_object_destroy">
 | 
						|
      <title>debug_object_destroy</title>
 | 
						|
      <para>
 | 
						|
	This function is called to mark an object destroyed. This is
 | 
						|
	useful to prevent the usage of invalid objects, which are
 | 
						|
	still available in memory: either statically allocated objects
 | 
						|
	or objects which are freed later.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	When the real object is tracked by debugobjects it is checked,
 | 
						|
	whether the object can be destroyed. Destruction is not
 | 
						|
	allowed for active and destroyed objects. When debugobjects
 | 
						|
	detects an error, then it calls the fixup_destroy function of
 | 
						|
	the object type description structure if provided by the
 | 
						|
	caller. The fixup function can correct the problem before the
 | 
						|
	real destruction of the object happens. E.g. it can deactivate
 | 
						|
	an active object in order to prevent damage to the subsystem.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	When the destruction is legitimate, then the state of the
 | 
						|
	associated tracker object is set to ODEBUG_STATE_DESTROYED.
 | 
						|
      </para>
 | 
						|
    </sect1>
 | 
						|
 | 
						|
    <sect1 id="debug_object_free">
 | 
						|
      <title>debug_object_free</title>
 | 
						|
      <para>
 | 
						|
	This function is called before an object is freed.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	When the real object is tracked by debugobjects it is checked,
 | 
						|
	whether the object can be freed. Free is not allowed for
 | 
						|
	active objects. When debugobjects detects an error, then it
 | 
						|
	calls the fixup_free function of the object type description
 | 
						|
	structure if provided by the caller. The fixup function can
 | 
						|
	correct the problem before the real free of the object
 | 
						|
	happens. E.g. it can deactivate an active object in order to
 | 
						|
	prevent damage to the subsystem.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	Note that debug_object_free removes the object from the
 | 
						|
	tracker. Later usage of the object is detected by the other
 | 
						|
	debug checks.
 | 
						|
      </para>
 | 
						|
    </sect1>
 | 
						|
 | 
						|
    <sect1 id="debug_object_assert_init">
 | 
						|
      <title>debug_object_assert_init</title>
 | 
						|
      <para>
 | 
						|
	This function is called to assert that an object has been
 | 
						|
	initialized.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	When the real object is not tracked by debugobjects, it calls
 | 
						|
	fixup_assert_init of the object type description structure
 | 
						|
	provided by the caller, with the hardcoded object state
 | 
						|
	ODEBUG_NOT_AVAILABLE. The fixup function can correct the problem
 | 
						|
	by calling debug_object_init and other specific initializing
 | 
						|
	functions.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	When the real object is already tracked by debugobjects it is
 | 
						|
	ignored.
 | 
						|
      </para>
 | 
						|
    </sect1>
 | 
						|
  </chapter>
 | 
						|
  <chapter id="fixupfunctions">
 | 
						|
    <title>Fixup functions</title>
 | 
						|
    <sect1 id="debug_obj_descr">
 | 
						|
      <title>Debug object type description structure</title>
 | 
						|
!Iinclude/linux/debugobjects.h
 | 
						|
    </sect1>
 | 
						|
    <sect1 id="fixup_init">
 | 
						|
      <title>fixup_init</title>
 | 
						|
      <para>
 | 
						|
	This function is called from the debug code whenever a problem
 | 
						|
	in debug_object_init is detected. The function takes the
 | 
						|
	address of the object and the state which is currently
 | 
						|
	recorded in the tracker.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	Called from debug_object_init when the object state is:
 | 
						|
	<itemizedlist>
 | 
						|
	  <listitem><para>ODEBUG_STATE_ACTIVE</para></listitem>
 | 
						|
	</itemizedlist>
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	The function returns 1 when the fixup was successful,
 | 
						|
	otherwise 0. The return value is used to update the
 | 
						|
	statistics.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	Note, that the function needs to call the debug_object_init()
 | 
						|
	function again, after the damage has been repaired in order to
 | 
						|
	keep the state consistent.
 | 
						|
      </para>
 | 
						|
    </sect1>
 | 
						|
 | 
						|
    <sect1 id="fixup_activate">
 | 
						|
      <title>fixup_activate</title>
 | 
						|
      <para>
 | 
						|
	This function is called from the debug code whenever a problem
 | 
						|
	in debug_object_activate is detected.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	Called from debug_object_activate when the object state is:
 | 
						|
	<itemizedlist>
 | 
						|
	  <listitem><para>ODEBUG_STATE_NOTAVAILABLE</para></listitem>
 | 
						|
	  <listitem><para>ODEBUG_STATE_ACTIVE</para></listitem>
 | 
						|
	</itemizedlist>
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	The function returns 1 when the fixup was successful,
 | 
						|
	otherwise 0. The return value is used to update the
 | 
						|
	statistics.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	Note that the function needs to call the debug_object_activate()
 | 
						|
	function again after the damage has been repaired in order to
 | 
						|
	keep the state consistent.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	The activation of statically initialized objects is a special
 | 
						|
	case. When debug_object_activate() has no tracked object for
 | 
						|
	this object address then fixup_activate() is called with
 | 
						|
	object state ODEBUG_STATE_NOTAVAILABLE. The fixup function
 | 
						|
	needs to check whether this is a legitimate case of a
 | 
						|
	statically initialized object or not. In case it is it calls
 | 
						|
	debug_object_init() and debug_object_activate() to make the
 | 
						|
	object known to the tracker and marked active. In this case
 | 
						|
	the function should return 0 because this is not a real fixup.
 | 
						|
      </para>
 | 
						|
    </sect1>
 | 
						|
 | 
						|
    <sect1 id="fixup_destroy">
 | 
						|
      <title>fixup_destroy</title>
 | 
						|
      <para>
 | 
						|
	This function is called from the debug code whenever a problem
 | 
						|
	in debug_object_destroy is detected.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	Called from debug_object_destroy when the object state is:
 | 
						|
	<itemizedlist>
 | 
						|
	  <listitem><para>ODEBUG_STATE_ACTIVE</para></listitem>
 | 
						|
	</itemizedlist>
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	The function returns 1 when the fixup was successful,
 | 
						|
	otherwise 0. The return value is used to update the
 | 
						|
	statistics.
 | 
						|
      </para>
 | 
						|
    </sect1>
 | 
						|
    <sect1 id="fixup_free">
 | 
						|
      <title>fixup_free</title>
 | 
						|
      <para>
 | 
						|
	This function is called from the debug code whenever a problem
 | 
						|
	in debug_object_free is detected. Further it can be called
 | 
						|
	from the debug checks in kfree/vfree, when an active object is
 | 
						|
	detected from the debug_check_no_obj_freed() sanity checks.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	Called from debug_object_free() or debug_check_no_obj_freed()
 | 
						|
	when the object state is:
 | 
						|
	<itemizedlist>
 | 
						|
	  <listitem><para>ODEBUG_STATE_ACTIVE</para></listitem>
 | 
						|
	</itemizedlist>
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	The function returns 1 when the fixup was successful,
 | 
						|
	otherwise 0. The return value is used to update the
 | 
						|
	statistics.
 | 
						|
      </para>
 | 
						|
    </sect1>
 | 
						|
    <sect1 id="fixup_assert_init">
 | 
						|
      <title>fixup_assert_init</title>
 | 
						|
      <para>
 | 
						|
	This function is called from the debug code whenever a problem
 | 
						|
	in debug_object_assert_init is detected.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	Called from debug_object_assert_init() with a hardcoded state
 | 
						|
	ODEBUG_STATE_NOTAVAILABLE when the object is not found in the
 | 
						|
	debug bucket.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	The function returns 1 when the fixup was successful,
 | 
						|
	otherwise 0. The return value is used to update the
 | 
						|
	statistics.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	Note, this function should make sure debug_object_init() is
 | 
						|
	called before returning.
 | 
						|
      </para>
 | 
						|
      <para>
 | 
						|
	The handling of statically initialized objects is a special
 | 
						|
	case. The fixup function should check if this is a legitimate
 | 
						|
	case of a statically initialized object or not. In this case only
 | 
						|
	debug_object_init() should be called to make the object known to
 | 
						|
	the tracker. Then the function should return 0 because this is not
 | 
						|
	a real fixup.
 | 
						|
      </para>
 | 
						|
    </sect1>
 | 
						|
  </chapter>
 | 
						|
  <chapter id="bugs">
 | 
						|
    <title>Known Bugs And Assumptions</title>
 | 
						|
    <para>
 | 
						|
	None (knock on wood).
 | 
						|
    </para>
 | 
						|
  </chapter>
 | 
						|
</book>
 |