From: Hugh Dickins <hughd@google.com>
To: Christoph Hellwig <hch@lst.de>
Cc: Chandan Babu R <chandan.babu@oracle.com>,
"Darrick J. Wong" <djwong@kernel.org>,
Hugh Dickins <hughd@google.com>,
Andrew Morton <akpm@linux-foundation.org>,
Matthew Wilcox <willy@infradead.org>,
linux-xfs@vger.kernel.org, linux-mm@kvack.org
Subject: Re: [PATCH 13/20] xfs: don't allow highmem pages in xfile mappings
Date: Thu, 15 Feb 2024 23:13:55 -0800 (PST) [thread overview]
Message-ID: <f3df6aa8-2085-4342-088f-83257848845e@google.com> (raw)
In-Reply-To: <20240129143502.189370-14-hch@lst.de>
On Mon, 29 Jan 2024, Christoph Hellwig wrote:
> XFS is generally used on 64-bit, non-highmem platforms and xfile
> mappings are accessed all the time. Reduce our pain by not allowing
> any highmem mappings in the xfile page cache and remove all the kmap
> calls for it.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> Reviewed-by: Darrick J. Wong <djwong@kernel.org>
> ---
> fs/xfs/scrub/xfarray.c | 3 +--
> fs/xfs/scrub/xfile.c | 21 +++++++++------------
> 2 files changed, 10 insertions(+), 14 deletions(-)
>
> diff --git a/fs/xfs/scrub/xfarray.c b/fs/xfs/scrub/xfarray.c
> index 95ac14bceeadd6..d0f98a43b2ba0a 100644
> --- a/fs/xfs/scrub/xfarray.c
> +++ b/fs/xfs/scrub/xfarray.c
> @@ -580,7 +580,7 @@ xfarray_sort_get_page(
> * xfile pages must never be mapped into userspace, so we skip the
> * dcache flush when mapping the page.
> */
> - si->page_kaddr = kmap_local_page(si->xfpage.page);
> + si->page_kaddr = page_address(si->xfpage.page);
> return 0;
> }
>
> @@ -592,7 +592,6 @@ xfarray_sort_put_page(
> if (!si->page_kaddr)
> return 0;
>
> - kunmap_local(si->page_kaddr);
> si->page_kaddr = NULL;
>
> return xfile_put_page(si->array->xfile, &si->xfpage);
> diff --git a/fs/xfs/scrub/xfile.c b/fs/xfs/scrub/xfile.c
> index 7e915385ef0011..a669ebbbc02d1d 100644
> --- a/fs/xfs/scrub/xfile.c
> +++ b/fs/xfs/scrub/xfile.c
> @@ -77,6 +77,12 @@ xfile_create(
> inode = file_inode(xf->file);
> lockdep_set_class(&inode->i_rwsem, &xfile_i_mutex_key);
>
> + /*
> + * We don't want to bother with kmapping data during repair, so don't
> + * allow highmem pages to back this mapping.
> + */
> + mapping_set_gfp_mask(inode->i_mapping, GFP_KERNEL);
I had been going to point you to inode_nohighmem(inode), which is how
that is usually done. But I share Matthew's uncertainty about cpusets
and the __GFP_HARDWALL inside GFP_USER: you may well be right to stick
with GFP_KERNEL, just as you've done it here. I suppose it depends on
whether you see this as a system operation or a user-invoked operation.
I did also think that perhaps you could mask off __GFP_FS here, to
avoid having to remember those memalloc_nofs_save()s elsewhere; but
that's probably a bad idea, I doubt anywhere else does it that way.
So, no change required, but I wanted to think about it.
Hugh
> +
> trace_xfile_create(xf);
>
> *xfilep = xf;
> @@ -126,7 +132,6 @@ xfile_load(
>
> pflags = memalloc_nofs_save();
> while (count > 0) {
> - void *p, *kaddr;
> unsigned int len;
>
> len = min_t(ssize_t, count, PAGE_SIZE - offset_in_page(pos));
> @@ -153,10 +158,7 @@ xfile_load(
> * xfile pages must never be mapped into userspace, so
> * we skip the dcache flush.
> */
> - kaddr = kmap_local_page(page);
> - p = kaddr + offset_in_page(pos);
> - memcpy(buf, p, len);
> - kunmap_local(kaddr);
> + memcpy(buf, page_address(page) + offset_in_page(pos), len);
> put_page(page);
>
> advance:
> @@ -221,14 +223,13 @@ xfile_store(
> * the dcache flush. If the page is not uptodate, zero it
> * before writing data.
> */
> - kaddr = kmap_local_page(page);
> + kaddr = page_address(page);
> if (!PageUptodate(page)) {
> memset(kaddr, 0, PAGE_SIZE);
> SetPageUptodate(page);
> }
> p = kaddr + offset_in_page(pos);
> memcpy(p, buf, len);
> - kunmap_local(kaddr);
>
> ret = aops->write_end(NULL, mapping, pos, len, len, page,
> fsdata);
> @@ -314,11 +315,7 @@ xfile_get_page(
> * to the caller and make sure the backing store will hold on to them.
> */
> if (!PageUptodate(page)) {
> - void *kaddr;
> -
> - kaddr = kmap_local_page(page);
> - memset(kaddr, 0, PAGE_SIZE);
> - kunmap_local(kaddr);
> + memset(page_address(page), 0, PAGE_SIZE);
> SetPageUptodate(page);
> }
>
> --
> 2.39.2
next prev parent reply other threads:[~2024-02-16 7:14 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-29 14:34 put the xfs xfile abstraction on a diet v3 Christoph Hellwig
2024-01-29 14:34 ` [PATCH 01/20] mm: move mapping_set_update out of <linux/swap.h> Christoph Hellwig
2024-01-29 14:34 ` [PATCH 02/20] shmem: move shmem_mapping out of line Christoph Hellwig
2024-02-16 6:03 ` Hugh Dickins
2024-01-29 14:34 ` [PATCH 03/20] shmem: set a_ops earlier in shmem_symlink Christoph Hellwig
2024-01-29 14:34 ` [PATCH 04/20] shmem: move the shmem_mapping assert into shmem_get_folio_gfp Christoph Hellwig
2024-01-29 14:34 ` [PATCH 05/20] shmem: export shmem_get_folio Christoph Hellwig
2024-02-16 6:07 ` Hugh Dickins
2024-02-16 13:53 ` Matthew Wilcox
2024-02-19 6:25 ` Christoph Hellwig
2024-01-29 14:34 ` [PATCH 06/20] shmem: export shmem_kernel_file_setup Christoph Hellwig
2024-01-29 16:24 ` Darrick J. Wong
2024-01-29 14:34 ` [PATCH 07/20] shmem: document how to "persist" data when using shmem_*file_setup Christoph Hellwig
2024-01-30 6:06 ` Matthew Wilcox
2024-01-30 8:04 ` Christoph Hellwig
2024-01-30 8:05 ` Christoph Hellwig
2024-01-29 14:34 ` [PATCH 08/20] xfs: remove xfile_stat Christoph Hellwig
2024-01-29 14:34 ` [PATCH 09/20] xfs: remove the xfile_pread/pwrite APIs Christoph Hellwig
2024-01-29 14:34 ` [PATCH 10/20] xfs: don't try to handle non-update pages in xfile_obj_load Christoph Hellwig
2024-01-29 14:34 ` [PATCH 11/20] xfs: shmem_file_setup can't return NULL Christoph Hellwig
2024-01-29 14:34 ` [PATCH 12/20] xfs: don't modify file and inode flags for shmem files Christoph Hellwig
2024-02-16 6:55 ` Hugh Dickins
2024-01-29 14:34 ` [PATCH 13/20] xfs: don't allow highmem pages in xfile mappings Christoph Hellwig
2024-02-16 7:13 ` Hugh Dickins [this message]
2024-01-29 14:34 ` [PATCH 14/20] xfs: use shmem_get_folio in xfile_obj_store Christoph Hellwig
2024-02-16 7:40 ` Hugh Dickins
2024-01-29 14:34 ` [PATCH 15/20] xfs: use shmem_get_folio in in xfile_load Christoph Hellwig
2024-01-29 14:34 ` [PATCH 16/20] xfs: add file_{get,put}_folio Christoph Hellwig
2024-01-29 14:34 ` [PATCH 17/20] xfs: remove xfarray_sortinfo.page_kaddr Christoph Hellwig
2024-01-29 14:35 ` [PATCH 18/20] xfs: fix a comment in xfarray.c Christoph Hellwig
2024-01-29 14:35 ` [PATCH 19/20] xfs: convert xfarray_pagesort to deal with large folios Christoph Hellwig
2024-01-29 14:35 ` [PATCH 20/20] xfs: remove xfile_{get,put}_page Christoph Hellwig
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=f3df6aa8-2085-4342-088f-83257848845e@google.com \
--to=hughd@google.com \
--cc=akpm@linux-foundation.org \
--cc=chandan.babu@oracle.com \
--cc=djwong@kernel.org \
--cc=hch@lst.de \
--cc=linux-mm@kvack.org \
--cc=linux-xfs@vger.kernel.org \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox