On Mon, Aug 29, 2022 at 11:20 PM Mario Limonciello <mario.limonciello@xxxxxxx> wrote: > > The WMI subsystem in the kernel currently tracks WMI devices by > a GUID string not by ACPI device. The GUID used by the `wmi-bmof` > module however is available from many devices on nearly every machine. > > This originally was though to be a bug, but as it happens on most thought > machines it is a design mistake. It has been fixed by tying an ACPI > device to the driver with struct wmi_driver. So drivers that have > moved over to struct wmi_driver can actually support multiple > instantiations of a GUID without any problem. > > Add an allow list into wmi.c for GUIDs that the drivers that are known > to use struct wmi_driver. The list is populated with `wmi-bmof` right > now. The additional instances of that in sysfs with be suffixed with -%d ... > +/* allow duplicate GUIDs as these device drivers use struct wmi_driver */ > +static const char * const allow_duplicates[] = { > + "05901221-D566-11D1-B2F0-00A0C9062910", /* wmi-bmof */ > + NULL, No comma for the terminator. > +}; ... > +static int guid_count(const guid_t *guid) > +{ > + struct wmi_block *wblock; > + int count = 0; > + > + list_for_each_entry(wblock, &wmi_block_list, list) { > + if (guid_equal(&wblock->gblock.guid, guid)) > + count++; > + } > + > + return count; > +} I haven't deeply checked the code, but this kind of approach is fragile and proven to be error prone as shown in practice. The scenario is (again, not sure if it's possible, need a comment in the code if it's not possible) removing an entry from the list in the middle and trying to add it again. you will see the duplicate count values. That's why in the general case we use IDA or similar approaches. -- With Best Regards, Andy Shevchenko