[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <20190123053035.GB8785@mit.edu>
Date: Wed, 23 Jan 2019 00:30:35 -0500
From: "Theodore Y. Ts'o" <tytso@....edu>
To: Xiaoguang Wang <xiaoguang.wang@...ux.alibaba.com>
CC: <linux-ext4@...r.kernel.org>, <jack@...e.cz>
Subject: Re: [PATCH v2] jbd2: fix deadlock while checkpoint thread waits
commit thread to finish
On Sun, Nov 25, 2018 at 04:36:06PM +0800, Xiaoguang Wang wrote:
> This issue was found when I tried to put checkpoint work in a separate thread,
> the deadlock below happened:
> Thread1 | Thread2
> __jbd2_log_wait_for_space |
> jbd2_log_do_checkpoint (hold j_checkpoint_mutex)|
> if (jh->b_transaction != NULL) |
> ... |
> jbd2_log_start_commit(journal, tid); |jbd2_update_log_tail
> | will lock j_checkpoint_mutex,
> | but will be blocked here.
> |
> jbd2_log_wait_commit(journal, tid); |
> wait_event(journal->j_wait_done_commit, |
> !tid_gt(tid, journal->j_commit_sequence)); |
> ... |wake_up(j_wait_done_commit)
> } |
>
> then deadlock occurs, Thread1 will never be waken up.
>
> To fix this issue, drop j_checkpoint_mutex in jbd2_log_do_checkpoint()
> when we are going to wait for transaction commit.
>
> Reviewed-by: Jan Kara <jack@...e.cz>
> Signed-off-by: Xiaoguang Wang <xiaoguang.wang@...ux.alibaba.com>
Thanks, applied.
- Ted
Powered by blists - more mailing lists