diff options
Diffstat (limited to 'arch/s390/mm/pgalloc.c')
| -rw-r--r-- | arch/s390/mm/pgalloc.c | 6 | 
1 files changed, 5 insertions, 1 deletions
| diff --git a/arch/s390/mm/pgalloc.c b/arch/s390/mm/pgalloc.c index 84bd6329a88d..76d89ee8b428 100644 --- a/arch/s390/mm/pgalloc.c +++ b/arch/s390/mm/pgalloc.c @@ -28,7 +28,7 @@ static struct ctl_table page_table_sysctl[] = {  		.data		= &page_table_allocate_pgste,  		.maxlen		= sizeof(int),  		.mode		= S_IRUGO | S_IWUSR, -		.proc_handler	= proc_dointvec, +		.proc_handler	= proc_dointvec_minmax,  		.extra1		= &page_table_allocate_pgste_min,  		.extra2		= &page_table_allocate_pgste_max,  	}, @@ -252,6 +252,8 @@ void page_table_free(struct mm_struct *mm, unsigned long *table)  		spin_unlock_bh(&mm->context.lock);  		if (mask != 0)  			return; +	} else { +		atomic_xor_bits(&page->_refcount, 3U << 24);  	}  	pgtable_page_dtor(page); @@ -304,6 +306,8 @@ static void __tlb_remove_table(void *_table)  			break;  		/* fallthrough */  	case 3:		/* 4K page table with pgstes */ +		if (mask & 3) +			atomic_xor_bits(&page->_refcount, 3 << 24);  		pgtable_page_dtor(page);  		__free_page(page);  		break; |