Skip to content

Commit

Permalink
Merge tag 'linux-cpupower-5.11-rc1' of git://git.kernel.org/pub/scm/l…
Browse files Browse the repository at this point in the history
…inux/kernel/git/shuah/linux

Pull cpupower utility update for v5.11-rc1 from Shuah Khan:

"This consists of a change to provide online and offline CPU information.
 This change makes it easier to keep track of offline cpus whose cpuidle
 or cpufreq property aren't changed when updates are made to online cpus."

* tag 'linux-cpupower-5.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux:
  cpupower: Provide online and offline CPU information
  • Loading branch information
Rafael J. Wysocki committed Dec 1, 2020
2 parents d23e95c + 748f0d7 commit f8edfa6
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 1 deletion.
3 changes: 3 additions & 0 deletions tools/power/cpupower/utils/cpufreq-set.c
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,7 @@ int cmd_freq_set(int argc, char **argv)
}
}

get_cpustate();

/* loop over CPUs */
for (cpu = bitmask_first(cpus_chosen);
Expand All @@ -332,5 +333,7 @@ int cmd_freq_set(int argc, char **argv)
}
}

print_offline_cpus();

return 0;
}
4 changes: 4 additions & 0 deletions tools/power/cpupower/utils/cpuidle-set.c
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,8 @@ int cmd_idle_set(int argc, char **argv)
exit(EXIT_FAILURE);
}

get_cpustate();

/* Default is: set all CPUs */
if (bitmask_isallclear(cpus_chosen))
bitmask_setall(cpus_chosen);
Expand Down Expand Up @@ -181,5 +183,7 @@ int cmd_idle_set(int argc, char **argv)
break;
}
}

print_offline_cpus();
return EXIT_SUCCESS;
}
8 changes: 8 additions & 0 deletions tools/power/cpupower/utils/cpupower.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ int run_as_root;
int base_cpu;
/* Affected cpus chosen by -c/--cpu param */
struct bitmask *cpus_chosen;
struct bitmask *online_cpus;
struct bitmask *offline_cpus;

#ifdef DEBUG
int be_verbose;
Expand Down Expand Up @@ -178,6 +180,8 @@ int main(int argc, const char *argv[])
char pathname[32];

cpus_chosen = bitmask_alloc(sysconf(_SC_NPROCESSORS_CONF));
online_cpus = bitmask_alloc(sysconf(_SC_NPROCESSORS_CONF));
offline_cpus = bitmask_alloc(sysconf(_SC_NPROCESSORS_CONF));

argc--;
argv += 1;
Expand Down Expand Up @@ -230,6 +234,10 @@ int main(int argc, const char *argv[])
ret = p->main(argc, argv);
if (cpus_chosen)
bitmask_free(cpus_chosen);
if (online_cpus)
bitmask_free(online_cpus);
if (offline_cpus)
bitmask_free(offline_cpus);
return ret;
}
print_help();
Expand Down
12 changes: 12 additions & 0 deletions tools/power/cpupower/utils/helpers/helpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,8 @@ struct cpupower_cpu_info {
*/
extern int get_cpu_info(struct cpupower_cpu_info *cpu_info);
extern struct cpupower_cpu_info cpupower_cpu_info;


/* cpuid and cpuinfo helpers **************************/

/* X86 ONLY ****************************************/
Expand Down Expand Up @@ -171,4 +173,14 @@ static inline unsigned int cpuid_ecx(unsigned int op) { return 0; };
static inline unsigned int cpuid_edx(unsigned int op) { return 0; };
#endif /* defined(__i386__) || defined(__x86_64__) */

/*
* CPU State related functions
*/
extern struct bitmask *online_cpus;
extern struct bitmask *offline_cpus;

void get_cpustate(void);
void print_online_cpus(void);
void print_offline_cpus(void);

#endif /* __CPUPOWERUTILS_HELPERS__ */
66 changes: 65 additions & 1 deletion tools/power/cpupower/utils/helpers/misc.c
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
// SPDX-License-Identifier: GPL-2.0
#if defined(__i386__) || defined(__x86_64__)

#include <stdio.h>
#include <stdlib.h>

#include "helpers/helpers.h"

#if defined(__i386__) || defined(__x86_64__)

#define MSR_AMD_HWCR 0xc0010015

int cpufreq_has_boost_support(unsigned int cpu, int *support, int *active,
Expand Down Expand Up @@ -41,3 +45,63 @@ int cpufreq_has_boost_support(unsigned int cpu, int *support, int *active,
return 0;
}
#endif /* #if defined(__i386__) || defined(__x86_64__) */

/* get_cpustate
*
* Gather the information of all online CPUs into bitmask struct
*/
void get_cpustate(void)
{
unsigned int cpu = 0;

bitmask_clearall(online_cpus);
bitmask_clearall(offline_cpus);

for (cpu = bitmask_first(cpus_chosen);
cpu <= bitmask_last(cpus_chosen); cpu++) {

if (cpupower_is_cpu_online(cpu) == 1)
bitmask_setbit(online_cpus, cpu);
else
bitmask_setbit(offline_cpus, cpu);

continue;
}
}

/* print_online_cpus
*
* Print the CPU numbers of all CPUs that are online currently
*/
void print_online_cpus(void)
{
int str_len = 0;
char *online_cpus_str = NULL;

str_len = online_cpus->size * 5;
online_cpus_str = (void *)malloc(sizeof(char) * str_len);

if (!bitmask_isallclear(online_cpus)) {
bitmask_displaylist(online_cpus_str, str_len, online_cpus);
printf(_("Following CPUs are online:\n%s\n"), online_cpus_str);
}
}

/* print_offline_cpus
*
* Print the CPU numbers of all CPUs that are offline currently
*/
void print_offline_cpus(void)
{
int str_len = 0;
char *offline_cpus_str = NULL;

str_len = offline_cpus->size * 5;
offline_cpus_str = (void *)malloc(sizeof(char) * str_len);

if (!bitmask_isallclear(offline_cpus)) {
bitmask_displaylist(offline_cpus_str, str_len, offline_cpus);
printf(_("Following CPUs are offline:\n%s\n"), offline_cpus_str);
printf(_("cpupower set operation was not performed on them\n"));
}
}

0 comments on commit f8edfa6

Please sign in to comment.