Supporting reading of system information from BIOS.
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
@@ -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.
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.pldmidecode.pl new file +50
-0@@ -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"; + }
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.htmlbut 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
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.pldmidecode.pl new file +41
-0@@ -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