]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lscpu: add helper to get physical sockets
authorMasayoshi Mizuma <m.mizuma@jp.fujitsu.com>
Fri, 20 Nov 2020 05:06:08 +0000 (00:06 -0500)
committerKarel Zak <kzak@redhat.com>
Fri, 20 Nov 2020 08:17:12 +0000 (09:17 +0100)
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@jp.fujitsu.com>
sys-utils/lscpu-dmi.c
sys-utils/lscpu.h

index 00d4439f80c97f85024dd2be64d0b4d5e35d2191..e7ffa88d3abb20d89a6c3aa4c926f11ac09067c6 100644 (file)
@@ -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;
+}
index 9ec3fca17c8c237905b233b71ce34b47a1ee2c21..74c647e3a8f0df29f8c37b6acc5ec3a1e12e7b1b 100644 (file)
@@ -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 */