Messages in this thread | | | Date | Mon, 1 Dec 2014 17:52:34 -0500 | From | Johannes Weiner <> | Subject | Re: [rfc patch] mm: protect set_page_dirty() from ongoing truncation |
| |
On Wed, Nov 26, 2014 at 02:00:06PM -0800, Andrew Morton wrote: > On Tue, 25 Nov 2014 14:48:41 -0500 Johannes Weiner <hannes@cmpxchg.org> wrote: > > The > > same btw applies for the page_mkwrite case: how is mapping safe to > > pass to balance_dirty_pages() after unlocking page table and page? > > I'm not sure which code you're referring to here, but it's likely that > the switch-balancing-to-bdi approach will address that as well?
This code in do_wp_page():
pte_unmap_unlock(page_table, ptl); [...] put_page(dirty_page); if (page_mkwrite) { struct address_space *mapping = dirty_page->mapping;
set_page_dirty(dirty_page); unlock_page(dirty_page); page_cache_release(dirty_page); if (mapping) { /* * Some device drivers do not set page.mapping * but still dirty their pages */ balance_dirty_pages_ratelimited(mapping); } }
And there is also this code in do_shared_fault():
pte_unmap_unlock(pte, ptl);
if (set_page_dirty(fault_page)) dirtied = 1; mapping = fault_page->mapping; unlock_page(fault_page); if ((dirtied || vma->vm_ops->page_mkwrite) && mapping) { /* * Some device drivers do not set page.mapping but still * dirty their pages */ balance_dirty_pages_ratelimited(mapping); }
I don't see anything that ensures mapping stays alive by the time it's passed to balance_dirty_pages() in either case.
Argh, but of course there is. The mmap_sem. That pins the vma, which pins the file, which pins the inode. In all cases. So I think we can just stick with passing mapping to balance_dirty_pages() for now.
| |