diff mbox series

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

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

Commit Message

Yuan Can Nov. 15, 2022, 9:16 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 removing 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>
---
Changes in v2:
- fix typos in commit msg
- change to the suggested error handling style
 arch/x86/platform/intel/iosf_mbi.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

Comments

Hans de Goede Nov. 15, 2022, 10:16 a.m. UTC | #1
Hi,

On 11/15/22 10:16, Yuan Can 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 removing 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>

Thanks, patch looks good to me:

Reviewed-by: Hans de Goede <hdegoede@redhat.com>

Regards,

Hans


> ---
> Changes in v2:
> - fix typos in commit msg
> - change to the suggested error handling style
>  arch/x86/platform/intel/iosf_mbi.c | 14 +++++++++++++-
>  1 file changed, 13 insertions(+), 1 deletion(-)
> 
> diff --git a/arch/x86/platform/intel/iosf_mbi.c b/arch/x86/platform/intel/iosf_mbi.c
> index fdd49d70b437..2d64985c53f9 100644
> --- a/arch/x86/platform/intel/iosf_mbi.c
> +++ b/arch/x86/platform/intel/iosf_mbi.c
> @@ -545,11 +545,23 @@ 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)
> +		goto err_remove;
> +
> +	return 0;
> +
> +err_remove:
> +	cpu_latency_qos_remove_request(&iosf_mbi_pm_qos);
> +	iosf_debugfs_remove();
> +
> +	return ret;
>  }
>  
>  static void __exit iosf_mbi_exit(void)
diff mbox series

Patch

diff --git a/arch/x86/platform/intel/iosf_mbi.c b/arch/x86/platform/intel/iosf_mbi.c
index fdd49d70b437..2d64985c53f9 100644
--- a/arch/x86/platform/intel/iosf_mbi.c
+++ b/arch/x86/platform/intel/iosf_mbi.c
@@ -545,11 +545,23 @@  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)
+		goto err_remove;
+
+	return 0;
+
+err_remove:
+	cpu_latency_qos_remove_request(&iosf_mbi_pm_qos);
+	iosf_debugfs_remove();
+
+	return ret;
 }
 
 static void __exit iosf_mbi_exit(void)