module_t *module_add_node(moduleid_t id, cnodeid_t n) { module_t *m; int i; char buffer[16]; #ifdef __ia64 memset(buffer, 0, 16); format_module_id(buffer, id, MODULE_FORMAT_BRIEF); DPRINTF("module_add_node: id=%s node=%d\n", buffer, n); #endif if ((m = module_lookup(id)) == 0) { #ifdef LATER m = kmem_zalloc_node(sizeof (module_t), KM_NOSLEEP, n); #else m = kmalloc(sizeof (module_t), GFP_KERNEL); memset(m, 0 , sizeof(module_t)); #endif ASSERT_ALWAYS(m); m->id = id; spin_lock_init(&m->lock); mutex_init_locked(&m->thdcnt); // set_elsc(&m->elsc); elsc_init(&m->elsc, COMPACT_TO_NASID_NODEID(n)); spin_lock_init(&m->elsclock); /* Insert in sorted order by module number */ for (i = nummodules; i > 0 && modules[i - 1]->id > id; i--) modules[i] = modules[i - 1]; modules[i] = m; nummodules++; } m->nodes[m->nodecnt++] = n; DPRINTF("module_add_node: module %s now has %d nodes\n", buffer, m->nodecnt); return m; }
module_t *module_add_node(geoid_t geoid, cnodeid_t cnodeid) { module_t *m; int i; char buffer[16]; moduleid_t moduleid; memset(buffer, 0, 16); moduleid = geo_module(geoid); format_module_id(buffer, moduleid, MODULE_FORMAT_BRIEF); DPRINTF("module_add_node: moduleid=%s node=%d\n", buffer, cnodeid); if ((m = module_lookup(moduleid)) == 0) { m = kmalloc(sizeof (module_t), GFP_KERNEL); memset(m, 0 , sizeof(module_t)); ASSERT_ALWAYS(m); m->id = moduleid; spin_lock_init(&m->lock); mutex_init_locked(&m->thdcnt); /* Insert in sorted order by module number */ for (i = nummodules; i > 0 && modules[i - 1]->id > moduleid; i--) modules[i] = modules[i - 1]; modules[i] = m; nummodules++; } m->nodes[m->nodecnt] = cnodeid; m->geoid[m->nodecnt] = geoid; m->nodecnt++; DPRINTF("module_add_node: module %s now has %d nodes\n", buffer, m->nodecnt); return m; }
/* * Set up the platform-dependent fields in the nodepda. */ void init_platform_nodepda(nodepda_t *npda, cnodeid_t node) { hubinfo_t hubinfo; #ifdef CONFIG_IA64_SGI_SN1 int sn; #endif extern void router_map_init(nodepda_t *); extern void router_queue_init(nodepda_t *,cnodeid_t); extern void intr_init_vecblk(nodepda_t *, cnodeid_t, int); /* Allocate per-node platform-dependent data */ hubinfo = (hubinfo_t)alloc_bootmem_node(NODE_DATA(node), sizeof(struct hubinfo_s)); npda->pdinfo = (void *)hubinfo; hubinfo->h_nodepda = npda; hubinfo->h_cnodeid = node; hubinfo->h_nasid = COMPACT_TO_NASID_NODEID(node); spin_lock_init(&hubinfo->h_crblock); hubinfo->h_widgetid = hub_widget_id(hubinfo->h_nasid); npda->xbow_peer = INVALID_NASID; /* * Initialize the linked list of * router info pointers to the dependent routers */ npda->npda_rip_first = NULL; /* * npda_rip_last always points to the place * where the next element is to be inserted * into the list */ npda->npda_rip_last = &npda->npda_rip_first; npda->module_id = INVALID_MODULE; #ifdef CONFIG_IA64_SGI_SN1 /* * Initialize the interrupts. * On sn2, this is done at pci init time, * because sn2 needs the cpus checked in * when it initializes interrupts. This is * so we don't see all the nodes as headless. */ for (sn=0; sn<NUM_SUBNODES; sn++) { intr_init_vecblk(npda, node, sn); } #endif /* CONFIG_IA64_SGI_SN1 */ mutex_init_locked(&npda->xbow_sema); /* init it locked? */ #ifdef LATER /* Setup the (module,slot) --> nic mapping for all the routers * in the system. This is useful during error handling when * there is no shared memory. */ router_map_init(npda); /* Allocate memory for the per-node router traversal queue */ router_queue_init(npda,node); npda->sbe_info = alloc_bootmem_node(NODE_DATA(node), sizeof (sbe_info_t)); ASSERT(npda->sbe_info); #endif /* LATER */ }