From: Masayoshi Mizuma <m.mizuma@xxxxxxxxxxxxxx> Add a helper function, get_number_of_physical_sockets_from_dmi(), to get physical sockets from DMI table in case of the sysfs for cpu topology doesn't have the physical socket information. get_number_of_physical_sockets_from_dmi() parse the DMI table and counts the number of SMBIOS Processor Information (Type04) structure. Signed-off-by: Masayoshi Mizuma <m.mizuma@xxxxxxxxxxxxxx> --- sys-utils/lscpu-dmi.c | 29 +++++++++++++++++++++++++++++ sys-utils/lscpu.h | 2 ++ 2 files changed, 31 insertions(+) diff --git a/sys-utils/lscpu-dmi.c b/sys-utils/lscpu-dmi.c index 00d4439f8..e7ffa88d3 100644 --- a/sys-utils/lscpu-dmi.c +++ b/sys-utils/lscpu-dmi.c @@ -66,6 +66,9 @@ int parse_dmi_table(uint16_t len, uint16_t num, di->manufacturer = dmi_string(&h, data[0x04]); di->product = dmi_string(&h, data[0x05]); break; + case 4: + di->sockets++; + break; default: break; } @@ -77,3 +80,29 @@ int parse_dmi_table(uint16_t len, uint16_t num, done: return rc; } + +size_t get_number_of_physical_sockets_from_dmi(void) +{ + static char const sys_fw_dmi_tables[] = _PATH_SYS_DMI; + struct dmi_info di; + struct stat st; + uint8_t *data; + int rc = 0; + + if (stat(sys_fw_dmi_tables, &st)) + return rc; + + data = get_mem_chunk(0, st.st_size, sys_fw_dmi_tables); + if (!data) + return rc; + + memset(&di, 0, sizeof(struct dmi_info)); + rc = parse_dmi_table(st.st_size, st.st_size/4, data, &di); + + free(data); + + if ((rc < 0) || !di.sockets) + return 0; + else + return di.sockets; +} diff --git a/sys-utils/lscpu.h b/sys-utils/lscpu.h index 565f6aee5..d137b94b1 100644 --- a/sys-utils/lscpu.h +++ b/sys-utils/lscpu.h @@ -312,10 +312,12 @@ struct dmi_info { char *vendor; char *product; char *manufacturer; + int sockets; }; void to_dmi_header(struct lscpu_dmi_header *h, uint8_t *data); char *dmi_string(const struct lscpu_dmi_header *dm, uint8_t s); int parse_dmi_table(uint16_t len, uint16_t num, uint8_t *data, struct dmi_info *di); +size_t get_number_of_physical_sockets_from_dmi(void); #endif /* LSCPU_H */ -- 2.27.0