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 7EB26C43334 for ; Tue, 7 Jun 2022 07:35:24 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id AB8786B0072; Tue, 7 Jun 2022 03:35:23 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id A41AD6B0073; Tue, 7 Jun 2022 03:35:23 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 8E25B6B0074; Tue, 7 Jun 2022 03:35:23 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 78EEC6B0072 for ; Tue, 7 Jun 2022 03:35:23 -0400 (EDT) Received: from smtpin14.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 49AB320916 for ; Tue, 7 Jun 2022 07:35:23 +0000 (UTC) X-FDA: 79550629326.14.3C6C6F4 Received: from p3plwbeout14-05.prod.phx3.secureserver.net (p3plsmtp14-05-2.prod.phx3.secureserver.net [173.201.192.190]) by imf18.hostedemail.com (Postfix) with ESMTP id E2B9B1C0015 for ; Tue, 7 Jun 2022 07:34:59 +0000 (UTC) Received: from mailex.mailcore.me ([94.136.40.145]) by :WBEOUT: with ESMTP id yTkDnD2ybIZ2cyTkEnF7Hg; Tue, 07 Jun 2022 00:35:18 -0700 X-CMAE-Analysis: v=2.4 cv=RuUAkAqK c=1 sm=1 tr=0 ts=629effb6 a=7e6w4QD8YWtpVJ/7+iiidw==:117 a=84ok6UeoqCVsigPHarzEiQ==:17 a=ggZhUymU-5wA:10 a=IkcTkHD0fZMA:10 a=JPEYwPQDsx4A:10 a=JfrnYn6hAAAA:8 a=cm27Pg_UAAAA:8 a=FXvPX3liAAAA:8 a=t7CeM3EgAAAA:8 a=VwQbUJbxAAAA:8 a=gozxAr8Rxt5D4kyEU7QA:9 a=QEXdDO2ut3YA:10 a=1CNFftbPRP8L7MoqJWF3:22 a=xmb-EsYY8bH0VWELuYED:22 a=UObqyxdv-6Yh2QiB9mM_:22 a=FdTzh2GWekK77mhwV6Dw:22 a=AjGcO6oz07-iQ99wixmX:22 X-SECURESERVER-ACCT: phillip@squashfs.org.uk X-SID: yTkDnD2ybIZ2c Received: from 82-69-79-175.dsl.in-addr.zen.co.uk ([82.69.79.175] helo=[192.168.178.33]) by smtp01.mailcore.me with esmtpa (Exim 4.94.2) (envelope-from ) id 1nyTk9-0003Xi-M1; Tue, 07 Jun 2022 08:35:17 +0100 Message-ID: <31ed17e7-29d1-55e8-cb09-a750ab80da15@squashfs.org.uk> Date: Tue, 7 Jun 2022 08:35:10 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Thunderbird/91.9.1 Subject: Re: [PATCH v4 3/3] squashfs: implement readahead To: Marek Szyprowski , Hsin-Yi Wang , Matthew Wilcox , Xiongwei Song Cc: Zheng Liang , Zhang Yi , Hou Tao , Miao Xie , Andrew Morton , "linux-mm @ kvack . org" , "squashfs-devel @ lists . sourceforge . net" , linux-kernel@vger.kernel.org References: <20220601103922.1338320-1-hsinyi@chromium.org> <20220601103922.1338320-4-hsinyi@chromium.org> From: Phillip Lougher In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Mailcore-Auth: 439999529 X-Mailcore-Domain: 1394945 X-123-reg-Authenticated: phillip@squashfs.org.uk X-Originating-IP: 82.69.79.175 X-CMAE-Envelope: MS4xfMY7fxtW8NH/IShtJqm0L/RVrphk1xTsiiQ7JP2+XOwz//3KksRmIFwlGP0FklLpK4sDzL3651uzVoFFXI3Sl7ZnUywvs4QKfRdGAMx2zQmDxJ7y/jNg TJ62GIOq93k+52ORDxcDyJ0muwXoe+A01zt2pmiGWy3JViUVC4JtFRIQy5CG+fErcypR4xQUZxbSSnpYpHVhn+9tYg8UGDgJroE= X-Stat-Signature: nfwhcqpiij7hynjo1snnf4x5pak3yhzx X-Rspam-User: Authentication-Results: imf18.hostedemail.com; dkim=none; spf=none (imf18.hostedemail.com: domain of phillip@squashfs.org.uk has no SPF policy when checking 173.201.192.190) smtp.mailfrom=phillip@squashfs.org.uk; dmarc=none X-Rspamd-Server: rspam12 X-Rspamd-Queue-Id: E2B9B1C0015 X-HE-Tag: 1654587299-278254 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: On 03/06/2022 13:54, Marek Szyprowski wrote: > Hi, > > On 01.06.2022 12:39, Hsin-Yi Wang wrote: >> Implement readahead callback for squashfs. It will read datablocks >> which cover pages in readahead request. For a few cases it will >> not mark page as uptodate, including: >> - file end is 0. >> - zero filled blocks. >> - current batch of pages isn't in the same datablock or not enough in a >> datablock. >> - decompressor error. >> Otherwise pages will be marked as uptodate. The unhandled pages will be >> updated by readpage later. >> >> Suggested-by: Matthew Wilcox >> Signed-off-by: Hsin-Yi Wang >> Reported-by: Matthew Wilcox >> Reported-by: Phillip Lougher >> Reported-by: Xiongwei Song >> --- > > This patch landed recently in linux-next as commit 95f7a26191de > ("squashfs: implement readahead"). I've noticed that it causes serious > issues on my test systems (various ARM 32bit and 64bit based boards). > The easiest way to observe is udev timeout 'waiting for /dev to be fully > populated' and prolonged booting time. I'm using squashfs for deploying > kernel modules via initrd. Reverting aeefca9dfae7 & 95f7a26191deon on > top of the next-20220603 fixes the issue. > > Let me know how I can help debugging this issue. There is no hurry > though, because the next week I will be on holidays. Hi Marek, Can you supply an example Squashfs filesystem and script that reproduces the slow-down? Failing that, can you supply a copy of your initrd/root-filesystem that can be run under emulation to reproduce the issue? (I don't have any modern ARM embedded systems). Again failing that, are you happy to test some debug code? Thanks Phillip (Squashfs maintainer and author). > >> v3->v4: Fix a few variable type and their locations. >> v3: https://lore.kernel.org/lkml/20220523065909.883444-4-hsinyi@chromium.org/ >> v2: https://lore.kernel.org/lkml/20220517082650.2005840-4-hsinyi@chromium.org/ >> v1: https://lore.kernel.org/lkml/20220516105100.1412740-3-hsinyi@chromium.org/ >> --- >> fs/squashfs/file.c | 97 +++++++++++++++++++++++++++++++++++++++++++++- >> 1 file changed, 96 insertions(+), 1 deletion(-) >> >> diff --git a/fs/squashfs/file.c b/fs/squashfs/file.c >> index a8e495d8eb86..df7ad4b3e99c 100644 >> --- a/fs/squashfs/file.c >> +++ b/fs/squashfs/file.c >> @@ -39,6 +39,7 @@ >> #include "squashfs_fs_sb.h" >> #include "squashfs_fs_i.h" >> #include "squashfs.h" >> +#include "page_actor.h" >> >> /* >> * Locate cache slot in range [offset, index] for specified inode. If >> @@ -495,7 +496,101 @@ static int squashfs_read_folio(struct file *file, struct folio *folio) >> return 0; >> } >> >> +static void squashfs_readahead(struct readahead_control *ractl) >> +{ >> + struct inode *inode = ractl->mapping->host; >> + struct squashfs_sb_info *msblk = inode->i_sb->s_fs_info; >> + size_t mask = (1UL << msblk->block_log) - 1; >> + unsigned short shift = msblk->block_log - PAGE_SHIFT; >> + loff_t start = readahead_pos(ractl) &~ mask; >> + size_t len = readahead_length(ractl) + readahead_pos(ractl) - start; >> + struct squashfs_page_actor *actor; >> + unsigned int nr_pages = 0; >> + struct page **pages; >> + int i, file_end = i_size_read(inode) >> msblk->block_log; >> + unsigned int max_pages = 1UL << shift; >> + >> + readahead_expand(ractl, start, (len | mask) + 1); >> + >> + if (file_end == 0) >> + return; >> + >> + pages = kmalloc_array(max_pages, sizeof(void *), GFP_KERNEL); >> + if (!pages) >> + return; >> + >> + actor = squashfs_page_actor_init_special(pages, max_pages, 0); >> + if (!actor) >> + goto out; >> + >> + for (;;) { >> + pgoff_t index; >> + int res, bsize; >> + u64 block = 0; >> + unsigned int expected; >> + >> + nr_pages = __readahead_batch(ractl, pages, max_pages); >> + if (!nr_pages) >> + break; >> + >> + if (readahead_pos(ractl) >= i_size_read(inode) || >> + nr_pages < max_pages) >> + goto skip_pages; >> + >> + index = pages[0]->index >> shift; >> + if ((pages[nr_pages - 1]->index >> shift) != index) >> + goto skip_pages; >> + >> + expected = index == file_end ? >> + (i_size_read(inode) & (msblk->block_size - 1)) : >> + msblk->block_size; >> + >> + bsize = read_blocklist(inode, index, &block); >> + if (bsize == 0) >> + goto skip_pages; >> + >> + res = squashfs_read_data(inode->i_sb, block, bsize, NULL, >> + actor); >> + >> + if (res == expected) { >> + int bytes; >> + >> + /* Last page may have trailing bytes not filled */ >> + bytes = res % PAGE_SIZE; >> + if (bytes) { >> + void *pageaddr; >> + >> + pageaddr = kmap_atomic(pages[nr_pages - 1]); >> + memset(pageaddr + bytes, 0, PAGE_SIZE - bytes); >> + kunmap_atomic(pageaddr); >> + } >> + >> + for (i = 0; i < nr_pages; i++) >> + SetPageUptodate(pages[i]); >> + } >> + >> + for (i = 0; i < nr_pages; i++) { >> + unlock_page(pages[i]); >> + put_page(pages[i]); >> + } >> + } >> + >> + kfree(actor); >> + kfree(pages); >> + return; >> + >> +skip_pages: >> + for (i = 0; i < nr_pages; i++) { >> + unlock_page(pages[i]); >> + put_page(pages[i]); >> + } >> + >> + kfree(actor); >> +out: >> + kfree(pages); >> +} >> >> const struct address_space_operations squashfs_aops = { >> - .read_folio = squashfs_read_folio >> + .read_folio = squashfs_read_folio, >> + .readahead = squashfs_readahead >> }; > > Best regards