summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGwendal Grignou <gwendal@chromium.org>2021-01-07 11:44:27 -0800
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-10-21 18:35:15 +0000
commitd258eb1658afb888e44dd5d0c481e0e4a5d593bf (patch)
tree4ba1b31a0904954e37f6644544c6f216d85eda30
parenta565f57e9e949f64ea25cc1188143db7f3d41bcc (diff)
downloadchrome-ec-firmware-rammus-11275.B.tar.gz
common: motion: fix races at shutdownfirmware-rammus-11275.B
Do not use collection_rate blindly after a function may have slept: the HOOK task could have run suspend() or suspend() call and set it to 0. Fixes 104f5257 ("motion: Control on which task sensor setting functions are running on") [CL:2553347] BUG=b:218982018, b:176918310, b:170703322 BRANCH=kukui TEST=unit test. Change-Id: I9ef13ceca195db4b48866f1e53f9408fb2bbf595 Signed-off-by: Gwendal Grignou <gwendal@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2616137 Reviewed-by: Aseda Aboagye <aaboagye@chromium.org> Reviewed-by: Diana Z <dzigterman@chromium.org> (cherry picked from commit ea99e40f31445e67659c09b32cab6857cad8b83e) Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3508418 Reviewed-by: Ricardo Quesada <ricardoq@chromium.org>
-rw-r--r--common/motion_sense.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/common/motion_sense.c b/common/motion_sense.c
index 2e044e1671..353e54030b 100644
--- a/common/motion_sense.c
+++ b/common/motion_sense.c
@@ -678,11 +678,8 @@ static inline void update_sense_data(uint8_t *lpc_status, int *psample_id)
static int motion_sense_read(struct motion_sensor_t *sensor)
{
- if (sensor->state != SENSOR_INITIALIZED)
- return EC_ERROR_UNKNOWN;
-
- if (sensor->drv->get_data_rate(sensor) == 0)
- return EC_ERROR_NOT_POWERED;
+ ASSERT(sensor->state == SENSOR_INITIALIZED);
+ ASSERT(sensor->drv->get_data_rate(sensor) != 0);
#ifdef CONFIG_ACCEL_SPOOF_MODE
/*
@@ -739,6 +736,13 @@ static int motion_sense_process(struct motion_sensor_t *sensor,
struct ec_response_motion_sensor_data vector;
int *v = sensor->raw_xyz;
+ /*
+ * Since motion_sense_read can sleep, other task may be
+ * scheduled. In particular if suspend is called by
+ * HOOKS task, it may set colleciton_rate to 0 and we
+ * would crash in increment_sensor_collection.
+ */
+ increment_sensor_collection(sensor, ts);
ret = motion_sense_read(sensor);
if (ret == EC_SUCCESS) {
vector.flags = 0;
@@ -753,7 +757,6 @@ static int motion_sense_process(struct motion_sensor_t *sensor,
motion_sense_fifo_add_data(&vector, sensor, 3,
__hw_clock_source_read());
}
- increment_sensor_collection(sensor, ts);
} else {
ret = EC_ERROR_BUSY;
}
@@ -770,8 +773,14 @@ static int motion_sense_process(struct motion_sensor_t *sensor,
if (motion_sensor_in_forced_mode(sensor)) {
if (motion_sensor_time_to_read(ts, sensor)) {
/* Get latest data for local calculation */
- ret = motion_sense_read(sensor);
+ /*
+ * Since motion_sense_read can sleep, other task may be
+ * scheduled. In particular if suspend is called by
+ * HOOKS task, it may set colleciton_rate to 0 and we
+ * would crash in increment_sensor_collection.
+ */
increment_sensor_collection(sensor, ts);
+ ret = motion_sense_read(sensor);
} else {
ret = EC_ERROR_BUSY;
}