diff options
author | 2020-07-08 11:18:45 +0100 | |
---|---|---|
committer | 2020-07-09 12:58:35 +0200 | |
commit | 027c70021b905eb23e2f36c64add062ba218b841 (patch) | |
tree | e31ba3386c152bc8515b16d3022eb674d2d0859b /tools/perf/scripts/python/export-to-postgresql.py | |
parent | ALSA: echoaudio: Remove redundant check (diff) | |
download | linux-dev-027c70021b905eb23e2f36c64add062ba218b841.tar.xz linux-dev-027c70021b905eb23e2f36c64add062ba218b841.zip |
ALSA: echoaudio: Race conditions around "opencount"
Use of atomics does not make these statements robust:
atomic_inc(&chip->opencount);
if (atomic_read(&chip->opencount) > 1 && chip->rate_set)
chip->can_set_rate=0;
and
if (atomic_read(&chip->opencount)) {
if (chip->opencount) {
changed = -EAGAIN;
} else {
changed = set_digital_mode(chip, dmode);
It would be necessary to atomically increment or decrement the value
and use the returned result. And yet we still need to prevent other
threads making use of "can_set_rate" while we set it.
However in all but one case the atomic is misleading as they are already
running with "mode_mutex" held.
Decisions are made on mode setting are often intrinsically connected
to "opencount" because some operations are not permitted unless
there is sole ownership.
So instead simplify this, and use "mode_mutex" as a lock for all reference
counting and mode setting.
Signed-off-by: Mark Hills <mark@xwax.org>
Link: https://lore.kernel.org/r/20200708101848.3457-2-mark@xwax.org
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'tools/perf/scripts/python/export-to-postgresql.py')
0 files changed, 0 insertions, 0 deletions