From patchwork Fri Mar 7 13:54:05 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthew Wilcox X-Patchwork-Id: 14006517 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 0A2D9C19F32 for ; Fri, 7 Mar 2025 13:54:35 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 738FD6B0092; Fri, 7 Mar 2025 08:54:20 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 3A2206B0096; Fri, 7 Mar 2025 08:54:20 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 0F8936B0098; Fri, 7 Mar 2025 08:54:20 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id AE7336B0092 for ; Fri, 7 Mar 2025 08:54:19 -0500 (EST) Received: from smtpin05.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id AC06380B9D for ; Fri, 7 Mar 2025 13:54:20 +0000 (UTC) X-FDA: 83194899480.05.CB87C69 Received: from casper.infradead.org (casper.infradead.org [90.155.50.34]) by imf01.hostedemail.com (Postfix) with ESMTP id 18A7640005 for ; Fri, 7 Mar 2025 13:54:18 +0000 (UTC) Authentication-Results: imf01.hostedemail.com; dkim=pass header.d=infradead.org header.s=casper.20170209 header.b=AiRyjb9p; spf=none (imf01.hostedemail.com: domain of willy@infradead.org has no SPF policy when checking 90.155.50.34) smtp.mailfrom=willy@infradead.org; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1741355659; 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:dkim-signature; bh=MofhovjlADQCQPqeYMIVdQLieQlnl0tttbSu0oh4ZYs=; b=urVJQHieoqukaZjjzHqIbfbB4ObbMR/whtsD7FuZU8mkYp/7M+I9nSWHTBGD8ubdfNJuJE h4YKl/O0HI+H1gFj5d/IH0MQw32vDlQVec8dbnlZKVwHMXu/q6MruOH+sUN54cKFn9crkw eInS++IirqsZIKLFW27rBhlIpf7ilBA= ARC-Authentication-Results: i=1; imf01.hostedemail.com; dkim=pass header.d=infradead.org header.s=casper.20170209 header.b=AiRyjb9p; spf=none (imf01.hostedemail.com: domain of willy@infradead.org has no SPF policy when checking 90.155.50.34) smtp.mailfrom=willy@infradead.org; dmarc=none ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1741355659; a=rsa-sha256; cv=none; b=K4yhlWfENhFntXTeV6v92TqysMNrzdEDd8nOCw4LfHmIBWSSb37J+FuiKX1AdwFcgtiNcr 1GAOgdsIFILNrPbol9Y6Ni1VHlSsOGt1onE66/UHDsmy8mx7+WrHhYXF2D73ADfrYORv0k 44c0x0I/rHSAH1SXn2jDBC12Gn7BzYk= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description; bh=MofhovjlADQCQPqeYMIVdQLieQlnl0tttbSu0oh4ZYs=; b=AiRyjb9pnJivKUulf3/TkIqiUa 7bhUXqQ56kgH5be5/6hPtgs3OfvkXoqoxzjwP6dDK1dCxb8eB+fgx4Si+OXoXbWx/4QXbPkcf2f8H Tx5q9E1QnRnNoJzPSNY/L6g0oQta0BR7vhffZTsRhpB93XUAkEOKHR0z5mH+o6gXbRpVJdaWM4Uo9 5UUVoisF5QVZ5H8bexl780zg4hPo3PCV+RPFrP9zQf2Hk34Mi7a9GHfCGByUnfGbeU/WpgTVjsbcW MvndBuaq0WiuOxnS0t0xcPqBydhg6nU8rOrVyZMSsSxwtvudPIMEXontGuVzP4owwFrlrBVWrTH/l x4M1cLcA==; Received: from willy by casper.infradead.org with local (Exim 4.98 #2 (Red Hat Linux)) id 1tqY9Y-0000000CXGF-0qyX; Fri, 07 Mar 2025 13:54:16 +0000 From: "Matthew Wilcox (Oracle)" To: linux-fsdevel@vger.kernel.org Cc: "Matthew Wilcox (Oracle)" , linux-mm@kvack.org, intel-gfx@lists.freedesktop.org Subject: [PATCH 05/11] vboxsf: Convert to writepages Date: Fri, 7 Mar 2025 13:54:05 +0000 Message-ID: <20250307135414.2987755-6-willy@infradead.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250307135414.2987755-1-willy@infradead.org> References: <20250307135414.2987755-1-willy@infradead.org> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Server: rspam10 X-Rspamd-Queue-Id: 18A7640005 X-Stat-Signature: 9q3fneyqnpoh3ee9p6oi5m95orrt7si9 X-HE-Tag: 1741355658-769726 X-HE-Meta: U2FsdGVkX195M/WOJdjxdN3i6XNSn3jet33CtYcyEXKO/5yU2YRR8nvg7HrQdoEVhcgQsMhBuGVIqay7/pxKVExvVTq7KMGeNGkKAFpt5p7WiXLd8dDM61iRKR8xn7MUYdUKjKToieZmMXoHC0HYdYF2QvrHY2VzAvBmn82sSDN9JXAYqSQBoUvqN5QhrWTpwwUT2jJICQ1RUqrtxEMEtu5Fmyg8KbiQFFzwhWiCk3AuZUQUOKe4QhWRuGBpvZ/r009pYlSiMqqj2B6LMv6SctFSZFRwyj8O3ElHHFdE6iIgNiB4tJi+kWp2V9De62enH468Ka9lP/5wCnaRMYDDTNF18OVOIoo7pmnVlrqU92NLOV21JB/JHWWkySkzUQnaqn/1+TH2TNOwrMJZWXRhCGG943c0ueoMVHWrdmi9SBxkwRboCxSyL6uSLT69YG1HIfUl+5KlGXtoSou3UszA/7MPCkQLwtqAAjtz4QF4lz4NTpJLZO9N6wERkvcHXMoCZ3yLjExZPb7C+7oMh7m3exTKk5wykEdrK4/ValFPsFxZOJs5UG4IlFmbWKGGT0JQ2zRcXYmY5PsNMx8GPOttHhmK7AjrJY5XuVLyYinSUj9NqaQzCI9NjkD4zKQzEFUIMaF7BeRQMnVkCGU2rXx61Y00z/0Uh11bFinbvTjB78vL94ynUBXLrl3POQv2ZfJOOWMhjiErwe6JZsOehGbSEBdPL783fAsX31GMXdwpTAeTj3HRv3aZJn1nLZqWml3PxShEP14MyKE+tJjl2WFwf3DcPTXTCpT35BMtxrk8mXzbNLlmOofC3TI76WJ6P0IZtQr1zQKeCSTXqoE+6jvFaAEwOWS5DUEvD2OBi5ZFYtaokJx6iLbBwRppJ1r7V16FvsF7Prgxcy3UgnRI+ZzuFnd2cY0dkO6XSrnC/9MaZw1BmkF5qJK/C+WecZtM0X8tMqCiJhN0y48vYVJezRp GnNgDVYc yotRmIgug+fe1eItW0X7retHEKA/muKEwqhPzDHXIhqa7YylWjUsHu6RcdbukSKSkLb73wu/4hxgGsF9DbzW7n0AldDUl/sJ5yDzUzVlE3QA73iv57iHmYsTxSEP/bUtJydZNakITJfaqzE1XL6ORSzyMYPxd3DAD9yGMZAs+8R1jMQr/19an1/uOB4KRO8asA8gMXn6/dALFvVdpWq0KDDwOjMSiy/A6nYam7qSDmUBSbYU= 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: If we add a migrate_folio operation, we can convert the writepage operation to writepages. Further, this lets us optimise by using the same write handle for multiple folios. The large folio support here is illusory; we would need to kmap each page in turn for proper support. But we do remove a few hidden calls to compound_head(). Signed-off-by: Matthew Wilcox (Oracle) --- fs/vboxsf/file.c | 47 +++++++++++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/fs/vboxsf/file.c b/fs/vboxsf/file.c index b780deb81b02..b492794f8e9a 100644 --- a/fs/vboxsf/file.c +++ b/fs/vboxsf/file.c @@ -262,40 +262,42 @@ static struct vboxsf_handle *vboxsf_get_write_handle(struct vboxsf_inode *sf_i) return sf_handle; } -static int vboxsf_writepage(struct page *page, struct writeback_control *wbc) +static int vboxsf_writepages(struct address_space *mapping, + struct writeback_control *wbc) { - struct inode *inode = page->mapping->host; + struct inode *inode = mapping->host; + struct folio *folio = NULL; struct vboxsf_inode *sf_i = VBOXSF_I(inode); struct vboxsf_handle *sf_handle; - loff_t off = page_offset(page); loff_t size = i_size_read(inode); - u32 nwrite = PAGE_SIZE; - u8 *buf; - int err; - - if (off + PAGE_SIZE > size) - nwrite = size & ~PAGE_MASK; + int error; sf_handle = vboxsf_get_write_handle(sf_i); if (!sf_handle) return -EBADF; - buf = kmap(page); - err = vboxsf_write(sf_handle->root, sf_handle->handle, - off, &nwrite, buf); - kunmap(page); + while ((folio = writeback_iter(mapping, wbc, folio, &error))) { + loff_t off = folio_pos(folio); + u32 nwrite = folio_size(folio); + u8 *buf; - kref_put(&sf_handle->refcount, vboxsf_handle_release); + if (nwrite > size - off) + nwrite = size - off; - if (err == 0) { - /* mtime changed */ - sf_i->force_restat = 1; - } else { - ClearPageUptodate(page); + buf = kmap_local_folio(folio, 0); + error = vboxsf_write(sf_handle->root, sf_handle->handle, + off, &nwrite, buf); + kunmap_local(buf); + + folio_unlock(folio); } - unlock_page(page); - return err; + kref_put(&sf_handle->refcount, vboxsf_handle_release); + + /* mtime changed */ + if (error == 0) + sf_i->force_restat = 1; + return error; } static int vboxsf_write_end(struct file *file, struct address_space *mapping, @@ -347,10 +349,11 @@ static int vboxsf_write_end(struct file *file, struct address_space *mapping, */ const struct address_space_operations vboxsf_reg_aops = { .read_folio = vboxsf_read_folio, - .writepage = vboxsf_writepage, + .writepages = vboxsf_writepages, .dirty_folio = filemap_dirty_folio, .write_begin = simple_write_begin, .write_end = vboxsf_write_end, + .migrate_folio = filemap_migrate_folio, }; static const char *vboxsf_get_link(struct dentry *dentry, struct inode *inode,