diff options
author | Jett Rink <jettrink@chromium.org> | 2019-06-13 13:27:38 -0600 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2019-06-14 02:32:55 +0000 |
commit | 8374923a60c8b63b7bb2c1823e4f5b6078544e44 (patch) | |
tree | cfd5574a404b0452082a70f96f952d24629f2be1 /common | |
parent | daaab800a7d844bb776811e5db0e3f4a43946b7e (diff) | |
download | chrome-ec-8374923a60c8b63b7bb2c1823e4f5b6078544e44.tar.gz |
motionsense: prevent loop after missing events
We don't need to loop to figure out when to schedule the next sensor
collection event, just schedule it as soon as possible. This eliminates
a watchdog reset when we miss scheduling the sensor task and get really
far behind.
BRANCH=none
BUG=b:133190570
TEST=normal operation is fine, based on longs of failing results in bug,
this should prevent the watch reset.
Change-Id: I3001028ba393b51d1958f0136ba040eaee5e52d1
Signed-off-by: Jett Rink <jettrink@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/1658521
Reviewed-by: Yuval Peress <peress@chromium.org>
Reviewed-by: Jack Rosenthal <jrosenth@chromium.org>
Diffstat (limited to 'common')
-rw-r--r-- | common/motion_sense.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/common/motion_sense.c b/common/motion_sense.c index 3e9bd4b550..d7084dbf84 100644 --- a/common/motion_sense.c +++ b/common/motion_sense.c @@ -970,19 +970,21 @@ static inline void increment_sensor_collection(struct motion_sensor_t *sensor, { sensor->next_collection += sensor->collection_rate; - while (time_after(ts->le.lo, sensor->next_collection)) { + if (time_after(ts->le.lo, sensor->next_collection)) { /* * If we get here it means that we completely missed a sensor - * collection time and we attempt to recover by incrementing - * the next collection time until we recover. This should not - * happen and if it does it means that the ec cannot handle the - * requested data rate. + * collection time and we attempt to recover by scheduling as + * soon as possible. This should not happen and if it does it + * means that the ec cannot handle the requested data rate. */ + int missed_events = + time_until(sensor->next_collection, ts->le.lo) / + sensor->collection_rate; - CPRINTS("%s Missed data collection at %u - rate: %d", - sensor->name, sensor->next_collection, + CPRINTS("%s Missed %d data collections at %u - rate: %d", + sensor->name, missed_events, sensor->next_collection, sensor->collection_rate); - sensor->next_collection += sensor->collection_rate; + sensor->next_collection = ts->le.lo + motion_min_interval; } } |