[Letux-kernel] modprobe twl4030_* hangs

H. Nikolaus Schaller hns at goldelico.com
Sat Feb 13 21:14:43 CET 2016


Hi,
I may have found it - at least for the twl4030 on GTA04.

The problem are devm_ calls.

They are risky if there is a simple return -EPROBE_DEFER.
And EPROBE_DEFER is what I have recently added back to
our drivers.

This apparently was inserted at a different location than before, so the
code could succeed with uninitialized data.

There is another similar issue with our VAC iio patch. It may also fail
with EPROBE_DEFER.

We better should also make the twl4030_charger defer in that case
as well, so that the madc subsystem is initialized. Otherwise we can't
detect VAC in some cases (whoever is faster with probing).

So the sequence must be:

1. parse DT
2. check if all resources are available (PHY, iio) - return -EPROBE_DEFER
3. only then start with devm_power_supply_register or devm_request_threaded_irq - never return -EPROBE_DEFER

After reordering things, it looks fine again and

for i in $(lsmod | sed 's|\([a-zA-Z_0-9]\) .*|\1|'); do echo $i; modprobe -v $i; done

does not show any hangs.

Now I have to rework the patch set to transform linus/master to the new version.

This is a little tricky since we must reorder the code *before* we insert the
-EPROBE_DEFER code since if we do the other way round, it is no longer
bisectable at this position.

For the bq2429x_charger it must be something different because there is only
devm_kzalloc used and nothing else.

BR,
Nikolaus

Am 12.02.2016 um 12:13 schrieb H. Nikolaus Schaller <hns at goldelico.com>:

> Hi,
> after some more tests it is clearly:
> 
> twl4030_charger on the GTA04
> bq2429x_charger on the Pyra
> 
> If I remove these modules and do a depmod -a both systems boot (almost) fine and fast.
> On the GTA04 I have no USB/OTG connection.
> 
> Then doing a modprobe twl4030_charger on the GTA04 makes the modprobe hang...
> 
> I.e. the driver is buggy. Perhaps the EPROBE_DEFER patch we have introduced?
> Which waits for the USB-PHY (which appears not to be available).
> 
> AFAIK these drivers have nothing in common. Except part of the name and that
> both are I2C devices. And both register as "power supply".
> 
> Any ideas?
> 
> BR,
> Nikolaus
> 
> 
> Am 11.02.2016 um 12:28 schrieb H. Nikolaus Schaller <hns at goldelico.com>:
> 
>> 
>> Am 11.02.2016 um 12:18 schrieb H. Nikolaus Schaller <hns at goldelico.com>:
>> 
>>> 
>>> Am 11.02.2016 um 12:13 schrieb H. Nikolaus Schaller <hns at goldelico.com>:
>>> 
>>>> Hi,
>>>> I have found a strange thing in my latest 4.5-rc3.
>>>> 
>>>> root at letux:~# modprobe twl4030_madc_battery
>>>> root at letux:~# modprobe twl4030_pwrbutton   
>>>> ^C
>>>> root at letux:~# modprobe twl4030_vibra    
>>>> root at letux:~# modprobe twl4030_charger
>>>> ^C
>>>> root at letux:~# modprobe twl4030_madc   
>>>> root at letux:~# modprobe phy_twl4030_usb
>>>> ^C
>>>> root at letux:~# 
>>>> 
>>>> Some twl4030 related modules can't be modprobed and simply hang.
>>>> Some others work.
>>>> 
>>>> The total effect is that the kernel needs ~200 seconds to boot.
>>>> 
>>>> And I have the same on the OMAP5 (where the twl4030 modules
>>>> are not loaded/needed at all).
>>> 
>>> Well, there it is the bq2429x driver. And the common part is that both
>>> create charger nodes, registered by power_supply_register().
>>> 
>>> What is even more strange is that they show up in lsmod. But a
>>> second modprobe -v reports that it tries another insmod:
>>> 
>>> root at letux:~# lsmod | fgrep bq24
>>> bq2429x_charger        13916  1 
>>> root at letux:~# modprobe -v bq2429x_charger
>>> insmod /lib/modules/4.5.0-rc3-letux+/kernel/drivers/power/bq2429x_charger.ko 
>>> ^C
>>> root at letux:~# 
>>> 
>> 
>> I just found that modprobe understands verbosity levels:
>> 
>> root at letux:~# modprobe -v -v -v bq2429x_charger
>> modprobe: INFO: ../libkmod/libkmod.c:354 kmod_set_log_fn() custom logging function 0x7f654a6d registered
>> modprobe: DEBUG: ../libkmod/libkmod-index.c:790 index_mm_open() file=/lib/modules/4.5.0-rc3-letux+/modules.dep.bin
>> modprobe: DEBUG: ../libkmod/libkmod-index.c:790 index_mm_open() file=/lib/modules/4.5.0-rc3-letux+/modules.alias.bin
>> modprobe: DEBUG: ../libkmod/libkmod-index.c:790 index_mm_open() file=/lib/modules/4.5.0-rc3-letux+/modules.symbols.bin
>> modprobe: DEBUG: ../libkmod/libkmod-index.c:790 index_mm_open() file=/lib/modules/4.5.0-rc3-letux+/modules.builtin.bin
>> modprobe: DEBUG: ../libkmod/libkmod-module.c:540 kmod_module_new_from_lookup() input alias=bq2429x_charger, normalized=bq2429x_charger
>> modprobe: DEBUG: ../libkmod/libkmod-module.c:546 kmod_module_new_from_lookup() lookup modules.dep bq2429x_charger
>> modprobe: DEBUG: ../libkmod/libkmod.c:545 kmod_search_moddep() use mmaped index 'modules.dep' modname=bq2429x_charger
>> modprobe: DEBUG: ../libkmod/libkmod.c:392 kmod_pool_get_module() get module name='bq2429x_charger' found=(nil)
>> modprobe: DEBUG: ../libkmod/libkmod.c:400 kmod_pool_add_module() add 0x7f6773f0 key='bq2429x_charger'
>> modprobe: DEBUG: ../libkmod/libkmod-module.c:196 kmod_module_parse_depline() 0 dependencies for bq2429x_charger
>> modprobe: DEBUG: ../libkmod/libkmod-module.c:567 kmod_module_new_from_lookup() lookup bq2429x_charger=0, list=0x7f6770d8
>> modprobe: DEBUG: ../libkmod/libkmod-module.c:1374 kmod_module_get_options() modname=snd_pcsp mod->name=bq2429x_charger mod->alias=(null)
>> modprobe: DEBUG: ../libkmod/libkmod-module.c:1374 kmod_module_get_options() modname=snd_usb_audio mod->name=bq2429x_charger mod->alias=(null)
>> modprobe: DEBUG: ../libkmod/libkmod-module.c:1374 kmod_module_get_options() modname=cx88_alsa mod->name=bq2429x_charger mod->alias=(null)
>> modprobe: DEBUG: ../libkmod/libkmod-module.c:1374 kmod_module_get_options() modname=snd_atiixp_modem mod->name=bq2429x_charger mod->alias=(null)
>> modprobe: DEBUG: ../libkmod/libkmod-module.c:1374 kmod_module_get_options() modname=snd_intel8x0m mod->name=bq2429x_charger mod->alias=(null)
>> modprobe: DEBUG: ../libkmod/libkmod-module.c:1374 kmod_module_get_options() modname=snd_via82xx_modem mod->name=bq2429x_charger mod->alias=(null)
>> modprobe: DEBUG: ../libkmod/libkmod-module.c:1374 kmod_module_get_options() modname=cirrus mod->name=bq2429x_charger mod->alias=(null)
>> modprobe: DEBUG: ../libkmod/libkmod-module.c:1374 kmod_module_get_options() modname=mgag200 mod->name=bq2429x_charger mod->alias=(null)
>> modprobe: DEBUG: ../libkmod/libkmod-module.c:728 kmod_module_get_path() name='bq2429x_charger' path='/lib/modules/4.5.0-rc3-letux+/kernel/drivers/power/bq2429x_charger.ko'
>> modprobe: DEBUG: ../libkmod/libkmod-module.c:728 kmod_module_get_path() name='bq2429x_charger' path='/lib/modules/4.5.0-rc3-letux+/kernel/drivers/power/bq2429x_charger.ko'
>> insmod /lib/modules/4.5.0-rc3-letux+/kernel/drivers/power/bq2429x_charger.ko 
>> modprobe: DEBUG: ../libkmod/libkmod-module.c:728 kmod_module_get_path() name='bq2429x_charger' path='/lib/modules/4.5.0-rc3-letux+/kernel/drivers/power/bq2429x_charger.ko'
>> 
>> Maybe something in the MODULE_ALIAS is broken?
>> 
>> Really strange...
>> 
>> BR,
>> Nikolaus
>> 
>> _______________________________________________
>> http://projects.goldelico.com/p/gta04-kernel/
>> Letux-kernel mailing list
>> Letux-kernel at openphoenux.org
>> http://lists.goldelico.com/mailman/listinfo.cgi/letux-kernel
> 
> _______________________________________________
> http://projects.goldelico.com/p/gta04-kernel/
> Letux-kernel mailing list
> Letux-kernel at openphoenux.org
> http://lists.goldelico.com/mailman/listinfo.cgi/letux-kernel



More information about the Letux-kernel mailing list