• Florian Fainelli's avatar
    dma-debug: prevent early callers from crashing · 2ce8e7ed
    Florian Fainelli authored
    dma_debug_init() is called by architecture specific code at different
    levels, but typically as a fs_initcall due to the debugfs initialization.
    Some platforms may have early callers of the DMA-API, running prior to the
    fs_initcall() level, which is not much of an issue unless
    CONFIG_DMA_API_DEBUG is set.  When the DMA-API debugging facilities are
    turned on a caller will go through:
    
    debug_dma_map_{single,page}
      -> dma_mapping_error (inline function usually)
        -> debug_dma_mapping_error
          -> get_hash_bucket
    
    Calling get_hash_bucket() returns a valid hash value since we hash on high
    bits of the dma_addr cookie, but we will grab an unitialized spinlock,
    which typically won't crash but produce a warning, the real crash will
    however happen during the bucket list traversal because the list has not
    been initialized yet.
    
    An obvious solution is of course to move some of the offenders to run
    after the fs_initcall level, but since this might not always be an option,
    we add a flag "dma_debug_initialized" which is set to false by default,
    and set to true once dma_debug_init() has had a chance to run.
    
    The dma_debug_disabled() helper function previously introduced just needs
    to check for dma_debug_initialized to allow the caller to proceed or not.
    Signed-off-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
    Cc: Dan Williams <dan.j.williams@intel.com>
    Cc: Jiri Kosina <jkosina@suse.cz>
    Cc: Horia Geanta <horia.geanta@freescale.com>
    Cc: Brian Norris <computersforpeace@gmail.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    2ce8e7ed
dma-debug.c 41.9 KB