lscpu: add -x and {On,Off}-line CPU(s) mask/list
Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
parent
aac1e59ebb
commit
4f912c6ac5
|
@ -22,6 +22,10 @@ Print a help message.
|
||||||
.TP
|
.TP
|
||||||
.BR \-p , " \-\-parse"
|
.BR \-p , " \-\-parse"
|
||||||
Print out in parsable instead of printable format.
|
Print out in parsable instead of printable format.
|
||||||
|
.TP
|
||||||
|
.BR \-x , " \-\-hex"
|
||||||
|
Use hexadecimal masks for CPU(s) sets (e.g. 0x3). The default is print the sets
|
||||||
|
in the list format (e.g. 0,1).
|
||||||
.SH BUGS
|
.SH BUGS
|
||||||
The basic overview about CPU family, model, etc. is always based on the first
|
The basic overview about CPU family, model, etc. is always based on the first
|
||||||
CPU only.
|
CPU only.
|
||||||
|
|
|
@ -769,7 +769,24 @@ print_parsable(struct lscpu_desc *desc)
|
||||||
#define print_n(_key, _val) printf("%-23s%d\n", _key, _val)
|
#define print_n(_key, _val) printf("%-23s%d\n", _key, _val)
|
||||||
|
|
||||||
static void
|
static void
|
||||||
print_readable(struct lscpu_desc *desc)
|
print_cpuset(const char *key, cpu_set_t *set, int hex)
|
||||||
|
{
|
||||||
|
size_t setsize = CPU_ALLOC_SIZE(maxcpus);
|
||||||
|
size_t setbuflen = 7 * maxcpus;
|
||||||
|
char setbuf[setbuflen], *p;
|
||||||
|
|
||||||
|
if (hex) {
|
||||||
|
p = cpumask_create(setbuf, setbuflen, set, setsize);
|
||||||
|
printf("%-23s0x%s\n", key, p);
|
||||||
|
} else {
|
||||||
|
p = cpulist_create(setbuf, setbuflen, set, setsize);
|
||||||
|
print_s(key, p);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
print_readable(struct lscpu_desc *desc, int hex)
|
||||||
{
|
{
|
||||||
char buf[512];
|
char buf[512];
|
||||||
int i;
|
int i;
|
||||||
|
@ -797,7 +814,31 @@ print_readable(struct lscpu_desc *desc)
|
||||||
}
|
}
|
||||||
|
|
||||||
print_n(_("CPU(s):"), desc->ncpus);
|
print_n(_("CPU(s):"), desc->ncpus);
|
||||||
print_n(_("On-line CPU(s):"), CPU_COUNT_S(setsize, desc->online));
|
|
||||||
|
print_cpuset(hex ? _("On-line CPU(s) mask:") :
|
||||||
|
_("On-line CPU(s) list:"),
|
||||||
|
desc->online, hex);
|
||||||
|
|
||||||
|
if (CPU_COUNT_S(setsize, desc->online) != desc->ncpus) {
|
||||||
|
cpu_set_t *set;
|
||||||
|
|
||||||
|
/* Linux kernel provides cpuset of off-line CPUs that contains
|
||||||
|
* all configured CPUs (see /sys/devices/system/cpu/offline),
|
||||||
|
* but want to print real (present in system) off-line CPUs only.
|
||||||
|
*/
|
||||||
|
set = cpuset_alloc(maxcpus, NULL, NULL);
|
||||||
|
if (!set)
|
||||||
|
err(EXIT_FAILURE, _("failed to callocate cpu set"));
|
||||||
|
CPU_ZERO_S(setsize, set);
|
||||||
|
for (i = 0; i < desc->ncpus; i++) {
|
||||||
|
if (!is_cpu_online(desc, i))
|
||||||
|
CPU_SET_S(i, setsize, set);
|
||||||
|
}
|
||||||
|
print_cpuset(hex ? _("Off-line CPU(s) mask:") :
|
||||||
|
_("Off-line CPU(s) list:"),
|
||||||
|
set, hex);
|
||||||
|
cpuset_free(set);
|
||||||
|
}
|
||||||
|
|
||||||
if (desc->nsockets) {
|
if (desc->nsockets) {
|
||||||
print_n(_("Thread(s) per core:"), desc->nthreads / desc->ncores);
|
print_n(_("Thread(s) per core:"), desc->nthreads / desc->ncores);
|
||||||
|
@ -838,17 +879,9 @@ print_readable(struct lscpu_desc *desc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (desc->nnodes) {
|
|
||||||
size_t setbuflen = 7 * maxcpus;
|
|
||||||
char setbuf[setbuflen];
|
|
||||||
|
|
||||||
for (i = 0; i < desc->nnodes; i++) {
|
for (i = 0; i < desc->nnodes; i++) {
|
||||||
snprintf(buf, sizeof(buf), _("NUMA node%d CPU(s):"), i);
|
snprintf(buf, sizeof(buf), _("NUMA node%d CPU(s):"), i);
|
||||||
print_s(buf, cpulist_create(
|
print_cpuset(buf, desc->nodemaps[i], hex);
|
||||||
setbuf, setbuflen,
|
|
||||||
desc->nodemaps[i],
|
|
||||||
setsize));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -860,19 +893,22 @@ void usage(int rc)
|
||||||
puts(_( "CPU architecture information helper\n\n"
|
puts(_( "CPU architecture information helper\n\n"
|
||||||
" -h, --help usage information\n"
|
" -h, --help usage information\n"
|
||||||
" -p, --parse print out in parsable instead of printable format.\n"
|
" -p, --parse print out in parsable instead of printable format.\n"
|
||||||
" -s, --sysroot use the directory as a new system root.\n"));
|
" -s, --sysroot use the directory as a new system root.\n"
|
||||||
|
" -x, --hex print haxadecimal masks rather than lists of CPU(s)\n"));
|
||||||
|
|
||||||
exit(rc);
|
exit(rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
struct lscpu_desc _desc, *desc = &_desc;
|
struct lscpu_desc _desc, *desc = &_desc;
|
||||||
int parsable = 0, c, i;
|
int parsable = 0, c, i, hex = 0;
|
||||||
|
|
||||||
struct option longopts[] = {
|
struct option longopts[] = {
|
||||||
{ "help", no_argument, 0, 'h' },
|
{ "help", no_argument, 0, 'h' },
|
||||||
{ "parse", no_argument, 0, 'p' },
|
{ "parse", no_argument, 0, 'p' },
|
||||||
{ "sysroot", required_argument, 0, 's' },
|
{ "sysroot", required_argument, 0, 's' },
|
||||||
|
{ "hex", no_argument, 0, 'x' },
|
||||||
{ NULL, 0, 0, 0 }
|
{ NULL, 0, 0, 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -880,7 +916,7 @@ int main(int argc, char *argv[])
|
||||||
bindtextdomain(PACKAGE, LOCALEDIR);
|
bindtextdomain(PACKAGE, LOCALEDIR);
|
||||||
textdomain(PACKAGE);
|
textdomain(PACKAGE);
|
||||||
|
|
||||||
while((c = getopt_long(argc, argv, "hps:", longopts, NULL)) != -1) {
|
while((c = getopt_long(argc, argv, "hps:x", longopts, NULL)) != -1) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case 'h':
|
case 'h':
|
||||||
usage(EXIT_SUCCESS);
|
usage(EXIT_SUCCESS);
|
||||||
|
@ -892,6 +928,9 @@ int main(int argc, char *argv[])
|
||||||
strncpy(pathbuf, optarg, sizeof(pathbuf));
|
strncpy(pathbuf, optarg, sizeof(pathbuf));
|
||||||
pathbuf[sizeof(pathbuf) - 1] = '\0';
|
pathbuf[sizeof(pathbuf) - 1] = '\0';
|
||||||
break;
|
break;
|
||||||
|
case 'x':
|
||||||
|
hex = 1;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
usage(EXIT_FAILURE);
|
usage(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
@ -918,7 +957,7 @@ int main(int argc, char *argv[])
|
||||||
if (parsable)
|
if (parsable)
|
||||||
print_parsable(desc);
|
print_parsable(desc);
|
||||||
else
|
else
|
||||||
print_readable(desc);
|
print_readable(desc, hex);
|
||||||
|
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue