diff options
| author | Thomas Gleixner <[email protected]> | 2019-05-06 12:04:12 +0200 | 
|---|---|---|
| committer | Thomas Gleixner <[email protected]> | 2019-05-06 12:04:12 +0200 | 
| commit | fb4e0592654adb31bc6f3a738d6499b816a655d6 (patch) | |
| tree | e6edaf18cf3a7f49e93fb51de5a47f4b9e786f53 /mm/huge_memory.c | |
| parent | 471ba0e686cb13752bc1ff3216c54b69a2d250ea (diff) | |
| parent | 16e32c3cde7763ab875b9030b443ecbc8e352d8a (diff) | |
Merge tag 'irqchip-5.2' of git://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms into irq/core
Pull irqchip updates from Marc Zyngier
- The huge (and terrifying) TI INTR/INTA set of drivers
- Rewrite of the stm32mp1-exti driver as a platform driver
- Update the IOMMU MSI mapping API to be RT friendly
- A number of cleanups and other low impact fixes
Diffstat (limited to 'mm/huge_memory.c')
| -rw-r--r-- | mm/huge_memory.c | 36 | 
1 files changed, 36 insertions, 0 deletions
| diff --git a/mm/huge_memory.c b/mm/huge_memory.c index 404acdcd0455..165ea46bf149 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c @@ -755,6 +755,21 @@ static void insert_pfn_pmd(struct vm_area_struct *vma, unsigned long addr,  	spinlock_t *ptl;  	ptl = pmd_lock(mm, pmd); +	if (!pmd_none(*pmd)) { +		if (write) { +			if (pmd_pfn(*pmd) != pfn_t_to_pfn(pfn)) { +				WARN_ON_ONCE(!is_huge_zero_pmd(*pmd)); +				goto out_unlock; +			} +			entry = pmd_mkyoung(*pmd); +			entry = maybe_pmd_mkwrite(pmd_mkdirty(entry), vma); +			if (pmdp_set_access_flags(vma, addr, pmd, entry, 1)) +				update_mmu_cache_pmd(vma, addr, pmd); +		} + +		goto out_unlock; +	} +  	entry = pmd_mkhuge(pfn_t_pmd(pfn, prot));  	if (pfn_t_devmap(pfn))  		entry = pmd_mkdevmap(entry); @@ -766,11 +781,16 @@ static void insert_pfn_pmd(struct vm_area_struct *vma, unsigned long addr,  	if (pgtable) {  		pgtable_trans_huge_deposit(mm, pmd, pgtable);  		mm_inc_nr_ptes(mm); +		pgtable = NULL;  	}  	set_pmd_at(mm, addr, pmd, entry);  	update_mmu_cache_pmd(vma, addr, pmd); + +out_unlock:  	spin_unlock(ptl); +	if (pgtable) +		pte_free(mm, pgtable);  }  vm_fault_t vmf_insert_pfn_pmd(struct vm_area_struct *vma, unsigned long addr, @@ -821,6 +841,20 @@ static void insert_pfn_pud(struct vm_area_struct *vma, unsigned long addr,  	spinlock_t *ptl;  	ptl = pud_lock(mm, pud); +	if (!pud_none(*pud)) { +		if (write) { +			if (pud_pfn(*pud) != pfn_t_to_pfn(pfn)) { +				WARN_ON_ONCE(!is_huge_zero_pud(*pud)); +				goto out_unlock; +			} +			entry = pud_mkyoung(*pud); +			entry = maybe_pud_mkwrite(pud_mkdirty(entry), vma); +			if (pudp_set_access_flags(vma, addr, pud, entry, 1)) +				update_mmu_cache_pud(vma, addr, pud); +		} +		goto out_unlock; +	} +  	entry = pud_mkhuge(pfn_t_pud(pfn, prot));  	if (pfn_t_devmap(pfn))  		entry = pud_mkdevmap(entry); @@ -830,6 +864,8 @@ static void insert_pfn_pud(struct vm_area_struct *vma, unsigned long addr,  	}  	set_pud_at(mm, addr, pud, entry);  	update_mmu_cache_pud(vma, addr, pud); + +out_unlock:  	spin_unlock(ptl);  } |