[PATCH 3/4] lscpu: add helper to get physical sockets

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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.

Note, ARM SBBR v1.0 and newer requires SMBIOS Processor Information
(Type04). And ARM SBBR v1.2 requires ACPI PPTT which has physical socket
information. So the helper function is useful for the machine base on
SBBR v1.0 and v1.1.

Signed-off-by: Masayoshi Mizuma <m.mizuma@xxxxxxxxxxxxxx>
---
 sys-utils/lscpu-dmi.c | 30 ++++++++++++++++++++++++++++++
 sys-utils/lscpu.h     |  1 +
 2 files changed, 31 insertions(+)

diff --git a/sys-utils/lscpu-dmi.c b/sys-utils/lscpu-dmi.c
index 64aac99f5..21c557aeb 100644
--- a/sys-utils/lscpu-dmi.c
+++ b/sys-utils/lscpu-dmi.c
@@ -46,6 +46,7 @@ struct dmi_info {
 	char *vendor;
 	char *product;
 	char *manufacturer;
+	int sockets;
 };
 
 static void *get_mem_chunk(size_t base, size_t len, const char *devmem)
@@ -137,6 +138,9 @@ static 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;
 		}
@@ -330,3 +334,29 @@ int read_hypervisor_dmi(void)
 
 	return rc < 0 ? HYPER_NONE : rc;
 }
+
+int 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 = -1;
+
+	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 rc;
+	else
+		return di.sockets;
+}
diff --git a/sys-utils/lscpu.h b/sys-utils/lscpu.h
index 13af2ad0a..4475a3d27 100644
--- a/sys-utils/lscpu.h
+++ b/sys-utils/lscpu.h
@@ -209,6 +209,7 @@ struct lscpu_modifier {
 };
 
 extern int read_hypervisor_dmi(void);
+extern int get_number_of_physical_sockets_from_dmi(void);
 extern void arm_cpu_decode(struct lscpu_desc *desc);
 
 #endif /* LSCPU_H */
-- 
2.27.0




[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux