Browse Source
On multiprocessor systems, it's routine to enter sys_clock_announce() in parallel (the driver will generally announce zero ticks on all but one cpu). When that happens, each call will independently enter the loop over the timeout list. The access is correctly synchronized, so the list handling is correct. But the lock is RELEASED around the invocation of the callback, which means that the individual callbacks may interleave between cpus. That means that individual application-provided callbacks may be executed in parallel, which to the app is indistinguishable from "out of order". That's surprising and error-prone. Don't do it. Place a secondary outer spinlock around the announce loop (but not the timeslicing handling) to correctly serialize the timeout handling on a single cpu. (It should be noted that this was discovered not because of a timeout callback race, but because the resulting simultaneous calls to sys_clock_set_timeout from separate cores seems to cause extremely high latency excursions on intel_adsp hardware using the cavs_timer driver. That hardware issue is still poorly understood, but this fix is desirable regardless.) Signed-off-by: Andy Ross <andrew.j.ross@intel.com>pull/41903/head
1 changed files with 19 additions and 0 deletions
Loading…
Reference in new issue