From patchwork Wed Mar 27 15:57:46 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kemeng Shi X-Patchwork-Id: 13605691 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 22C73C47DD9 for ; Wed, 27 Mar 2024 07:01:56 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 84DBB6B0099; Wed, 27 Mar 2024 03:01:56 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 7FEAC6B009B; Wed, 27 Mar 2024 03:01:56 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 69F946B009C; Wed, 27 Mar 2024 03:01:56 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 5C0BF6B0099 for ; Wed, 27 Mar 2024 03:01:56 -0400 (EDT) Received: from smtpin30.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 2D2071A0283 for ; Wed, 27 Mar 2024 07:01:56 +0000 (UTC) X-FDA: 81941924232.30.8C86DDE Received: from dggsgout11.his.huawei.com (unknown [45.249.212.51]) by imf16.hostedemail.com (Postfix) with ESMTP id 34C32180010 for ; Wed, 27 Mar 2024 07:01:51 +0000 (UTC) Authentication-Results: imf16.hostedemail.com; dkim=none; spf=pass (imf16.hostedemail.com: domain of shikemeng@huaweicloud.com designates 45.249.212.51 as permitted sender) smtp.mailfrom=shikemeng@huaweicloud.com; dmarc=none ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1711522914; a=rsa-sha256; cv=none; b=bTzgnetI7wS65pIv8pEVY3a1rZZ7gOjSs5BhJs8F5B7mzQdkOaa7zeaKfO9QagT4tQPwHD roLFcuZq08tv16+3EDxIrLu+S00EiBWRzeVd6U4I4FE8+ZQZSfhLEHSjhwV+ouI3zEJX38 fZEXEdD5mIDVHAvM5JIVfRP5hYbOLiM= ARC-Authentication-Results: i=1; imf16.hostedemail.com; dkim=none; spf=pass (imf16.hostedemail.com: domain of shikemeng@huaweicloud.com designates 45.249.212.51 as permitted sender) smtp.mailfrom=shikemeng@huaweicloud.com; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1711522914; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=kgnsA5kjzN7C1eNrwFYC8nv1yP1t4hfIAysfW+ul6ho=; b=C4eR3YkETARAega1Ph6KeobZ4qgO3FH/sVPDfydHy+g5BzKDZCsSnTIDg6/pDmCPmspOcs Af3hQj/Z1u1dTHYUQutRHUEKOHsLP4aDVHbirODWNDDJrKxNwJesHk/zxNCyh3vUmUlRiu Q/kUfaRzd92h6CvJXeBvho8EEOpZkUw= Received: from mail.maildlp.com (unknown [172.19.93.142]) by dggsgout11.his.huawei.com (SkyGuard) with ESMTP id 4V4Hdv2Q9Xz4f3n61 for ; Wed, 27 Mar 2024 15:01:39 +0800 (CST) Received: from mail02.huawei.com (unknown [10.116.40.75]) by mail.maildlp.com (Postfix) with ESMTP id 75EE21A016E for ; Wed, 27 Mar 2024 15:01:47 +0800 (CST) Received: from huaweicloud.com (unknown [10.175.101.6]) by APP2 (Coremail) with SMTP id Syh0CgAnSQxYxANmi6+LIQ--.50310S3; Wed, 27 Mar 2024 15:01:47 +0800 (CST) From: Kemeng Shi To: akpm@linux-foundation.org, willy@infradead.org, jack@suse.cz, bfoster@redhat.com, tj@kernel.org Cc: dsterba@suse.com, mjguzik@gmail.com, dhowells@redhat.com, linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-fsdevel@vger.kernel.org Subject: [PATCH v2 1/6] writeback: protect race between bdi release and bdi_debug_stats_show Date: Wed, 27 Mar 2024 23:57:46 +0800 Message-Id: <20240327155751.3536-2-shikemeng@huaweicloud.com> X-Mailer: git-send-email 2.30.0 In-Reply-To: <20240327155751.3536-1-shikemeng@huaweicloud.com> References: <20240327155751.3536-1-shikemeng@huaweicloud.com> MIME-Version: 1.0 X-CM-TRANSID: Syh0CgAnSQxYxANmi6+LIQ--.50310S3 X-Coremail-Antispam: 1UD129KBjvJXoW7uFyxtw4DKF4UJry7XFyDtrb_yoW8uFy5pa 1Ykas8Gr48X347Wr13ZFWDurZaq3ySqwnrWF97uws3Cr1kA34akFyxCFyjyr1rArZ5C34Y qan0qrWUCrWUAaUanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUPab4IE77IF4wAFF20E14v26ryj6rWUM7CY07I20VC2zVCF04k2 6cxKx2IYs7xG6rWj6s0DM7CIcVAFz4kK6r1j6r18M280x2IEY4vEnII2IxkI6r1a6r45M2 8IrcIa0xkI8VA2jI8067AKxVWUGwA2048vs2IY020Ec7CjxVAFwI0_Gr0_Xr1l8cAvFVAK 0II2c7xJM28CjxkF64kEwVA0rcxSw2x7M28EF7xvwVC0I7IYx2IY67AKxVW7JVWDJwA2z4 x0Y4vE2Ix0cI8IcVCY1x0267AKxVW8Jr0_Cr1UM28EF7xvwVC2z280aVAFwI0_GcCE3s1l 84ACjcxK6I8E87Iv6xkF7I0E14v26rxl6s0DM2AIxVAIcxkEcVAq07x20xvEncxIr21l5I 8CrVACY4xI64kE6c02F40Ex7xfMcIj6xIIjxv20xvE14v26r1j6r18McIj6I8E87Iv67AK xVWUJVW8JwAm72CE4IkC6x0Yz7v_Jr0_Gr1lF7xvr2IYc2Ij64vIr41lFIxGxcIEc7CjxV A2Y2ka0xkIwI1l42xK82IYc2Ij64vIr41l4I8I3I0E4IkC6x0Yz7v_Jr0_Gr1lx2IqxVAq x4xG67AKxVWUJVWUGwC20s026x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY17CE14v26r1q6r 43MIIYrxkI7VAKI48JMIIF0xvE2Ix0cI8IcVAFwI0_Jr0_JF4lIxAIcVC0I7IYx2IY6xkF 7I0E14v26r4j6F4UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv67AKxV WUJVW8JwCI42IY6I8E87Iv6xkF7I0E14v26r4j6r4UJbIYCTnIWIevJa73UjIFyTuYvjxU 3Xo2DUUUU X-CM-SenderInfo: 5vklyvpphqwq5kxd4v5lfo033gof0z/ X-Rspam-User: X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: 34C32180010 X-Stat-Signature: k6xgtcerat3tbdco3bcg45h8nneiha4x X-HE-Tag: 1711522911-156163 X-HE-Meta: U2FsdGVkX1+OnW9iY39e7y5wsMwbemKJ4ISOiK4UIExrglChx+Ozv1uIghNQAofXFgFGQJ26SNn28R54n006GY/fHHP0WS0n6lJx89u0sTFiiNT/ypSwdHaznGNFxjWNYXOFfnHro6dnVkdKrVcgHO1mHB6TA/SSRn4KSlgELRj+u0O+GTIh0RyQRJYkTlRNTZf27tLLcUe/uWmJoqfb7BQebNmbI9KCPGe0sYrsUuEBr2plGTQ7JNC8yGfKReJ4DUNQrFyeqvBjWfFl1U+OnDdb2QjFl7hL8abbYZmVe6DN74mWHsYkMbhkouTlPE34+BYGr7cuoHs9SQeq8apEbRN3SfvAI+41LVZWkTPtEnl5rD2iUzTEw/53k8dLwUS8WQ7z6jJgHqdzVOqzt6FUEBXX958XY+A0QJztzGh9ibUapTru7XZKId05sHDhFlOQDSPaqbL0LIAHJ2nC0YPWtDOQ8bcx0DARhfITElWN6p1HpzLQsOTc7dkI/h0hy1l10OCL/ECv+Wh15621H5vo0Wos5KwVzsY6K0fMdestrnlgd8j+0ZkWa/zec1tMrhcYKjYuX30Xj7CvY6snZJouNcc3ET2AUfKBhXRoS6wLboj+arUP+lU+IAY0zmT+7DfkvDAtdIBBn1nDLsJE8BOeRQ6W9U7mqFK/jViwQlLrTcuckpcA/17Nmm5MU5Ar22SlGeGt+PYOyvB8J2kA01eYEXhF2k0jumg29C6yiCAB9tlAm1v8caQ1ap9F3eoAUqi8wrzNRTYAHOO0Lev/uuaTph7iWz2/xWMe/X6Bo6DAbEOl3/dcrvT9MYNO4XtC2n6S/t0Mjexz5R8beyvIr6x1ROoCtF/u9G6LHjl1pam+G8fjBlry+ftsjE6/hoqU8rktyglxjJFpLbVKZxc5WUCeq/26awwnKN78qiLej2wZ3KrFmt38qQrv+8Lv48Orj2+IWkjRb/TdEihW+3IGYtt /20kxdwC UZRJzutB4sVsZ84Y= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: There is a race between bdi release and bdi_debug_stats_show: /* get debug info */ /* bdi release */ bdi_debug_stats_show bdi = m->private; wb = &bdi->wb; bdi_unregister bdi_put release_bdi kfree(bdi) /* use after free */ spin_lock(&wb->list_lock); Search bdi on bdi_list under rcu lock in bdi_debug_stats_show to ensure the bdi is not freed to fix the issue. Signed-off-by: Kemeng Shi --- mm/backing-dev.c | 33 +++++++++++++++++++++++++++++++-- 1 file changed, 31 insertions(+), 2 deletions(-) diff --git a/mm/backing-dev.c b/mm/backing-dev.c index 5f2be8c8df11..70f02959f3bd 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -46,16 +46,44 @@ static void bdi_debug_init(void) bdi_debug_root = debugfs_create_dir("bdi", NULL); } -static int bdi_debug_stats_show(struct seq_file *m, void *v) +static struct backing_dev_info *lookup_bdi(struct seq_file *m) { + const struct file *file = m->file; struct backing_dev_info *bdi = m->private; - struct bdi_writeback *wb = &bdi->wb; + struct backing_dev_info *exist; + + list_for_each_entry_rcu(exist, &bdi_list, bdi_list) { + if (exist != bdi) + continue; + + if (exist->debug_dir == file->f_path.dentry->d_parent) + return bdi; + else + return NULL; + } + + return NULL; +} + + +static int bdi_debug_stats_show(struct seq_file *m, void *v) +{ + struct backing_dev_info *bdi; + struct bdi_writeback *wb; unsigned long background_thresh; unsigned long dirty_thresh; unsigned long wb_thresh; unsigned long nr_dirty, nr_io, nr_more_io, nr_dirty_time; struct inode *inode; + rcu_read_lock(); + bdi = lookup_bdi(m); + if (!bdi) { + rcu_read_unlock(); + return -EEXIST; + } + + wb = &bdi->wb; nr_dirty = nr_io = nr_more_io = nr_dirty_time = 0; spin_lock(&wb->list_lock); list_for_each_entry(inode, &wb->b_dirty, i_io_list) @@ -101,6 +129,7 @@ static int bdi_debug_stats_show(struct seq_file *m, void *v) nr_dirty_time, !list_empty(&bdi->bdi_list), bdi->wb.state); + rcu_read_unlock(); return 0; } DEFINE_SHOW_ATTRIBUTE(bdi_debug_stats);