Re: [PATCH 5/8] reiserfs: Convert do_journal_end() to use kmap_local_folio()

Jan Kara <[email protected]>
Newsgroups gmane.comp.file-systems.reiserfs.general,gmane.linux.file-systems
Message-ID <20221222103705.f2s7bpwv2g7x2bwt@quack3>
On Wed 21-12-22 19:04:02, Matthew Wilcox wrote:
> On Tue, Dec 20, 2022 at 03:59:39PM -0800, Ira Weiny wrote:
> > On Tue, Dec 20, 2022 at 06:34:57PM +0000, Matthew Wilcox wrote:
> > > On Tue, Dec 20, 2022 at 08:58:52AM -0800, Ira Weiny wrote:
> > > > On Tue, Dec 20, 2022 at 12:18:01PM +0100, Jan Kara wrote:
> > > > > On Tue 20-12-22 09:35:43, Matthew Wilcox wrote:
> > > > > > But that doesn't solve the "What about fs block size > PAGE_SIZE"
> > > > > > problem that we also want to solve.  Here's a concrete example:
> > > > > > 
> > > > > >  static __u32 jbd2_checksum_data(__u32 crc32_sum, struct buffer_head *bh)
> > > > > >  {
> > > > > > -       struct page *page = bh->b_page;
> > > > > > +       struct folio *folio = bh->b_folio;
> > > > > >         char *addr;
> > > > > >         __u32 checksum;
> > > > > >  
> > > > > > -       addr = kmap_atomic(page);
> > > > > > -       checksum = crc32_be(crc32_sum,
> > > > > > -               (void *)(addr + offset_in_page(bh->b_data)), bh->b_size);
> > > > > > -       kunmap_atomic(addr);
> > > > > > +       BUG_ON(IS_ENABLED(CONFIG_HIGHMEM) && bh->b_size > PAGE_SIZE);
> > > > > > +
> > > > > > +       addr = kmap_local_folio(folio, offset_in_folio(folio, bh->b_data));
> > > > > > +       checksum = crc32_be(crc32_sum, addr, bh->b_size);
> > > > > > +       kunmap_local(addr);
> > > > > >  
> > > > > >         return checksum;
> > > > > >  }
> > > > > > 
> > > > > > I don't want to add a lot of complexity to handle the case of b_size >
> > > > > > PAGE_SIZE on a HIGHMEM machine since that's not going to benefit terribly
> > > > > > many people.  I'd rather have the assertion that we don't support it.
> > > > > > But if there's a good higher-level abstraction I'm missing here ...
> > > > > 
> > > > > Just out of curiosity: So far I was thinking folio is physically contiguous
> > > > > chunk of memory. And if it is, then it does not seem as a huge overkill if
> > > > > kmap_local_folio() just maps the whole folio?
> > > > 
> > > > Willy proposed that previously but we could not come to a consensus on how to
> > > > do it.
> > > > 
> > > > https://lore.kernel.org/all/Yv2VouJb2pNbP59m@iweiny-desk3/
> > > > 
> > > > FWIW I still think increasing the entries to cover any foreseeable need would
> > > > be sufficient because HIGHMEM does not need to be optimized.  Couldn't we hide
> > > > the entry count into some config option which is only set if a FS needs a
> > > > larger block size on a HIGHMEM system?
> > > 
> > > "any foreseeable need"?  I mean ... I'd like to support 2MB folios,
> > > even on HIGHMEM machines, and that's 512 entries.  If we're doing
> > > memcpy_to_folio(), we know that's only one mapping, but still, 512
> > > entries is _a lot_ of address space to be reserving on a 32-bit machine.
> > 
> > I'm confused.  A memcpy_to_folio() could loop to map the pages as needed
> > depending on the amount of data to copy.  Or just map/unmap in a loop.
> > 
> > This seems like an argument to have a memcpy_to_folio() to hide such nastiness
> > on HIGHMEM from the user.
> 
> I see that you are confused.  What I'm not quite sure of is how I confused
> you, so I'm just going to try again in different words.
> 
> Given the desire to support 2MB folios on x86/ARM PAE systems, we can't
> have a kmap_local_entire_folio() because that would take up too much
> address space.

Is that really a problem? I mean sure 2MB is noticeable in 32-bit address
space but these mappings are very shortlived due to their nature (and the
API kind of enforces that) so there'd hardly be more than a handful of them
existing in parallel on a system. Or is my expectation wrong?

But I agree the solution with memcpy_to/from_folio() works as well.

> > [*] I only play a file system developer on TV.  ;-)
> 
> That's OK, I'm only pretending to be an MM developer.  Keep quiet, and
> I think we can get away with this.

"All the world's a stage, and all the men and women merely players." :)

								Honza

-- 
Jan Kara <[email protected]>
SUSE Labs, CR
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.