Currently, someone can invoke the sysfs such as state_show()
intermittently before dev_set_drvdata() is done.
And it can be a cause of kernel Oops because of edev is Null at that time.
So modified the driver registration to after setting drviver data.
- Oops's backtrace.
Backtrace:
[<c067865c>] (state_show) from [<c05222e8>] (dev_attr_show)
[<c05222c0>] (dev_attr_show) from [<c02c66e0>] (sysfs_kf_seq_show)
[<c02c6648>] (sysfs_kf_seq_show) from [<c02c496c>] (kernfs_seq_show)
[<c02c4938>] (kernfs_seq_show) from [<c025e2a0>] (seq_read)
[<c025e11c>] (seq_read) from [<c02c50a0>] (kernfs_fop_read)
[<c02c5064>] (kernfs_fop_read) from [<c0231cac>] (__vfs_read)
[<c0231c5c>] (__vfs_read) from [<c0231ee0>] (vfs_read)
[<c0231e34>] (vfs_read) from [<c0232464>] (ksys_read)
[<c02323f0>] (ksys_read) from [<c02324fc>] (sys_read)
[<c02324e4>] (sys_read) from [<c00091d0>] (__sys_trace_return)
Signed-off-by: bumwoo lee <[email protected]>
---
drivers/extcon/extcon.c | 29 +++++++++++++++++------------
1 file changed, 17 insertions(+), 12 deletions(-)
diff --git a/drivers/extcon/extcon.c b/drivers/extcon/extcon.c
index d27cd9f88f86..d3a32b806499 100644
--- a/drivers/extcon/extcon.c
+++ b/drivers/extcon/extcon.c
@@ -1224,19 +1224,14 @@ int extcon_dev_register(struct extcon_dev *edev)
edev->dev.type = &edev->extcon_dev_type;
}
- ret = device_register(&edev->dev);
- if (ret) {
- put_device(&edev->dev);
- goto err_dev;
- }
-
spin_lock_init(&edev->lock);
- edev->nh = devm_kcalloc(&edev->dev, edev->max_supported,
- sizeof(*edev->nh), GFP_KERNEL);
- if (!edev->nh) {
- ret = -ENOMEM;
- device_unregister(&edev->dev);
- goto err_dev;
+ if (edev->max_supported) {
+ edev->nh = kcalloc(edev->max_supported, sizeof(*edev->nh),
+ GFP_KERNEL);
+ if (!edev->nh) {
+ ret = -ENOMEM;
+ goto err_alloc_nh;
+ }
}
for (index = 0; index < edev->max_supported; index++)
@@ -1247,6 +1242,12 @@ int extcon_dev_register(struct extcon_dev *edev)
dev_set_drvdata(&edev->dev, edev);
edev->state = 0;
+ ret = device_register(&edev->dev);
+ if (ret) {
+ put_device(&edev->dev);
+ goto err_dev;
+ }
+
mutex_lock(&extcon_dev_list_lock);
list_add(&edev->entry, &extcon_dev_list);
mutex_unlock(&extcon_dev_list_lock);
@@ -1254,6 +1255,9 @@ int extcon_dev_register(struct extcon_dev *edev)
return 0;
err_dev:
+ if (edev->max_supported)
+ kfree(edev->nh);
+err_alloc_nh:
if (edev->max_supported)
kfree(edev->extcon_dev_type.groups);
err_alloc_groups:
@@ -1314,6 +1318,7 @@ void extcon_dev_unregister(struct extcon_dev *edev)
if (edev->max_supported) {
kfree(edev->extcon_dev_type.groups);
kfree(edev->cables);
+ kfree(edev->nh);
}
put_device(&edev->dev);
--
2.35.1
Hi bumwoo,
On 22. 4. 27. 12:00, bumwoo lee wrote:
> Currently, someone can invoke the sysfs such as state_show()
> intermittently before dev_set_drvdata() is done.
> And it can be a cause of kernel Oops because of edev is Null at that time.
> So modified the driver registration to after setting drviver data.
>
> - Oops's backtrace.
>
> Backtrace:
> [<c067865c>] (state_show) from [<c05222e8>] (dev_attr_show)
> [<c05222c0>] (dev_attr_show) from [<c02c66e0>] (sysfs_kf_seq_show)
> [<c02c6648>] (sysfs_kf_seq_show) from [<c02c496c>] (kernfs_seq_show)
> [<c02c4938>] (kernfs_seq_show) from [<c025e2a0>] (seq_read)
> [<c025e11c>] (seq_read) from [<c02c50a0>] (kernfs_fop_read)
> [<c02c5064>] (kernfs_fop_read) from [<c0231cac>] (__vfs_read)
> [<c0231c5c>] (__vfs_read) from [<c0231ee0>] (vfs_read)
> [<c0231e34>] (vfs_read) from [<c0232464>] (ksys_read)
> [<c02323f0>] (ksys_read) from [<c02324fc>] (sys_read)
> [<c02324e4>] (sys_read) from [<c00091d0>] (__sys_trace_return)
>
> Signed-off-by: bumwoo lee <[email protected]>
> ---
> drivers/extcon/extcon.c | 29 +++++++++++++++++------------
> 1 file changed, 17 insertions(+), 12 deletions(-)
(snip)
Applied it on extcon-fixes. Thanks for your work.
I change the first letter to capital letter as following:
- extcon: Modify extcon device to be created after driver data is set
And better to use the correct version on patch title on next
and then add the changes according to version as following:
If you describe changes under '---', it is no problem
when git apply with git am command.
For example.
[PATCH v2] extcon: Modify extcon device to be created after driver data
...
Signed-off-by: bumwoo lee <[email protected]>
---
Changes from v1:
- explain what are changes
--
Best Regards,
Samsung Electronics
Chanwoo Choi
Hi Chanwoo,
Thank you for your kind detail guidance and example.
Best Regards,
Bumwoo Lee.
-----Original Message-----
From: Chanwoo Choi <[email protected]>
Sent: Thursday, April 28, 2022 8:16 AM
To: bumwoo lee <[email protected]>; MyungJoo Ham <[email protected]>; Chanwoo Choi <[email protected]>; [email protected]
Subject: Re: [PATCH V1] extcon: modify extcon device to be created after driver data is set
Hi bumwoo,
On 22. 4. 27. 12:00, bumwoo lee wrote:
> Currently, someone can invoke the sysfs such as state_show()
> intermittently before dev_set_drvdata() is done.
> And it can be a cause of kernel Oops because of edev is Null at that time.
> So modified the driver registration to after setting drviver data.
>
> - Oops's backtrace.
>
> Backtrace:
> [<c067865c>] (state_show) from [<c05222e8>] (dev_attr_show)
> [<c05222c0>] (dev_attr_show) from [<c02c66e0>] (sysfs_kf_seq_show)
> [<c02c6648>] (sysfs_kf_seq_show) from [<c02c496c>] (kernfs_seq_show)
> [<c02c4938>] (kernfs_seq_show) from [<c025e2a0>] (seq_read)
> [<c025e11c>] (seq_read) from [<c02c50a0>] (kernfs_fop_read)
> [<c02c5064>] (kernfs_fop_read) from [<c0231cac>] (__vfs_read)
> [<c0231c5c>] (__vfs_read) from [<c0231ee0>] (vfs_read) [<c0231e34>]
> (vfs_read) from [<c0232464>] (ksys_read) [<c02323f0>] (ksys_read) from
> [<c02324fc>] (sys_read) [<c02324e4>] (sys_read) from [<c00091d0>]
> (__sys_trace_return)
>
> Signed-off-by: bumwoo lee <[email protected]>
> ---
> drivers/extcon/extcon.c | 29 +++++++++++++++++------------
> 1 file changed, 17 insertions(+), 12 deletions(-)
(snip)
Applied it on extcon-fixes. Thanks for your work.
I change the first letter to capital letter as following:
- extcon: Modify extcon device to be created after driver data is set
And better to use the correct version on patch title on next and then add the changes according to version as following:
If you describe changes under '---', it is no problem when git apply with git am command.
For example.
[PATCH v2] extcon: Modify extcon device to be created after driver data ...
Signed-off-by: bumwoo lee <[email protected]>
---
Changes from v1:
- explain what are changes
--
Best Regards,
Samsung Electronics
Chanwoo Choi