brintos

brintos / linux-shallow public Read only

0
0
Text · 2.3 KiB · 18fd775 Raw
115 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 *  (C) 2011 Thomas Renninger <trenn@suse.de>, Novell Inc.4 */5 6 7#include <unistd.h>8#include <stdio.h>9#include <stdlib.h>10#include <errno.h>11#include <string.h>12#include <getopt.h>13#include <sys/utsname.h>14 15#include "helpers/helpers.h"16#include "helpers/sysfs.h"17 18static struct option set_opts[] = {19     {"perf-bias", optional_argument, NULL, 'b'},20     { },21};22 23static void print_wrong_arg_exit(void)24{25	printf(_("invalid or unknown argument\n"));26	exit(EXIT_FAILURE);27}28 29int cmd_info(int argc, char **argv)30{31	extern char *optarg;32	extern int optind, opterr, optopt;33	unsigned int cpu;34	struct utsname uts;35 36	union {37		struct {38			int perf_bias:1;39		};40		int params;41	} params = {};42	int ret = 0;43 44	ret = uname(&uts);45	if (!ret && (!strcmp(uts.machine, "ppc64le") ||46		     !strcmp(uts.machine, "ppc64"))) {47		fprintf(stderr, _("Subcommand not supported on POWER.\n"));48		return ret;49	}50 51	setlocale(LC_ALL, "");52	textdomain(PACKAGE);53 54	/* parameter parsing */55	while ((ret = getopt_long(argc, argv, "b", set_opts, NULL)) != -1) {56		switch (ret) {57		case 'b':58			if (params.perf_bias)59				print_wrong_arg_exit();60			params.perf_bias = 1;61			break;62		default:63			print_wrong_arg_exit();64		}65	}66 67	if (!params.params)68		params.params = 0x7;69 70	/* Default is: show output of base_cpu only */71	if (bitmask_isallclear(cpus_chosen))72		bitmask_setbit(cpus_chosen, base_cpu);73 74	/* Add more per cpu options here */75	if (!params.perf_bias)76		return ret;77 78	if (params.perf_bias) {79		if (!run_as_root) {80			params.perf_bias = 0;81			printf(_("Intel's performance bias setting needs root privileges\n"));82		} else if (!(cpupower_cpu_info.caps & CPUPOWER_CAP_PERF_BIAS)) {83			printf(_("System does not support Intel's performance"84				 " bias setting\n"));85			params.perf_bias = 0;86		}87	}88 89	/* loop over CPUs */90	for (cpu = bitmask_first(cpus_chosen);91	     cpu <= bitmask_last(cpus_chosen); cpu++) {92 93		if (!bitmask_isbitset(cpus_chosen, cpu))94			continue;95 96		printf(_("analyzing CPU %d:\n"), cpu);97 98		if (sysfs_is_cpu_online(cpu) != 1){99			printf(_(" *is offline\n"));100			continue;101		}102 103		if (params.perf_bias) {104			ret = cpupower_intel_get_perf_bias(cpu);105			if (ret < 0) {106				fprintf(stderr,107			_("Could not read perf-bias value[%d]\n"), ret);108				exit(EXIT_FAILURE);109			} else110				printf(_("perf-bias: %d\n"), ret);111		}112	}113	return 0;114}115