lscpu: make read_topology() more robust to avoid SIGFPE
Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
parent
a901dd5dad
commit
d4bfa64d44
1 changed files with 17 additions and 6 deletions
|
@ -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.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue