xref: /dpdk/usertools/cpu_layout.py (revision f8244c6399d9fae6afab6770ae367aef38742ea5)
1#!/usr/bin/env python
2
3#
4#   BSD LICENSE
5#
6#   Copyright(c) 2010-2014 Intel Corporation. All rights reserved.
7#   Copyright(c) 2017 Cavium, Inc. All rights reserved.
8#   All rights reserved.
9#
10#   Redistribution and use in source and binary forms, with or without
11#   modification, are permitted provided that the following conditions
12#   are met:
13#
14#     * Redistributions of source code must retain the above copyright
15#       notice, this list of conditions and the following disclaimer.
16#     * Redistributions in binary form must reproduce the above copyright
17#       notice, this list of conditions and the following disclaimer in
18#       the documentation and/or other materials provided with the
19#       distribution.
20#     * Neither the name of Intel Corporation nor the names of its
21#       contributors may be used to endorse or promote products derived
22#       from this software without specific prior written permission.
23#
24#   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25#   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26#   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
27#   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
28#   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29#   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30#   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31#   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32#   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33#   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34#   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35#
36from __future__ import print_function
37import sys
38try:
39    xrange # Python 2
40except NameError:
41    xrange = range # Python 3
42
43sockets = []
44cores = []
45core_map = {}
46base_path = "/sys/devices/system/cpu"
47fd = open("{}/kernel_max".format(base_path))
48max_cpus = int(fd.read())
49fd.close()
50for cpu in xrange(max_cpus + 1):
51    try:
52        fd = open("{}/cpu{}/topology/core_id".format(base_path, cpu))
53    except IOError:
54        continue
55    except:
56        break
57    core = int(fd.read())
58    fd.close()
59    fd = open("{}/cpu{}/topology/physical_package_id".format(base_path, cpu))
60    socket = int(fd.read())
61    fd.close()
62    if core not in cores:
63        cores.append(core)
64    if socket not in sockets:
65        sockets.append(socket)
66    key = (socket, core)
67    if key not in core_map:
68        core_map[key] = []
69    core_map[key].append(cpu)
70
71print(format("=" * (47 + len(base_path))))
72print("Core and Socket Information (as reported by '{}')".format(base_path))
73print("{}\n".format("=" * (47 + len(base_path))))
74print("cores = ", cores)
75print("sockets = ", sockets)
76print("")
77
78max_processor_len = len(str(len(cores) * len(sockets) * 2 - 1))
79max_thread_count = len(list(core_map.values())[0])
80max_core_map_len = (max_processor_len * max_thread_count)  \
81                      + len(", ") * (max_thread_count - 1) \
82                      + len('[]') + len('Socket ')
83max_core_id_len = len(str(max(cores)))
84
85output = " ".ljust(max_core_id_len + len('Core '))
86for s in sockets:
87    output += " Socket %s" % str(s).ljust(max_core_map_len - len('Socket '))
88print(output)
89
90output = " ".ljust(max_core_id_len + len('Core '))
91for s in sockets:
92    output += " --------".ljust(max_core_map_len)
93    output += " "
94print(output)
95
96for c in cores:
97    output = "Core %s" % str(c).ljust(max_core_id_len)
98    for s in sockets:
99        if (s,c) in core_map:
100            output += " " + str(core_map[(s, c)]).ljust(max_core_map_len)
101        else:
102            output += " " * (max_core_map_len + 1)
103    print(output)
104