Skip to contentSkip to conversation

Supporting reading of system information from BIOS.

PATCH In review Rita Sinha 3 participants 4 messages Oct 14, 2014

lore
Share & tools
lore

Rita Sinha

author
#0 lore raw

PATCH 1/1 Supporting reading of system information from BIOS.

This patch is in response to http://wiki.xenproject.org/wiki/Outreach_Program_Projects#CPU.2FRAM.2FPCI_diagram_tool project for applying to OPW-Round9.It adds support for reading system architecture information from BIOS rather than from sysfs and proc interfaces since in a virtualisation enviroment, some of this information is no longer accurate, particularly any information based around numbers of cpus.

---
 dmidecode.pl | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)
 create mode 100644 dmidecode.pl
dmidecode.pl new file +51 -0
new file mode 100644
index 0000000..76fdf78
@@ -0,0 +1,51 @@
+#!/usr/bin/perl
+
+# dmidecode.pl - a script to read the system architecture information
+# directly from the BIOS.  Only for Linux.
+#
+# Rita Sinha ([email protected])
+# OPW Program-Round9
+# 14/10/14
+
+`id -u` == 0 || die "must be run as root";
+
+open(DmiFh, "/usr/sbin/dmidecode |") or
+  die "problem running dmidecode";
+$DmiNumProcs = 0;
+$DmiNumSockets = 0;
+while(<DmiFh>)
+  {
+    next unless /Central Processor/;
+    # We've found a processor (or at least a socket), keep going
+    while(<DmiFh>)
+	{
+	  # Keep walking the dmidecode output to find out if
+	  # the socket has a processor in it.
+	  last if /^Handle/;
+	  next unless /Status/;
+	  $DmiNumSockets += 1;
+	  /Populated/ and $DmiNumProcs += 1;
+	  last;
+	}
+  }
+close DmiFh;
+
+open(CpuInfoFh, "/proc/cpuinfo") || die "failed to open /proc/cpuinfo!";
+$CpuInfoNumProcs = 0;
+while(<CpuInfoFh>)
+  {
+    next unless /^processor.*:/;
+    ($CpuInfoNumProcs) += (/^processor.*: (\d+)/);
+  }
+close CpuInfoFh;
+
+if ( $DmiNumProcs != $CpuInfoNumProcs )
+  {
+    print "Warning: dmidecode reports $DmiNumProcs processors, kernel reports $CpuInfoNumProcs processors.\n";
+  }
+
+if ( $DmiNumProcs != $DmiNumSockets )
+  {
+    print "Info: dmidecode reports $DmiNumSockets cpu sockets, but only $DmiNumProcs processors.\n";
+  }
+
Signature · 8 lines
1.8.3.1

The information contained in this electronic mail transmission 
may be privileged and confidential, and therefore, protected 
from disclosure. If you have received this communication in 
error, please notify us immediately by replying to this 
message and deleting it from your computer without copying 
or disclosing it.
#1 lore raw
Quoted 8 lines · Rita Sinha

This patch is in response to
http://wiki.xenproject.org/wiki/Outreach_Program_Projects#CPU.2FRAM.2FPCI_diagram_tool
project for applying to OPW-Round9.It adds support for reading system architecture information from BIOS rather than from sysfs and proc interfaces since in a virtualisation enviroment, some of this information is no longer accurate, particularly any information based around numbers of cpus.

Nice, thanks for taking this project on.

Have you considered implementing something that functions the same as hwloc-gather-topology(1):
http://manpages.ubuntu.com/manpages/saucy/man1/hwloc-gather-topology.1.html

but instead of collecting information from /proc and /sys, it accesses DMI and ACPI tables directly? This would let you reuse the existing lstopo(1) command to display a graphical topology.

--msw

Quoted 61 lines
---
 dmidecode.pl | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)
 create mode 100644 dmidecode.pl
dmidecode.pl new file +50 -0
new file mode 100644
index 0000000..76fdf78
@@ -0,0 +1,51 @@
+#!/usr/bin/perl
+
+# dmidecode.pl - a script to read the system architecture information
+# directly from the BIOS.  Only for Linux.
+#
+# Rita Sinha ([email protected])
+# OPW Program-Round9
+# 14/10/14
+
+`id -u` == 0 || die "must be run as root";
+
+open(DmiFh, "/usr/sbin/dmidecode |") or
+  die "problem running dmidecode";
+$DmiNumProcs = 0;
+$DmiNumSockets = 0;
+while(<DmiFh>)
+  {
+    next unless /Central Processor/;
+    # We've found a processor (or at least a socket), keep going
+    while(<DmiFh>)
+	{
+	  # Keep walking the dmidecode output to find out if
+	  # the socket has a processor in it.
+	  last if /^Handle/;
+	  next unless /Status/;
+	  $DmiNumSockets += 1;
+	  /Populated/ and $DmiNumProcs += 1;
+	  last;
+	}
+  }
+close DmiFh;
+
+open(CpuInfoFh, "/proc/cpuinfo") || die "failed to open /proc/cpuinfo!";
+$CpuInfoNumProcs = 0;
+while(<CpuInfoFh>)
+  {
+    next unless /^processor.*:/;
+    ($CpuInfoNumProcs) += (/^processor.*: (\d+)/);
+  }
+close CpuInfoFh;
+
+if ( $DmiNumProcs != $CpuInfoNumProcs )
+  {
+    print "Warning: dmidecode reports $DmiNumProcs processors, kernel reports $CpuInfoNumProcs processors.\n";
+  }
+
+if ( $DmiNumProcs != $DmiNumSockets )
+  {
+    print "Info: dmidecode reports $DmiNumSockets cpu sockets, but only $DmiNumProcs processors.\n";
+  }
author
#2 lore raw

Hi Matt,

Please find my response inline.

Quoted 9 lines

Have you considered implementing something that functions the same as hwloc-gather-topology(1):
http://manpages.ubuntu.com/manpages/saucy/man1/hwloc-gather-topology.1.html

but instead of collecting information from /proc and /sys, it accesses DMI and ACPI tables directly? This would let you reuse the existing lstopo(1) command to display a graphical topology.

This patch is just to float my idea as to how I plan to implement this project. It is open to any suggestions, ideas or queries from others in the community.

Yes. Andrew and I have discussed that the hwloc method of detection(reading the sysfs interface) for native linux is wrong and I plan to reimplement it using DMI and ACPI tables data.

Regards,
Rita Sinha

#3 lore raw
In reply to Rita Sinha

On 14/10/14 05:44, Rita Sinha wrote:

Thanks for having a stab at this. Some comments inline

Quoted 1 line

This patch is in response to http://wiki.xenproject.org/wiki/Outreach_Program_Projects#CPU.2FRAM.2FPCI_diagram_tool project for applying to OPW-Round9.It adds support for reading system architecture information from BIOS rather than from sysfs and proc interfaces since in a virtualisation enviroment, some of this information is no longer accurate, particularly any information based around numbers of cpus.

Would you mind formatting this to 80 columns wide?

Generally speaking, submission of patches need a Signed-off-by: tag.

Quoted 52 lines
---
 dmidecode.pl | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 51 insertions(+)
 create mode 100644 dmidecode.pl
dmidecode.pl new file +41 -0
new file mode 100644
index 0000000..76fdf78
@@ -0,0 +1,51 @@
+#!/usr/bin/perl
+
+# dmidecode.pl - a script to read the system architecture information
+# directly from the BIOS.  Only for Linux.
+#
+# Rita Sinha ([email protected])
+# OPW Program-Round9
+# 14/10/14
+
+`id -u` == 0 || die "must be run as root";
+
+open(DmiFh, "/usr/sbin/dmidecode |") or
+  die "problem running dmidecode";
+$DmiNumProcs = 0;
+$DmiNumSockets = 0;
+while(<DmiFh>)
+  {
+    next unless /Central Processor/;
+    # We've found a processor (or at least a socket), keep going
+    while(<DmiFh>)
+	{
+	  # Keep walking the dmidecode output to find out if
+	  # the socket has a processor in it.
+	  last if /^Handle/;
+	  next unless /Status/;
+	  $DmiNumSockets += 1;
+	  /Populated/ and $DmiNumProcs += 1;
+	  last;
+	}
+  }
+close DmiFh;
+
+open(CpuInfoFh, "/proc/cpuinfo") || die "failed to open /proc/cpuinfo!";
+$CpuInfoNumProcs = 0;
+while(<CpuInfoFh>)
+  {
+    next unless /^processor.*:/;
+    ($CpuInfoNumProcs) += (/^processor.*: (\d+)/);
+  }
+close CpuInfoFh;
+

dmidecode.pl line 51

Quoted 10 lines
dmidecode.pl new file +10 -0
+if ( $DmiNumProcs != $CpuInfoNumProcs )
+  {
+    print "Warning: dmidecode reports $DmiNumProcs processors, kernel reports $CpuInfoNumProcs processors.\n";
+  }
+
+if ( $DmiNumProcs != $DmiNumSockets )
+  {
+    print "Info: dmidecode reports $DmiNumSockets cpu sockets, but only $DmiNumProcs processors.\n";
+  }
+

Running this script in dom0 yields:

[root@fusebot ~]# ./dmidecode.pl
Warning: dmidecode reports 1 processors, kernel reports 4 processors.

This is a Xeon E3-1240 v3 system where dom0 has 4 vcpus.

Under Xen, each vcpu appears as a separate processor, which is why /proc/cpuinfo and dmidecode disagree about the processor count. This also goes to show that /proc/cpuinfo only sees the virtual layout, not the physical layout.

I think it might be worth starting with a design of the first task we discussed, including the indented source of the information to be used.

~Andrew