Re: [PATCH 1/4] mm: thp: Return the correct value for change_huge_pmd
From: Mel Gorman <mgorman@suse.de>
Date: 2015-03-07 20:56:22
Also in:
linux-mm, linux-xfs, lkml
On Sat, Mar 07, 2015 at 12:31:03PM -0800, Linus Torvalds wrote:
On Sat, Mar 7, 2015 at 7:20 AM, Mel Gorman [off-list ref] wrote:quoted
if (!prot_numa || !pmd_protnone(*pmd)) { - ret = 1; entry = pmdp_get_and_clear_notify(mm, addr, pmd); entry = pmd_modify(entry, newprot); ret = HPAGE_PMD_NR;Hmm. I know I acked this already, but the return value - which correct - is still potentially something we could improve upon. In particular, we don't need to flush the TLB's if the old entry was not present. Sadly, we don't have a helper function for that. But the code *could* do something like entry = pmdp_get_and_clear_notify(mm, addr, pmd); ret = pmd_tlb_cacheable(entry) ? HPAGE_PMD_NR : 1; entry = pmd_modify(entry, newprot); where pmd_tlb_cacheable() on x86 would test if _PAGE_PRESENT (bit #0) is set.
I agree with you in principle. pmd_tlb_cacheable looks and sounds very similar to pte_accessible().
In particular, that would mean that as we change *from* a protnone (whether NUMA or really protnone) we wouldn't need to flush the TLB. In fact, we could make it even more aggressive: it's not just an old non-present TLB entry that doesn't need flushing - we can avoid the flushing whenever we strictly increase the access rigths. So we could have something that takes the old entry _and_ the new protections into account, and avoids the TLB flush if the new entry is strictly more permissive. This doesn't explain the extra TLB flushes Dave sees, though, because the old code didn't make those kinds of optimizations either. But maybe something like this is worth doing.
I think it is worth doing although it'll be after LSF/MM before I do it. I severely doubt this is what Dave is seeing because the vmstats indicated there was no THP activity but it's still a good idea. -- Mel Gorman SUSE Labs