• Hongchen Zhang's avatar
    PM: hibernate: Enforce ordering during image compression/decompression · 71cd7e80
    Hongchen Zhang authored
    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: 081a9d04 ("PM / Hibernate: Improve performance of LZO/plain hibernation, checksum image")
    Cc: All applicable <stable@vger.kernel.org>
    Signed-off-by: default avatarHongchen Zhang <zhanghongchen@loongson.cn>
    Co-developed-by: default avatarWeihao Li <liweihao@loongson.cn>
    Signed-off-by: default avatarWeihao Li <liweihao@loongson.cn>
    [ rjw: Subject rewrite and changelog edits ]
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    71cd7e80
swap.c 38.2 KB