From: Masayoshi Mizuma Date: Fri, 20 Nov 2020 05:06:08 +0000 (-0500) Subject: lscpu: add helper to get physical sockets X-Git-Tag: v2.37-rc1~280 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=788f90d69a43198e648442399967542e98e44d11;p=thirdparty%2Futil-linux.git lscpu: add helper to get physical sockets 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 --- diff --git a/sys-utils/lscpu-dmi.c b/sys-utils/lscpu-dmi.c index 00d4439f80..e7ffa88d3a 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 9ec3fca17c..74c647e3a8 100644 --- a/sys-utils/lscpu.h +++ b/sys-utils/lscpu.h @@ -311,10 +311,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 */