On Sun, 19 Aug 2018, Lukas Wunner wrote: > Ever since the PCI hotplug core was introduced in 2002, drivers had to > allocate and register a struct hotplug_slot_info for every slot: > https://git.kernel.org/tglx/history/c/a8a2069f432c > > Apparently the idea was that drivers furnish the hotplug core with an > up-to-date card presence status, power status, latch status and > attention indicator status as well as notify the hotplug core of changes > thereof. However only 4 out of 12 hotplug drivers bother to notify the > hotplug core with pci_hp_change_slot_info() and the hotplug core never > made any use of the information: There is just a single macro in > pci_hotplug_core.c, GET_STATUS(), which uses the hotplug_slot_info if > the driver lacks the corresponding callback in hotplug_slot_ops. The > macro is called when the user reads the attribute via sysfs. > > Now, if the callback isn't defined, the attribute isn't exposed in sysfs > in the first place (see e.g. has_power_file()). There are only two > situations when the hotplug_slot_info would actually be accessed: > > * If the driver defines ->enable_slot or ->disable_slot but not > ->get_power_status. > > * If the driver defines ->set_attention_status but not > ->get_attention_status. > > There is no driver doing the former and just a single driver doing the > latter, namely pnv_php.c. Amend it with a ->get_attention_status > callback. With that, the hotplug_slot_info becomes completely unused by > the PCI hotplug core. But a few drivers use it internally as a cache: > > cpcihp uses it to cache the latch_status and adapter_status. > cpqhp uses it to cache the adapter_status. > pnv_php and rpaphp use it to cache the attention_status. > shpchp uses it to cache all four values. > > Amend these drivers to cache the information in their private slot > struct. shpchp's slot struct already contains members to cache the > power_status and adapter_status, so additional members are only needed > for the other two values. In the case of cpqphp, the cached value is > only accessed in a single place, so instead of caching it, read the > current value from the hardware. > > Caution: acpiphp, cpci, cpqhp, shpchp, asus-wmi and eeepc-laptop > populate the hotplug_slot_info with initial values on probe. That code > is herewith removed. There is a theoretical chance that the code has > side effects without which the driver fails to function, e.g. if the > ACPI method to read the adapter status needs to be executed at least > once on probe. That seems unlikely to me, still maintainers should > review the changes carefully for this possibility. > > Signed-off-by: Lukas Wunner <lukas@xxxxxxxxx> > Cc: Rafael J. Wysocki <rjw@xxxxxxxxxxxxx> > Cc: Len Brown <lenb@xxxxxxxxxx> > Cc: Scott Murray <scott@xxxxxxxxxxxx> > Cc: Benjamin Herrenschmidt <benh@xxxxxxxxxxxxxxxxxxx> > Cc: Paul Mackerras <paulus@xxxxxxxxx> > Cc: Michael Ellerman <mpe@xxxxxxxxxxxxxx> > Cc: Gavin Shan <gwshan@xxxxxxxxxxxxxxxxxx> > Cc: Sebastian Ott <sebott@xxxxxxxxxxxxxxxxxx> > Cc: Gerald Schaefer <gerald.schaefer@xxxxxxxxxx> > Cc: Corentin Chary <corentin.chary@xxxxxxxxx> > Cc: Darren Hart <dvhart@xxxxxxxxxxxxx> > Cc: Andy Shevchenko <andy@xxxxxxxxxxxxx> for s390_pci_hpc.c: Acked-by: Sebastian Ott <sebott@xxxxxxxxxxxxx>