powerpc/eeh: Fix eeh_dev_check_failure() for PE#0
authorOliver O'Halloran <oohall@gmail.com>
Wed, 21 Oct 2020 23:25:54 +0000 (10:25 +1100)
committerMichael Ellerman <mpe@ellerman.id.au>
Wed, 21 Oct 2020 23:38:53 +0000 (10:38 +1100)
In commit 269e583357df ("powerpc/eeh: Delete eeh_pe->config_addr") the
following simplification was made:

-       if (!pe->addr && !pe->config_addr) {
+       if (!pe->addr) {
                eeh_stats.no_cfg_addr++;
                return 0;
        }

This introduced a bug which causes EEH checking to be skipped for
devices in PE#0.

Before the change above the check would always pass since at least one
of the two PE addresses would be non-zero in all circumstances. On
PowerNV pe->config_addr would be the BDFN of the first device added to
the PE. The zero BDFN is reserved for the PHB's root port, but this is
fine since for obscure platform reasons the root port is never
assigned to PE#0.

Similarly, on pseries pe->addr has always been non-zero for the
reasons outlined in commit 42de19d5ef71 ("powerpc/pseries/eeh: Allow
zero to be a valid PE configuration address").

We can fix the problem by deleting the block entirely The original
purpose of this test was to avoid performing EEH checks on devices
that were not on an EEH capable bus. In modern Linux the edev->pe
pointer will be NULL for devices that are not on an EEH capable bus.
The code block immediately above this one already checks for the
edev->pe == NULL case so this test (new and old) is entirely
redundant.

Ideally we'd delete eeh_stats.no_cfg_addr too since nothing increments
it any more. Unfortunately, that information is exposed via
/proc/powerpc/eeh which means it's technically ABI. We could make it
hard-coded, but that's a change for another patch.

Fixes: 269e583357df ("powerpc/eeh: Delete eeh_pe->config_addr")
Signed-off-by: Oliver O'Halloran <oohall@gmail.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20201021232554.1434687-1-oohall@gmail.com
arch/powerpc/kernel/eeh.c

index 0e160df..813713c 100644 (file)
@@ -466,11 +466,6 @@ int eeh_dev_check_failure(struct eeh_dev *edev)
                return 0;
        }
 
-       if (!pe->addr) {
-               eeh_stats.no_cfg_addr++;
-               return 0;
-       }
-
        /*
         * On PowerNV platform, we might already have fenced PHB
         * there and we need take care of that firstly.