#include #include #include #include #include #include #include #include #include #include #include "helpers/helpers.h" static struct option info_opts[] = { {"disable", required_argument, NULL, 'd'}, {"enable", required_argument, NULL, 'e'}, {"disable-by-latency", required_argument, NULL, 'D'}, {"enable-all", no_argument, NULL, 'E'}, { }, }; int cmd_idle_set(int argc, char **argv) { extern char *optarg; extern int optind, opterr, optopt; int ret = 0, cont = 1, param = 0, disabled; unsigned long long latency = 0, state_latency; unsigned int cpu = 0, idlestate = 0, idlestates = 0; char *endptr; do { ret = getopt_long(argc, argv, "d:e:ED:", info_opts, NULL); if (ret == -1) break; switch (ret) { case '?': param = '?'; cont = 0; break; case 'd': if (param) { param = -1; cont = 0; break; } param = ret; idlestate = atoi(optarg); break; case 'e': if (param) { param = -1; cont = 0; break; } param = ret; idlestate = atoi(optarg); break; case 'D': if (param) { param = -1; cont = 0; break; } param = ret; latency = strtoull(optarg, &endptr, 10); if (*endptr != '\0') { printf(_("Bad latency value: %s\n"), optarg); exit(EXIT_FAILURE); } break; case 'E': if (param) { param = -1; cont = 0; break; } param = ret; break; case -1: cont = 0; break; } } while (cont); switch (param) { case -1: printf(_("You can't specify more than one " "output-specific argument\n")); exit(EXIT_FAILURE); case '?': printf(_("invalid or unknown argument\n")); exit(EXIT_FAILURE); } /* Default is: set all CPUs */ if (bitmask_isallclear(cpus_chosen)) bitmask_setall(cpus_chosen); for (cpu = bitmask_first(cpus_chosen); cpu <= bitmask_last(cpus_chosen); cpu++) { if (!bitmask_isbitset(cpus_chosen, cpu)) continue; if (cpupower_is_cpu_online(cpu) != 1) continue; idlestates = cpuidle_state_count(cpu); if (idlestates <= 0) continue; switch (param) { case 'd': ret = cpuidle_state_disable(cpu, idlestate, 1); if (ret == 0) printf(_("Idlestate %u disabled on CPU %u\n"), idlestate, cpu); else if (ret == -1) printf(_("Idlestate %u not available on CPU %u\n"), idlestate, cpu); else if (ret == -2) printf(_("Idlestate disabling not supported by kernel\n")); else printf(_("Idlestate %u not disabled on CPU %u\n"), idlestate, cpu); break; case 'e': ret = cpuidle_state_disable(cpu, idlestate, 0); if (ret == 0) printf(_("Idlestate %u enabled on CPU %u\n"), idlestate, cpu); else if (ret == -1) printf(_("Idlestate %u not available on CPU %u\n"), idlestate, cpu); else if (ret == -2) printf(_("Idlestate enabling not supported by kernel\n")); else printf(_("Idlestate %u not enabled on CPU %u\n"), idlestate, cpu); break; case 'D': for (idlestate = 0; idlestate < idlestates; idlestate++) { disabled = cpuidle_is_state_disabled (cpu, idlestate); state_latency = cpuidle_state_latency (cpu, idlestate); if (disabled == 1) { if (latency > state_latency){ ret = cpuidle_state_disable (cpu, idlestate, 0); if (ret == 0) printf(_("Idlestate %u enabled on CPU %u\n"), idlestate, cpu); } continue; } if (latency <= state_latency){ ret = cpuidle_state_disable (cpu, idlestate, 1); if (ret == 0) printf(_("Idlestate %u disabled on CPU %u\n"), idlestate, cpu); } } break; case 'E': for (idlestate = 0; idlestate < idlestates; idlestate++) { disabled = cpuidle_is_state_disabled (cpu, idlestate); if (disabled == 1) { ret = cpuidle_state_disable (cpu, idlestate, 0); if (ret == 0) printf(_("Idlestate %u enabled on CPU %u\n"), idlestate, cpu); } } break; default: /* Not reachable with proper args checking */ printf(_("Invalid or unknown argument\n")); exit(EXIT_FAILURE); break; } } return EXIT_SUCCESS; } '>40space:mode:
authorzhong jiang <zhongjiang@huawei.com>2017-01-24 15:18:52 -0800
committerLinus Torvalds <torvalds@linux-foundation.org>2017-01-24 16:26:14 -0800
commit3277953de2f31dd03c6375e9a9f680ac37fc9d27 (patch)
tree6ba22924faa1b82ef2f0277db10a3f5abdc44157 /include/dt-bindings/reset/altr,rst-mgr.h
parent3705ccfdd1e8b539225ce20e3925a945cc788d67 (diff)
mm: do not export ioremap_page_range symbol for external module
Recently, I've found cases in which ioremap_page_range was used incorrectly, in external modules, leading to crashes. This can be partly attributed to the fact that ioremap_page_range is lower-level, with fewer protections, as compared to the other functions that an external module would typically call. Those include: ioremap_cache ioremap_nocache ioremap_prot ioremap_uc ioremap_wc ioremap_wt ...each of which wraps __ioremap_caller, which in turn provides a safer way to achieve the mapping. Therefore, stop EXPORT-ing ioremap_page_range. Link: http://lkml.kernel.org/r/1485173220-29010-1-git-send-email-zhongjiang@huawei.com Signed-off-by: zhong jiang <zhongjiang@huawei.com> Reviewed-by: John Hubbard <jhubbard@nvidia.com> Suggested-by: John Hubbard <jhubbard@nvidia.com> Acked-by: Michal Hocko <mhocko@suse.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'include/dt-bindings/reset/altr,rst-mgr.h')