Hi Denis,
On 04/25/2016 08:56 PM, Denis Kenzior wrote:
Hi John,
On 04/25/2016 02:02 AM, John Ernberg wrote:
> Hi Denis,
>
> On 04/22/2016 09:43 PM, Denis Kenzior wrote:
>> Hi John,
>>
>> On 04/22/2016 08:07 AM, John Ernberg wrote:
>>> From: John Ernberg <john.ernberg(a)actia.se>
>>>
>>> Prevents glib from causing SIGFPE during certain circumstances of
>>> modem
>>> removal.
>>
>> Do you have a stack trace handy?
> I have one for the bluez5 hfp plugin which was recreated by stopping
> oFono, the rest of the changes were added as a sort of safeguard.
>
> Stack trace:
>
> (gdb)
> (gdb) bt
> #0 0x76d88748 in raise (sig=8)
> at ../nptl/sysdeps/unix/sysv/linux/pt-raise.c:37
> #1 0x76e8bcac in __aeabi_ldiv0 ()
> at
>
/opt/yocto/build/tmp/work-shared/gcc-4.8.2-r0/gcc-4.8.2/libgcc/config/arm/lib1funcs.S:1331
>
> #2 0x76e0e1b4 in g_hash_table_lookup_node (hash_return=<synthetic
> pointer>,
> key=0xe17418, hash_table=0xe10e38)
> at
> /usr/src/debug/glib-2.0/1_2.38.2-r0/glib-2.38.2/glib/ghash.c:371
> #3 g_hash_table_lookup (hash_table=0xe10e38, key=key@entry=0xe17418)
> at
> /usr/src/debug/glib-2.0/1_2.38.2-r0/glib-2.38.2/glib/ghash.c:1076
> #4 0x0008ccb8 in sim_watch (atom=<optimized out>, cond=<optimized out>,
> data=0xe18f88) at plugins/hfp_ag_bluez5.c:260
> #5 0x000910d0 in call_watches (atom=atom@entry=0xe17540,
> cond=cond@entry=OFONO_ATOM_WATCH_CONDITION_UNREGISTERED) at
> src/modem.c:261
> #6 0x00091de0 in __ofono_atom_unregister (atom=atom@entry=0xe17540)
> at src/modem.c:281
> #7 0x00091e54 in flush_atoms (
> new_state=new_state@entry=MODEM_STATE_POWER_OFF, modem=0xe18f88)
> at src/modem.c:430
> #8 0x00091f60 in modem_change_state (modem=0xe18f88,
> new_state=MODEM_STATE_POWER_OFF) at src/modem.c:511
> #9 0x000921c8 in set_powered (modem=modem@entry=0xe18f88,
> powered=powered@entry=0) at src/modem.c:882
> #10 0x00092990 in modem_unregister (modem=0xe18f88) at src/modem.c:2040
> #11 0x00093cec in ofono_modem_driver_unregister (d=0x112168)
> at src/modem.c:2176
What calls this? The corresponding exit function in question is not
present in the stack trace.
The modem plugins call it during their exit. Since the
plugins are all
calling exit the drivers gets unregistered.
> #12 0x00091040 in __ofono_plugin_cleanup () at src/plugin.c:197
> #13 0x00014e24 in main (argc=85540, argv=0x7ee60d44) at src/main.c:255
>
> oFono debug log:
>
> ofonod[5126]: src/plugin.c:__ofono_plugin_cleanup()
> ofonod[5126]: plugins/push-notification.c:push_notification_exit()
> ofonod[5126]: plugins/smart-messaging.c:smart_messaging_exit()
> ofonod[5126]: plugins/bluez5.c:bt_unregister_profile() Bluetooth:
> Unregistering profile /bluetooth/profile/dun_gw
> ofonod[5126]: plugins/bluez5.c:bt_unregister_profile() Bluetooth:
> Unregistering profile /bluetooth/profile/hfp_hf
> ofonod[5126]:
> src/handsfree-audio.c:ofono_handsfree_card_driver_unregister() driver:
> 0x113994
> ofonod[5126]: src/modem.c:ofono_modem_driver_unregister() driver:
> 0x1139a4, name: hfp
> ofonod[5126]: src/modem.c:ofono_modem_driver_unregister() driver:
> 0x11391c, name: ublox
> ofonod[5126]: src/modem.c:ofono_modem_driver_unregister() driver:
> 0x1138b4, name: quectel
> ofonod[5126]: src/modem.c:ofono_modem_driver_unregister() driver:
> 0x113854, name: he910
> ofonod[5126]:
> src/private-network.c:ofono_private_network_driver_unregister() driver:
> 0x113828, name: ConnMan Private Network
> ofonod[5126]: src/modem.c:ofono_modem_driver_unregister() driver:
> 0x1137d0, name: sim900
> ofonod[5126]: src/modem.c:ofono_modem_driver_unregister() driver:
> 0x113778, name: samsung
> ofonod[5126]: src/modem.c:ofono_modem_driver_unregister() driver:
> 0x113720, name: speedupcdma
> ofonod[5126]: src/modem.c:ofono_modem_driver_unregister() driver:
> 0x1136c0, name: speedup
> ofonod[5126]: src/modem.c:ofono_modem_driver_unregister() driver:
> 0x113668, name: alcatel
> ofonod[5126]: src/modem.c:ofono_modem_driver_unregister() driver:
> 0x113600, name: icera
> ofonod[5126]: src/modem.c:ofono_modem_driver_unregister() driver:
> 0x1135a8, name: linktop
> ofonod[5126]: src/modem.c:ofono_modem_driver_unregister() driver:
> 0x113550, name: nokiacdma
> ofonod[5126]: src/modem.c:ofono_modem_driver_unregister() driver:
> 0x1134f8, name: nokia
> ofonod[5126]: src/modem.c:ofono_modem_driver_unregister() driver:
> 0x1134a0, name: tc65
> ofonod[5126]: src/modem.c:ofono_modem_driver_unregister() driver:
> 0x113408, name: ste
> ofonod[5126]: src/modem.c:ofono_modem_driver_unregister() driver:
> 0x1133a0, name: ifx
> ofonod[5126]: src/modem.c:ofono_modem_driver_unregister() driver:
> 0x113348, name: palmpre
> ofonod[5126]: src/modem.c:ofono_modem_driver_unregister() driver:
> 0x1132e8, name: novatel
> ofonod[5126]: src/modem.c:ofono_modem_driver_unregister() driver:
> 0x113290, name: sierra
> ofonod[5126]: src/modem.c:ofono_modem_driver_unregister() driver:
> 0x113208, name: huawei
> ofonod[5126]: src/modem.c:ofono_modem_driver_unregister() driver:
> 0x1131b0, name: zte
> ofonod[5126]: src/modem.c:ofono_modem_driver_unregister() driver:
> 0x113140, name: hso
> ofonod[5126]: src/modem.c:ofono_modem_driver_unregister() driver:
> 0x1130e0, name: mbm
> ofonod[5126]: src/modem.c:ofono_modem_driver_unregister() driver:
> 0x113080, name: calypso
> ofonod[5126]: src/modem.c:ofono_modem_driver_unregister() driver:
> 0x113028, name: wavecom
> ofonod[5126]: src/modem.c:ofono_modem_driver_unregister() driver:
> 0x112fd0, name: g1
> ofonod[5126]:
> src/cdma-voicecall.c:ofono_cdma_voicecall_driver_unregister() driver:
> 0x112f78, name: cdmamodem
> ofonod[5126]: src/modem.c:ofono_devinfo_driver_unregister() driver:
> 0x112fa0, name: cdmamodem
> ofonod[5126]: src/cdma-connman.c:ofono_cdma_connman_driver_unregister()
> driver: 0x112fbc, name: cdmamodem
> ofonod[5126]: src/ctm.c:ofono_ctm_driver_unregister() driver: 0x112e88,
> name: phonesim
> ofonod[5126]: src/gprs.c:ofono_gprs_context_driver_unregister() driver:
> 0x112e9c, name: phonesim
> ofonod[5126]: src/modem.c:ofono_modem_driver_unregister() driver:
> 0x112eb8, name: phonesim
> ofonod[5126]: src/ussd.c:ofono_ussd_driver_unregister() driver:
> 0x112e74, name: speedupmodem
> ofonod[5126]: src/voicecall.c:ofono_voicecall_driver_unregister()
> driver: 0x112d38, name: hfpmodem
> ofonod[5126]: src/modem.c:ofono_devinfo_driver_unregister() driver:
> 0x112ddc, name: hfpmodem
> ofonod[5126]: src/network.c:ofono_netreg_driver_unregister() driver:
> 0x112d90, name: hfpmodem
> ofonod[5126]: src/call-volume.c:ofono_call_volume_driver_unregister()
> driver: 0x112dc4, name: hfpmodem
> ofonod[5126]: src/handsfree.c:ofono_handsfree_driver_unregister()
> driver: 0x112e08, name: hfpmodem
> ofonod[5126]: src/siri.c:ofono_siri_driver_unregister() driver:
> 0x112e3c, name: hfpmodem
> ofonod[5126]: src/network.c:ofono_netreg_driver_unregister() driver:
> 0x112cb8, name: dunmodem
> ofonod[5126]: src/gprs.c:ofono_gprs_driver_unregister() driver:
> 0x112cdc, name: dunmodem
> ofonod[5126]: src/voicecall.c:ofono_voicecall_driver_unregister()
> driver: 0x112bec, name: stemodem
> ofonod[5126]: src/gprs.c:ofono_gprs_context_driver_unregister() driver:
> 0x112c74, name: stemodem
> ofonod[5126]:
> src/radio-settings.c:ofono_radio_settings_driver_unregister() driver:
> 0x112c3c, name: stemodem
> ofonod[5126]: src/stk.c:ofono_stk_driver_unregister() driver: 0x112b98,
> name: ifxmodem
> ofonod[5126]: src/gprs.c:ofono_gprs_context_driver_unregister() driver:
> 0x112b6c, name: ifxmodem
> ofonod[5126]:
> src/radio-settings.c:ofono_radio_settings_driver_unregister() driver:
> 0x112b38, name: ifxmodem
> ofonod[5126]:
> src/audio-settings.c:ofono_audio_settings_driver_unregister() driver:
> 0x112b24, name: ifxmodem
> ofonod[5126]: src/voicecall.c:ofono_voicecall_driver_unregister()
> driver: 0x112acc, name: ifxmodem
> ofonod[5126]: src/ctm.c:ofono_ctm_driver_unregister() driver: 0x112bb8,
> name: ifxmodem
> ofonod[5126]: src/gprs.c:ofono_gprs_context_driver_unregister() driver:
> 0x112a5c, name: hsomodem
> ofonod[5126]:
> src/radio-settings.c:ofono_radio_settings_driver_unregister() driver:
> 0x112a80, name: hsomodem
> ofonod[5126]:
> src/location-reporting.c:ofono_location_reporting_driver_unregister()
> driver: 0x112a1c, name: mbmmodem
> ofonod[5126]: src/stk.c:ofono_stk_driver_unregister() driver: 0x1129fc,
> name: mbmmodem
> ofonod[5126]: src/gprs.c:ofono_gprs_context_driver_unregister() driver:
> 0x1129d8, name: mbmmodem
> ofonod[5126]: src/stk.c:ofono_stk_driver_unregister() driver: 0x112990,
> name: calypsomodem
> ofonod[5126]: src/voicecall.c:ofono_voicecall_driver_unregister()
> driver: 0x112940, name: calypsomodem
> ofonod[5126]: src/cdma-netreg.c:ofono_cdma_netreg_driver_unregister()
> driver: 0x112910, name: huaweimodem
> ofonod[5126]: src/gprs.c:ofono_gprs_context_driver_unregister() driver:
> 0x1128c0, name: huaweimodem
> ofonod[5126]:
> src/radio-settings.c:ofono_radio_settings_driver_unregister() driver:
> 0x1128e4, name: huaweimodem
> ofonod[5126]:
> src/audio-settings.c:ofono_audio_settings_driver_unregister() driver:
> 0x1128ac, name: huaweimodem
> ofonod[5126]: src/voicecall.c:ofono_voicecall_driver_unregister()
> driver: 0x11285c, name: huaweimodem
> ofonod[5126]: src/ussd.c:ofono_ussd_driver_unregister() driver:
> 0x112848, name: huaweimodem
> ofonod[5126]: src/gprs.c:ofono_gprs_context_driver_unregister() driver:
> 0x1127d0, name: iceramodem
> ofonod[5126]:
> src/radio-settings.c:ofono_radio_settings_driver_unregister() driver:
> 0x1127fc, name: iceramodem
> ofonod[5126]:
> src/radio-settings.c:ofono_radio_settings_driver_unregister() driver:
> 0x11277c, name: ztemodem
> ofonod[5126]: src/gprs.c:ofono_gprs_context_driver_unregister() driver:
> 0x112738, name: swmodem
> ofonod[5126]:
> src/radio-settings.c:ofono_radio_settings_driver_unregister() driver:
> 0x1126f4, name: nwmodem
> ofonod[5126]: src/sim-auth.c:ofono_sim_auth_driver_unregister() driver:
> 0x112698, name: atmodem
> ofonod[5126]: src/stk.c:ofono_stk_driver_unregister() driver: 0x112520,
> name: atmodem
> ofonod[5126]: src/sim.c:ofono_sim_driver_unregister() driver: 0x112488,
> name: atmodem
> ofonod[5126]: src/sim.c:ofono_sim_driver_unregister() driver: 0x1124d0,
> name: atmodem-noef
> ofonod[5126]: src/sms.c:ofono_sms_driver_unregister() driver: 0x1122e0,
> name: atmodem
> ofonod[5126]: src/ussd.c:ofono_ussd_driver_unregister() driver:
> 0x112548, name: atmodem
> ofonod[5126]: src/phonebook.c:ofono_phonebook_driver_unregister()
> driver: 0x1125ec, name: atmodem
> ofonod[5126]:
> src/call-settings.c:ofono_call_settings_driver_unregister() driver:
> 0x112270, name: atmodem
> ofonod[5126]: src/call-meter.c:ofono_call_meter_driver_unregister()
> driver: 0x112364, name: atmodem
> ofonod[5126]:
> src/call-forwarding.c:ofono_call_forwarding_driver_unregister() driver:
> 0x112324, name: atmodem
> ofonod[5126]: src/call-barring.c:ofono_call_barring_driver_unregister()
> driver: 0x1125bc, name: atmodem
> ofonod[5126]: src/network.c:ofono_netreg_driver_unregister() driver:
> 0x1123d0, name: atmodem
> ofonod[5126]: src/modem.c:ofono_devinfo_driver_unregister() driver:
> 0x112604, name: atmodem
> ofonod[5126]: src/voicecall.c:ofono_voicecall_driver_unregister()
> driver: 0x11256c, name: atmodem
> ofonod[5126]: src/cbs.c:ofono_cbs_driver_unregister() driver: 0x112308,
> name: atmodem
> ofonod[5126]: src/call-volume.c:ofono_call_volume_driver_unregister()
> driver: 0x112630, name: atmodem
> ofonod[5126]: src/gprs.c:ofono_gprs_driver_unregister() driver:
> 0x112660, name: atmodem
> ofonod[5126]: src/gprs.c:ofono_gprs_context_driver_unregister() driver:
> 0x112674, name: atmodem
> ofonod[5126]: src/gnss.c:ofono_gnss_driver_unregister() driver:
> 0x1126b8, name: atmodem
> ofonod[5126]: src/modem.c:modem_unregister() 0xe18f88
> ofonod[5126]: src/modem.c:modem_change_state() old state: 3, new
> state: 0
Are you running a modified version of oFono by any chance? The
upstream version handles SIGINT and SIGTERM by calling
__ofono_modem_shutdown. Which in turn flushes all atoms and all the
various watches are cleaned up.
In the embedded system where I run oFono I have not
figured out how to
get the stack tracing implemented in src/log.c working so that is disabled.
I have not done any changes to src/main.c or src/log.c except disabling
the internal stack trace.
Only after all the modems are shut down do we exit the event loop and
__ofono_plugin_cleanup is called. The fact that you still have a
modem in state MODEM_STATE_ONLINE here is a bit puzzling.
However, even if I take out that logic and force the debug log to look
like yours, the only problems I detect are in the hfp_ag_bluez5 plugin
and examples/emulator.c plugin.
Hm, if it doesn't happen in upstream this is
also probably PEBKAC on my
part somehow.
> ofonod[5126]: src/modem.c:flush_atoms()
> ofonod[5126]: src/sim.c:ofono_sim_remove_spn_watch() 0xe17418
> ofonod[5126]: src/network.c:netreg_remove() atom: 0xe17af8
> ofonod[5126]: src/voicecall.c:voicecall_remove() atom: 0xe17c58
> ofonod[5126]: src/gprs.c:gprs_context_unregister() 0xe17cd8, 0xe17a30
> ofonod[5126]: src/gprs.c:gprs_context_remove() atom: 0xe17cf8
> ofonod[5126]: drivers/atmodem/gprs-context.c:at_gprs_context_remove()
> ofonod[5126]: src/gprs.c:gprs_unregister() 0xe17a30
> ofonod[5126]: src/gprs.c:gprs_remove() atom: 0xe17b48
> ofonod[5126]: plugins/push-notification.c:push_notification_cleanup()
> 0xe1adb0
> ofonod[5126]: plugins/smart-messaging.c:smart_messaging_cleanup()
> 0xe1ad80
> ofonod[5126]: src/sms.c:sms_remove() atom: 0xe175a0
> Floating point exception (core dumped)
>
>>
>>> ---
>>> plugins/push-notification.c | 26 +++++++++++++++++++++++---
>>> 1 file changed, 23 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/plugins/push-notification.c b/plugins/push-notification.c
>>> index ff388d9..ecf100f 100644
>>> --- a/plugins/push-notification.c
>>> +++ b/plugins/push-notification.c
>>> @@ -45,6 +45,7 @@
>>> #define WAP_PUSH_DST_PORT 2948
>>>
>>> static unsigned int modemwatch_id;
>>> +static GHashTable *sms_watches = NULL;
>>>
>>> struct push_notification {
>>> struct ofono_modem *modem;
>>> @@ -164,6 +165,16 @@ static void push_notification_cleanup(gpointer
>>> user)
>>> ofono_modem_remove_interface(pn->modem,
>>> PUSH_NOTIFICATION_INTERFACE);
>>> }
>>>
>>> +static gboolean atom_watch_remove(gpointer key, gpointer value,
>>> + gpointer user_data)
>>> +{
>>> + struct ofono_modem *modem = key;
>>> +
>>> + __ofono_modem_remove_atom_watch(modem, GPOINTER_TO_UINT(value));
>>> +
>>> + return TRUE;
>>> +}
>>> +
>>> static void sms_watch(struct ofono_atom *atom,
>>> enum ofono_atom_watch_condition cond,
>>> void *data)
>>> @@ -197,18 +208,22 @@ static void sms_watch(struct ofono_atom *atom,
>>> static void modem_watch(struct ofono_modem *modem, gboolean added,
>>> void *user)
>>> {
>>> struct push_notification *pn;
>>> + int sms;
>>> DBG("modem: %p, added: %d", modem, added);
>>>
>>> - if (added == FALSE)
>>> + if (added == FALSE) {
>>> + g_hash_table_remove(sms_watches, modem);
>>> return;
>>> + }
>>
>> This has no effect. The atom_watches for that particular modem have
>> already been freed by the time the modem watch has been called in
>> call_modemwatches(). See modem_unregister for details.
> Depends on which exit is called first, for at least some plugins the
> exit can be called before modem_unregister. So the plugin is already
> cleaned up when its atom watch is being called. This is the root of the
> SIGFPE in glib.
> This just removes the entry in the local hash table, as the plugin exit
> function will now unregister the watches if there are any active during
> exit.
I still don't see how it matters in this case. Even if
push_notification plugin is cleaned up first, all it will do is remove
the modemwatch. All actual watches created will be cleaned up when
the modem is removed.
I suspect the issue is isolated to hfp_ag_bluez5 plugin only.
>>
>>>
>>> pn = g_try_new0(struct push_notification, 1);
>>> if (pn == NULL)
>>> return;
>>>
>>> pn->modem = modem;
>>> - __ofono_modem_add_atom_watch(modem, OFONO_ATOM_TYPE_SMS,
>>> - sms_watch, pn, g_free);
>>> + sms = __ofono_modem_add_atom_watch(modem, OFONO_ATOM_TYPE_SMS,
>>> + sms_watch, pn, g_free);
>>> + g_hash_table_insert(sms_watches, modem, GUINT_TO_POINTER(sms));
>>> }
>>>
>>> static void call_modemwatch(struct ofono_modem *modem, void *user)
>>> @@ -220,6 +235,8 @@ static int push_notification_init(void)
>>> {
>>> DBG("");
>>>
>>> + sms_watches = g_hash_table_new(g_direct_hash, g_direct_equal);
>>> +
>>> modemwatch_id = __ofono_modemwatch_add(modem_watch, NULL,
>>> NULL);
>>>
>>> __ofono_modem_foreach(call_modemwatch, NULL);
>>> @@ -232,6 +249,9 @@ static void push_notification_exit(void)
>>> DBG("");
>>>
>>> __ofono_modemwatch_remove(modemwatch_id);
>>> +
>>> + g_hash_table_foreach_remove(sms_watches, atom_watch_remove,
>>> NULL);
>>> + g_hash_table_destroy(sms_watches);
>>
>> atom watches are already being removed by the virtue of modems being
>> unregistered.
>>
>>> }
>>>
>>> OFONO_PLUGIN_DEFINE(push_notification, "Push Notification
Plugin",
>>> VERSION,
>>>
>>
>> Regards,
>> -Denis
> I hope this clarifies the reason for this patch. I deeply apologize for
> not including this information with the patch submission.
>
> Best regards // John Ernberg
>
Regards,
-Denis
I think we can drop this patch set as it's most likely a fault on my
part that causes the problem. If this happens to be an actual problem
upstream under some circumstances, I will submit a new version of this set.
Best regards // John Ernberg