| Zhang, Yanmin | 69dcc99 | 2006-02-03 03:04:36 -0800 | [diff] [blame] | 1 |  | 
| Alex Chiang | 663fb2f | 2009-10-21 21:45:31 -0600 | [diff] [blame] | 2 | Export CPU topology info via sysfs. Items (attributes) are similar | 
| Bartosz Golaszewski | 54a5369 | 2015-05-26 15:11:29 +0200 | [diff] [blame] | 3 | to /proc/cpuinfo output of some architectures: | 
| Zhang, Yanmin | 69dcc99 | 2006-02-03 03:04:36 -0800 | [diff] [blame] | 4 |  | 
 | 5 | 1) /sys/devices/system/cpu/cpuX/topology/physical_package_id: | 
| Alex Chiang | 663fb2f | 2009-10-21 21:45:31 -0600 | [diff] [blame] | 6 |  | 
 | 7 | 	physical package id of cpuX. Typically corresponds to a physical | 
 | 8 | 	socket number, but the actual value is architecture and platform | 
 | 9 | 	dependent. | 
 | 10 |  | 
| Zhang, Yanmin | 69dcc99 | 2006-02-03 03:04:36 -0800 | [diff] [blame] | 11 | 2) /sys/devices/system/cpu/cpuX/topology/core_id: | 
| Alex Chiang | 663fb2f | 2009-10-21 21:45:31 -0600 | [diff] [blame] | 12 |  | 
 | 13 | 	the CPU core ID of cpuX. Typically it is the hardware platform's | 
 | 14 | 	identifier (rather than the kernel's).  The actual value is | 
 | 15 | 	architecture and platform dependent. | 
 | 16 |  | 
| Heiko Carstens | b40d8ed | 2010-08-31 10:28:17 +0200 | [diff] [blame] | 17 | 3) /sys/devices/system/cpu/cpuX/topology/book_id: | 
 | 18 |  | 
 | 19 | 	the book ID of cpuX. Typically it is the hardware platform's | 
 | 20 | 	identifier (rather than the kernel's).	The actual value is | 
 | 21 | 	architecture and platform dependent. | 
 | 22 |  | 
 | 23 | 4) /sys/devices/system/cpu/cpuX/topology/thread_siblings: | 
| Alex Chiang | 663fb2f | 2009-10-21 21:45:31 -0600 | [diff] [blame] | 24 |  | 
| Xishi Qiu | f8ea61e6 | 2013-09-04 18:58:29 +0800 | [diff] [blame] | 25 | 	internal kernel map of cpuX's hardware threads within the same | 
| Bartosz Golaszewski | 54a5369 | 2015-05-26 15:11:29 +0200 | [diff] [blame] | 26 | 	core as cpuX. | 
| Alex Chiang | 663fb2f | 2009-10-21 21:45:31 -0600 | [diff] [blame] | 27 |  | 
| Bartosz Golaszewski | 54a5369 | 2015-05-26 15:11:29 +0200 | [diff] [blame] | 28 | 5) /sys/devices/system/cpu/cpuX/topology/thread_siblings_list: | 
 | 29 |  | 
 | 30 | 	human-readable list of cpuX's hardware threads within the same | 
 | 31 | 	core as cpuX. | 
 | 32 |  | 
 | 33 | 6) /sys/devices/system/cpu/cpuX/topology/core_siblings: | 
| Alex Chiang | 663fb2f | 2009-10-21 21:45:31 -0600 | [diff] [blame] | 34 |  | 
 | 35 | 	internal kernel map of cpuX's hardware threads within the same | 
 | 36 | 	physical_package_id. | 
| Zhang, Yanmin | 69dcc99 | 2006-02-03 03:04:36 -0800 | [diff] [blame] | 37 |  | 
| Bartosz Golaszewski | 54a5369 | 2015-05-26 15:11:29 +0200 | [diff] [blame] | 38 | 7) /sys/devices/system/cpu/cpuX/topology/core_siblings_list: | 
 | 39 |  | 
 | 40 | 	human-readable list of cpuX's hardware threads within the same | 
 | 41 | 	physical_package_id. | 
 | 42 |  | 
 | 43 | 8) /sys/devices/system/cpu/cpuX/topology/book_siblings: | 
| Heiko Carstens | b40d8ed | 2010-08-31 10:28:17 +0200 | [diff] [blame] | 44 |  | 
 | 45 | 	internal kernel map of cpuX's hardware threads within the same | 
 | 46 | 	book_id. | 
 | 47 |  | 
| Bartosz Golaszewski | 54a5369 | 2015-05-26 15:11:29 +0200 | [diff] [blame] | 48 | 9) /sys/devices/system/cpu/cpuX/topology/book_siblings_list: | 
 | 49 |  | 
 | 50 | 	human-readable list of cpuX's hardware threads within the same | 
 | 51 | 	book_id. | 
 | 52 |  | 
| Zhang, Yanmin | 69dcc99 | 2006-02-03 03:04:36 -0800 | [diff] [blame] | 53 | To implement it in an architecture-neutral way, a new source file, | 
| Bartosz Golaszewski | 54a5369 | 2015-05-26 15:11:29 +0200 | [diff] [blame] | 54 | drivers/base/topology.c, is to export the 6 or 9 attributes. The three book | 
| Heiko Carstens | b40d8ed | 2010-08-31 10:28:17 +0200 | [diff] [blame] | 55 | related sysfs files will only be created if CONFIG_SCHED_BOOK is selected. | 
| Zhang, Yanmin | 69dcc99 | 2006-02-03 03:04:36 -0800 | [diff] [blame] | 56 |  | 
| Ben Hutchings | c50cbb0 | 2008-06-04 21:47:29 -0700 | [diff] [blame] | 57 | For an architecture to support this feature, it must define some of | 
 | 58 | these macros in include/asm-XXX/topology.h: | 
| Zhang, Yanmin | 69dcc99 | 2006-02-03 03:04:36 -0800 | [diff] [blame] | 59 | #define topology_physical_package_id(cpu) | 
 | 60 | #define topology_core_id(cpu) | 
| Heiko Carstens | b40d8ed | 2010-08-31 10:28:17 +0200 | [diff] [blame] | 61 | #define topology_book_id(cpu) | 
| Bartosz Golaszewski | 06931e6 | 2015-05-26 15:11:28 +0200 | [diff] [blame] | 62 | #define topology_sibling_cpumask(cpu) | 
| Rusty Russell | fbd59a8 | 2009-01-10 21:58:08 -0800 | [diff] [blame] | 63 | #define topology_core_cpumask(cpu) | 
| Heiko Carstens | b40d8ed | 2010-08-31 10:28:17 +0200 | [diff] [blame] | 64 | #define topology_book_cpumask(cpu) | 
| Zhang, Yanmin | 69dcc99 | 2006-02-03 03:04:36 -0800 | [diff] [blame] | 65 |  | 
| Bartosz Golaszewski | 54a5369 | 2015-05-26 15:11:29 +0200 | [diff] [blame] | 66 | The type of **_id macros is int. | 
 | 67 | The type of **_cpumask macros is (const) struct cpumask *. The latter | 
 | 68 | correspond with appropriate **_siblings sysfs attributes (except for | 
 | 69 | topology_sibling_cpumask() which corresponds with thread_siblings). | 
| Zhang, Yanmin | 69dcc99 | 2006-02-03 03:04:36 -0800 | [diff] [blame] | 70 |  | 
| Ben Hutchings | c50cbb0 | 2008-06-04 21:47:29 -0700 | [diff] [blame] | 71 | To be consistent on all architectures, include/linux/topology.h | 
 | 72 | provides default definitions for any of the above macros that are | 
 | 73 | not defined by include/asm-XXX/topology.h: | 
 | 74 | 1) physical_package_id: -1 | 
 | 75 | 2) core_id: 0 | 
| Bartosz Golaszewski | 54a5369 | 2015-05-26 15:11:29 +0200 | [diff] [blame] | 76 | 3) sibling_cpumask: just the given CPU | 
 | 77 | 4) core_cpumask: just the given CPU | 
| Mike Travis | d62720a | 2008-12-17 14:14:30 -0800 | [diff] [blame] | 78 |  | 
| Heiko Carstens | b40d8ed | 2010-08-31 10:28:17 +0200 | [diff] [blame] | 79 | For architectures that don't support books (CONFIG_SCHED_BOOK) there are no | 
 | 80 | default definitions for topology_book_id() and topology_book_cpumask(). | 
 | 81 |  | 
| Alex Chiang | 663fb2f | 2009-10-21 21:45:31 -0600 | [diff] [blame] | 82 | Additionally, CPU topology information is provided under | 
| Mike Travis | d62720a | 2008-12-17 14:14:30 -0800 | [diff] [blame] | 83 | /sys/devices/system/cpu and includes these files.  The internal | 
 | 84 | source for the output is in brackets ("[]"). | 
 | 85 |  | 
| Alex Chiang | 663fb2f | 2009-10-21 21:45:31 -0600 | [diff] [blame] | 86 |     kernel_max: the maximum CPU index allowed by the kernel configuration. | 
| Mike Travis | d62720a | 2008-12-17 14:14:30 -0800 | [diff] [blame] | 87 | 		[NR_CPUS-1] | 
 | 88 |  | 
| Alex Chiang | 663fb2f | 2009-10-21 21:45:31 -0600 | [diff] [blame] | 89 |     offline:	CPUs that are not online because they have been | 
| Mike Travis | d62720a | 2008-12-17 14:14:30 -0800 | [diff] [blame] | 90 | 		HOTPLUGGED off (see cpu-hotplug.txt) or exceed the limit | 
| Alex Chiang | 663fb2f | 2009-10-21 21:45:31 -0600 | [diff] [blame] | 91 | 		of CPUs allowed by the kernel configuration (kernel_max | 
| Mike Travis | d62720a | 2008-12-17 14:14:30 -0800 | [diff] [blame] | 92 | 		above). [~cpu_online_mask + cpus >= NR_CPUS] | 
 | 93 |  | 
| Alex Chiang | 663fb2f | 2009-10-21 21:45:31 -0600 | [diff] [blame] | 94 |     online:	CPUs that are online and being scheduled [cpu_online_mask] | 
| Mike Travis | d62720a | 2008-12-17 14:14:30 -0800 | [diff] [blame] | 95 |  | 
| Alex Chiang | 663fb2f | 2009-10-21 21:45:31 -0600 | [diff] [blame] | 96 |     possible:	CPUs that have been allocated resources and can be | 
| Mike Travis | d62720a | 2008-12-17 14:14:30 -0800 | [diff] [blame] | 97 | 		brought online if they are present. [cpu_possible_mask] | 
 | 98 |  | 
| Alex Chiang | 663fb2f | 2009-10-21 21:45:31 -0600 | [diff] [blame] | 99 |     present:	CPUs that have been identified as being present in the | 
| Mike Travis | d62720a | 2008-12-17 14:14:30 -0800 | [diff] [blame] | 100 | 		system. [cpu_present_mask] | 
 | 101 |  | 
 | 102 | The format for the above output is compatible with cpulist_parse() | 
 | 103 | [see <linux/cpumask.h>].  Some examples follow. | 
 | 104 |  | 
| Alex Chiang | 663fb2f | 2009-10-21 21:45:31 -0600 | [diff] [blame] | 105 | In this example, there are 64 CPUs in the system but cpus 32-63 exceed | 
| Mike Travis | d62720a | 2008-12-17 14:14:30 -0800 | [diff] [blame] | 106 | the kernel max which is limited to 0..31 by the NR_CPUS config option | 
| Alex Chiang | 663fb2f | 2009-10-21 21:45:31 -0600 | [diff] [blame] | 107 | being 32.  Note also that CPUs 2 and 4-31 are not online but could be | 
| Mike Travis | d62720a | 2008-12-17 14:14:30 -0800 | [diff] [blame] | 108 | brought online as they are both present and possible. | 
 | 109 |  | 
 | 110 |      kernel_max: 31 | 
 | 111 |         offline: 2,4-31,32-63 | 
 | 112 |          online: 0-1,3 | 
 | 113 |        possible: 0-31 | 
 | 114 |         present: 0-31 | 
 | 115 |  | 
 | 116 | In this example, the NR_CPUS config option is 128, but the kernel was | 
| Alex Chiang | 663fb2f | 2009-10-21 21:45:31 -0600 | [diff] [blame] | 117 | started with possible_cpus=144.  There are 4 CPUs in the system and cpu2 | 
 | 118 | was manually taken offline (and is the only CPU that can be brought | 
| Mike Travis | d62720a | 2008-12-17 14:14:30 -0800 | [diff] [blame] | 119 | online.) | 
 | 120 |  | 
 | 121 |      kernel_max: 127 | 
 | 122 |         offline: 2,4-127,128-143 | 
 | 123 |          online: 0-1,3 | 
 | 124 |        possible: 0-127 | 
 | 125 |         present: 0-3 | 
 | 126 |  | 
 | 127 | See cpu-hotplug.txt for the possible_cpus=NUM kernel start parameter | 
| Alex Chiang | 663fb2f | 2009-10-21 21:45:31 -0600 | [diff] [blame] | 128 | as well as more information on the various cpumasks. |