From 219da9223d14aa21e4feb4fe850eb4c1691c98d8 Mon Sep 17 00:00:00 2001 From: Davidlohr Bueso Date: Fri, 30 Jul 2010 11:43:36 -0400 Subject: dmesg: fix memory leak in dmesg(1). Signed-off-by: Davidlohr Bueso --- sys-utils/dmesg.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'sys-utils') diff --git a/sys-utils/dmesg.c b/sys-utils/dmesg.c index fd184aaf..f1a7dcb7 100644 --- a/sys-utils/dmesg.c +++ b/sys-utils/dmesg.c @@ -111,12 +111,12 @@ main(int argc, char *argv[]) { if (bufsize) { sz = bufsize + 8; - buf = (char *) malloc(sz); + buf = (char *) malloc(sz * sizeof(char)); n = klogctl(cmd, buf, sz); } else { sz = 16392; while (1) { - buf = (char *) malloc(sz); + buf = (char *) malloc(sz * sizeof(char)); n = klogctl(3, buf, sz); /* read only */ if (n != sz || sz > (1<<28)) break; @@ -147,5 +147,6 @@ main(int argc, char *argv[]) { } if (lastc != '\n') putchar('\n'); + free(buf); return 0; } -- cgit v1.2.3 From aac1e59ebb205d0ae5a0480900bab22ae34729d9 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Wed, 11 Aug 2010 12:43:25 +0200 Subject: lscpu: support offline CPUs # echo 0 >/sys/devices/system/cpu/cpu3/online # echo 0 >/sys/devices/system/cpu/cpu2/online # grep processor /proc/cpuinfo processor : 0 processor : 1 # lscpu lscpu: error: cannot open /sys/devices/system/cpu/cpu2/cache/index0/shared_cpu_map: No such file or directory This patch also add a new "On-line CPU(s):" line to the lscpu(1) output. Addresses: http://bugzilla.redhat.com/show_bug.cgi?id=623012 Signed-off-by: Karel Zak --- sys-utils/lscpu.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 52 insertions(+), 9 deletions(-) (limited to 'sys-utils') diff --git a/sys-utils/lscpu.c b/sys-utils/lscpu.c index 74f5e781..eff655c4 100644 --- a/sys-utils/lscpu.c +++ b/sys-utils/lscpu.c @@ -101,6 +101,7 @@ struct lscpu_desc { int mode; /* rm, lm or/and tm */ int ncpus; /* number of CPUs */ + cpu_set_t *online; /* mask with online CPUs */ int nnodes; /* number of NUMA modes */ cpu_set_t **nodemaps; /* array with NUMA nodes */ @@ -125,6 +126,10 @@ static size_t sysrootlen; static char pathbuf[PATH_MAX]; static int maxcpus; /* size in bits of kernel cpu mask */ +#define is_cpu_online(_d, _cpu) \ + ((_d) && (_d)->online ? \ + CPU_ISSET_S((_cpu), CPU_ALLOC_SIZE(maxcpus), (_d)->online) : 0) + static FILE *path_fopen(const char *mode, int exit_on_err, const char *path, ...) __attribute__ ((__format__ (__printf__, 3, 4))); static void path_getstr(char *result, size_t len, const char *path, ...) @@ -235,17 +240,14 @@ xstrdup(const char *str) } static cpu_set_t * -path_cpuset(const char *path, ...) +path_cpuparse(int islist, const char *path, va_list ap) { FILE *fd; - va_list ap; cpu_set_t *set; size_t setsize, len = maxcpus * 7; char buf[len]; - va_start(ap, path); fd = path_vfopen("r", 1, path, ap); - va_end(ap); if (!fgets(buf, len, fd)) err(EXIT_FAILURE, _("failed to read: %s"), pathbuf); @@ -259,8 +261,38 @@ path_cpuset(const char *path, ...) if (!set) err(EXIT_FAILURE, _("failed to callocate cpu set")); - if (cpumask_parse(buf, set, setsize)) - errx(EXIT_FAILURE, _("failed to parse CPU mask %s"), buf); + if (islist) { + if (cpulist_parse(buf, set, setsize)) + errx(EXIT_FAILURE, _("failed to parse CPU list %s"), buf); + } else { + if (cpumask_parse(buf, set, setsize)) + errx(EXIT_FAILURE, _("failed to parse CPU mask %s"), buf); + } + return set; +} + +static cpu_set_t * +path_cpuset(const char *path, ...) +{ + va_list ap; + cpu_set_t *set; + + va_start(ap, path); + set = path_cpuparse(0, path, ap); + va_end(ap); + + return set; +} + +static cpu_set_t * +path_cpulist(const char *path, ...) +{ + va_list ap; + cpu_set_t *set; + + va_start(ap, path); + set = path_cpuparse(1, path, ap); + va_end(ap); return set; } @@ -365,6 +397,9 @@ read_basicinfo(struct lscpu_desc *desc) /* we are reading some /sys snapshot instead of the real /sys, * let's use any crazy number... */ maxcpus = desc->ncpus > 2048 ? desc->ncpus : 2048; + + /* get mask for online CPUs */ + desc->online = path_cpulist(_PATH_SYS_SYSTEM "/cpu/online"); } static int @@ -523,7 +558,8 @@ read_topology(struct lscpu_desc *desc, int num) "/cpu%d/topology/thread_siblings", num); core_siblings = path_cpuset(_PATH_SYS_CPU "/cpu%d/topology/core_siblings", num); - if (num == 0) { + + if (!desc->coremaps) { int ncores, nsockets, nthreads; size_t setsize = CPU_ALLOC_SIZE(maxcpus); @@ -563,7 +599,7 @@ read_cache(struct lscpu_desc *desc, int num) char buf[256]; int i; - if (num == 0) { + if (!desc->ncaches) { while(path_exist(_PATH_SYS_SYSTEM "/cpu/cpu%d/cache/index%d", num, desc->ncaches)) desc->ncaches++; @@ -670,6 +706,9 @@ print_parsable(struct lscpu_desc *desc) for (i = 0; i < desc->ncpus; i++) { + if (!is_cpu_online(desc, i)) + continue; + /* #CPU */ printf("%d", i); @@ -734,6 +773,7 @@ print_readable(struct lscpu_desc *desc) { char buf[512]; int i; + size_t setsize = CPU_ALLOC_SIZE(maxcpus); print_s(_("Architecture:"), desc->arch); @@ -757,6 +797,7 @@ print_readable(struct lscpu_desc *desc) } print_n(_("CPU(s):"), desc->ncpus); + print_n(_("On-line CPU(s):"), CPU_COUNT_S(setsize, desc->online)); if (desc->nsockets) { print_n(_("Thread(s) per core:"), desc->nthreads / desc->ncores); @@ -806,7 +847,7 @@ print_readable(struct lscpu_desc *desc) print_s(buf, cpulist_create( setbuf, setbuflen, desc->nodemaps[i], - CPU_ALLOC_SIZE(maxcpus))); + setsize)); } } } @@ -861,6 +902,8 @@ int main(int argc, char *argv[]) read_basicinfo(desc); for (i = 0; i < desc->ncpus; i++) { + if (!is_cpu_online(desc, i)) + continue; read_topology(desc, i); read_cache(desc, i); } -- cgit v1.2.3 From 4f912c6ac5f62b801fc9078aa0517bb72ce6bd1b Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Wed, 11 Aug 2010 15:41:48 +0200 Subject: lscpu: add -x and {On,Off}-line CPU(s) mask/list Signed-off-by: Karel Zak --- sys-utils/lscpu.1 | 4 +++ sys-utils/lscpu.c | 73 ++++++++++++++++++++++++++++++++++++++++++------------- 2 files changed, 60 insertions(+), 17 deletions(-) (limited to 'sys-utils') diff --git a/sys-utils/lscpu.1 b/sys-utils/lscpu.1 index 4f78ee6b..30e08a57 100644 --- a/sys-utils/lscpu.1 +++ b/sys-utils/lscpu.1 @@ -22,6 +22,10 @@ Print a help message. .TP .BR \-p , " \-\-parse" 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 The basic overview about CPU family, model, etc. is always based on the first CPU only. diff --git a/sys-utils/lscpu.c b/sys-utils/lscpu.c index eff655c4..58cd869d 100644 --- a/sys-utils/lscpu.c +++ b/sys-utils/lscpu.c @@ -769,7 +769,24 @@ print_parsable(struct lscpu_desc *desc) #define print_n(_key, _val) printf("%-23s%d\n", _key, _val) 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]; int i; @@ -797,7 +814,31 @@ print_readable(struct lscpu_desc *desc) } 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) { 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++) { - snprintf(buf, sizeof(buf), _("NUMA node%d CPU(s):"), i); - print_s(buf, cpulist_create( - setbuf, setbuflen, - desc->nodemaps[i], - setsize)); - } + for (i = 0; i < desc->nnodes; i++) { + snprintf(buf, sizeof(buf), _("NUMA node%d CPU(s):"), i); + print_cpuset(buf, desc->nodemaps[i], hex); } } @@ -860,19 +893,22 @@ void usage(int rc) puts(_( "CPU architecture information helper\n\n" " -h, --help usage information\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); } int main(int argc, char *argv[]) { struct lscpu_desc _desc, *desc = &_desc; - int parsable = 0, c, i; + int parsable = 0, c, i, hex = 0; struct option longopts[] = { { "help", no_argument, 0, 'h' }, { "parse", no_argument, 0, 'p' }, { "sysroot", required_argument, 0, 's' }, + { "hex", no_argument, 0, 'x' }, { NULL, 0, 0, 0 } }; @@ -880,7 +916,7 @@ int main(int argc, char *argv[]) bindtextdomain(PACKAGE, LOCALEDIR); 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) { case 'h': usage(EXIT_SUCCESS); @@ -892,6 +928,9 @@ int main(int argc, char *argv[]) strncpy(pathbuf, optarg, sizeof(pathbuf)); pathbuf[sizeof(pathbuf) - 1] = '\0'; break; + case 'x': + hex = 1; + break; default: usage(EXIT_FAILURE); } @@ -918,7 +957,7 @@ int main(int argc, char *argv[]) if (parsable) print_parsable(desc); else - print_readable(desc); + print_readable(desc, hex); return EXIT_SUCCESS; } -- cgit v1.2.3 From 1fc0b941d6d14ac2b8a5b0e40ab3c9981c034d41 Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Fri, 20 Aug 2010 11:45:00 +0200 Subject: flock: properly report exec() errors Reported-by: Barry Davis Signed-off-by: Karel Zak --- sys-utils/flock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'sys-utils') diff --git a/sys-utils/flock.c b/sys-utils/flock.c index 1f1c563b..20004cae 100644 --- a/sys-utils/flock.c +++ b/sys-utils/flock.c @@ -298,8 +298,8 @@ int main(int argc, char *argv[]) } else if ( f == 0 ) { if ( do_close ) close(fd); - err = errno; execvp(cmd_argv[0], cmd_argv); + err = errno; /* execvp() failed */ fprintf(stderr, "%s: %s: %s\n", program, cmd_argv[0], strerror(err)); _exit((err == ENOMEM) ? EX_OSERR: EX_UNAVAILABLE); -- cgit v1.2.3 From 9b8d4d5f1818ede8f38eca74aef30a62e8e70ef3 Mon Sep 17 00:00:00 2001 From: Davidlohr Bueso Date: Tue, 17 Aug 2010 10:02:00 -0400 Subject: lscpu: add byte order and bogoMIPS information Signed-off-by: Davidlohr Bueso Signed-off-by: Karel Zak --- sys-utils/lscpu.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'sys-utils') diff --git a/sys-utils/lscpu.c b/sys-utils/lscpu.c index 58cd869d..ac66d2ec 100644 --- a/sys-utils/lscpu.c +++ b/sys-utils/lscpu.c @@ -30,6 +30,7 @@ #include #include #include +#include #include "cpuset.h" #include "nls.h" @@ -97,6 +98,7 @@ struct lscpu_desc { int virtype; /* VIRT_PARA|FULL|NONE ? */ char *mhz; char *stepping; + char *bogomips; char *flags; int mode; /* rm, lm or/and tm */ @@ -366,6 +368,7 @@ read_basicinfo(struct lscpu_desc *desc) else if (lookup(buf, "stepping", &desc->stepping)) ; else if (lookup(buf, "cpu MHz", &desc->mhz)) ; else if (lookup(buf, "flags", &desc->flags)) ; + else if (lookup(buf, "bogomips", &desc->bogomips)) ; else continue; } @@ -812,7 +815,13 @@ print_readable(struct lscpu_desc *desc, int hex) *(p - 2) = '\0'; print_s(_("CPU op-mode(s):"), buf); } - +#ifdef __BYTE_ORDER +#if (__BYTE_ORDER == __LITTLE_ENDIAN) + print_s(_("Byte Order:"), "Little Endian"); +#else + print_s(_("Byte Order:"), "Big Endian"); +#endif +#endif print_n(_("CPU(s):"), desc->ncpus); print_cpuset(hex ? _("On-line CPU(s) mask:") : @@ -858,6 +867,8 @@ print_readable(struct lscpu_desc *desc, int hex) print_s(_("Stepping:"), desc->stepping); if (desc->mhz) print_s(_("CPU MHz:"), desc->mhz); + if (desc->bogomips) + print_s(_("BogoMIPS:"), desc->bogomips); if (desc->virtflag) { if (!strcmp(desc->virtflag, "svm")) print_s(_("Virtualization:"), "AMD-V"); -- cgit v1.2.3 From 5d4ba40ddcf8e0edb3e595e398d22af67074cebe Mon Sep 17 00:00:00 2001 From: Karel Zak Date: Fri, 20 Aug 2010 21:15:51 +0200 Subject: lscpu: support sysfs without cpu/online file Signed-off-by: Karel Zak --- sys-utils/lscpu.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'sys-utils') diff --git a/sys-utils/lscpu.c b/sys-utils/lscpu.c index ac66d2ec..027a2982 100644 --- a/sys-utils/lscpu.c +++ b/sys-utils/lscpu.c @@ -402,7 +402,8 @@ read_basicinfo(struct lscpu_desc *desc) maxcpus = desc->ncpus > 2048 ? desc->ncpus : 2048; /* get mask for online CPUs */ - desc->online = path_cpulist(_PATH_SYS_SYSTEM "/cpu/online"); + if (path_exist(_PATH_SYS_SYSTEM "/cpu/online")) + desc->online = path_cpulist(_PATH_SYS_SYSTEM "/cpu/online"); } static int @@ -709,7 +710,7 @@ print_parsable(struct lscpu_desc *desc) for (i = 0; i < desc->ncpus; i++) { - if (!is_cpu_online(desc, i)) + if (desc->online && !is_cpu_online(desc, i)) continue; /* #CPU */ @@ -824,11 +825,12 @@ print_readable(struct lscpu_desc *desc, int hex) #endif print_n(_("CPU(s):"), desc->ncpus); - print_cpuset(hex ? _("On-line CPU(s) mask:") : - _("On-line CPU(s) list:"), - desc->online, hex); + if (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) { + if (desc->online && CPU_COUNT_S(setsize, desc->online) != desc->ncpus) { cpu_set_t *set; /* Linux kernel provides cpuset of off-line CPUs that contains @@ -952,7 +954,7 @@ int main(int argc, char *argv[]) read_basicinfo(desc); for (i = 0; i < desc->ncpus; i++) { - if (!is_cpu_online(desc, i)) + if (desc->online && !is_cpu_online(desc, i)) continue; read_topology(desc, i); read_cache(desc, i); -- cgit v1.2.3