Received: by 2002:a25:1506:0:0:0:0:0 with SMTP id 6csp4329685ybv; Tue, 25 Feb 2020 17:58:29 -0800 (PST) X-Google-Smtp-Source: APXvYqzT4R1i40jw01ZIGN2SqX0u8mtbO0Z1R0q7qs4OLHHVXRgRtKArck1iq3w99LwNFwlljqaZ X-Received: by 2002:a9d:7c81:: with SMTP id q1mr1147536otn.112.1582682309426; Tue, 25 Feb 2020 17:58:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1582682309; cv=none; d=google.com; s=arc-20160816; b=QOHo2KdmZuQwJI54iGoUUZM089DHozZfJD8PtFoTXHd+dE1dg9tHE8zNTNqYr9EkKO li2+iP1H21nhQ5s5zCDaPT3wzEFSJj9CR5bxeOYaJ5s26X4tafa4P+asLdR6sO5bmicv cjiz2xZP+nuw415/AIJpZgDG68paFC7vKojhgqpi/Mtad6bCtOoZ5tNN5GojMH4FnSUf 3b3fIa+iODdLdSJgpBulNvpmOIp/nAzLgTiGLFsZIG/RqXoHYVTzTi/GSPkBYpRD+o+M 4DKnGtzFwujtKPYoq3OsHSNZJH+MK4mU2l59bBRCevAz9j/0CudaD+7uklUlBOFl3ztb 29UQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:to:subject; bh=0xmBOg++px664iIfnQK6POS6e1O3/DdDG+3gRlyuTP4=; b=NO0s2GpmnG+IQ8u+XSZcbKUw2xLbKFdSvYH6QvlnPzPmEY3osmuCVpYHVVYcgx8auq oMHiBln+G4BO3NxAXMSXAf+rKdyc0gZUssaQoZ1skJPxfgKVorx5h+IL04zu/RzoyT9U Vsr8hQOgoO41yHtOTwJIq+ROe6uGkWTDznzCHCkKFNhNri6MrXiZKdVRBqAxumySmPlx kODYdONwkFrzJDzz0C2KjkZpq84dYK7vRyijcPOBs9Xyxs2/LIXkj/wniR927B59z7mr hzrz6GxojyYkFdhNBwEQiHTIzFv+8mO8MHRwDY1HiY/U0HM4lIKTrzz5gpENnBq2xc2P Nj7A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id w12si399622otk.77.2020.02.25.17.58.16; Tue, 25 Feb 2020 17:58:29 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729501AbgBZB6I (ORCPT + 99 others); Tue, 25 Feb 2020 20:58:08 -0500 Received: from szxga06-in.huawei.com ([45.249.212.32]:46292 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727809AbgBZB6H (ORCPT ); Tue, 25 Feb 2020 20:58:07 -0500 Received: from DGGEMS401-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id 677A1B8C5026B24D04EA; Wed, 26 Feb 2020 09:58:05 +0800 (CST) Received: from [10.134.22.195] (10.134.22.195) by smtp.huawei.com (10.3.19.201) with Microsoft SMTP Server (TLS) id 14.3.439.0; Wed, 26 Feb 2020 09:58:04 +0800 Subject: Re: [f2fs-dev] Writes stoped working on f2fs after the compression support was added To: =?UTF-8?Q?Ond=c5=99ej_Jirman?= , Jaegeuk Kim , , References: <20191209222345.1078-1-jaegeuk@kernel.org> <20200222044617.pfrhnz2iavkrtdn6@core.my.home> <20200222181721.tzrrohep5l3yklpf@core.my.home> <20200224135837.k54ke4ppca26ibec@core.my.home> <20200224140349.74yagjdwewmclx4v@core.my.home> <20200224143149.au6hvmmfw4ajsq2g@core.my.home> <39712bf4-210b-d7b6-cbb1-eb57585d991a@huawei.com> <20200225120814.gjm4dby24cs22lux@core.my.home> <20200225122706.d6pngz62iwyowhym@core.my.home> From: Chao Yu Message-ID: <72d28eba-53b9-b6f4-01a5-45b2352f4285@huawei.com> Date: Wed, 26 Feb 2020 09:58:03 +0800 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: <20200225122706.d6pngz62iwyowhym@core.my.home> Content-Type: text/plain; charset="utf-8" Content-Language: en-US Content-Transfer-Encoding: 8bit X-Originating-IP: [10.134.22.195] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2020/2/25 20:27, Ondřej Jirman wrote: > On Tue, Feb 25, 2020 at 01:08:14PM +0100, megi xff wrote: >> Hello, >> >> On Tue, Feb 25, 2020 at 07:24:12PM +0800, Chao Yu wrote: >>> On 2020/2/24 22:31, Ondřej Jirman wrote: >>>>> Just by a looks of it: >>>>> >>>>> root@tbs2[/proc/sys/kernel] # dmesg | grep up_write | wc -l >>>>> 324 >>>>> root@tbs2[/proc/sys/kernel] # dmesg | grep down_write | wc -l >>>>> 347 >>>>> >>>>> there seems to be a mismatch of lock/unlock counts. >>>> >>>> Sorry, a wrong grep expression. >>>> >>>> root@tbs2[~] # dmesg | grep inode_down_write | wc -l >>>> 357 >>>> root@tbs2[~] # dmesg | grep inode_up_write | wc -l >>>> 357 >>>> root@tbs2[~] # dmesg | grep inode_up_read | wc -l >>>> 16 >>>> root@tbs2[~] # dmesg | grep inode_down_read | wc -l >>>> 16 >>> >>> I don't know why we have consistent down/up pair, but through disassembled >>> code, I doubt it's the f2fs_inode->i_sem. >> >> Because we were counting attempts, and not a successful lock. ;) [ 214.508943] inode_down_write from f2fs_write_cache_pages+0x2b4/0x7c4 [ 306.213325] inode_down_write from f2fs_write_cache_pages+0x2b4/0x7c4 Actually, down_write count is 320, up_write count is 319, kworker didn't call up_write at 214.508943. >> >>> c0435d7c: ebf54af8 bl c0188964 >>> c0435d80: e1a00006 mov r0, r6 >>> c0435d84: eb138135 bl c0916260 >>> >>> inode_down_write() >>> >>> c0435d88: e284ce1d add ip, r4, #464 ; 0x1d0 >>> >>> We are stuck here. >>> >>> [ 430.675754] [] (down_write) from [] (f2fs_write_single_data_page+0x600/0x7d8) >>> ^^^^^^^^^ >>> [ 430.675764] [] (f2fs_write_single_data_page) from [] (f2fs_write_cache_pages+0x2b4/0x7c4) >>> >>> >>> c0435d8c: e14b0ad4 ldrd r0, [fp, #-164] ; 0xffffff5c >>> c0435d90: e1cc20d0 ldrd r2, [ip] >>> c0435d94: e1520000 cmp r2, r0 >>> c0435d98: e0d33001 sbcs r3, r3, r1 >>> c0435d9c: b1cc00f0 strdlt r0, [ip] >>> c0435da0: e1a00006 mov r0, r6 >>> c0435da4: ebf52227 bl c017e648 >>> c0435da8: e51b2098 ldr r2, [fp, #-152] ; 0xffffff68 >>> c0435dac: e30c0730 movw r0, #50992 ; 0xc730 >>> c0435db0: e59f11a4 ldr r1, [pc, #420] ; c0435f5c >>> c0435db4: e34c00b6 movt r0, #49334 ; 0xc0b6 >>> c0435db8: ebf54ae9 bl c0188964 >>> >>> inode_up_write() >> >> The patch you sent helped so far. I'll keep the tablet running for a while, >> but so far the issue did not reappear within a few minutes after boot as >> usual. > > So this time it just took several times longer to appear (8-20mins to the hang): > > https://megous.com/dl/tmp/dmesg1 > https://megous.com/dl/tmp/dmesg2 Alright, I still didn't see any possible deadlock in f2fs. Can you try below patch? I'd like to see whether spinlock can cause the same issue. From 3e9e8daf922eaa2c5db195ce278e89e10191c516 Mon Sep 17 00:00:00 2001 From: Chao Yu Date: Wed, 26 Feb 2020 09:53:03 +0800 Subject: [PATCH] fix Signed-off-by: Chao Yu --- fs/f2fs/compress.c | 4 ++-- fs/f2fs/data.c | 4 ++-- fs/f2fs/f2fs.h | 5 +++-- fs/f2fs/file.c | 4 ++-- fs/f2fs/super.c | 1 + 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/fs/f2fs/compress.c b/fs/f2fs/compress.c index b4ff25dc55a9..6de0872ad881 100644 --- a/fs/f2fs/compress.c +++ b/fs/f2fs/compress.c @@ -906,10 +906,10 @@ static int f2fs_write_compressed_pages(struct compress_ctx *cc, f2fs_put_dnode(&dn); f2fs_unlock_op(sbi); - down_write(&fi->i_sem); + spin_lock(&fi->i_size_lock); if (fi->last_disk_size < psize) fi->last_disk_size = psize; - up_write(&fi->i_sem); + spin_unlock(&fi->i_size_lock); f2fs_put_rpages(cc); f2fs_destroy_compress_ctx(cc); diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index cb41260ca941..5c9b072cf0de 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -2651,10 +2651,10 @@ int f2fs_write_single_data_page(struct page *page, int *submitted, if (err) { file_set_keep_isize(inode); } else { - down_write(&F2FS_I(inode)->i_sem); + spin_lock(&F2FS_I(inode)->i_size_lock); if (F2FS_I(inode)->last_disk_size < psize) F2FS_I(inode)->last_disk_size = psize; - up_write(&F2FS_I(inode)->i_sem); + spin_unlock(&F2FS_I(inode)->i_size_lock); } done: diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h index 4a02edc2454b..1a8af2020e72 100644 --- a/fs/f2fs/f2fs.h +++ b/fs/f2fs/f2fs.h @@ -701,6 +701,7 @@ struct f2fs_inode_info { struct task_struct *cp_task; /* separate cp/wb IO stats*/ nid_t i_xattr_nid; /* node id that contains xattrs */ loff_t last_disk_size; /* lastly written file size */ + spinlock_t i_size_lock; /* protect last_disk_size */ #ifdef CONFIG_QUOTA struct dquot *i_dquot[MAXQUOTAS]; @@ -2882,9 +2883,9 @@ static inline bool f2fs_skip_inode_update(struct inode *inode, int dsync) if (!f2fs_is_time_consistent(inode)) return false; - down_read(&F2FS_I(inode)->i_sem); + spin_lock(&F2FS_I(inode)->i_size_lock); ret = F2FS_I(inode)->last_disk_size == i_size_read(inode); - up_read(&F2FS_I(inode)->i_sem); + spin_unlock(&F2FS_I(inode)->i_size_lock); return ret; } diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c index fdb492c2f248..56fe18fbb2ef 100644 --- a/fs/f2fs/file.c +++ b/fs/f2fs/file.c @@ -938,10 +938,10 @@ int f2fs_setattr(struct dentry *dentry, struct iattr *attr) if (err) return err; - down_write(&F2FS_I(inode)->i_sem); + spin_lock(&F2FS_I(inode)->i_size_lock); inode->i_mtime = inode->i_ctime = current_time(inode); F2FS_I(inode)->last_disk_size = i_size_read(inode); - up_write(&F2FS_I(inode)->i_sem); + spin_unlock(&F2FS_I(inode)->i_size_lock); } __setattr_copy(inode, attr); diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 0b16204d3b7d..2d0e5d1269f5 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -957,6 +957,7 @@ static struct inode *f2fs_alloc_inode(struct super_block *sb) /* Initialize f2fs-specific inode info */ atomic_set(&fi->dirty_pages, 0); init_rwsem(&fi->i_sem); + spin_lock_init(&fi->i_size_lock); INIT_LIST_HEAD(&fi->dirty_list); INIT_LIST_HEAD(&fi->gdirty_list); INIT_LIST_HEAD(&fi->inmem_ilist); -- 2.18.0.rc1 > > thank you and regards, > o. > >> thank you and regards, >> o. >> >>> Thanks, >>> >>>> >>>> So it's probably not inode locking. >>>> >>>>> root@tbs2[/proc/sys/kernel] # dmesg | grep down_read | wc -l >>>>> 16 >>>>> root@tbs2[/proc/sys/kernel] # dmesg | grep up_read | wc -l >>>>> 16 >>>>> >>>>> regards, >>>>> o. >>>>> >>>>>> thank you, >>>>>> o. >>>>>> >>>>>>>> Thanks, >>>>>>>> >>>>>>>>> [ 246.758190] r5:eff213b0 r4:da283c60 >>>>>>>>> [ 246.758198] [] (f2fs_write_single_data_page) from [] (f2fs_write_cache_pages+0x2b4/0x7c4) >>>>>>>>> [ 246.758204] r10:da645c28 r9:da283d60 r8:da283c60 r7:0000000f r6:da645d80 r5:00000001 >>>>>>>>> [ 246.758206] r4:eff213b0 >>>>>>>>> [ 246.758214] [] (f2fs_write_cache_pages) from [] (f2fs_write_data_pages+0x344/0x35c) >>>>>>>>> [ 246.758220] r10:00000000 r9:d9ed002c r8:d9ed0000 r7:00000004 r6:da283d60 r5:da283c60 >>>>>>>>> [ 246.758223] r4:da645d80 >>>>>>>>> [ 246.758238] [] (f2fs_write_data_pages) from [] (do_writepages+0x3c/0xd4) >>>>>>>>> [ 246.758244] r10:0000000a r9:c0e03d00 r8:00000c00 r7:c0264ddc r6:da645d80 r5:da283d60 >>>>>>>>> [ 246.758246] r4:da283c60 >>>>>>>>> [ 246.758254] [] (do_writepages) from [] (__writeback_single_inode+0x44/0x454) >>>>>>>>> [ 246.758259] r7:da283d60 r6:da645eac r5:da645d80 r4:da283c60 >>>>>>>>> [ 246.758266] [] (__writeback_single_inode) from [] (writeback_sb_inodes+0x204/0x4b0) >>>>>>>>> [ 246.758272] r10:0000000a r9:c0e03d00 r8:da283cc8 r7:da283c60 r6:da645eac r5:da283d08 >>>>>>>>> [ 246.758274] r4:d9dc9848 >>>>>>>>> [ 246.758281] [] (writeback_sb_inodes) from [] (__writeback_inodes_wb+0x50/0xe4) >>>>>>>>> [ 246.758287] r10:da3797a8 r9:c0e03d00 r8:d9dc985c r7:da645eac r6:00000000 r5:d9dc9848 >>>>>>>>> [ 246.758289] r4:da5a8800 >>>>>>>>> [ 246.758296] [] (__writeback_inodes_wb) from [] (wb_writeback+0x294/0x338) >>>>>>>>> [ 246.758302] r10:fffbf200 r9:da644000 r8:c0e04e64 r7:d9dc9848 r6:d9dc9874 r5:da645eac >>>>>>>>> [ 246.758305] r4:d9dc9848 >>>>>>>>> [ 246.758312] [] (wb_writeback) from [] (wb_workfn+0x35c/0x54c) >>>>>>>>> [ 246.758318] r10:da5f2005 r9:d9dc984c r8:d9dc9948 r7:d9dc9848 r6:00000000 r5:d9dc9954 >>>>>>>>> [ 246.758321] r4:000031e6 >>>>>>>>> [ 246.758334] [] (wb_workfn) from [] (process_one_work+0x214/0x544) >>>>>>>>> [ 246.758340] r10:da5f2005 r9:00000200 r8:00000000 r7:da5f2000 r6:ef044400 r5:da5eb000 >>>>>>>>> [ 246.758343] r4:d9dc9954 >>>>>>>>> [ 246.758350] [] (process_one_work) from [] (worker_thread+0x4c/0x574) >>>>>>>>> [ 246.758357] r10:ef044400 r9:c0e03d00 r8:ef044418 r7:00000088 r6:ef044400 r5:da5eb014 >>>>>>>>> [ 246.758359] r4:da5eb000 >>>>>>>>> [ 246.758368] [] (worker_thread) from [] (kthread+0x144/0x170) >>>>>>>>> [ 246.758374] r10:ec9e5e90 r9:dabf325c r8:da5eb000 r7:da644000 r6:00000000 r5:da5fe000 >>>>>>>>> [ 246.758377] r4:dabf3240 >>>>>>>>> [ 246.758386] [] (kthread) from [] (ret_from_fork+0x14/0x2c) >>>>>>>>> [ 246.758391] Exception stack(0xda645fb0 to 0xda645ff8) >>>>>>>>> [ 246.758397] 5fa0: 00000000 00000000 00000000 00000000 >>>>>>>>> [ 246.758402] 5fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 >>>>>>>>> [ 246.758407] 5fe0: 00000000 00000000 00000000 00000000 00000013 00000000 >>>>>>>>> [ 246.758413] r10:00000000 r9:00000000 r8:00000000 r7:00000000 r6:00000000 r5:c01563b8 >>>>>>>>> [ 246.758416] r4:da5fe000 >>>>>>>>> . >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> _______________________________________________ >>>>>>>> Linux-f2fs-devel mailing list >>>>>>>> Linux-f2fs-devel@lists.sourceforge.net >>>>>>>> https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel >>>>>>>> >>>> . >>>> > . >