forked from mirrors/linux
		
	mm: numa: avoid unnecessary TLB flushes when setting NUMA hinting entries
If a PTE or PMD is already marked NUMA when scanning to mark entries for NUMA hinting then it is not necessary to update the entry and incur a TLB flush penalty. Avoid the avoidhead where possible. Signed-off-by: Mel Gorman <mgorman@suse.de> Cc: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Dave Jones <davej@redhat.com> Cc: Hugh Dickins <hughd@google.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Kirill Shutemov <kirill.shutemov@linux.intel.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Rik van Riel <riel@redhat.com> Cc: Sasha Levin <sasha.levin@oracle.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									c0e7cad9f2
								
							
						
					
					
						commit
						10c1045f28
					
				
					 2 changed files with 12 additions and 6 deletions
				
			
		| 
						 | 
				
			
			@ -1493,12 +1493,14 @@ int change_huge_pmd(struct vm_area_struct *vma, pmd_t *pmd,
 | 
			
		|||
			return 0;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		ret = 1;
 | 
			
		||||
		entry = pmdp_get_and_clear_notify(mm, addr, pmd);
 | 
			
		||||
		entry = pmd_modify(entry, newprot);
 | 
			
		||||
		ret = HPAGE_PMD_NR;
 | 
			
		||||
		set_pmd_at(mm, addr, pmd, entry);
 | 
			
		||||
		BUG_ON(pmd_write(entry));
 | 
			
		||||
		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;
 | 
			
		||||
			set_pmd_at(mm, addr, pmd, entry);
 | 
			
		||||
			BUG_ON(pmd_write(entry));
 | 
			
		||||
		}
 | 
			
		||||
		spin_unlock(ptl);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -86,6 +86,10 @@ static unsigned long change_pte_range(struct vm_area_struct *vma, pmd_t *pmd,
 | 
			
		|||
				page = vm_normal_page(vma, addr, oldpte);
 | 
			
		||||
				if (!page || PageKsm(page))
 | 
			
		||||
					continue;
 | 
			
		||||
 | 
			
		||||
				/* Avoid TLB flush if possible */
 | 
			
		||||
				if (pte_protnone(oldpte))
 | 
			
		||||
					continue;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			ptent = ptep_modify_prot_start(mm, addr, pte);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue