static int __init parse_dt_topology(void) { struct device_node *cn, *map; int ret = 0; int cpu; cn = of_find_node_by_path("/cpus"); if (!cn) { pr_err("No CPU information found in DT\n"); return 0; } /* * When topology is provided cpu-map is essentially a root * cluster with restricted subnodes. */ map = of_get_child_by_name(cn, "cpu-map"); if (!map) goto out; ret = parse_cluster(map, 0); if (ret != 0) goto out_map; topology_normalize_cpu_scale(); /* * Check that all cores are in the topology; the SMP code will * only mark cores described in the DT as possible. */ for_each_possible_cpu(cpu) if (cpu_topology[cpu].package_id == -1) ret = -EINVAL; out_map: of_node_put(map); out: of_node_put(cn); return ret; }
static int __init parse_cluster(struct device_node *cluster, int depth) { char name[10]; bool leaf = true; bool has_cores = false; struct device_node *c; static int cluster_id __initdata; int core_id = 0; int i, ret; /* * First check for child clusters; we currently ignore any * information about the nesting of clusters and present the * scheduler with a flat list of them. */ i = 0; do { snprintf(name, sizeof(name), "cluster%d", i); c = of_get_child_by_name(cluster, name); if (c) { leaf = false; ret = parse_cluster(c, depth + 1); of_node_put(c); if (ret != 0) return ret; } i++; } while (c); /* Now check for cores */ i = 0; do { snprintf(name, sizeof(name), "core%d", i); c = of_get_child_by_name(cluster, name); if (c) { has_cores = true; if (depth == 0) { pr_err("%s: cpu-map children should be clusters\n", c->full_name); of_node_put(c); return -EINVAL; } if (leaf) { ret = parse_core(c, cluster_id, core_id++); } else { pr_err("%s: Non-leaf cluster with core %s\n", cluster->full_name, name); ret = -EINVAL; } of_node_put(c); if (ret != 0) return ret; } i++; } while (c); if (leaf && !has_cores) pr_warn("%s: empty cluster\n", cluster->full_name); if (leaf) cluster_id++; return 0; }
int main(int argc, char *argv[]) { extern char *optarg; extern int optind; extern char *version; int someflag, ch, fanout, showflag, fanflag; char *p, *group, *nodename, *username; char **exclude; struct rlimit limit; node_t *nodeptr; someflag = showflag = fanflag = 0; exclusion = debug = batchflag = 0; testflag = rshport = nrofrungroups = 0; showprocs = 20; /* nrof procs to show by default */ interval = 5; /* 5 second delay between node reads */ porttimeout = 5; /* 5 seconds to port timeout */ grouping = 0; fanout = DEFAULT_FANOUT; nodename = NULL; username = NULL; group = NULL; nodeptr = NULL; nodelink = NULL; exclude = NULL; rungroup = calloc(GROUP_MALLOC, sizeof(char **)); if (rungroup == NULL) bailout(); progname = strdup(basename(argv[0])); #if defined(__linux__) while ((ch = getopt(argc, argv, "+?bdqti:f:g:l:m:o:p:s:vw:x:")) != -1) #else while ((ch = getopt(argc, argv, "?bdqti:f:g:l:m:o:p:s:vw:x:")) != -1) #endif switch (ch) { case 'b': batchflag = 1; /* we want batch mode */ break; case 'd': /* we want to debug dsh (hidden)*/ debug = 1; break; case 'i': /* interval between node reads */ interval = atoi(optarg); break; case 'l': /* invoke me as some other user */ username = strdup(optarg); break; case 'q': /* just show me some info and quit */ showflag = 1; break; case 't': /* test the nodes before connecting */ testflag = 1; break; case 'p': /* what is the rsh port number? */ rshport = atoi(optarg); break; case 'o': /* set the test timeout in seconds */ porttimeout = atoi(optarg); break; case 'm': /* set the display mode */ if (strncasecmp(optarg, "proc", 4) == 0) displaymode = DISPLAY_PROC; else if (strncasecmp(optarg, "load", 4) == 0) displaymode = DISPLAY_LOAD; break; case 'f': /* set the fanout size */ fanout = atoi(optarg); fanflag = 1; break; case 'g': /* pick a group to run on */ grouping = 1; nrofrungroups = parse_gopt(optarg); break; case 'v': (void)printf("%s: %s\n", progname, version); exit(EXIT_SUCCESS); break; case 'x': /* exclude nodes, w overrides this */ exclusion = 1; exclude = parse_xopt(optarg); break; case 'w': /* perform operation on these nodes */ someflag = 1; for (p = optarg; p != NULL; ) { nodename = (char *)strsep(&p, ","); if (nodename != NULL) (void)nodealloc(nodename); } break; case '?': /* you blew it */ (void)fprintf(stderr, "usage:\n%s [-bqtv] [-f fanout] [-p portnum] [-o timeout] " "[-g rungroup1,...,rungroupN]\n" " [-l username] [-x node1,...,nodeN] [-w node1,..,nodeN]" " [-m proc|load] [-i interval]\n", progname); return(EXIT_FAILURE); /*NOTREACHED*/ break; default: break; } /* Check for various environment variables and use them if they exist */ if (!fanflag && getenv("FANOUT")) fanout = atoi(getenv("FANOUT")); if (!rshport && getenv("RCMD_PORT")) rshport = atoi(getenv("RCMD_PORT")); if (!testflag && getenv("RCMD_TEST")) testflag = 1; if (porttimeout == 5 && getenv("RCMD_TEST_TIMEOUT")) porttimeout = atoi(getenv("RCMD_TEST_TIMEOUT")); if (username == NULL && getenv("RCMD_USER")) username = strdup(getenv("RCMD_USER")); rshport = get_rshport(testflag, rshport, "RCMD_CMD"); if (!someflag) parse_cluster(exclude); argc -= optind; argv += optind; if (showflag) { do_showcluster(fanout); return(EXIT_SUCCESS); } /* * set per-process limits for max descriptors, this avoids running * out of descriptors and the odd errors that come with that. */ if (getrlimit(RLIMIT_NOFILE, &limit) != 0) bailout(); if (limit.rlim_cur < fanout * 5) { limit.rlim_cur = fanout * 5; if (setrlimit(RLIMIT_NOFILE, &limit) != 0) bailout(); } do_command(fanout, username); return(EXIT_SUCCESS); }
int main(int argc, char **argv) { extern char *optarg; extern int optind; extern char *version; int someflag, ch, i, allflag, showflag; char *p, *group, *nodename, *username; char **exclude; node_t *nodeptr; someflag = 0; showflag = 0; exclusion = 0; debug = 0; errorflag = 0; allflag = 0; grouping = 0; nrofrungroups = 0; testflag = 0; rshport = 0; porttimeout = 5; /* 5 seconds to port timeout */ username = NULL; nodename = NULL; group = NULL; nodeptr = NULL; nodelink = NULL; exclude = NULL; rungroup = calloc(GROUP_MALLOC, sizeof(char **)); if (rungroup == NULL) bailout(); progname = strdup(basename(argv[0])); srand48(getpid()); /* seed the random number generator */ #if defined(__linux__) while ((ch = getopt(argc, argv, "+?adeiqtvg:l:o:p:w:x:")) != -1) #else while ((ch = getopt(argc, argv, "?adeiqtvg:l:o:p:w:x:")) != -1) #endif switch (ch) { case 'a': /* set the allrun flag */ allflag = 1; break; case 'd': /* set the debug flag */ debug = 1; break; case 'e': /* we want stderr to be printed */ errorflag = 1; break; case 'i': /* we want tons of extra info */ debug = 1; break; case 'l': /* invoke me as some other user */ username = strdup(optarg); break; case 'q': /* just show me some info and quit */ showflag = 1; break; case 't': /* test the nodes before connecting */ testflag = 1; break; case 'p': /* what is the rsh port number? */ rshport = atoi(optarg); break; case 'o': /* set the test timeout in seconds */ porttimeout = atoi(optarg); break; case 'g': /* pick a group to run on */ grouping = 1; nrofrungroups = parse_gopt(optarg); break; case 'x': /* exclude nodes, w overrides this */ exclusion = 1; exclude = parse_xopt(optarg); break; case 'w': /* perform operation on these nodes */ someflag = 1; i = 0; for (p = optarg; p != NULL; ) { nodename = (char *)strsep(&p, ","); if (nodename != NULL) (void)nodealloc(nodename); } break; case 'v': (void)printf("%s: %s\n", progname, version); exit(EXIT_SUCCESS); break; case '?': /* you blew it */ (void)fprintf(stderr, "usage: %s [-aeiqtv] [-p portnum] [-o timeout] " "[-g rungroup1,...,rungroupN]\n" "\t[-l username] [-x node1,...,nodeN] [-w node1,..,nodeN] " "[command ...]\n", progname); exit(EXIT_FAILURE); break; default: break; } if (username == NULL && getenv("RCMD_USER")) username = strdup(getenv("RCMD_USER")); if (!rshport && getenv("RCMD_PORT")) rshport = atoi(getenv("RCMD_PORT")); if (!testflag && getenv("RCMD_TEST")) testflag = 1; if (porttimeout == 5 && getenv("RCMD_TEST_TIMEOUT")) porttimeout = atoi(getenv("RCMD_TEST_TIMEOUT")); rshport = get_rshport(testflag, rshport, "RCMD_CMD"); if (!someflag) parse_cluster(exclude); argc -= optind; argv += optind; if (showflag) { do_showcluster(DEFAULT_FANOUT); exit(EXIT_SUCCESS); } do_command(argv, allflag, username); exit(EXIT_SUCCESS); }
int main(int argc, char **argv) { extern char *optarg; extern int optind; extern char *version; int someflag, ch, i, preserve, recurse; char *p, *nodename, *username, *group; char **exclude; node_t *nodeptr; fanout = 0; quiet = 1; concurrent = 0; someflag = 0; preserve = 0; recurse = 0; exclusion = 0; grouping = 0; nrofrungroups = 0; testflag = 0; rshport = 0; bflag = 0; porttimeout = 5; /* 5 seconds to port timeout */ username = NULL; group = NULL; nodeptr = NULL; nodelink = NULL; exclude = NULL; rungroup = calloc(GROUP_MALLOC, sizeof(char **)); if (rungroup == NULL) bailout(); progname = strdup(basename(argv[0])); #if defined(__linux__) while ((ch = getopt(argc, argv, "+?bcdeprtvf:g:l:n:o:w:x:")) != -1) #else while ((ch = getopt(argc, argv, "?bcdeprtvf:g:l:n:o:w:x:")) != -1) #endif switch (ch) { case 'b': /* set reverse/backwards mode */ bflag = 1; break; case 'c': /* set concurrent mode */ concurrent = 1; break; case 'd': /* hidden debug mode */ debug = 1; break; case 'e': /* display error messages */ quiet = 0; break; case 'p': /* preserve file modes */ preserve = 1; break; case 'r': /* recursive directory operations */ recurse = 1; break; case 't': /* test the nodes before connecting */ testflag = 1; break; case 'n': /* what is the rsh port number? */ rshport = atoi(optarg); break; case 'o': /* set the test timeout in seconds */ porttimeout = atoi(optarg); break; case 'l': /* invoke me as some other user */ username = strdup(optarg); break; case 'f': /* set the fanout size */ fanout = atoi(optarg); break; case 'g': /* pick a group to run on */ grouping = 1; nrofrungroups = parse_gopt(optarg); break; case 'x': /* exclude nodes, w overrides this */ exclusion = 1; exclude = parse_xopt(optarg); break; case 'w': /* perform operation on these nodes */ someflag = 1; i = 0; for (p = optarg; p != NULL; ) { nodename = (char *)strsep(&p, ","); if (nodename != NULL) (void)nodealloc(nodename); } break; case 'v': (void)printf("%s: %s\n", progname, version); exit(EXIT_SUCCESS); break; case '?': (void)fprintf(stderr, "usage: %s [-ceprv] [-f fanout] [-g rungroup1,...,rungroupN] " "[-l username] [-x node1,...,nodeN] [-w node1,..,nodeN] " "source_file1 [source_file2 ... source_fileN] " "[desitination_file]\n", progname); return(EXIT_FAILURE); /* NOTREACHED */ break; default: break; } if (fanout == 0 && getenv("FANOUT")) fanout = atoi(getenv("FANOUT")); else fanout = DEFAULT_FANOUT; if (username == NULL && getenv("RCP_USER")) username = strdup(getenv("RCP_USER")); if (!rshport && getenv("RCP_PORT")) rshport = atoi(getenv("RCP_PORT")); if (!testflag && getenv("RCMD_TEST")) testflag = 1; if (porttimeout == 5 && getenv("RCMD_TEST_TIMEOUT")) porttimeout = atoi(getenv("RCMD_TEST_TIMEOUT")); rshport = get_rshport(testflag, rshport, "RCP_CMD"); if (!someflag) parse_cluster(exclude); argc -= optind; argv += optind; do_copy(argv, recurse, preserve, username); return(EXIT_SUCCESS); }