Re: [PATCH 2/2] platform/x86: wmi: Allow creating WMI devices with the same GUID

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Dec 8, 2017 at 6:34 PM, Mario Limonciello
<mario.limonciello@xxxxxxxx> wrote:
> In: commit d1f9e4970742 ("ACPI: WMI: Survive BIOS with duplicate GUIDs")
> parsing two of the same GUID was prevented in the WMI bus driver.
>
> At the time no one understood why GUID 05901221-D566-11D1-B2F0-00A0C9062910
> was being duplicated.  It's now known that GUID is used for the binary
> MOF file of a _WDG entry in the ASL.  It's entirely possible for multiple
> _WDG entries and for multiple instances to bind in a given driver.
>
> NOTE:
> The only known instance of duplicated GUID's is the WMI BMOF GUID above,
> but it is possible that other vendors may duplicate GUIDs as well. It
> would be better for drivers to not interact with the WMI bus by GUID
> string but by the struct wmi_device provided by the WMI bus during
> probing.

I think you also need to audit all the users of wmi_block_list for
duplicate handling.  For example, wmi_install_notify_handler()
probably needs a break statement inside the if (memcmp(...)).

>
> Signed-off-by: Mario Limonciello <mario.limonciello@xxxxxxxx>
> ---
>  drivers/platform/x86/wmi.c | 31 -------------------------------
>  1 file changed, 31 deletions(-)
>
> diff --git a/drivers/platform/x86/wmi.c b/drivers/platform/x86/wmi.c
> index 45d9010aafcf..5ac17e360fa2 100644
> --- a/drivers/platform/x86/wmi.c
> +++ b/drivers/platform/x86/wmi.c
> @@ -1102,28 +1102,6 @@ static void wmi_free_devices(struct acpi_device *device)
>         }
>  }
>
> -static bool guid_already_parsed(struct acpi_device *device,
> -                               const u8 *guid)
> -{
> -       struct wmi_block *wblock;
> -
> -       list_for_each_entry(wblock, &wmi_block_list, list) {
> -               if (memcmp(wblock->gblock.guid, guid, 16) == 0) {
> -                       /*
> -                        * Because we historically didn't track the relationship
> -                        * between GUIDs and ACPI nodes, we don't know whether
> -                        * we need to suppress GUIDs that are unique on a
> -                        * given node but duplicated across nodes.
> -                        */
> -                       dev_warn(&device->dev, "duplicate WMI GUID %pUL (first instance was on %s)\n",
> -                                guid, dev_name(&wblock->acpi_device->dev));
> -                       return true;
> -               }
> -       }
> -
> -       return false;
> -}
> -
>  /*
>   * Parse the _WDG method for the GUID data blocks
>   */
> @@ -1157,15 +1135,6 @@ static int parse_wdg(struct device *wmi_bus_dev, struct acpi_device *device)
>                 if (debug_dump_wdg)
>                         wmi_dump_wdg(&gblock[i]);
>
> -               /*
> -                * Some WMI devices, like those for nVidia hooks, have a
> -                * duplicate GUID. It's not clear what we should do in this
> -                * case yet, so for now, we'll just ignore the duplicate
> -                * for device creation.
> -                */
> -               if (guid_already_parsed(device, gblock[i].guid))
> -                       continue;
> -
>                 wblock = kzalloc(sizeof(struct wmi_block), GFP_KERNEL);
>                 if (!wblock) {
>                         retval = -ENOMEM;
> --
> 2.14.1
>



[Index of Archives]     [Linux Kernel Development]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux