commit 71cd7e80cfde548959952eac7063aeaea1f2e1c6 upstream.
An S4 (suspend to disk) test on the LoongArch 3A6000 platform sometimes
fails with the following error messaged in the dmesg log:
Invalid LZO compressed length
That happens because when compressing/decompressing the image, the
synchronization between the control thread and the compress/decompress/crc
thread is based on a relaxed ordering interface, which is unreliable, and the
following situation may occur:
CPU 0 CPU 1
save_image_lzo lzo_compress_threadfn
atomic_set(&d->stop, 1);
atomic_read(&data[thr].stop)
data[thr].cmp = data[thr].cmp_len;
WRITE data[thr].cmp_len
Then CPU0 gets a stale cmp_len and writes it to disk. During resume from S4,
wrong cmp_len is loaded.
To maintain data consistency between the two threads, use the acquire/release
variants of atomic set and read operations.
Fixes:
|
||
|---|---|---|
| .. | ||
| autosleep.c | ||
| console.c | ||
| energy_model.c | ||
| hibernate.c | ||
| Kconfig | ||
| main.c | ||
| Makefile | ||
| power.h | ||
| poweroff.c | ||
| process.c | ||
| qos.c | ||
| snapshot.c | ||
| suspend.c | ||
| suspend_test.c | ||
| swap.c | ||
| user.c | ||
| wakelock.c | ||