lscpu: make read_topology() more robust to avoid SIGFPE

Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
Karel Zak 2012-11-13 10:36:25 +01:00
parent a901dd5dad
commit d4bfa64d44

View file

@ -627,16 +627,26 @@ read_topology(struct lscpu_desc *desc, int num)
/* threads within one core */ /* threads within one core */
nthreads = CPU_COUNT_S(setsize, thread_siblings); nthreads = CPU_COUNT_S(setsize, thread_siblings);
if (!nthreads)
nthreads = 1;
/* cores within one socket */ /* cores within one socket */
ncores = CPU_COUNT_S(setsize, core_siblings) / nthreads; ncores = CPU_COUNT_S(setsize, core_siblings) / nthreads;
/* number of sockets within one book. if (!ncores)
* Because of odd / non-present cpu maps and to keep ncores = 1;
* calculation easy we make sure that nsockets and
* nbooks is at least 1. /* number of sockets within one book. Because of odd /
* non-present cpu maps and to keep calculation easy we make
* sure that nsockets and nbooks is at least 1.
*/ */
nsockets = desc->ncpus / nthreads / ncores ?: 1; nsockets = desc->ncpus / nthreads / ncores;
if (!nsockets)
nsockets = 1;
/* number of books */ /* number of books */
nbooks = desc->ncpus / nthreads / ncores / nsockets ?: 1; nbooks = desc->ncpus / nthreads / ncores / nsockets;
if (!nbooks)
nbooks = 1;
/* all threads, see also read_basicinfo() /* all threads, see also read_basicinfo()
* -- fallback for kernels without * -- fallback for kernels without
@ -644,6 +654,7 @@ read_topology(struct lscpu_desc *desc, int num)
*/ */
if (!desc->nthreads) if (!desc->nthreads)
desc->nthreads = nbooks * nsockets * ncores * nthreads; desc->nthreads = nbooks * nsockets * ncores * nthreads;
/* For each map we make sure that it can have up to ncpuspos /* For each map we make sure that it can have up to ncpuspos
* entries. This is because we cannot reliably calculate the * entries. This is because we cannot reliably calculate the
* number of cores, sockets and books on all architectures. * number of cores, sockets and books on all architectures.