summaryrefslogtreecommitdiffstats
path: root/drivers/staging
diff options
context:
space:
mode:
authorBryan O'Donoghue <bryan.odonoghue@linaro.org>2016-06-16 13:42:16 +0100
committerGreg Kroah-Hartman <gregkh@google.com>2016-06-16 09:07:41 -0700
commit93dbb97a3e2455cdb5efee17a497758ece4b8ed7 (patch)
tree095d9aebfa50f5ad88bf37bd126d4e7d3da5de93 /drivers/staging
parent0cc3bc6930d02ff5083b7b7bc18ca53299bb383a (diff)
greybus: timesync: Rework timesync removal serialization logic
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>
Diffstat (limited to 'drivers/staging')
-rw-r--r--drivers/staging/greybus/timesync.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/staging/greybus/timesync.c b/drivers/staging/greybus/timesync.c
index cc08b090f1b3..b9b29f5f5c8f 100644
--- a/drivers/staging/greybus/timesync.c
+++ b/drivers/staging/greybus/timesync.c
@@ -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);