diff mbox series

x86/platform/intel/iosf_mbi: Fix error handling in iosf_mbi_init()

Message ID 20221115073636.25412-1-yuancan@huawei.com (mailing list archive)
State Superseded, archived
Headers show
Series x86/platform/intel/iosf_mbi: Fix error handling in iosf_mbi_init() | expand

Commit Message

Yuan Can Nov. 15, 2022, 7:36 a.m. UTC
A problem about modprobe iosf_mbi failed is triggered with the following
log given:

 debugfs: Directory 'iosf_sb' with parent '/' already present!

The reason is that iosf_mbi_init() returns pci_register_driver()
directly without checking its return value, if pci_register_driver()
failed, it returns without removing debugfs, resulting the debugfs of
iosf_sb can never be created later.

 iosf_mbi_init()
   iosf_mbi_dbg_init() # create debugfs
   pci_register_driver()
     driver_register()
       bus_add_driver()
         priv = kzalloc(...) # OOM happened
   # return without remove debugfs and destroy workqueue

Fix by remove debugfs and iosf_mbi_pm_qos when pci_register_driver()
returns error.

Fixes: 8dc12f933c9d ("x86/iosf: Add debugfs support")
Fixes: e09db3d241f8 ("x86: baytrail/cherrytrail: Rework and move P-Unit PMIC bus semaphore code")
Signed-off-by: Yuan Can <yuancan@huawei.com>
---
 arch/x86/platform/intel/iosf_mbi.c | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

Comments

Andy Shevchenko Nov. 15, 2022, 8:26 a.m. UTC | #1
On Tue, Nov 15, 2022 at 9:38 AM Yuan Can <yuancan@huawei.com> wrote:
>
> A problem about modprobe iosf_mbi failed is triggered with the following
> log given:
>
>  debugfs: Directory 'iosf_sb' with parent '/' already present!
>
> The reason is that iosf_mbi_init() returns pci_register_driver()
> directly without checking its return value, if pci_register_driver()
> failed, it returns without removing debugfs, resulting the debugfs of
> iosf_sb can never be created later.
>
>  iosf_mbi_init()
>    iosf_mbi_dbg_init() # create debugfs
>    pci_register_driver()
>      driver_register()
>        bus_add_driver()
>          priv = kzalloc(...) # OOM happened
>    # return without remove debugfs and destroy workqueue
>
> Fix by remove debugfs and iosf_mbi_pm_qos when pci_register_driver()

removing

> returns error.

>  static int __init iosf_mbi_init(void)
>  {
> +       int ret;
> +
>         iosf_debugfs_init();
>
>         cpu_latency_qos_add_request(&iosf_mbi_pm_qos, PM_QOS_DEFAULT_VALUE);
>
> -       return pci_register_driver(&iosf_mbi_pci_driver);
> +       ret = pci_register_driver(&iosf_mbi_pci_driver);
> +       if (ret) {
> +               cpu_latency_qos_remove_request(&iosf_mbi_pm_qos);
> +               iosf_debugfs_remove();
> +       }
> +
> +       return ret;
>  }

Can we rewrite it as

  if (ret)
    goto err_remove;

  return 0;

err_remove:
  ...
  return ret;

?
Yuan Can Nov. 15, 2022, 8:29 a.m. UTC | #2
在 2022/11/15 16:26, Andy Shevchenko 写道:
> On Tue, Nov 15, 2022 at 9:38 AM Yuan Can <yuancan@huawei.com> wrote:
>> A problem about modprobe iosf_mbi failed is triggered with the following
>> log given:
>>
>>   debugfs: Directory 'iosf_sb' with parent '/' already present!
>>
>> The reason is that iosf_mbi_init() returns pci_register_driver()
>> directly without checking its return value, if pci_register_driver()
>> failed, it returns without removing debugfs, resulting the debugfs of
>> iosf_sb can never be created later.
>>
>>   iosf_mbi_init()
>>     iosf_mbi_dbg_init() # create debugfs
>>     pci_register_driver()
>>       driver_register()
>>         bus_add_driver()
>>           priv = kzalloc(...) # OOM happened
>>     # return without remove debugfs and destroy workqueue
>>
>> Fix by remove debugfs and iosf_mbi_pm_qos when pci_register_driver()
> removing
>
>> returns error.
>>   static int __init iosf_mbi_init(void)
>>   {
>> +       int ret;
>> +
>>          iosf_debugfs_init();
>>
>>          cpu_latency_qos_add_request(&iosf_mbi_pm_qos, PM_QOS_DEFAULT_VALUE);
>>
>> -       return pci_register_driver(&iosf_mbi_pci_driver);
>> +       ret = pci_register_driver(&iosf_mbi_pci_driver);
>> +       if (ret) {
>> +               cpu_latency_qos_remove_request(&iosf_mbi_pm_qos);
>> +               iosf_debugfs_remove();
>> +       }
>> +
>> +       return ret;
>>   }
> Can we rewrite it as
>
>    if (ret)
>      goto err_remove;
>
>    return 0;
>
> err_remove:
>    ...
>    return ret;
>
> ?
Thanks for these suggestions! will be changed in the next version.
diff mbox series

Patch

diff --git a/arch/x86/platform/intel/iosf_mbi.c b/arch/x86/platform/intel/iosf_mbi.c
index fdd49d70b437..98632ac3db2f 100644
--- a/arch/x86/platform/intel/iosf_mbi.c
+++ b/arch/x86/platform/intel/iosf_mbi.c
@@ -545,11 +545,19 @@  static struct pci_driver iosf_mbi_pci_driver = {
 
 static int __init iosf_mbi_init(void)
 {
+	int ret;
+
 	iosf_debugfs_init();
 
 	cpu_latency_qos_add_request(&iosf_mbi_pm_qos, PM_QOS_DEFAULT_VALUE);
 
-	return pci_register_driver(&iosf_mbi_pci_driver);
+	ret = pci_register_driver(&iosf_mbi_pci_driver);
+	if (ret) {
+		cpu_latency_qos_remove_request(&iosf_mbi_pm_qos);
+		iosf_debugfs_remove();
+	}
+
+	return ret;
 }
 
 static void __exit iosf_mbi_exit(void)