]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
greybus: timesync: Rework timesync removal serialization logic
authorBryan O'Donoghue <bryan.odonoghue@linaro.org>
Thu, 16 Jun 2016 12:42:16 +0000 (13:42 +0100)
committerGreg Kroah-Hartman <gregkh@google.com>
Thu, 16 Jun 2016 16:07:41 +0000 (09:07 -0700)
We need to make sure we adequately cancel and quiesce any scheduled
TimeSync synchronization operations in the case of greybus.ko being yanked
out of memory i.e. when doing an EHCI runtime suspend or just a plain
rmmod. The scenario is a new TimeSync sync operation has been scheduled.
Next gb_timesync_svc_remove() runs. In this case we should terminate any
scheduled work, terminate our ktime tracking timer and state transition to
GB_TIMESYNC_STATE_INVALID to ensure no other context may schedule any new
TimeSync operations.

Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
Reviewed-by: Vaibhav Hiremath <vaibhav.hiremath@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/timesync.c

index cc08b090f1b36c6e59baf4aa0d6a5b3da0e27fb5..b9b29f5f5c8f7663157acd4bc5f78a67047a791d 100644 (file)
@@ -1067,8 +1067,9 @@ void gb_timesync_svc_remove(struct gb_svc *svc)
 
        mutex_lock(&timesync_svc->mutex);
 
-       gb_timesync_teardown(timesync_svc);
+       gb_timesync_set_state_atomic(timesync_svc, GB_TIMESYNC_STATE_INVALID);
        del_timer_sync(&timesync_svc->ktime_timer);
+       gb_timesync_teardown(timesync_svc);
 
        gb_timesync_hd_remove(timesync_svc, svc->hd);
        list_for_each_entry_safe(timesync_interface, next,
@@ -1076,7 +1077,6 @@ void gb_timesync_svc_remove(struct gb_svc *svc)
                list_del(&timesync_interface->list);
                kfree(timesync_interface);
        }
-       gb_timesync_set_state_atomic(timesync_svc, GB_TIMESYNC_STATE_INVALID);
        debugfs_remove(timesync_svc->frame_ktime_dentry);
        debugfs_remove(timesync_svc->frame_time_dentry);
        destroy_workqueue(timesync_svc->work_queue);