lkml.org 
[lkml]   [2022]   [Aug]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.19 0265/1157] erofs: wake up all waiters after z_erofs_lzma_head ready
    Date
    From: Yuwen Chen <chenyuwen1@meizu.com>

    [ Upstream commit 2df7c4bd7c1d2bc5ece5e9ed19dbd386810c2a65 ]

    When the user mounts the erofs second times, the decompression thread
    may hung. The problem happens due to a sequence of steps like the
    following:

    1) Task A called z_erofs_load_lzma_config which obtain all of the node
    from the z_erofs_lzma_head.

    2) At this time, task B called the z_erofs_lzma_decompress and wanted to
    get a node. But the z_erofs_lzma_head was empty, the Task B had to
    sleep.

    3) Task A release nodes and push nodes into the z_erofs_lzma_head. But
    task B was still sleeping.

    One example report when the hung happens:
    task:kworker/u3:1 state:D stack:14384 pid: 86 ppid: 2 flags:0x00004000
    Workqueue: erofs_unzipd z_erofs_decompressqueue_work
    Call Trace:
    <TASK>
    __schedule+0x281/0x760
    schedule+0x49/0xb0
    z_erofs_lzma_decompress+0x4bc/0x580
    ? cpu_core_flags+0x10/0x10
    z_erofs_decompress_pcluster+0x49b/0xba0
    ? __update_load_avg_se+0x2b0/0x330
    ? __update_load_avg_se+0x2b0/0x330
    ? update_load_avg+0x5f/0x690
    ? update_load_avg+0x5f/0x690
    ? set_next_entity+0xbd/0x110
    ? _raw_spin_unlock+0xd/0x20
    z_erofs_decompress_queue.isra.0+0x2e/0x50
    z_erofs_decompressqueue_work+0x30/0x60
    process_one_work+0x1d3/0x3a0
    worker_thread+0x45/0x3a0
    ? process_one_work+0x3a0/0x3a0
    kthread+0xe2/0x110
    ? kthread_complete_and_exit+0x20/0x20
    ret_from_fork+0x22/0x30
    </TASK>

    Signed-off-by: Yuwen Chen <chenyuwen1@meizu.com>
    Fixes: 622ceaddb764 ("erofs: lzma compression support")
    Reviewed-by: Gao Xiang <hsiangkao@linux.alibaba.com>
    Link: https://lore.kernel.org/r/20220626224041.4288-1-chenyuwen1@meizu.com
    Signed-off-by: Gao Xiang <hsiangkao@linux.alibaba.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    fs/erofs/decompressor_lzma.c | 1 +
    1 file changed, 1 insertion(+)

    diff --git a/fs/erofs/decompressor_lzma.c b/fs/erofs/decompressor_lzma.c
    index 05a3063cf2bc..5e59b3f523eb 100644
    --- a/fs/erofs/decompressor_lzma.c
    +++ b/fs/erofs/decompressor_lzma.c
    @@ -143,6 +143,7 @@ int z_erofs_load_lzma_config(struct super_block *sb,
    DBG_BUGON(z_erofs_lzma_head);
    z_erofs_lzma_head = head;
    spin_unlock(&z_erofs_lzma_lock);
    + wake_up_all(&z_erofs_lzma_wq);

    z_erofs_lzma_max_dictsize = dict_size;
    mutex_unlock(&lzma_resize_mutex);
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-08-16 01:04    [W:4.015 / U:1.696 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site