Received: by 2002:a5d:9c59:0:0:0:0:0 with SMTP id 25csp1391690iof; Tue, 7 Jun 2022 04:52:36 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy4qCD72L3zm/f0KFNS1yDh0LEugOWHATlo/2ijGMQepq378nsZk8EKngp37IZcWW6nmi7f X-Received: by 2002:a62:c146:0:b0:51b:8c73:acad with SMTP id i67-20020a62c146000000b0051b8c73acadmr29526558pfg.22.1654602756246; Tue, 07 Jun 2022 04:52:36 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1654602756; cv=none; d=google.com; s=arc-20160816; b=S4x1psBHZkdnLdlHkQvS5YvCsOv4UVBaNsIG76Nigi7dFAQXLbireayo0nv2sjn5e4 gb7/Ay6QuzIfJQRoumkVmj5IEk17enksr4J0IC/EJPleHtHnzCwV1mkHxJ0OCMQXQKk2 rsPlEMC5+d16lMJiETjs3VAUf5FZ6exVEe8UJSJAIDRM3VNW17OezO/xuLR72MWNJzWQ kI0PauDXyi+xSdn9R1g+WCKyPm1BuH5XbBoVHjEorZoht1Zf6buczZ54Ap+atoWo8fLa ooTg4O5mv+LQA1v0pOdzfzRwxq3nqYpqdt2kBuzcaDciJJ2Cd323e4rkKKBiGsakW3Qb AAog== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from :references:cc:to:subject:user-agent:mime-version:date:message-id; bh=+EpJ1cuXwSgfY6bF7Ue5Tg+LzJmH6eq+rWiFl4U4rt0=; b=jDBK2NWDPOUX/+Z2Q6GcCgBRz7B5/M4BoLWtkWhr1ifszg83r6ui7XjnlFt+fHIWBg GcNOE9PsHNkaklmFtMbG8ak0jSjlkvDwGVn3fKnns8SJA3iO9RrTs9pxhKcw3My/tmcg EyFZNTDmNztnUmrwawArxVpkmq1Rkql98mP4DlJHEW+Y9TXhCL0231cLKkPp1wDrxc0+ eIe1eHAAnHYYJ4NCY7OVGO3CdZziiEv8JWL4acU9zD1w7cUhP0Y2Uh8HOrWZw1iFvooe hGDPXaACRxZI78UeY6l1oG46Ltzg0TaKcJjFbPRWNu9/qfOGchMCUkIOh480nzGbWkud xWCw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id q188-20020a6343c5000000b003fc949fa196si24229905pga.866.2022.06.07.04.52.23; Tue, 07 Jun 2022 04:52:36 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231704AbiFGHfY (ORCPT + 99 others); Tue, 7 Jun 2022 03:35:24 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43668 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230134AbiFGHfW (ORCPT ); Tue, 7 Jun 2022 03:35:22 -0400 Received: from p3plwbeout15-03.prod.phx3.secureserver.net (p3plsmtp15-03-2.prod.phx3.secureserver.net [173.201.193.38]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3253160BBB for ; Tue, 7 Jun 2022 00:35:18 -0700 (PDT) Received: from mailex.mailcore.me ([94.136.40.145]) by :WBEOUT: with ESMTP id yTkDnHTqFg7ZlyTkEnGQxR; Tue, 07 Jun 2022 00:35:18 -0700 X-CMAE-Analysis: v=2.4 cv=a//1SWeF 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: yTkDnHTqFg7Zl 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: MS4xfGwJrZcAmJiVw4SQzSorIGvTYoP8Ng9Fc8C1qZ2c8WCA3wTTufIq7AJ/RgsZsYtTkp1IQcjWai8uLQ6QN2hl8W9A0G6fVGElhMR9biqCLE7RpiyW8O2/ 9usqtE3vi7Wkae2oI213/1X6Hw1phrrvXXbGPACw54Yp+gBZBOaAyRXpfcEEHr2FhLmN0VKqY3sAz5U4fpiatTZKV2+uQZe4vlo= X-Spam-Status: No, score=-4.8 required=5.0 tests=BAYES_00,NICE_REPLY_A, RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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