title: How does Linux determine the order of module init calls?
body: <p>I have a device with SPI flash storage I'd like to use an UBIFS filesystem on that flash device as my rootfs. The problem I'm facing is that the UBI module initializes before the SPI module initializes. Because of this, when UBI loads, it cannot attach to the UBI device that I've told it to (via the kernel command line), so there is no rootfs. The console output below illustrates this.</p>
  
  <p>I've been diving into the source enough to see that <code>init/main.c</code> has a <code>do_initcalls()</code> function that simply calls a list of function pointers. Those function pointers point to the all the <code>module_init()</code> functions of the modules that are built-in to the kernel. Those function pointers are placed in a special section in the kernel binary, so this order is chosen at compile-time. However, I haven't yet figured out how that order is determined.</p>
  
  <pre><code>    [    0.482500] UBI error: ubi_init: UBI error: cannot initialize UBI, error -19
      [    0.492500] atmel_spi atmel_spi.0: Using dma0chan0 (tx) and  dma0chan1 (rx) for DMA transfers
      [    0.500000] atmel_spi atmel_spi.0: Atmel SPI Controller at 0xf0000000 (irq 13)
      [    0.507500] m25p80 spi0.1: mx25l25635e (32768 Kbytes)
      [    0.512500] Creating 7 MTD partitions on "jedec_flash":
      [    0.520000] 0x000000000000-0x000000020000 : "loader"
      [    0.527500] 0x000000020000-0x000000060000 : "u-boot"
      [    0.537500] 0x000000060000-0x000000080000 : "u-boot-env"
      [    0.547500] 0x000000080000-0x000000280000 : "kernel0"
      [    0.557500] 0x000000280000-0x000000480000 : "kernel1"
      [    0.567500] 0x000000480000-0x000001240000 : "fs"
      [    0.575000] 0x000001240000-0x000002000000 : "play"
      [    0.590000] AT91SAM9 Watchdog enabled (heartbeat=15 sec, nowayout=0)
      [    0.607500] TCP cubic registered
      [    0.615000] VFS: Cannot open root device "ubi0:root0" or unknown-block(0,0)
      [    0.622500] Please append a correct "root=" boot option; here are the available partitions:
      [    0.630000] 1f00             128 mtdblock0  (driver?)
      [    0.635000] 1f01             256 mtdblock1  (driver?)
      [    0.640000] 1f02             128 mtdblock2  (driver?)
      [    0.645000] 1f03            2048 mtdblock3  (driver?)
      [    0.650000] 1f04            2048 mtdblock4  (driver?)
      [    0.655000] 1f05           14080 mtdblock5  (driver?)
      [    0.660000] 1f06           14080 mtdblock6  (driver?)
      [    0.665000] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
  </code></pre>