diff options
Diffstat (limited to 'mm/pgtable-generic.c')
| -rw-r--r-- | mm/pgtable-generic.c | 24 | 
1 files changed, 14 insertions, 10 deletions
diff --git a/mm/pgtable-generic.c b/mm/pgtable-generic.c index 3929a40bd6c..a8b91992593 100644 --- a/mm/pgtable-generic.c +++ b/mm/pgtable-generic.c @@ -110,9 +110,10 @@ int pmdp_clear_flush_young(struct vm_area_struct *vma,  pte_t ptep_clear_flush(struct vm_area_struct *vma, unsigned long address,  		       pte_t *ptep)  { +	struct mm_struct *mm = (vma)->vm_mm;  	pte_t pte; -	pte = ptep_get_and_clear((vma)->vm_mm, address, ptep); -	if (pte_accessible(pte)) +	pte = ptep_get_and_clear(mm, address, ptep); +	if (pte_accessible(mm, pte))  		flush_tlb_page(vma, address);  	return pte;  } @@ -151,14 +152,14 @@ void pmdp_splitting_flush(struct vm_area_struct *vma, unsigned long address,  void pgtable_trans_huge_deposit(struct mm_struct *mm, pmd_t *pmdp,  				pgtable_t pgtable)  { -	assert_spin_locked(&mm->page_table_lock); +	assert_spin_locked(pmd_lockptr(mm, pmdp));  	/* FIFO */ -	if (!mm->pmd_huge_pte) +	if (!pmd_huge_pte(mm, pmdp))  		INIT_LIST_HEAD(&pgtable->lru);  	else -		list_add(&pgtable->lru, &mm->pmd_huge_pte->lru); -	mm->pmd_huge_pte = pgtable; +		list_add(&pgtable->lru, &pmd_huge_pte(mm, pmdp)->lru); +	pmd_huge_pte(mm, pmdp) = pgtable;  }  #endif /* CONFIG_TRANSPARENT_HUGEPAGE */  #endif @@ -170,14 +171,14 @@ pgtable_t pgtable_trans_huge_withdraw(struct mm_struct *mm, pmd_t *pmdp)  {  	pgtable_t pgtable; -	assert_spin_locked(&mm->page_table_lock); +	assert_spin_locked(pmd_lockptr(mm, pmdp));  	/* FIFO */ -	pgtable = mm->pmd_huge_pte; +	pgtable = pmd_huge_pte(mm, pmdp);  	if (list_empty(&pgtable->lru)) -		mm->pmd_huge_pte = NULL; +		pmd_huge_pte(mm, pmdp) = NULL;  	else { -		mm->pmd_huge_pte = list_entry(pgtable->lru.next, +		pmd_huge_pte(mm, pmdp) = list_entry(pgtable->lru.next,  					      struct page, lru);  		list_del(&pgtable->lru);  	} @@ -191,6 +192,9 @@ pgtable_t pgtable_trans_huge_withdraw(struct mm_struct *mm, pmd_t *pmdp)  void pmdp_invalidate(struct vm_area_struct *vma, unsigned long address,  		     pmd_t *pmdp)  { +	pmd_t entry = *pmdp; +	if (pmd_numa(entry)) +		entry = pmd_mknonnuma(entry);  	set_pmd_at(vma->vm_mm, address, pmdp, pmd_mknotpresent(*pmdp));  	flush_tlb_range(vma, address, address + HPAGE_PMD_SIZE);  }  | 
