/* * Initialize all I/O devices. Starting closest to nodes, probe and * initialize outward. */ void init_all_devices(void) { /* Governor on init threads..bump up when safe * (beware many devfs races) */ cnodeid_t cnodeid, active; active = 0; for (cnodeid = 0; cnodeid < numnodes; cnodeid++) { DBG("init_all_devices: Calling io_init_node() for cnode %d\n", cnodeid); io_init_node(cnodeid); DBG("init_all_devices: Done io_init_node() for cnode %d\n", cnodeid); } for (cnodeid = 0; cnodeid < numnodes; cnodeid++) /* * Update information generated by IO init. */ update_node_information(cnodeid); #if HWG_PRINT hwgraph_print(); #endif }
/* * Initialize all I/O devices. Starting closest to nodes, probe and * initialize outward. */ void init_all_devices(void) { cnodeid_t cnodeid, active; active = 0; for (cnodeid = 0; cnodeid < numionodes; cnodeid++) { DBG("init_all_devices: Calling io_init_node() for cnode %d\n", cnodeid); io_init_node(cnodeid); DBG("init_all_devices: Done io_init_node() for cnode %d\n", cnodeid); } for (cnodeid = 0; cnodeid < numnodes; cnodeid++) { /* * Update information generated by IO init. */ update_node_information(cnodeid); } }
/* * Initialize all I/O devices. Starting closest to nodes, probe and * initialize outward. */ void init_all_devices(void) { /* Governor on init threads..bump up when safe * (beware many devfs races) */ #ifdef LATER int io_init_node_threads = 2; #endif cnodeid_t cnodeid, active; #ifdef LINUX_KERNEL_THREADS sema_init(&io_init_sema, 0); #endif active = 0; for (cnodeid = 0; cnodeid < numnodes; cnodeid++) { #ifdef LINUX_KERNEL_THREADS char thread_name[16]; extern int io_init_pri; /* * Spawn a service thread for each node to initialize all * I/O on that node. Each thread attempts to bind itself * to the node whose I/O it's initializing. */ sprintf(thread_name, "IO_init[%d]", cnodeid); (void)sthread_create(thread_name, 0, IOINIT_STKSZ, 0, io_init_pri, KT_PS, (st_func_t *)io_init_node, (void *)(long)cnodeid, 0, 0, 0); #else DBG("init_all_devices: Calling io_init_node() for cnode %d\n", cnodeid); io_init_node(cnodeid); DBG("init_all_devices: Done io_init_node() for cnode %d\n", cnodeid); #endif /* LINUX_KERNEL_THREADS */ #ifdef LINUX_KERNEL_THREADS /* Limit how many nodes go at once, to not overload hwgraph */ /* TBD: Should timeout */ DBG("started thread for cnode %d\n", cnodeid); active++; if (io_init_node_threads && active >= io_init_node_threads) { down(&io_init_sema); active--; } #endif /* LINUX_KERNEL_THREADS */ } #ifdef LINUX_KERNEL_THREADS /* Wait until all IO_init threads are done */ while (active > 0) { #ifdef AA_DEBUG DBG("waiting, %d still active\n", active); #endif down(&io_init_sema); active--; } #endif /* LINUX_KERNEL_THREADS */ for (cnodeid = 0; cnodeid < numnodes; cnodeid++) /* * Update information generated by IO init. */ update_node_information(cnodeid); baseio_ctlr_num_set(); /* Setup the system critical graph (which is a subgraph of the * main hwgraph). This information is useful during io error * handling. */ sys_critical_graph_init(); #if HWG_PRINT hwgraph_print(); #endif }