xref: /dpdk/usertools/cpu_layout.py (revision deb87e67)
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 Networks Ltd. 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
38
39sockets = []
40cores = []
41core_map = {}
42base_path = "/sys/devices/system/cpu"
43fd = open("{}/kernel_max".format(base_path))
44max_cpus = int(fd.read())
45fd.close()
46for cpu in xrange(max_cpus + 1):
47    try:
48        fd = open("{}/cpu{}/topology/core_id".format(base_path, cpu))
49    except:
50        break
51    core = int(fd.read())
52    fd.close()
53    fd = open("{}/cpu{}/topology/physical_package_id".format(base_path, cpu))
54    socket = int(fd.read())
55    fd.close()
56    if core not in cores:
57        cores.append(core)
58    if socket not in sockets:
59        sockets.append(socket)
60    key = (socket, core)
61    if key not in core_map:
62        core_map[key] = []
63    core_map[key].append(cpu)
64
65print(format("=" * (47 + len(base_path))))
66print("Core and Socket Information (as reported by '{}')".format(base_path))
67print("{}\n".format("=" * (47 + len(base_path))))
68print("cores = ", cores)
69print("sockets = ", sockets)
70print("")
71
72max_processor_len = len(str(len(cores) * len(sockets) * 2 - 1))
73max_core_map_len = max_processor_len * 2 + len('[, ]') + len('Socket ')
74max_core_id_len = len(str(max(cores)))
75
76output = " ".ljust(max_core_id_len + len('Core '))
77for s in sockets:
78    output += " Socket %s" % str(s).ljust(max_core_map_len - len('Socket '))
79print(output)
80
81output = " ".ljust(max_core_id_len + len('Core '))
82for s in sockets:
83    output += " --------".ljust(max_core_map_len)
84    output += " "
85print(output)
86
87for c in cores:
88    output = "Core %s" % str(c).ljust(max_core_id_len)
89    for s in sockets:
90        output += " " + str(core_map[(s, c)]).ljust(max_core_map_len)
91    print(output)
92