X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=arch%2Fia64%2Fsn%2Fkernel%2Fsn2%2Fsn_hwperf.c;h=8a810d339e2f1524601902328271ecf852ba0790;hb=9e1bf581d67d87a1d7fc0ea500729e3a03643a26;hp=21c08eaa5e39d1efbc233e33b03359c6576f0c81;hpb=8d40237c730b8be87c1b80a5d96b9c603fefa829;p=linux-2.6.git diff --git a/arch/ia64/sn/kernel/sn2/sn_hwperf.c b/arch/ia64/sn/kernel/sn2/sn_hwperf.c index 21c08eaa5..8a810d339 100644 --- a/arch/ia64/sn/kernel/sn2/sn_hwperf.c +++ b/arch/ia64/sn/kernel/sn2/sn_hwperf.c @@ -36,12 +36,9 @@ #include #include #include -#include -#include -#include -#include -#include -#include +#include +#include +#include static void *sn_hwperf_salheap = NULL; static int sn_hwperf_obj_cnt = 0; @@ -83,26 +80,21 @@ out: static int sn_hwperf_geoid_to_cnode(char *location) { int cnode; - geoid_t geoid; - moduleid_t module_id; - char type; - int rack, slot, slab; - int this_rack, this_slot, this_slab; + int mod, slot, slab; + int cmod, cslot, cslab; - if (sscanf(location, "%03d%c%02d#%d", &rack, &type, &slot, &slab) != 4) + if (sscanf(location, "%03dc%02d#%d", &mod, &slot, &slab) != 3) return -1; - - for (cnode = 0; cnode < numionodes; cnode++) { - geoid = cnodeid_get_geoid(cnode); - module_id = geo_module(geoid); - this_rack = MODULE_GET_RACK(module_id); - this_slot = MODULE_GET_BPOS(module_id); - this_slab = geo_slab(geoid); - if (rack == this_rack && slot == this_slot && slab == this_slab) - break; + for (cnode = 0; cnode < numnodes; cnode++) { + /* XXX: need a better way than this ... */ + if (sscanf(NODEPDA(cnode)->hwg_node_name, + "hw/module/%03dc%02d/slab/%d", &cmod, &cslot, &cslab) == 3) { + if (mod == cmod && slot == cslot && slab == cslab) + break; + } } - return cnode < numionodes ? cnode : -1; + return cnode < numnodes ? cnode : -1; } static int sn_hwperf_obj_to_cnode(struct sn_hwperf_object_info * obj) @@ -121,35 +113,52 @@ static int sn_hwperf_generic_ordinal(struct sn_hwperf_object_info *obj, for (ordinal=0, p=objs; p != obj; p++) { if (SN_HWPERF_FOREIGN(p)) continue; - if (SN_HWPERF_SAME_OBJTYPE(p, obj)) + if (p->location[3] == obj->location[3]) ordinal++; } return ordinal; } -static const char *slabname_node = "node"; /* SHub asic */ -static const char *slabname_ionode = "ionode"; /* TIO asic */ -static const char *slabname_router = "router"; /* NL3R or NL4R */ -static const char *slabname_other = "other"; /* unknown asic */ +#ifndef MODULE_IOBRICK +/* this will be available when ioif TIO support is added */ +#define MODULE_IOBRICK (MODULE_OPUSBRICK+1) +#endif -static const char *sn_hwperf_get_slabname(struct sn_hwperf_object_info *obj, - struct sn_hwperf_object_info *objs, int *ordinal) +static const char *sn_hwperf_get_brickname(struct sn_hwperf_object_info *obj, + struct sn_hwperf_object_info *objs, int *ordinal) { - int isnode; - const char *slabname = slabname_other; + int i; + const char *objtype = NULL; - if ((isnode = SN_HWPERF_IS_NODE(obj)) || SN_HWPERF_IS_IONODE(obj)) { - slabname = isnode ? slabname_node : slabname_ionode; - *ordinal = sn_hwperf_obj_to_cnode(obj); + for (i=0; i < MAX_BRICK_TYPES; i++) { + if (brick_types[i] != obj->location[3]) + continue; + switch (i) { + case MODULE_CBRICK: + objtype = "node"; + *ordinal = sn_hwperf_obj_to_cnode(obj); /* cnodeid */ + break; + + case MODULE_RBRICK: + objtype = "router"; + *ordinal = sn_hwperf_generic_ordinal(obj, objs); + break; + + case MODULE_IOBRICK: + objtype = "ionode"; + *ordinal = sn_hwperf_generic_ordinal(obj, objs); + break; + } + break; } - else { + + if (i == MAX_BRICK_TYPES) { + objtype = "other"; *ordinal = sn_hwperf_generic_ordinal(obj, objs); - if (SN_HWPERF_IS_ROUTER(obj)) - slabname = slabname_router; } - return slabname; + return objtype; } static int sn_topology_show(struct seq_file *s, void *d) @@ -159,7 +168,7 @@ static int sn_topology_show(struct seq_file *s, void *d) int e; int i; int j; - const char *slabname; + const char *brickname; int ordinal; cpumask_t cpumask; char slice; @@ -185,22 +194,22 @@ static int sn_topology_show(struct seq_file *s, void *d) obj->name[i] = '_'; } - slabname = sn_hwperf_get_slabname(obj, objs, &ordinal); - seq_printf(s, "%s %d %s %s asic %s", slabname, ordinal, obj->location, + brickname = sn_hwperf_get_brickname(obj, objs, &ordinal); + seq_printf(s, "%s %d %s %s asic %s", brickname, ordinal, obj->location, obj->sn_hwp_this_part ? "local" : "shared", obj->name); - if (!SN_HWPERF_IS_NODE(obj) && !SN_HWPERF_IS_IONODE(obj)) + if (obj->location[3] != 'c') seq_putc(s, '\n'); else { seq_printf(s, ", nasid 0x%x", cnodeid_to_nasid(ordinal)); - for (i=0; i < numionodes; i++) { + for (i=0; i < numnodes; i++) { seq_printf(s, i ? ":%d" : ", dist %d", node_distance(ordinal, i)); } seq_putc(s, '\n'); /* - * CPUs on this node, if any + * CPUs on this node */ cpumask = node_to_cpumask(ordinal); for_each_online_cpu(i) { @@ -244,16 +253,11 @@ static int sn_topology_show(struct seq_file *s, void *d) break; } } + if (i >= sn_hwperf_obj_cnt) + continue; seq_printf(s, "numalink %d %s-%d", ordinal+pt, obj->location, ptdata[pt].port); - if (i >= sn_hwperf_obj_cnt) { - /* no connection */ - seq_puts(s, " local endpoint disconnected" - ", protocol unknown\n"); - continue; - } - if (obj->sn_hwp_this_part && p->sn_hwp_this_part) /* both ends local to this partition */ seq_puts(s, " local"); @@ -272,8 +276,9 @@ static int sn_topology_show(struct seq_file *s, void *d) */ seq_printf(s, " endpoint %s-%d, protocol %s\n", p->location, ptdata[pt].conn_port, - (SN_HWPERF_IS_NL3ROUTER(obj) || - SN_HWPERF_IS_NL3ROUTER(p)) ? "LLP3" : "LLP4"); + strcmp(obj->name, "NL3Router") == 0 || + strcmp(p->name, "NL3Router") == 0 ? + "LLP3" : "LLP4"); } vfree(ptdata); } @@ -400,7 +405,7 @@ sn_hwperf_ioctl(struct inode *in, struct file *fp, u32 op, u64 arg) r = -EINVAL; goto error; } - r = copy_from_user(&a, (const void __user *)arg, + r = copy_from_user(&a, (const void *)arg, sizeof(struct sn_hwperf_ioctl_args)); if (r != 0) { r = -EFAULT; @@ -421,7 +426,7 @@ sn_hwperf_ioctl(struct inode *in, struct file *fp, u32 op, u64 arg) } if (op & SN_HWPERF_OP_MEM_COPYIN) { - r = copy_from_user(p, (const void __user *)a.ptr, a.sz); + r = copy_from_user(p, (const void *)a.ptr, a.sz); if (r != 0) { r = -EFAULT; goto error; @@ -468,7 +473,7 @@ sn_hwperf_ioctl(struct inode *in, struct file *fp, u32 op, u64 arg) case SN_HWPERF_GET_NODE_NASID: if (a.sz != sizeof(u64) || - (node = a.arg) < 0 || node >= numionodes) { + (node = a.arg) < 0 || node >= numnodes) { r = -EINVAL; goto error; } @@ -521,7 +526,7 @@ sn_hwperf_ioctl(struct inode *in, struct file *fp, u32 op, u64 arg) } if (op & SN_HWPERF_OP_MEM_COPYOUT) { - r = copy_to_user((void __user *)a.ptr, p, a.sz); + r = copy_to_user((void *)a.ptr, p, a.sz); if (r != 0) { r = -EFAULT; goto error;