diff options
Diffstat (limited to 'mm/memory.c')
| -rw-r--r-- | mm/memory.c | 12 | 
1 files changed, 12 insertions, 0 deletions
diff --git a/mm/memory.c b/mm/memory.c index 8012c190789..8a7b4ccbe13 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -3477,6 +3477,7 @@ int do_numa_page(struct mm_struct *mm, struct vm_area_struct *vma,  	set_pte_at(mm, addr, ptep, pte);  	update_mmu_cache(vma, addr, ptep); +	count_vm_numa_event(NUMA_HINT_FAULTS);  	page = vm_normal_page(vma, addr, pte);  	if (!page) {  		pte_unmap_unlock(ptep, ptl); @@ -3485,6 +3486,8 @@ int do_numa_page(struct mm_struct *mm, struct vm_area_struct *vma,  	get_page(page);  	current_nid = page_to_nid(page); +	if (current_nid == numa_node_id()) +		count_vm_numa_event(NUMA_HINT_FAULTS_LOCAL);  	target_nid = mpol_misplaced(page, vma, addr);  	pte_unmap_unlock(ptep, ptl);  	if (target_nid == -1) { @@ -3517,6 +3520,9 @@ static int do_pmd_numa_page(struct mm_struct *mm, struct vm_area_struct *vma,  	unsigned long offset;  	spinlock_t *ptl;  	bool numa = false; +	int local_nid = numa_node_id(); +	unsigned long nr_faults = 0; +	unsigned long nr_faults_local = 0;  	spin_lock(&mm->page_table_lock);  	pmd = *pmdp; @@ -3565,10 +3571,16 @@ static int do_pmd_numa_page(struct mm_struct *mm, struct vm_area_struct *vma,  		curr_nid = page_to_nid(page);  		task_numa_fault(curr_nid, 1); +		nr_faults++; +		if (curr_nid == local_nid) +			nr_faults_local++; +  		pte = pte_offset_map_lock(mm, pmdp, addr, &ptl);  	}  	pte_unmap_unlock(orig_pte, ptl); +	count_vm_numa_events(NUMA_HINT_FAULTS, nr_faults); +	count_vm_numa_events(NUMA_HINT_FAULTS_LOCAL, nr_faults_local);  	return 0;  }  #else  |