Re: [PATCH v1 2/4] x86/pci: Re-use new dmi_get_bios_year() helper

5 messages, 3 authors, 2018-02-28 · open the first message on its own page

Re: [PATCH v1 2/4] x86/pci: Re-use new dmi_get_bios_year() helper

From: Jean Delvare <hidden>
Date: 2018-02-26 16:28:38

Hi Andy,

On Thu, 22 Feb 2018 14:59:21 +0200, Andy Shevchenko wrote:
quoted hunk
...instead of open coding its functionality.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 arch/x86/pci/acpi.c            | 8 ++------
 arch/x86/pci/direct.c          | 5 ++---
 arch/x86/pci/mmconfig-shared.c | 9 ++-------
 3 files changed, 6 insertions(+), 16 deletions(-)
diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c
index 7df49c40665e..00e60de30328 100644
--- a/arch/x86/pci/acpi.c
+++ b/arch/x86/pci/acpi.c
@@ -140,12 +140,8 @@ static const struct dmi_system_id pci_crs_quirks[] __initconst = {
 
 void __init pci_acpi_crs_quirks(void)
 {
-	int year;
-
-	if (dmi_get_date(DMI_BIOS_DATE, &year, NULL, NULL) && year < 2008) {
-		if (iomem_resource.end <= 0xffffffff)
-			pci_use_crs = false;
-	}
+	if ((dmi_get_bios_year() < 2008) && (iomem_resource.end <= 0xffffffff))
+		pci_use_crs = false;
You are changing the behavior here, when DMI does not provide a BIOS
date. Beforehand, the test would fail and pci_use_crs would be left
alone. After your change, dmi_get_bios_year() will return 0, and
"0 < 2008" is true, so pci_use_crs is set to false.

I have no opinion on what this driver should do in such case, but I
certainly wouldn't expect a change of behavior from a "use a helper
instead of open-coding" kind of patch.

I don't think you can safely assume that the code calling
dmi_get_bios_year() will always do the right thing when 0 is being
returned. It's up to the calling code to decide what the default
behavior should be.

Also there are more parentheses than needed.
quoted hunk
 
 	dmi_check_system(pci_crs_quirks);
 
diff --git a/arch/x86/pci/direct.c b/arch/x86/pci/direct.c
index 2d9503323d10..a51074c55982 100644
--- a/arch/x86/pci/direct.c
+++ b/arch/x86/pci/direct.c
@@ -195,14 +195,13 @@ static const struct pci_raw_ops pci_direct_conf2 = {
 static int __init pci_sanity_check(const struct pci_raw_ops *o)
 {
 	u32 x = 0;
-	int year, devfn;
+	int devfn;
 
 	if (pci_probe & PCI_NO_CHECKS)
 		return 1;
 	/* Assume Type 1 works for newer systems.
 	   This handles machines that don't have anything on PCI Bus 0. */
-	dmi_get_date(DMI_BIOS_DATE, &year, NULL, NULL);
-	if (year >= 2001)
+	if (dmi_get_bios_year() >= 2001)
 		return 1;
 
 	for (devfn = 0; devfn < 0x100; devfn++) {
diff --git a/arch/x86/pci/mmconfig-shared.c b/arch/x86/pci/mmconfig-shared.c
index 96684d0adcf9..0b40482578b8 100644
--- a/arch/x86/pci/mmconfig-shared.c
+++ b/arch/x86/pci/mmconfig-shared.c
@@ -547,19 +547,14 @@ static void __init pci_mmcfg_reject_broken(int early)
 static int __init acpi_mcfg_check_entry(struct acpi_table_mcfg *mcfg,
 					struct acpi_mcfg_allocation *cfg)
 {
-	int year;
-
 	if (cfg->address < 0xFFFFFFFF)
 		return 0;
 
 	if (!strncmp(mcfg->header.oem_id, "SGI", 3))
 		return 0;
 

7 more quoted lines

Here too some parentheses are not needed.
 
 	pr_err(PREFIX "MCFG region for %04x [bus %02x-%02x] at %#llx "
 	       "is above 4GB, ignored\n", cfg->pci_segment,

-- 
Jean Delvare
SUSE L3 Support

Re: [PATCH v1 2/4] x86/pci: Re-use new dmi_get_bios_year() helper

From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Date: 2018-02-28 10:29:11

On Mon, 2018-02-26 at 17:28 +0100, Jean Delvare wrote:
quoted
-	if (dmi_get_date(DMI_BIOS_DATE, &year, NULL, NULL) && year
< 2008) {
-		if (iomem_resource.end <= 0xffffffff)
-			pci_use_crs = false;
-	}
+	if ((dmi_get_bios_year() < 2008) && (iomem_resource.end <=
0xffffffff))
+		pci_use_crs = false;
You are changing the behavior here, when DMI does not provide a BIOS
date. Beforehand, the test would fail and pci_use_crs would be left
alone. After your change, dmi_get_bios_year() will return 0, and
"0 < 2008" is true, so pci_use_crs is set to false.
Hmm... Indeed.
I have no opinion on what this driver should do in such case,
I would assume that no BIOS date is related to prehistoric firmwares and
 using _CRS would sound weird on them.
 but I
certainly wouldn't expect a change of behavior from a "use a helper
instead of open-coding" kind of patch.
Agree.
I don't think you can safely assume that the code calling
dmi_get_bios_year() will always do the right thing when 0 is being
returned. It's up to the calling code to decide what the default
behavior should be.
That's correct.

-- 
Andy Shevchenko [off-list ref]
Intel Finland Oy

Re: [PATCH v1 2/4] x86/pci: Re-use new dmi_get_bios_year() helper

From: Rafael J. Wysocki <rafael@kernel.org>
Date: 2018-02-28 10:33:43

On Wed, Feb 28, 2018 at 11:29 AM, Andy Shevchenko
[off-list ref] wrote:
On Mon, 2018-02-26 at 17:28 +0100, Jean Delvare wrote:
quoted
quoted
-   if (dmi_get_date(DMI_BIOS_DATE, &year, NULL, NULL) && year
< 2008) {
-           if (iomem_resource.end <= 0xffffffff)
-                   pci_use_crs = false;
-   }
+   if ((dmi_get_bios_year() < 2008) && (iomem_resource.end <=
0xffffffff))
+           pci_use_crs = false;
You are changing the behavior here, when DMI does not provide a BIOS
date. Beforehand, the test would fail and pci_use_crs would be left
alone. After your change, dmi_get_bios_year() will return 0, and
"0 < 2008" is true, so pci_use_crs is set to false.
Hmm... Indeed.
quoted
I have no opinion on what this driver should do in such case,
I would assume that no BIOS date is related to prehistoric firmwares and
 using _CRS would sound weird on them.
Careful here.

You seem to be assuming that the DMI information is always valid
and/or complete which is know to not be the case sometimes.

Re: [PATCH v1 2/4] x86/pci: Re-use new dmi_get_bios_year() helper

From: Jean Delvare <hidden>
Date: 2018-02-28 19:21:52

On Wed, 28 Feb 2018 11:33:39 +0100, Rafael J. Wysocki wrote:
On Wed, Feb 28, 2018 at 11:29 AM, Andy Shevchenko
[off-list ref] wrote:
quoted
I would assume that no BIOS date is related to prehistoric firmwares and
 using _CRS would sound weird on them.  
Careful here.

You seem to be assuming that the DMI information is always valid
and/or complete which is know to not be the case sometimes.
True. While the BIOS date is not the worst offender when it comes to
broken DMI data, you must remember that the date comes as a string, and
older SMBIOS specifications did not even recommend a specific format
for that string. As a matter of fact, my collection of DMI tables
includes a few creative samples like "Jul  7 2016" or "09-16-08" which
the kernel fails to parse.

So the default behavior at the driver level shouldn't be based on what
older systems are most likely to enjoy. The default behavior must be
the safest option, regardless of the age of the system.

-- 
Jean Delvare
SUSE L3 Support

Re: [PATCH v1 2/4] x86/pci: Re-use new dmi_get_bios_year() helper

From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Date: 2018-02-28 19:34:28

On Wed, 2018-02-28 at 20:21 +0100, Jean Delvare wrote:
On Wed, 28 Feb 2018 11:33:39 +0100, Rafael J. Wysocki wrote:
quoted
On Wed, Feb 28, 2018 at 11:29 AM, Andy Shevchenko
[off-list ref] wrote:
quoted
I would assume that no BIOS date is related to prehistoric
firmwares and
 using _CRS would sound weird on them.  
Careful here.

You seem to be assuming that the DMI information is always valid
and/or complete which is know to not be the case sometimes.
True. While the BIOS date is not the worst offender when it comes to
broken DMI data, you must remember that the date comes as a string,
and
older SMBIOS specifications did not even recommend a specific format
for that string. As a matter of fact, my collection of DMI tables
includes a few creative samples like "Jul  7 2016" or "09-16-08" which
the kernel fails to parse.

So the default behavior at the driver level shouldn't be based on what
older systems are most likely to enjoy. The default behavior must be
the safest option, regardless of the age of the system.
Yep.

And here is a very good question which path is more safer: use _CRS, or
not?

Rafael, do you know any consequences of not using _CRS for PCI on older
and newer machines?

-- 
Andy Shevchenko [off-list ref]
Intel Finland Oy
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help