diff options
Diffstat (limited to 'mm/memory.c')
| -rw-r--r-- | mm/memory.c | 17 | 
1 files changed, 13 insertions, 4 deletions
diff --git a/mm/memory.c b/mm/memory.c index e2bb51b6242e..b1ca51a079f2 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -518,7 +518,7 @@ static void print_bad_pte(struct vm_area_struct *vma, unsigned long addr,  		 (long long)pte_val(pte), (long long)pmd_val(*pmd));  	if (page)  		dump_page(page, "bad pte"); -	pr_alert("addr:%p vm_flags:%08lx anon_vma:%p mapping:%p index:%lx\n", +	pr_alert("addr:%px vm_flags:%08lx anon_vma:%px mapping:%px index:%lx\n",  		 (void *)addr, vma->vm_flags, vma->anon_vma, mapping, index);  	pr_alert("file:%pD fault:%ps mmap:%ps readpage:%ps\n",  		 vma->vm_file, @@ -1026,6 +1026,9 @@ again:  		if (pte_none(ptent))  			continue; +		if (need_resched()) +			break; +  		if (pte_present(ptent)) {  			struct page *page; @@ -1093,7 +1096,6 @@ again:  		if (unlikely(details))  			continue; -		entry = pte_to_swp_entry(ptent);  		if (!non_swap_entry(entry))  			rss[MM_SWAPENTS]--;  		else if (is_migration_entry(entry)) { @@ -1124,8 +1126,11 @@ again:  	if (force_flush) {  		force_flush = 0;  		tlb_flush_mmu(tlb); -		if (addr != end) -			goto again; +	} + +	if (addr != end) { +		cond_resched(); +		goto again;  	}  	return addr; @@ -2196,6 +2201,10 @@ static vm_fault_t do_page_mkwrite(struct vm_fault *vmf)  	vmf->flags = FAULT_FLAG_WRITE|FAULT_FLAG_MKWRITE; +	if (vmf->vma->vm_file && +	    IS_SWAPFILE(vmf->vma->vm_file->f_mapping->host)) +		return VM_FAULT_SIGBUS; +  	ret = vmf->vma->vm_ops->page_mkwrite(vmf);  	/* Restore original flags so that caller is not surprised */  	vmf->flags = old_flags;  |