diff options
Diffstat (limited to 'mm/ksm.c')
| -rw-r--r-- | mm/ksm.c | 27 | 
1 files changed, 7 insertions, 20 deletions
| @@ -778,8 +778,6 @@ static int replace_page(struct vm_area_struct *vma, struct page *page,  			struct page *kpage, pte_t orig_pte)  {  	struct mm_struct *mm = vma->vm_mm; -	pgd_t *pgd; -	pud_t *pud;  	pmd_t *pmd;  	pte_t *ptep;  	spinlock_t *ptl; @@ -792,18 +790,10 @@ static int replace_page(struct vm_area_struct *vma, struct page *page,  	if (addr == -EFAULT)  		goto out; -	pgd = pgd_offset(mm, addr); -	if (!pgd_present(*pgd)) +	pmd = mm_find_pmd(mm, addr); +	if (!pmd)  		goto out; - -	pud = pud_offset(pgd, addr); -	if (!pud_present(*pud)) -		goto out; - -	pmd = pmd_offset(pud, addr);  	BUG_ON(pmd_trans_huge(*pmd)); -	if (!pmd_present(*pmd)) -		goto out;  	mmun_start = addr;  	mmun_end   = addr + PAGE_SIZE; @@ -1634,7 +1624,7 @@ again:  		struct anon_vma_chain *vmac;  		struct vm_area_struct *vma; -		anon_vma_lock(anon_vma); +		anon_vma_lock_write(anon_vma);  		anon_vma_interval_tree_foreach(vmac, &anon_vma->rb_root,  					       0, ULONG_MAX) {  			vma = vmac->vma; @@ -1688,7 +1678,7 @@ again:  		struct anon_vma_chain *vmac;  		struct vm_area_struct *vma; -		anon_vma_lock(anon_vma); +		anon_vma_lock_write(anon_vma);  		anon_vma_interval_tree_foreach(vmac, &anon_vma->rb_root,  					       0, ULONG_MAX) {  			vma = vmac->vma; @@ -1741,7 +1731,7 @@ again:  		struct anon_vma_chain *vmac;  		struct vm_area_struct *vma; -		anon_vma_lock(anon_vma); +		anon_vma_lock_write(anon_vma);  		anon_vma_interval_tree_foreach(vmac, &anon_vma->rb_root,  					       0, ULONG_MAX) {  			vma = vmac->vma; @@ -1929,12 +1919,9 @@ static ssize_t run_store(struct kobject *kobj, struct kobj_attribute *attr,  	if (ksm_run != flags) {  		ksm_run = flags;  		if (flags & KSM_RUN_UNMERGE) { -			int oom_score_adj; - -			oom_score_adj = test_set_oom_score_adj(OOM_SCORE_ADJ_MAX); +			set_current_oom_origin();  			err = unmerge_and_remove_all_rmap_items(); -			compare_swap_oom_score_adj(OOM_SCORE_ADJ_MAX, -								oom_score_adj); +			clear_current_oom_origin();  			if (err) {  				ksm_run = KSM_RUN_STOP;  				count = err; |