On Wed, Feb 26, 2014 at 10:48:30PM +0800, Bob Liu wrote: > > Do you relay on unlock_page() to have a compiler barrier? > > > > Before your commit mapping is a local variable and be assigned before > unlock_page(): > struct address_space *mapping = page->mapping; > unlock_page(dirty_page); > put_page(dirty_page); > if ((dirtied || page_mkwrite) && mapping) { > > > I'm afraid now "fault_page->mapping" might be changed to NULL after > "if ((dirtied || vma->vm_ops->page_mkwrite) && fault_page->mapping) {" > and then passed down to balance_dirty_pages_ratelimited(NULL). I see what you try to fix. I wounder if we need to do mapping = ACCESS_ONCE(fault_page->mapping); instead. The question is if compiler on its own can eliminate intermediate variable and dereference fault_page->mapping twice, as code with my patch does. I ask because smp_mb__after_clear_bit() in unlock_page() does nothing on some architectures. > >> > >> diff --git a/mm/memory.c b/mm/memory.c > >> index 548d97e..90cea22 100644 > >> --- a/mm/memory.c > >> +++ b/mm/memory.c > >> @@ -3419,6 +3419,7 @@ static int do_shared_fault(struct mm_struct *mm, > >> struct vm_area_struct *vma, > >> pgoff_t pgoff, unsigned int flags, pte_t orig_pte) > >> { > >> struct page *fault_page; > >> + struct address_space *mapping; > >> spinlock_t *ptl; > >> pte_t *pte; > >> int dirtied = 0; > >> @@ -3454,13 +3455,14 @@ static int do_shared_fault(struct mm_struct > >> *mm, struct vm_area_struct *vma, > >> > >> if (set_page_dirty(fault_page)) > >> dirtied = 1; > >> + mapping = fault_page->mapping; > >> unlock_page(fault_page); > >> - if ((dirtied || vma->vm_ops->page_mkwrite) && fault_page->mapping) { > >> + 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(fault_page->mapping); > >> + balance_dirty_pages_ratelimited(mapping); > >> } > >> > >> /* file_update_time outside page_lock */ > >> -- > >> To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > >> the body of a message to majordomo@xxxxxxxxxxxxxxx > >> More majordomo info at http://vger.kernel.org/majordomo-info.html > >> Please read the FAQ at http://www.tux.org/lkml/ > > > > -- > > Kirill A. Shutemov > > -- > Regards, > --Bob -- Kirill A. Shutemov -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>