From mboxrd@z Thu Jan 1 00:00:00 1970 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 3E865D735F3 for ; Sat, 30 Nov 2024 07:02:37 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 8BA1C6B0082; Sat, 30 Nov 2024 02:02:36 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 86A1A6B0085; Sat, 30 Nov 2024 02:02:36 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 731F56B0088; Sat, 30 Nov 2024 02:02:36 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 520EF6B0082 for ; Sat, 30 Nov 2024 02:02:36 -0500 (EST) Received: from smtpin23.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 758531A168A for ; Sat, 30 Nov 2024 07:02:35 +0000 (UTC) X-FDA: 82841867976.23.86CE62E Received: from smtpbgau1.qq.com (smtpbgau1.qq.com [54.206.16.166]) by imf26.hostedemail.com (Postfix) with ESMTP id 6DBEC140009 for ; Sat, 30 Nov 2024 07:02:22 +0000 (UTC) Authentication-Results: imf26.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf26.hostedemail.com: domain of kaixa@kiloview.com designates 54.206.16.166 as permitted sender) smtp.mailfrom=kaixa@kiloview.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1732950141; h=from:from:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=en0J4RNsE/raRlGFnU5Gn0tfkpcsONZd6kQMZuvV7CA=; b=nC9Hd25sOlnWmaLbEJ8UyXjnS77wGy1t1FqORWfT84aYiQC0a4dzERVGkwWDYWYHoByupi 8OfU2NeLCOOKC8vhPfq4ORV0NLqf+yonUsDHPxqoXkZSTtOP5jBWpa/km86O7Bm+7aGfkX QGKqUN3li75U5E4XbsgsySU7wVragt0= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1732950141; a=rsa-sha256; cv=none; b=Pt/C41dxXQLWCY4Y5+wwetO5bHrcNuvVZ87l+/7sUTOMRisnxFq6fTW951mvRxstchZM4H J5Z5H06pPWYq+aCHSeOh8iT75GHceHCp2a705EbHzALBiSa3qhS2mQO5VMuuOaj0o/ckuZ WGIdMWyOVp52vjhlCQLZlJW4BK5/u+0= ARC-Authentication-Results: i=1; imf26.hostedemail.com; dkim=none; dmarc=none; spf=pass (imf26.hostedemail.com: domain of kaixa@kiloview.com designates 54.206.16.166 as permitted sender) smtp.mailfrom=kaixa@kiloview.com X-QQ-mid: bizesmtpsz9t1732950142tnpjxr2 X-QQ-Originating-IP: 0g6bZfZ0ltr5uNCgu700GvvUu30xhMU5fM0jgkGFeyE= Received: from [IPv6:::ffff:192.168.40.115] ( [113.240.218.150]) by bizesmtp.qq.com (ESMTP) with id ; Sat, 30 Nov 2024 15:02:21 +0800 (CST) X-QQ-SSF: 0000000000000000000000000000000 X-QQ-GoodBg: 0 X-BIZMAIL-ID: 14619738396533929951 From: Luoxi To: Jerry Subject: Re: [PATCH] Fix issue: Writing a block devices case dead loop. generic_perform_write()-> balance_dirty_pages_ratelimited()-> balance_dirty_pages() At this point, if the block device removed, the process may trapped in a dead loop. and the memory of the bdi device hass also been released. I found this issue through SCSI devices Cc: linux-mm@kvack.org, "linux-kernel@vger.kernel.org" , Jerry Date: Sat, 30 Nov 2024 07:02:20 +0000 Message-Id: In-Reply-To: <20241130063431.79079-1-jerrydeng079@163.com> References: <20241130063431.79079-1-jerrydeng079@163.com> Reply-To: Luoxi User-Agent: eM_Client/10.1.4588.0 MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: quoted-printable X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtpsz:kiloview.com:qybglogicsvrgz:qybglogicsvrgz5a-0 X-QQ-XMAILINFO: ODfrXIp+dl2w0Tx+qK+NAOe8j3Owh+ScZGRJlcaB6u+b/sDg1J9lZ+Kf QEbg6XInsxzt+/mb7EDhlF3Ks76FAJy2rv/+cBDU6OiaoxfU2LV69mu6xhRBzwYI8Zly/sk CKORoKhqtmT1jwfV+4xKyNgdZWpGRm/BHlyaeLhE+XtXbrUI67Qvdcvz/OSl79bcEJUGAhI 2DFLWXlkzYvkVhpEd5Xd2ckbQ5rCEeAFdjscOfavThfhRcdgtL0W32TllYnuCA4gkMp2y6a WrD0tSkkN2q7R8go/Yghk3s1+3qn8lsxO6nXQhjOsKIBEcefg7DX4FsHb+cRyRgGZTChCM2 LgqHSSv/sRoiP937+HdPjWeDmo9phiQPb/jvHrMXpce+MfnUD2y9nWi8eqBt6Obvd4ax+2a ranlf+L/cEeMBNk0j1FVhBwcWQWdEaldTxZ+c4J8IXZdZGb2KwHKFeO72YQU1MsSx0ecrGI x3bghbMTvg78WqI4upqk281fn4+CPNAAde16pehQlWuL1emF/KILedlRLpvmSEmpoKZveNk USxu6IibPr1MO8PmWFJfP2MYsxGBV1iu4alQYoNv82g2CDQjnDQo/npJBzk2GDN4yxpb8FK YEavjZGpo0HIW/bgk3UU5GPka1Gm8lMijAVgDvhZJ/J6vbaMVrD5TxVfm8Cbxm/XgnbD42C jVk2e2ou2kvqhqSurCu98YcWPrr6Jtzdxi7+2upocEf5XAQ48+EWJT0asu05sp1deCTvZSw jQ94qTF74scKMNjcoGUf45+cn+iwtc81xVtPXqO72StN1Zv9gJvDuV+qSLxZv9cydVZZgPA g7+r/WoRS4dsWaae1tU2io2uaGmh+J34ZMp47CFmZg/qq9tAZbnkUPlR9LQq+Rw1Ovlq1ST q6ZkDfIAJn7ipijgFnHfpiW7ZpJdJjDYx2+J/B5zoi1H+kwVDRhBOMxMXQoLLpSWG5w2KRa PC3eF+aXNUxRvzer/BBAJN3T0 X-QQ-XMRINFO: NS+P29fieYNw95Bth2bWPxk= X-QQ-RECHKSPAM: 0 X-Rspamd-Queue-Id: 6DBEC140009 X-Rspam-User: X-Rspamd-Server: rspam07 X-Stat-Signature: yoiowjfraq3btz1jzrj7nw6w7oq6pqoh X-HE-Tag: 1732950142-403945 X-HE-Meta: U2FsdGVkX18uq+onnjtD+V9r0Xiy5Xs+Qep9UObm9LjIFCExofrf3leoL/AKGuIuv4WRCCZmS8GNfAyon8Dm7v+1VQnnXtnuDqb3C7wZhSCOrlFNDfN4+xRZ/tRu9FjaTDzxsrB4LsN6HPNtlYJKWlO+HWyE9p1hp036RTf8kfaA/S9oWD1aNqUcz8Tliwkil1S9dFgDp7784uykIeYQoTwkkKJQ/BoeLOPQKw1aPBJcf3IiCBTfe/ipEmV/dQMpreQdiAvnMRBoUe2Z+mX9OtWPRciZsTRTld5BNQ3wTt8Zw7nLKjnn43QLeFbr3/ffZNTxQXSN+2gFgACOqoeRRW5jPMjEg4qYLn64Yp/v7AIJ0uLE+AxcTkTzBCpVXsiut5x/ugA+4qz3VTjW37XmYCzyiz57+BlYfcDucXafDcihcCMUZ8LOry8giDKjZKNdQQ85OmRh0bP69/mSBeb7dSHNwt6vs/lKFzm7HnKkNi0Sl4MGPj5ntx3aGVLzk+AqKBoNSE7AXmLJyLWep2WblSmQ8I26PFRsRNyS89BITppOyGqiictvS/BJZvUfnjsJafwEERN/xv83C5eMbKr7ka5Wxe2DFHIlEzsapB1MczOMTQPA1kq6sDhUOc/SHjG1aekwCMfJzGXTQfmihLh1pTNgbCtQ7fB3iProoiu5dJlhFFXvpJYQHoIguHIF9ay+i+qsj4WLKABH8/QqgwqgC38kY3xXLmOyJ50WjDtV2XA/CHUimUq0gLgOQKWuUftO1p+YYtQ/Rs6kwVfBm9trSQOLhzODpT1bxiSt+25HNAgQVisOEZYdys7+MWSfiVzhHdcNg0GBK7kTZDBembQYt1Mm8TbNDhlS7n28u+heshJF9zs007ZlPxL01KxYNdBDGM2H1N3f7sYFz9ys/8DJEhlcKj2bSCv0bUjrURxCPMxKy/8aCprTqrWPemJe1NIMjZtlMBfj8sDNB3vC/Ik zfWh2gaO dYNXCgPymvNGKKY/cjmuJKyV2tfh8rdIHcHgLXelUSyHdOG2oh9EjNLld0GzmmLndpPhzTp7mp9vuB66lJvhx7+9bsYn0RIuuAXb1bgqP4s2xa4Z09XUUqGwK60j82vqk1tyXjM+tGtSdBDjnNlmB1EaZWYs4/6GM31VGlzPjirV+bnq0fmgyKhgEBeVl+dL5zi6TtCmbiwzEsCMyeqr1gFDiswGTmXA8lqPdFzbDDsnJyN+9CMuPxT65x6/RpZV2EPanW3jBaECgWw1oZpgO1uESQsbu2oOFPu9BAzkzueuE8KxviZfEgaZD/Pj8munVj1/dV/9g5H9aPr7+Iq8VLWn0FRC6kHEPE7zSIfPLI2tTVi7sC/ZuuTaY0p/rHO/HoIJvo6TGJc6uj6NLBxxG7C1tBgujixIgwNbAB5fRUHzq0EJxoTiMCVW6MiNY1t424hwsQP0jCEkH6mt1HrP+f8KLIvCP+Dzr4N1rC7p22AZaaKZud9jy9hTqtBAz4jLf9SchuDHEYdYQ8ulZ8PbKFJcnroT4OuGcWcCW 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: Hi, Jerry On 2024/11/30 14:34:31 +0800=EF=BC=8C"Jerry" wrote: >Signed-off-by: Jerry >--- > mm/backing-dev.c | 1 + > mm/filemap.c | 6 ++++- > mm/page-writeback.c | 61 +++++++++++++++++++++++++++++++++++++++++---- > 3 files changed, 62 insertions(+), 6 deletions(-) > >diff --git a/mm/backing-dev.c b/mm/backing-dev.c >index dd08ab928..0b86bd980 100755 >--- a/mm/backing-dev.c >+++ b/mm/backing-dev.c >@@ -878,6 +878,7 @@ void bdi_unregister(struct backing_dev_info *bdi) > /* make sure nobody finds us on the bdi_list anymore */ > bdi_remove_from_list(bdi); > wb_shutdown(&bdi->wb); >+ wake_up(&(bdi->wb_waitq)); > cgwb_bdi_unregister(bdi); > > /* >diff --git a/mm/filemap.c b/mm/filemap.c >index 3b0d8c6dd..3282840f0 100755 >--- a/mm/filemap.c >+++ b/mm/filemap.c >@@ -3300,6 +3300,7 @@ ssize_t generic_perform_write(struct file *file, > long status =3D 0; > ssize_t written =3D 0; > unsigned int flags =3D 0; >+ errseq_t err =3D 0; > > do { > struct page *page; >@@ -3368,8 +3369,11 @@ ssize_t generic_perform_write(struct file *file, > } > pos +=3D copied; > written +=3D copied; >- > balance_dirty_pages_ratelimited(mapping); >+ err =3D errseq_check(&mapping->wb_err, 0); >+ if (err) >+ return err; >+ > } while (iov_iter_count(i)); > > return written ? written : status; >diff --git a/mm/page-writeback.c b/mm/page-writeback.c >index b2c916474..e013a6d01 100755 >--- a/mm/page-writeback.c >+++ b/mm/page-writeback.c >@@ -146,6 +146,16 @@ struct dirty_throttle_control { > unsigned long pos_ratio; > }; > >+ >+ >+struct bdi_wq_callback_entry { >+ >+ struct task_struct *tsk; >+ struct wait_queue_entry wq_entry; >+ int bdi_unregister; >+}; >+ >+ > /* > * Length of period for aging writeout fractions of bdis. This is an > * arbitrarily chosen number. The longer the period, the slower fraction= s will >@@ -1567,6 +1577,22 @@ static inline void wb_dirty_limits(struct dirty_thr= ottle_control *dtc) > } > } > >+ >+static int wake_up_bdi_waitq(wait_queue_entry_t *wait, unsigned int mode, >+ int sync, void *key) >+{ >+ >+ struct bdi_wq_callback_entry *bwce =3D >+ container_of(wait, struct bdi_wq_callback_entry, wq_entry); >+ >+ bwce->bdi_unregister =3D 1; >+ if (bwce->tsk) >+ wake_up_process(bwce->tsk); >+ >+ return 0; >+} >+ >+ > /* > * balance_dirty_pages() must be called by processes which are generatin= g dirty > * data. It looks at the number of dirty pages in the machine and will= force >@@ -1574,7 +1600,7 @@ static inline void wb_dirty_limits(struct dirty_thro= ttle_control *dtc) > * If we're over `background_thresh' then the writeback threads are woke= n to > * perform some writeout. > */ >-static void balance_dirty_pages(struct bdi_writeback *wb, >+static int balance_dirty_pages(struct bdi_writeback *wb, > unsigned long pages_dirtied) > { > struct dirty_throttle_control gdtc_stor =3D { GDTC_INIT(wb) }; >@@ -1595,6 +1621,16 @@ static void balance_dirty_pages(struct bdi_writebac= k *wb, > struct backing_dev_info *bdi =3D wb->bdi; > bool strictlimit =3D bdi->capabilities & BDI_CAP_STRICTLIMIT; > unsigned long start_time =3D jiffies; >+ struct bdi_wq_callback_entry bwce =3D {NULL}; >+ int ret =3D 0; >+ >+ >+ if (!test_bit(WB_registered, &wb->state)) >+ return -EIO; >+ >+ init_waitqueue_func_entry(&(bwce.wq_entry), wake_up_bdi_waitq); >+ bwce.tsk =3D current; >+ add_wait_queue(&(bdi->wb_waitq), &(bwce.wq_entry)); > > for (;;) { > unsigned long now =3D jiffies; >@@ -1816,6 +1852,12 @@ static void balance_dirty_pages(struct bdi_writebac= k *wb, > wb->dirty_sleep =3D now; > io_schedule_timeout(pause); > >+ /* bid is unregister NULL, all bdi memory is illegal */ >+ if (bwce.bdi_unregister) { >+ ret =3D -EIO; >+ break; >+ } >+ > current->dirty_paused_when =3D now + pause; > current->nr_dirtied =3D 0; > current->nr_dirtied_pause =3D nr_dirtied_pause; >@@ -1843,12 +1885,15 @@ static void balance_dirty_pages(struct bdi_writeba= ck *wb, > if (fatal_signal_pending(current)) > break; > } >+ >+ if (bwce.bdi_unregister =3D=3D 0) >+ remove_wait_queue(&(bdi->wb_waitq), &(bwce.wq_entry)); > > if (!dirty_exceeded && wb->dirty_exceeded) > wb->dirty_exceeded =3D 0; > > if (writeback_in_progress(wb)) >- return; >+ return ret; > > /* > * In laptop mode, we wait until hitting the higher threshold before >@@ -1859,10 +1904,12 @@ static void balance_dirty_pages(struct bdi_writeba= ck *wb, > * background_thresh, to keep the amount of dirty memory low. > */ > if (laptop_mode) >- return; >+ return ret; > > if (nr_reclaimable > gdtc->bg_thresh) > wb_start_background_writeback(wb); >+ >+ return ret; > } > > static DEFINE_PER_CPU(int, bdp_ratelimits); >@@ -1944,8 +1991,12 @@ void balance_dirty_pages_ratelimited(struct address= _space *mapping) > } > preempt_enable(); > >- if (unlikely(current->nr_dirtied >=3D ratelimit)) >- balance_dirty_pages(wb, current->nr_dirtied); >+ if (unlikely(current->nr_dirtied >=3D ratelimit)) { >+ >+ if (balance_dirty_pages(wb, current->nr_dirtied) < 0) >+ errseq_set(&(mapping->wb_err), -EIO); >+ >+ } > > wb_put(wb); > } >-- >2.43.0 > > I think the title may be misplaced and needs to be described in concise=20 sentences. :) For detailed process, please refer to this link:=20 https://docs.kernel.org/process/submitting-patches.html Regards, Luoxi