From: Ivan Khoronzhuk <hidden> Date: 2015-02-04 17:06:37
Some utils, like dmidecode and smbios, need to access SMBIOS entry
table area in order to get information like SMBIOS version, size, etc.
Currently it's done via /dev/mem. But for situation when /dev/mem
usage is disabled, the utils have to use dmi sysfs instead, which
doesn't represent SMBIOS entry. So this patch adds SMBIOS area to
dmi-sysfs in order to allow utils in question to work correctly with
dmi sysfs interface.
Reviewed-by: Ard Biesheuvel <redacted>
Signed-off-by: Ivan Khoronzhuk <redacted>
---
v1: https://lkml.org/lkml/2015/1/23/643
v2: https://lkml.org/lkml/2015/1/26/345
v3: https://lkml.org/lkml/2015/1/28/768
v4..v2:
firmware: dmi_scan: add symbol to get SMBIOS entry area
- used u8 type for smbios_header var
firmware: dmi-sysfs: add SMBIOS entry point area attribute
- replaced -ENODATA on -EINVAL
v3..v2:
firmware: dmi_scan: add symbol to get SMBIOS entry area
firmware: dmi-sysfs: add SMBIOS entry point area attribute
- combined in one patch
- added SMBIOS information to ABI sysfs-dmi documentaton
v2..v1:
firmware: dmi_scan: add symbol to get SMBIOS entry area
- used additional static var to hold SMBIOS raw table size
- changed format of get_smbios_entry_area symbol
returned pointer on const smbios table
firmware: dmi-sysfs: add SMBIOS entry point area attribute
- adopted to updated get_smbios_entry_area symbol
- removed redundant array to save smbios table
Documentation/ABI/testing/sysfs-firmware-dmi | 10 +++++++
drivers/firmware/dmi-sysfs.c | 42 ++++++++++++++++++++++++++++
drivers/firmware/dmi_scan.c | 26 +++++++++++++++++
include/linux/dmi.h | 3 ++
4 files changed, 81 insertions(+)
@@ -12,6 +12,16 @@ Description: cannot ensure that the data as exported to userland is without error either.+ The firmware provides DMI structures as a packed list of+ data referenced by a SMBIOS table entry point. The SMBIOS+ entry point contains general information, like SMBIOS+ version, DMI table size, etc. The structure, content and+ size of SMBIOS entry point is dependent on SMBIOS version.+ That's why SMBIOS entry point is represented in dmi sysfs+ like a raw attribute and is accessible via+ /sys/firmware/dmi/smbios_raw_header. The format of SMBIOS+ entry point header can be read in SMBIOS specification.+ DMI is structured as a large table of entries, where each entry has a common header indicating the type and length of the entry, as well as a firmware-provided
@@ -29,6 +29,8 @@#define MAX_ENTRY_TYPE 255 /* Most of these aren't used, but we considerthetopentrytypeisonly8bits*/+staticconstu8*smbios_raw_header;+structdmi_sysfs_entry{structdmi_headerdh;structkobjectkobj;
@@ -646,9 +648,37 @@ static void cleanup_entry_list(void)}}+staticssize_tsmbios_entry_area_raw_read(structfile*filp,+structkobject*kobj,+structbin_attribute*bin_attr,+char*buf,loff_tpos,size_tcount)+{+ssize_tsize;++size=bin_attr->size;++if(size>pos)+size-=pos;+else+return0;++if(count<size)+size=count;++memcpy(buf,&smbios_raw_header[pos],size);++returnsize;+}++staticstructbin_attributesmbios_raw_area_attr={+.read=smbios_entry_area_raw_read,+.attr={.name="smbios_raw_header",.mode=0400},+};+staticint__initdmi_sysfs_init(void){interror=-ENOMEM;+intsize;intval;/* Set up our directory */
@@ -669,6 +699,18 @@ static int __init dmi_sysfs_init(void)gotoerr;}+smbios_raw_header=dmi_get_smbios_entry_area(&size);+if(!smbios_raw_header){+pr_debug("dmi-sysfs: SMBIOS raw data is not available.\n");+error=-EINVAL;+gotoerr;+}++/* Create the raw binary file to access the entry area */+smbios_raw_area_attr.size=size;+if(sysfs_create_bin_file(dmi_kobj,&smbios_raw_area_attr))+gotoerr;+pr_debug("dmi-sysfs: loaded.\n");return0;
@@ -113,6 +113,8 @@ static void dmi_table(u8 *buf, int len, int num,}}+staticu8smbios_header[32];+staticintsmbios_header_size;staticphys_addr_tdmi_base;staticu16dmi_len;staticu16dmi_num;
@@ -474,6 +476,8 @@ static int __init dmi_present(const u8 *buf)if(memcmp(buf,"_SM_",4)==0&&buf[5]<32&&dmi_checksum(buf,buf[5])){smbios_ver=get_unaligned_be16(buf+6);+smbios_header_size=buf[5];+memcpy(smbios_header,buf,smbios_header_size);/* Some BIOS report weird SMBIOS version, fix that up */switch(smbios_ver){
From: Ivan Khoronzhuk <hidden> Date: 2015-02-10 09:51:52
Hi Matt,
On 02/04/2015 07:06 PM, Ivan Khoronzhuk wrote:
quoted hunk
Some utils, like dmidecode and smbios, need to access SMBIOS entry
table area in order to get information like SMBIOS version, size, etc.
Currently it's done via /dev/mem. But for situation when /dev/mem
usage is disabled, the utils have to use dmi sysfs instead, which
doesn't represent SMBIOS entry. So this patch adds SMBIOS area to
dmi-sysfs in order to allow utils in question to work correctly with
dmi sysfs interface.
Reviewed-by: Ard Biesheuvel <redacted>
Signed-off-by: Ivan Khoronzhuk <redacted>
---
v1: https://lkml.org/lkml/2015/1/23/643
v2: https://lkml.org/lkml/2015/1/26/345
v3: https://lkml.org/lkml/2015/1/28/768
v4..v2:
firmware: dmi_scan: add symbol to get SMBIOS entry area
- used u8 type for smbios_header var
firmware: dmi-sysfs: add SMBIOS entry point area attribute
- replaced -ENODATA on -EINVAL
v3..v2:
firmware: dmi_scan: add symbol to get SMBIOS entry area
firmware: dmi-sysfs: add SMBIOS entry point area attribute
- combined in one patch
- added SMBIOS information to ABI sysfs-dmi documentaton
v2..v1:
firmware: dmi_scan: add symbol to get SMBIOS entry area
- used additional static var to hold SMBIOS raw table size
- changed format of get_smbios_entry_area symbol
returned pointer on const smbios table
firmware: dmi-sysfs: add SMBIOS entry point area attribute
- adopted to updated get_smbios_entry_area symbol
- removed redundant array to save smbios table
Documentation/ABI/testing/sysfs-firmware-dmi | 10 +++++++
drivers/firmware/dmi-sysfs.c | 42 ++++++++++++++++++++++++++++
drivers/firmware/dmi_scan.c | 26 +++++++++++++++++
include/linux/dmi.h | 3 ++
4 files changed, 81 insertions(+)
@@ -12,6 +12,16 @@ Description: cannot ensure that the data as exported to userland is without error either.+ The firmware provides DMI structures as a packed list of+ data referenced by a SMBIOS table entry point. The SMBIOS+ entry point contains general information, like SMBIOS+ version, DMI table size, etc. The structure, content and+ size of SMBIOS entry point is dependent on SMBIOS version.+ That's why SMBIOS entry point is represented in dmi sysfs+ like a raw attribute and is accessible via+ /sys/firmware/dmi/smbios_raw_header. The format of SMBIOS+ entry point header can be read in SMBIOS specification.+ DMI is structured as a large table of entries, where each entry has a common header indicating the type and length of the entry, as well as a firmware-provided
@@ -29,6 +29,8 @@#define MAX_ENTRY_TYPE 255 /* Most of these aren't used, but we considerthetopentrytypeisonly8bits*/+staticconstu8*smbios_raw_header;+structdmi_sysfs_entry{structdmi_headerdh;structkobjectkobj;
@@ -646,9 +648,37 @@ static void cleanup_entry_list(void)}}+staticssize_tsmbios_entry_area_raw_read(structfile*filp,+structkobject*kobj,+structbin_attribute*bin_attr,+char*buf,loff_tpos,size_tcount)+{+ssize_tsize;++size=bin_attr->size;++if(size>pos)+size-=pos;+else+return0;++if(count<size)+size=count;++memcpy(buf,&smbios_raw_header[pos],size);++returnsize;+}++staticstructbin_attributesmbios_raw_area_attr={+.read=smbios_entry_area_raw_read,+.attr={.name="smbios_raw_header",.mode=0400},+};+staticint__initdmi_sysfs_init(void){interror=-ENOMEM;+intsize;intval;/* Set up our directory */
@@ -669,6 +699,18 @@ static int __init dmi_sysfs_init(void)gotoerr;}+smbios_raw_header=dmi_get_smbios_entry_area(&size);+if(!smbios_raw_header){+pr_debug("dmi-sysfs: SMBIOS raw data is not available.\n");+error=-EINVAL;+gotoerr;+}++/* Create the raw binary file to access the entry area */+smbios_raw_area_attr.size=size;+if(sysfs_create_bin_file(dmi_kobj,&smbios_raw_area_attr))+gotoerr;+pr_debug("dmi-sysfs: loaded.\n");return0;
@@ -113,6 +113,8 @@ static void dmi_table(u8 *buf, int len, int num,}}+staticu8smbios_header[32];+staticintsmbios_header_size;staticphys_addr_tdmi_base;staticu16dmi_len;staticu16dmi_num;
@@ -474,6 +476,8 @@ static int __init dmi_present(const u8 *buf)if(memcmp(buf,"_SM_",4)==0&&buf[5]<32&&dmi_checksum(buf,buf[5])){smbios_ver=get_unaligned_be16(buf+6);+smbios_header_size=buf[5];+memcpy(smbios_header,buf,smbios_header_size);/* Some BIOS report weird SMBIOS version, fix that up */switch(smbios_ver){
What version of the kernel did you base this patch on? The conflict is
trivial to fixup and I've done so and pushed it out on the EFI 'next'
branch, but I wanted to call out this conflict explicitly.
--
Matt Fleming, Intel Open Source Technology Center
The problem is in above string.
I used linux next, but I had one patch before.
Sorry... just forgot about it.
I've attached the same patch but on top of linux_next,
it can be applied cleanly.
Sorry once again and thanks!
dmi_len = get_unaligned_le32(buf + 12);
dmi_base = get_unaligned_le64(buf + 16);
+ smbios_header_size = buf[6];
+ memcpy(smbios_header, buf, smbios_header_size);
/*
* The 64-bit SMBIOS 3.0 entry point no longer has a field
What version of the kernel did you base this patch on? The conflict is
trivial to fixup and I've done so and pushed it out on the EFI 'next'
branch, but I wanted to call out this conflict explicitly.
From: Jean Delvare <hidden> Date: 2015-02-26 09:36:30
Hi Ivan,
Sorry for the late review.
On Wed, 4 Feb 2015 19:06:03 +0200, Ivan Khoronzhuk wrote:
Some utils, like dmidecode and smbios, need to access SMBIOS entry
table area in order to get information like SMBIOS version, size, etc.
Currently it's done via /dev/mem. But for situation when /dev/mem
usage is disabled, the utils have to use dmi sysfs instead, which
doesn't represent SMBIOS entry. So this patch adds SMBIOS area to
dmi-sysfs in order to allow utils in question to work correctly with
dmi sysfs interface.
Reviewed-by: Ard Biesheuvel <redacted>
Signed-off-by: Ivan Khoronzhuk <redacted>
---
v1: https://lkml.org/lkml/2015/1/23/643
v2: https://lkml.org/lkml/2015/1/26/345
v3: https://lkml.org/lkml/2015/1/28/768
v4..v2:
Please always provide a list of changes from the previous version of
the patch, otherwise it's quite confusing.
quoted hunk
firmware: dmi_scan: add symbol to get SMBIOS entry area
- used u8 type for smbios_header var
firmware: dmi-sysfs: add SMBIOS entry point area attribute
- replaced -ENODATA on -EINVAL
v3..v2:
firmware: dmi_scan: add symbol to get SMBIOS entry area
firmware: dmi-sysfs: add SMBIOS entry point area attribute
- combined in one patch
- added SMBIOS information to ABI sysfs-dmi documentaton
v2..v1:
firmware: dmi_scan: add symbol to get SMBIOS entry area
- used additional static var to hold SMBIOS raw table size
- changed format of get_smbios_entry_area symbol
returned pointer on const smbios table
firmware: dmi-sysfs: add SMBIOS entry point area attribute
- adopted to updated get_smbios_entry_area symbol
- removed redundant array to save smbios table
Documentation/ABI/testing/sysfs-firmware-dmi | 10 +++++++
drivers/firmware/dmi-sysfs.c | 42 ++++++++++++++++++++++++++++
drivers/firmware/dmi_scan.c | 26 +++++++++++++++++
include/linux/dmi.h | 3 ++
4 files changed, 81 insertions(+)
@@ -12,6 +12,16 @@ Description: cannot ensure that the data as exported to userland is without error either.+ The firmware provides DMI structures as a packed list of+ data referenced by a SMBIOS table entry point. The SMBIOS+ entry point contains general information, like SMBIOS+ version, DMI table size, etc. The structure, content and+ size of SMBIOS entry point is dependent on SMBIOS version.+ That's why SMBIOS entry point is represented in dmi sysfs+ like a raw attribute and is accessible via+ /sys/firmware/dmi/smbios_raw_header. The format of SMBIOS
As mentioned before, I don't like the name "smbios_raw_header". I think
it should be "smbios_entry_point" or similar.
quoted hunk
+ entry point header can be read in SMBIOS specification.
+
DMI is structured as a large table of entries, where
each entry has a common header indicating the type and
length of the entry, as well as a firmware-provided
@@ -29,6 +29,8 @@#define MAX_ENTRY_TYPE 255 /* Most of these aren't used, but we considerthetopentrytypeisonly8bits*/+staticconstu8*smbios_raw_header;+structdmi_sysfs_entry{structdmi_headerdh;structkobjectkobj;
This is confusing again, now it's named "entry_area"? Please be
consistent and use entry_point everywhere.
As mentioned before I believe that this code should live in dmi_scan
and not dmi-sysfs.
@@ -669,6 +699,18 @@ static int __init dmi_sysfs_init(void) goto err; }+ smbios_raw_header = dmi_get_smbios_entry_area(&size);+ if (!smbios_raw_header) {+ pr_debug("dmi-sysfs: SMBIOS raw data is not available.\n");+ error = -EINVAL;+ goto err;+ }
I don't think this should have been a fatal error. Just because for
some reason dmi_get_smbios_entry_area() returned NULL is no good reason
for nor exposing /sys/firmware/dmi/entries as we used to.
But anyway this is no longer relevant if the code is moved to dmi_scan
as I suggested.
+
+ /* Create the raw binary file to access the entry area */
+ smbios_raw_area_attr.size = size;
+ if (sysfs_create_bin_file(dmi_kobj, &smbios_raw_area_attr))
+ goto err;
I think this should have had a corresponding call to
sysfs_remove_bin_file() in dmi_sysfs_exit(). (Again no longer relevant
if the code is moved.)
@@ -113,6 +113,8 @@ static void dmi_table(u8 *buf, int len, int num,}}+staticu8smbios_header[32];+staticintsmbios_header_size;staticphys_addr_tdmi_base;staticu16dmi_len;staticu16dmi_num;
@@ -474,6 +476,8 @@ static int __init dmi_present(const u8 *buf)if(memcmp(buf,"_SM_",4)==0&&buf[5]<32&&dmi_checksum(buf,buf[5])){smbios_ver=get_unaligned_be16(buf+6);+smbios_header_size=buf[5];+memcpy(smbios_header,buf,smbios_header_size);/* Some BIOS report weird SMBIOS version, fix that up */switch(smbios_ver){
I don't see why you need to check for !dmi_available. If
smbios_header_size is non-zero then the required data is available. It
is independent from dmi_walk_early() having succeeded or not.
If you really believe that this function should return NULL if
dmi_walk_early() failed (I don't), then you should be consistent and
only fill up smbios_header after dmi_walk_early() has been successfully
called.
There's one thing I do not understand. I seem to understand that the
goal behind this patch is to be able to run dmidecode without /dev/mem.
Dmidecode currently reads 2 areas from /dev/mem: the 0xF0000-0xFFFFF
area in search of the entry point, and the DMI data table itself. With
this patch you make the entry point available through sysfs. But
dmidecode will still need to access /dev/mem to access the DMI data
table. So that does not really solve anything, does it?
If we expose the raw DMI/SMBIOS entry point through sysfs, I believe we
want to expose the DMI table there too.
Thanks,
--
Jean Delvare
SUSE L3 Support
Hi Ivan,
Sorry for the late review.
On Wed, 4 Feb 2015 19:06:03 +0200, Ivan Khoronzhuk wrote:
quoted
Some utils, like dmidecode and smbios, need to access SMBIOS entry
table area in order to get information like SMBIOS version, size, etc.
Currently it's done via /dev/mem. But for situation when /dev/mem
usage is disabled, the utils have to use dmi sysfs instead, which
doesn't represent SMBIOS entry. So this patch adds SMBIOS area to
dmi-sysfs in order to allow utils in question to work correctly with
dmi sysfs interface.
Reviewed-by: Ard Biesheuvel <redacted>
Signed-off-by: Ivan Khoronzhuk <redacted>
---
v1: https://lkml.org/lkml/2015/1/23/643
v2: https://lkml.org/lkml/2015/1/26/345
v3: https://lkml.org/lkml/2015/1/28/768
v4..v2:
Please always provide a list of changes from the previous version of
the patch, otherwise it's quite confusing.
Typo v4..v2 -> v4..v3
quoted
firmware: dmi_scan: add symbol to get SMBIOS entry area
- used u8 type for smbios_header var
firmware: dmi-sysfs: add SMBIOS entry point area attribute
- replaced -ENODATA on -EINVAL
v3..v2:
firmware: dmi_scan: add symbol to get SMBIOS entry area
firmware: dmi-sysfs: add SMBIOS entry point area attribute
- combined in one patch
- added SMBIOS information to ABI sysfs-dmi documentaton
v2..v1:
firmware: dmi_scan: add symbol to get SMBIOS entry area
- used additional static var to hold SMBIOS raw table size
- changed format of get_smbios_entry_area symbol
returned pointer on const smbios table
firmware: dmi-sysfs: add SMBIOS entry point area attribute
- adopted to updated get_smbios_entry_area symbol
- removed redundant array to save smbios table
Documentation/ABI/testing/sysfs-firmware-dmi | 10 +++++++
drivers/firmware/dmi-sysfs.c | 42 ++++++++++++++++++++++++++++
drivers/firmware/dmi_scan.c | 26 +++++++++++++++++
include/linux/dmi.h | 3 ++
4 files changed, 81 insertions(+)
@@ -12,6 +12,16 @@ Description: cannot ensure that the data as exported to userland is without error either.+ The firmware provides DMI structures as a packed list of+ data referenced by a SMBIOS table entry point. The SMBIOS+ entry point contains general information, like SMBIOS+ version, DMI table size, etc. The structure, content and+ size of SMBIOS entry point is dependent on SMBIOS version.+ That's why SMBIOS entry point is represented in dmi sysfs+ like a raw attribute and is accessible via+ /sys/firmware/dmi/smbios_raw_header. The format of SMBIOS
As mentioned before, I don't like the name "smbios_raw_header". I think
it should be "smbios_entry_point" or similar.
If Matt is OK to get another version,
Let it be smbios_entry_point.
If it's more convenient, it should be changed while it's possible.
quoted
+ entry point header can be read in SMBIOS specification.
+
DMI is structured as a large table of entries, where
each entry has a common header indicating the type and
length of the entry, as well as a firmware-provided
@@ -29,6 +29,8 @@#define MAX_ENTRY_TYPE 255 /* Most of these aren't used, but we considerthetopentrytypeisonly8bits*/+staticconstu8*smbios_raw_header;+structdmi_sysfs_entry{structdmi_headerdh;structkobjectkobj;
This is confusing again, now it's named "entry_area"? Please be
consistent and use entry_point everywhere.
As mentioned before I believe that this code should live in dmi_scan
and not dmi-sysfs.
@@ -669,6 +699,18 @@ static int __init dmi_sysfs_init(void) goto err; }+ smbios_raw_header = dmi_get_smbios_entry_area(&size);+ if (!smbios_raw_header) {+ pr_debug("dmi-sysfs: SMBIOS raw data is not available.\n");+ error = -EINVAL;+ goto err;+ }
I don't think this should have been a fatal error. Just because for
some reason dmi_get_smbios_entry_area() returned NULL is no good reason
for nor exposing /sys/firmware/dmi/entries as we used to.
It issues an error only in case of when entry table is not available,
if entry point is absent then dmi table is not available a fortiori.
So there is no reason to continue from that point.
But anyway this is no longer relevant if the code is moved to dmi_scan
as I suggested.
quoted
+
+ /* Create the raw binary file to access the entry area */
+ smbios_raw_area_attr.size = size;
+ if (sysfs_create_bin_file(dmi_kobj, &smbios_raw_area_attr))
+ goto err;
I think this should have had a corresponding call to
sysfs_remove_bin_file() in dmi_sysfs_exit(). (Again no longer relevant
if the code is moved.)
The removing is done in kobject_del().
Doesn't it? In another way it should be done for
dmi/entries/*/raw attributes also.
@@ -113,6 +113,8 @@ static void dmi_table(u8 *buf, int len, int num,}}+staticu8smbios_header[32];+staticintsmbios_header_size;staticphys_addr_tdmi_base;staticu16dmi_len;staticu16dmi_num;
@@ -474,6 +476,8 @@ static int __init dmi_present(const u8 *buf)if(memcmp(buf,"_SM_",4)==0&&buf[5]<32&&dmi_checksum(buf,buf[5])){smbios_ver=get_unaligned_be16(buf+6);+smbios_header_size=buf[5];+memcpy(smbios_header,buf,smbios_header_size);/* Some BIOS report weird SMBIOS version, fix that up */switch(smbios_ver){
I don't see why you need to check for !dmi_available. If
smbios_header_size is non-zero then the required data is available. It
is independent from dmi_walk_early() having succeeded or not.
Probably you are right.
It's better to check only smbios_header_size.
If you really believe that this function should return NULL if
dmi_walk_early() failed (I don't), then you should be consistent and
only fill up smbios_header after dmi_walk_early() has been successfully
called.
There's one thing I do not understand. I seem to understand that the
goal behind this patch is to be able to run dmidecode without /dev/mem.
Dmidecode currently reads 2 areas from /dev/mem: the 0xF0000-0xFFFFF
area in search of the entry point, and the DMI data table itself. With
this patch you make the entry point available through sysfs. But
dmidecode will still need to access /dev/mem to access the DMI data
table. So that does not really solve anything, does it?
It's supposed to read DMI table via entries presented by dmi-sysfs.
It contains raw attributes that can be used for these purposes.
No need to use /dev/mem.
Another case if you want to add binary of whole dmi table to be able to
read it directly in order to parse in dmidecode w/o any additional headache
with open/close. Well, it partly dupes currently present dmi-sysfs.
But it simplifies dmi table parsing for dmidecode, and who wants to use
dmi-sysfs, let them use it, but dmidecode will be reading raw entry.
Well let it be. Why not.
If others are OK, for dmidecode, and probably others tools also,
kernel can constantly expose two tables under /sys/firmware/dmi/tables/
smbios_entry_point and dmi_table. Independently on dmi-sysfs.
If we expose the raw DMI/SMBIOS entry point through sysfs, I believe we
want to expose the DMI table there too.
Thanks,
From: Jean Delvare <hidden> Date: 2015-03-10 09:13:37
Hi Ivan,
Sorry for the late reply. I think I addressed some points in other
replies already, but for completeness let me reply to this post too.
Le Wednesday 04 March 2015 à 14:30 +0200, Ivan.khoronzhuk a écrit :
On 02/26/2015 11:36 AM, Jean Delvare wrote:
quoted
On Wed, 4 Feb 2015 19:06:03 +0200, Ivan Khoronzhuk wrote:
@@ -12,6 +12,16 @@ Description: cannot ensure that the data as exported to userland is without error either.+ The firmware provides DMI structures as a packed list of+ data referenced by a SMBIOS table entry point. The SMBIOS+ entry point contains general information, like SMBIOS+ version, DMI table size, etc. The structure, content and+ size of SMBIOS entry point is dependent on SMBIOS version.+ That's why SMBIOS entry point is represented in dmi sysfs+ like a raw attribute and is accessible via+ /sys/firmware/dmi/smbios_raw_header. The format of SMBIOS
As mentioned before, I don't like the name "smbios_raw_header". I think
it should be "smbios_entry_point" or similar.
If Matt is OK to get another version,
Let it be smbios_entry_point.
If it's more convenient, it should be changed while it's possible.
Great, thanks.
quoted
quoted
@@ -669,6 +699,18 @@ static int __init dmi_sysfs_init(void) goto err; }+ smbios_raw_header = dmi_get_smbios_entry_area(&size);+ if (!smbios_raw_header) {+ pr_debug("dmi-sysfs: SMBIOS raw data is not available.\n");+ error = -EINVAL;+ goto err;+ }
I don't think this should have been a fatal error. Just because for
some reason dmi_get_smbios_entry_area() returned NULL is no good reason
for nor exposing /sys/firmware/dmi/entries as we used to.
It issues an error only in case of when entry table is not available,
if entry point is absent then dmi table is not available a fortiori.
So there is no reason to continue from that point.
Well it could also fail because of an error in the code ;-) But OK, I
agree with you here.
quoted
But anyway this is no longer relevant if the code is moved to dmi_scan
as I suggested.
quoted
+
+ /* Create the raw binary file to access the entry area */
+ smbios_raw_area_attr.size = size;
+ if (sysfs_create_bin_file(dmi_kobj, &smbios_raw_area_attr))
+ goto err;
I think this should have had a corresponding call to
sysfs_remove_bin_file() in dmi_sysfs_exit(). (Again no longer relevant
if the code is moved.)
The removing is done in kobject_del().
Doesn't it? In another way it should be done for
dmi/entries/*/raw attributes also.
It _is_ done for other attributes already:
kset_unregister(dmi_kset);
Which is exactly why I believe it should be done for
smbios_raw_area_attr too. All other kernel drivers are calling
sysfs_create_bin_file() or equivalent in their cleanup function and I
see no reason why this driver would be an exception.
quoted
There's one thing I do not understand. I seem to understand that the
goal behind this patch is to be able to run dmidecode without /dev/mem.
Dmidecode currently reads 2 areas from /dev/mem: the 0xF0000-0xFFFFF
area in search of the entry point, and the DMI data table itself. With
this patch you make the entry point available through sysfs. But
dmidecode will still need to access /dev/mem to access the DMI data
table. So that does not really solve anything, does it?
It's supposed to read DMI table via entries presented by dmi-sysfs.
It contains raw attributes that can be used for these purposes.
No need to use /dev/mem.
Yes, I understood this meanwhile, sorry.
Another case if you want to add binary of whole dmi table to be able to
read it directly in order to parse in dmidecode w/o any additional headache
with open/close. Well, it partly dupes currently present dmi-sysfs.
In fact dmi-sysfs already duplicates a lot of code which was already
present in dmidecode and libsmbios. And exporting the raw table will
require way less code than the implementation you proposed originally.
So the code duplication argument doesn't hold, sorry.
But it simplifies dmi table parsing for dmidecode, and who wants to use
dmi-sysfs, let them use it, but dmidecode will be reading raw entry.
Well let it be. Why not.
Yes, this is exactly my point.
If others are OK, for dmidecode, and probably others tools also,
kernel can constantly expose two tables under /sys/firmware/dmi/tables/
smbios_entry_point and dmi_table. Independently on dmi-sysfs.
That's what I would like to see implemented, yes, thank you very much.
--
Jean Delvare
SUSE L3 Support
Hi Ivan,
Sorry for the late reply. I think I addressed some points in other
replies already, but for completeness let me reply to this post too.
Le Wednesday 04 March 2015 à 14:30 +0200, Ivan.khoronzhuk a écrit :
quoted
On 02/26/2015 11:36 AM, Jean Delvare wrote:
quoted
On Wed, 4 Feb 2015 19:06:03 +0200, Ivan Khoronzhuk wrote:
@@ -12,6 +12,16 @@ Description: cannot ensure that the data as exported to userland is without error either.+ The firmware provides DMI structures as a packed list of+ data referenced by a SMBIOS table entry point. The SMBIOS+ entry point contains general information, like SMBIOS+ version, DMI table size, etc. The structure, content and+ size of SMBIOS entry point is dependent on SMBIOS version.+ That's why SMBIOS entry point is represented in dmi sysfs+ like a raw attribute and is accessible via+ /sys/firmware/dmi/smbios_raw_header. The format of SMBIOS
As mentioned before, I don't like the name "smbios_raw_header". I think
it should be "smbios_entry_point" or similar.
If Matt is OK to get another version,
Let it be smbios_entry_point.
If it's more convenient, it should be changed while it's possible.
Great, thanks.
quoted
quoted
quoted
@@ -669,6 +699,18 @@ static int __init dmi_sysfs_init(void) goto err; }+ smbios_raw_header = dmi_get_smbios_entry_area(&size);+ if (!smbios_raw_header) {+ pr_debug("dmi-sysfs: SMBIOS raw data is not available.\n");+ error = -EINVAL;+ goto err;+ }
I don't think this should have been a fatal error. Just because for
some reason dmi_get_smbios_entry_area() returned NULL is no good reason
for nor exposing /sys/firmware/dmi/entries as we used to.
It issues an error only in case of when entry table is not available,
if entry point is absent then dmi table is not available a fortiori.
So there is no reason to continue from that point.
Well it could also fail because of an error in the code ;-) But OK, I
agree with you here.
quoted
quoted
But anyway this is no longer relevant if the code is moved to dmi_scan
as I suggested.
quoted
+
+ /* Create the raw binary file to access the entry area */
+ smbios_raw_area_attr.size = size;
+ if (sysfs_create_bin_file(dmi_kobj, &smbios_raw_area_attr))
+ goto err;
I think this should have had a corresponding call to
sysfs_remove_bin_file() in dmi_sysfs_exit(). (Again no longer relevant
if the code is moved.)
The removing is done in kobject_del().
Doesn't it? In another way it should be done for
dmi/entries/*/raw attributes also.
It _is_ done for other attributes already:
kset_unregister(dmi_kset);
Which is exactly why I believe it should be done for
smbios_raw_area_attr too. All other kernel drivers are calling
sysfs_create_bin_file() or equivalent in their cleanup function and I
see no reason why this driver would be an exception.
kset_unregister() uses kobject_del()
no see difference.
quoted
quoted
There's one thing I do not understand. I seem to understand that the
goal behind this patch is to be able to run dmidecode without /dev/mem.
Dmidecode currently reads 2 areas from /dev/mem: the 0xF0000-0xFFFFF
area in search of the entry point, and the DMI data table itself. With
this patch you make the entry point available through sysfs. But
dmidecode will still need to access /dev/mem to access the DMI data
table. So that does not really solve anything, does it?
It's supposed to read DMI table via entries presented by dmi-sysfs.
It contains raw attributes that can be used for these purposes.
No need to use /dev/mem.
Yes, I understood this meanwhile, sorry.
quoted
Another case if you want to add binary of whole dmi table to be able to
read it directly in order to parse in dmidecode w/o any additional headache
with open/close. Well, it partly dupes currently present dmi-sysfs.
In fact dmi-sysfs already duplicates a lot of code which was already
present in dmidecode and libsmbios. And exporting the raw table will
require way less code than the implementation you proposed originally.
So the code duplication argument doesn't hold, sorry.
quoted
But it simplifies dmi table parsing for dmidecode, and who wants to use
dmi-sysfs, let them use it, but dmidecode will be reading raw entry.
Well let it be. Why not.
Yes, this is exactly my point.
quoted
If others are OK, for dmidecode, and probably others tools also,
kernel can constantly expose two tables under /sys/firmware/dmi/tables/
smbios_entry_point and dmi_table. Independently on dmi-sysfs.
That's what I would like to see implemented, yes, thank you very much.