On Tue, Mar 23, 2021 at 04:30:27PM +0000, Matthew Wilcox wrote: > On Tue, Mar 23, 2021 at 03:41:25PM +0000, Christoph Hellwig wrote: > > On Mon, Mar 22, 2021 at 01:19:07AM +0000, Matthew Wilcox wrote: > > > I'd like to get it down to zero. After all, the !mapping case in > > > set_page_dirty() is exactly what we want. So is there a problem > > > with doing this? > > > > > > +++ b/mm/page-writeback.c > > > @@ -2562 +2562 @@ int set_page_dirty(struct page *page) > > > - if (likely(mapping)) { > > > + if (likely(mapping && mapping_can_writeback(mapping))) { > > > > > > But then I noticed that we have both mapping_can_writeback() > > > and mapping_use_writeback_tags(), and I'm no longer sure > > > which one to use. Also, why don't we mirror the results of > > > inode_to_bdi(mapping->host)->capabilities & BDI_CAP_WRITEBACK into > > > a mapping->flags & AS_something bit? > > > > Probably because no one has bothered to submit a patch yet. > > I was hoping for a little more guidance. Are mapping_can_writeback() > and mapping_use_writeback_tags() really the same thing? I mean, > obviously the swap spaces actually _can_ writeback, but it doesn't > use the tags to do it. Have you looked at the commit adding mapping_use_writeback_tags? It pretty clearly documents that as of that commit the swap cache does not use writeback tags and why.