• Mel Gorman's avatar
    block,xd: Delay allocation of DMA buffers until device is known · a3b8d92d
    Mel Gorman authored
    Loading the XD module triggers a warning like
    
     WARNING: at mm/page_alloc.c:1805
     __alloc_pages_nodemask+0x127/0x48f()
     Hardware name: System Product Name
     Modules linked in:
     Pid: 1, comm: swapper Not tainted 2.6.32-rc8-git5 #1
     Call Trace:
      [<c103d94b>] warn_slowpath_common+0x65/0x95
      [<c103d98d>] warn_slowpath_null+0x12/0x15
      [<c109550c>] __alloc_pages_nodemask+0x127/0x48f
      [<c10be964>] ? get_slab+0x8/0x50
      [<c10b8979>] alloc_page_interleave+0x2e/0x6e
      [<c10b8a10>] alloc_pages_current+0x57/0x99
      [<c2083a4a>] ? xd_init+0x0/0x482
      [<c1094c38>] __get_free_pages+0xd/0x1e
      [<c2083a94>] xd_init+0x4a/0x482
      [<c2082df0>] ? loop_init+0x104/0x16a
      [<c169162d>] ? loop_probe+0x0/0xaf
      [<c2083a4a>] ? xd_init+0x0/0x482
      [<c1001143>] do_one_initcall+0x51/0x13f
      [<c204a307>] kernel_init+0x10b/0x15f
      [<c204a1fc>] ? kernel_init+0x0/0x15f
      [<c1004347>] kernel_thread_helper+0x7/0x10
     ---[ end trace 686db6333ade6e7a ]---
     xd: Out of memory.
    
    The warning is because the alloc_pages is called with an
    order >= MAX_ORDER. The simplistic reason is that get_order(0) returns garbage
    values when given 0 as a size. The more complex reason is that the XD driver
    initialisation is broken.
    
    It's not clear why this ever worked. XD allocates a buffer for DMA based
    on the value of xd_maxsectors. This value is determined by the exact
    type of controller in use but the value is determined *after* an attempt
    has been made to allocate the buffer. i.e. the requested size of the DMA
    buffer will always be 0.
    
    This patch alters how XD is initialised slightly by allocating the
    buffer when and if a device has actually been detected. The error paths
    are updated to suit the new logic.
    Signed-off-by: default avatarMel Gorman <mel@csn.ul.ie>
    Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
    a3b8d92d
xd.c 33.8 KB