All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: Dominik Dingel <dingel@linux.vnet.ibm.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	linux-mm@kvack.org, Mel Gorman <mgorman@suse.de>,
	Michal Hocko <mhocko@suse.cz>,
	Dave Hansen <dave.hansen@intel.com>,
	Rik van Riel <riel@redhat.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>,
	Andy Lutomirski <luto@amacapital.net>,
	"Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>,
	Bob Liu <lliubbo@gmail.com>,
	Christian Borntraeger <borntraeger@de.ibm.com>,
	Cornelia Huck <cornelia.huck@de.ibm.com>,
	Gleb Natapov <gleb@kernel.org>,
	Heiko Carstens <heiko.carstens@de.ibm.com>,
	"H. Peter Anvin" <hpa@linux.intel.com>,
	Hugh Dickins <hughd@google.com>, Ingo Molnar <mingo@kernel.org>,
	Jianyu Zhan <nasa4836@gmail.com>,
	Johannes Weiner <hannes@cmpxchg.org>,
	"Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>,
	kvm@vger.kernel.org, linux390@de.ibm.com,
	linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org,
	Martin Schwidefsky <schwidefsky@de.ibm.com>,
	Peter Zijlstra <peterz@infradead.org>, Sasha Levin <sasha.levi>
Subject: Re: [PATCH 4/4] s390/mm: disable KSM for storage key enabled pages
Date: Wed, 22 Oct 2014 16:00:20 +0200	[thread overview]
Message-ID: <5447B874.5060206@redhat.com> (raw)
In-Reply-To: <1413976170-42501-5-git-send-email-dingel@linux.vnet.ibm.com>

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>

(missing R-b on patch 1 is _not_ a mistake :))

Paolo

On 10/22/2014 01:09 PM, Dominik Dingel wrote:
> When storage keys are enabled unmerge already merged pages and prevent
> new pages from being merged.
> 
> Signed-off-by: Dominik Dingel <dingel@linux.vnet.ibm.com>
> Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
> ---
>  arch/s390/include/asm/pgtable.h |  2 +-
>  arch/s390/kvm/priv.c            | 17 ++++++++++++-----
>  arch/s390/mm/pgtable.c          | 16 +++++++++++++++-
>  3 files changed, 28 insertions(+), 7 deletions(-)
> 
> diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h
> index 0da98d6..dfb38af 100644
> --- a/arch/s390/include/asm/pgtable.h
> +++ b/arch/s390/include/asm/pgtable.h
> @@ -1754,7 +1754,7 @@ static inline pte_t mk_swap_pte(unsigned long type, unsigned long offset)
>  extern int vmem_add_mapping(unsigned long start, unsigned long size);
>  extern int vmem_remove_mapping(unsigned long start, unsigned long size);
>  extern int s390_enable_sie(void);
> -extern void s390_enable_skey(void);
> +extern int s390_enable_skey(void);
>  extern void s390_reset_cmma(struct mm_struct *mm);
>  
>  /*
> diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c
> index f89c1cd..e0967fd 100644
> --- a/arch/s390/kvm/priv.c
> +++ b/arch/s390/kvm/priv.c
> @@ -156,21 +156,25 @@ static int handle_store_cpu_address(struct kvm_vcpu *vcpu)
>  	return 0;
>  }
>  
> -static void __skey_check_enable(struct kvm_vcpu *vcpu)
> +static int __skey_check_enable(struct kvm_vcpu *vcpu)
>  {
> +	int rc = 0;
>  	if (!(vcpu->arch.sie_block->ictl & (ICTL_ISKE | ICTL_SSKE | ICTL_RRBE)))
> -		return;
> +		return rc;
>  
> -	s390_enable_skey();
> +	rc = s390_enable_skey();
>  	trace_kvm_s390_skey_related_inst(vcpu);
>  	vcpu->arch.sie_block->ictl &= ~(ICTL_ISKE | ICTL_SSKE | ICTL_RRBE);
> +	return rc;
>  }
>  
>  
>  static int handle_skey(struct kvm_vcpu *vcpu)
>  {
> -	__skey_check_enable(vcpu);
> +	int rc = __skey_check_enable(vcpu);
>  
> +	if (rc)
> +		return rc;
>  	vcpu->stat.instruction_storage_key++;
>  
>  	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
> @@ -692,7 +696,10 @@ static int handle_pfmf(struct kvm_vcpu *vcpu)
>  		}
>  
>  		if (vcpu->run->s.regs.gprs[reg1] & PFMF_SK) {
> -			__skey_check_enable(vcpu);
> +			int rc = __skey_check_enable(vcpu);
> +
> +			if (rc)
> +				return rc;
>  			if (set_guest_storage_key(current->mm, useraddr,
>  					vcpu->run->s.regs.gprs[reg1] & PFMF_KEY,
>  					vcpu->run->s.regs.gprs[reg1] & PFMF_NQ))
> diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c
> index 58d7eb2..82aa528 100644
> --- a/arch/s390/mm/pgtable.c
> +++ b/arch/s390/mm/pgtable.c
> @@ -18,6 +18,8 @@
>  #include <linux/rcupdate.h>
>  #include <linux/slab.h>
>  #include <linux/swapops.h>
> +#include <linux/ksm.h>
> +#include <linux/mman.h>
>  
>  #include <asm/pgtable.h>
>  #include <asm/pgalloc.h>
> @@ -1328,22 +1330,34 @@ static int __s390_enable_skey(pte_t *pte, unsigned long addr,
>  	return 0;
>  }
>  
> -void s390_enable_skey(void)
> +int s390_enable_skey(void)
>  {
>  	struct mm_walk walk = { .pte_entry = __s390_enable_skey };
>  	struct mm_struct *mm = current->mm;
> +	struct vm_area_struct *vma;
> +	int rc = 0;
>  
>  	down_write(&mm->mmap_sem);
>  	if (mm_use_skey(mm))
>  		goto out_up;
>  
>  	mm->context.use_skey = 1;
> +	for (vma = mm->mmap; vma; vma = vma->vm_next) {
> +		if (ksm_madvise(vma, vma->vm_start, vma->vm_end,
> +				MADV_UNMERGEABLE, &vma->vm_flags)) {
> +			mm->context.use_skey = 0;
> +			rc = -ENOMEM;
> +			goto out_up;
> +		}
> +	}
> +	mm->def_flags &= ~VM_MERGEABLE;
>  
>  	walk.mm = mm;
>  	walk_page_range(0, TASK_SIZE, &walk);
>  
>  out_up:
>  	up_write(&mm->mmap_sem);
> +	return rc;
>  }
>  EXPORT_SYMBOL_GPL(s390_enable_skey);
>  
> 

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

WARNING: multiple messages have this Message-ID (diff)
From: Paolo Bonzini <pbonzini@redhat.com>
To: Dominik Dingel <dingel@linux.vnet.ibm.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	linux-mm@kvack.org, Mel Gorman <mgorman@suse.de>,
	Michal Hocko <mhocko@suse.cz>,
	Dave Hansen <dave.hansen@intel.com>,
	Rik van Riel <riel@redhat.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>,
	Andy Lutomirski <luto@amacapital.net>,
	"Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>,
	Bob Liu <lliubbo@gmail.com>,
	Christian Borntraeger <borntraeger@de.ibm.com>,
	Cornelia Huck <cornelia.huck@de.ibm.com>,
	Gleb Natapov <gleb@kernel.org>,
	Heiko Carstens <heiko.carstens@de.ibm.com>,
	"H. Peter Anvin" <hpa@linux.intel.com>,
	Hugh Dickins <hughd@google.com>, Ingo Molnar <mingo@kernel.org>,
	Jianyu Zhan <nasa4836@gmail.com>,
	Johannes Weiner <hannes@cmpxchg.org>,
	"Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>,
	kvm@vger.kernel.org, linux390@de.ibm.com,
	linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org,
	Martin Schwidefsky <schwidefsky@de.ibm.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Sasha Levin <sasha.levi
Subject: Re: [PATCH 4/4] s390/mm: disable KSM for storage key enabled pages
Date: Wed, 22 Oct 2014 16:00:20 +0200	[thread overview]
Message-ID: <5447B874.5060206@redhat.com> (raw)
In-Reply-To: <1413976170-42501-5-git-send-email-dingel@linux.vnet.ibm.com>

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>

(missing R-b on patch 1 is _not_ a mistake :))

Paolo

On 10/22/2014 01:09 PM, Dominik Dingel wrote:
> When storage keys are enabled unmerge already merged pages and prevent
> new pages from being merged.
> 
> Signed-off-by: Dominik Dingel <dingel@linux.vnet.ibm.com>
> Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
> ---
>  arch/s390/include/asm/pgtable.h |  2 +-
>  arch/s390/kvm/priv.c            | 17 ++++++++++++-----
>  arch/s390/mm/pgtable.c          | 16 +++++++++++++++-
>  3 files changed, 28 insertions(+), 7 deletions(-)
> 
> diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h
> index 0da98d6..dfb38af 100644
> --- a/arch/s390/include/asm/pgtable.h
> +++ b/arch/s390/include/asm/pgtable.h
> @@ -1754,7 +1754,7 @@ static inline pte_t mk_swap_pte(unsigned long type, unsigned long offset)
>  extern int vmem_add_mapping(unsigned long start, unsigned long size);
>  extern int vmem_remove_mapping(unsigned long start, unsigned long size);
>  extern int s390_enable_sie(void);
> -extern void s390_enable_skey(void);
> +extern int s390_enable_skey(void);
>  extern void s390_reset_cmma(struct mm_struct *mm);
>  
>  /*
> diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c
> index f89c1cd..e0967fd 100644
> --- a/arch/s390/kvm/priv.c
> +++ b/arch/s390/kvm/priv.c
> @@ -156,21 +156,25 @@ static int handle_store_cpu_address(struct kvm_vcpu *vcpu)
>  	return 0;
>  }
>  
> -static void __skey_check_enable(struct kvm_vcpu *vcpu)
> +static int __skey_check_enable(struct kvm_vcpu *vcpu)
>  {
> +	int rc = 0;
>  	if (!(vcpu->arch.sie_block->ictl & (ICTL_ISKE | ICTL_SSKE | ICTL_RRBE)))
> -		return;
> +		return rc;
>  
> -	s390_enable_skey();
> +	rc = s390_enable_skey();
>  	trace_kvm_s390_skey_related_inst(vcpu);
>  	vcpu->arch.sie_block->ictl &= ~(ICTL_ISKE | ICTL_SSKE | ICTL_RRBE);
> +	return rc;
>  }
>  
>  
>  static int handle_skey(struct kvm_vcpu *vcpu)
>  {
> -	__skey_check_enable(vcpu);
> +	int rc = __skey_check_enable(vcpu);
>  
> +	if (rc)
> +		return rc;
>  	vcpu->stat.instruction_storage_key++;
>  
>  	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
> @@ -692,7 +696,10 @@ static int handle_pfmf(struct kvm_vcpu *vcpu)
>  		}
>  
>  		if (vcpu->run->s.regs.gprs[reg1] & PFMF_SK) {
> -			__skey_check_enable(vcpu);
> +			int rc = __skey_check_enable(vcpu);
> +
> +			if (rc)
> +				return rc;
>  			if (set_guest_storage_key(current->mm, useraddr,
>  					vcpu->run->s.regs.gprs[reg1] & PFMF_KEY,
>  					vcpu->run->s.regs.gprs[reg1] & PFMF_NQ))
> diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c
> index 58d7eb2..82aa528 100644
> --- a/arch/s390/mm/pgtable.c
> +++ b/arch/s390/mm/pgtable.c
> @@ -18,6 +18,8 @@
>  #include <linux/rcupdate.h>
>  #include <linux/slab.h>
>  #include <linux/swapops.h>
> +#include <linux/ksm.h>
> +#include <linux/mman.h>
>  
>  #include <asm/pgtable.h>
>  #include <asm/pgalloc.h>
> @@ -1328,22 +1330,34 @@ static int __s390_enable_skey(pte_t *pte, unsigned long addr,
>  	return 0;
>  }
>  
> -void s390_enable_skey(void)
> +int s390_enable_skey(void)
>  {
>  	struct mm_walk walk = { .pte_entry = __s390_enable_skey };
>  	struct mm_struct *mm = current->mm;
> +	struct vm_area_struct *vma;
> +	int rc = 0;
>  
>  	down_write(&mm->mmap_sem);
>  	if (mm_use_skey(mm))
>  		goto out_up;
>  
>  	mm->context.use_skey = 1;
> +	for (vma = mm->mmap; vma; vma = vma->vm_next) {
> +		if (ksm_madvise(vma, vma->vm_start, vma->vm_end,
> +				MADV_UNMERGEABLE, &vma->vm_flags)) {
> +			mm->context.use_skey = 0;
> +			rc = -ENOMEM;
> +			goto out_up;
> +		}
> +	}
> +	mm->def_flags &= ~VM_MERGEABLE;
>  
>  	walk.mm = mm;
>  	walk_page_range(0, TASK_SIZE, &walk);
>  
>  out_up:
>  	up_write(&mm->mmap_sem);
> +	return rc;
>  }
>  EXPORT_SYMBOL_GPL(s390_enable_skey);
>  
> 

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

WARNING: multiple messages have this Message-ID (diff)
From: Paolo Bonzini <pbonzini@redhat.com>
To: Dominik Dingel <dingel@linux.vnet.ibm.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	linux-mm@kvack.org, Mel Gorman <mgorman@suse.de>,
	Michal Hocko <mhocko@suse.cz>,
	Dave Hansen <dave.hansen@intel.com>,
	Rik van Riel <riel@redhat.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>,
	Andy Lutomirski <luto@amacapital.net>,
	"Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>,
	Bob Liu <lliubbo@gmail.com>,
	Christian Borntraeger <borntraeger@de.ibm.com>,
	Cornelia Huck <cornelia.huck@de.ibm.com>,
	Gleb Natapov <gleb@kernel.org>,
	Heiko Carstens <heiko.carstens@de.ibm.com>,
	"H. Peter Anvin" <hpa@linux.intel.com>,
	Hugh Dickins <hughd@google.com>, Ingo Molnar <mingo@kernel.org>,
	Jianyu Zhan <nasa4836@gmail.com>,
	Johannes Weiner <hannes@cmpxchg.org>,
	"Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>,
	kvm@vger.kernel.org, linux390@de.ibm.com,
	linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org,
	Martin Schwidefsky <schwidefsky@de.ibm.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Sasha Levin <sasha.levin@oracle.com>
Subject: Re: [PATCH 4/4] s390/mm: disable KSM for storage key enabled pages
Date: Wed, 22 Oct 2014 16:00:20 +0200	[thread overview]
Message-ID: <5447B874.5060206@redhat.com> (raw)
In-Reply-To: <1413976170-42501-5-git-send-email-dingel@linux.vnet.ibm.com>

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>

(missing R-b on patch 1 is _not_ a mistake :))

Paolo

On 10/22/2014 01:09 PM, Dominik Dingel wrote:
> When storage keys are enabled unmerge already merged pages and prevent
> new pages from being merged.
> 
> Signed-off-by: Dominik Dingel <dingel@linux.vnet.ibm.com>
> Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
> ---
>  arch/s390/include/asm/pgtable.h |  2 +-
>  arch/s390/kvm/priv.c            | 17 ++++++++++++-----
>  arch/s390/mm/pgtable.c          | 16 +++++++++++++++-
>  3 files changed, 28 insertions(+), 7 deletions(-)
> 
> diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h
> index 0da98d6..dfb38af 100644
> --- a/arch/s390/include/asm/pgtable.h
> +++ b/arch/s390/include/asm/pgtable.h
> @@ -1754,7 +1754,7 @@ static inline pte_t mk_swap_pte(unsigned long type, unsigned long offset)
>  extern int vmem_add_mapping(unsigned long start, unsigned long size);
>  extern int vmem_remove_mapping(unsigned long start, unsigned long size);
>  extern int s390_enable_sie(void);
> -extern void s390_enable_skey(void);
> +extern int s390_enable_skey(void);
>  extern void s390_reset_cmma(struct mm_struct *mm);
>  
>  /*
> diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c
> index f89c1cd..e0967fd 100644
> --- a/arch/s390/kvm/priv.c
> +++ b/arch/s390/kvm/priv.c
> @@ -156,21 +156,25 @@ static int handle_store_cpu_address(struct kvm_vcpu *vcpu)
>  	return 0;
>  }
>  
> -static void __skey_check_enable(struct kvm_vcpu *vcpu)
> +static int __skey_check_enable(struct kvm_vcpu *vcpu)
>  {
> +	int rc = 0;
>  	if (!(vcpu->arch.sie_block->ictl & (ICTL_ISKE | ICTL_SSKE | ICTL_RRBE)))
> -		return;
> +		return rc;
>  
> -	s390_enable_skey();
> +	rc = s390_enable_skey();
>  	trace_kvm_s390_skey_related_inst(vcpu);
>  	vcpu->arch.sie_block->ictl &= ~(ICTL_ISKE | ICTL_SSKE | ICTL_RRBE);
> +	return rc;
>  }
>  
>  
>  static int handle_skey(struct kvm_vcpu *vcpu)
>  {
> -	__skey_check_enable(vcpu);
> +	int rc = __skey_check_enable(vcpu);
>  
> +	if (rc)
> +		return rc;
>  	vcpu->stat.instruction_storage_key++;
>  
>  	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
> @@ -692,7 +696,10 @@ static int handle_pfmf(struct kvm_vcpu *vcpu)
>  		}
>  
>  		if (vcpu->run->s.regs.gprs[reg1] & PFMF_SK) {
> -			__skey_check_enable(vcpu);
> +			int rc = __skey_check_enable(vcpu);
> +
> +			if (rc)
> +				return rc;
>  			if (set_guest_storage_key(current->mm, useraddr,
>  					vcpu->run->s.regs.gprs[reg1] & PFMF_KEY,
>  					vcpu->run->s.regs.gprs[reg1] & PFMF_NQ))
> diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c
> index 58d7eb2..82aa528 100644
> --- a/arch/s390/mm/pgtable.c
> +++ b/arch/s390/mm/pgtable.c
> @@ -18,6 +18,8 @@
>  #include <linux/rcupdate.h>
>  #include <linux/slab.h>
>  #include <linux/swapops.h>
> +#include <linux/ksm.h>
> +#include <linux/mman.h>
>  
>  #include <asm/pgtable.h>
>  #include <asm/pgalloc.h>
> @@ -1328,22 +1330,34 @@ static int __s390_enable_skey(pte_t *pte, unsigned long addr,
>  	return 0;
>  }
>  
> -void s390_enable_skey(void)
> +int s390_enable_skey(void)
>  {
>  	struct mm_walk walk = { .pte_entry = __s390_enable_skey };
>  	struct mm_struct *mm = current->mm;
> +	struct vm_area_struct *vma;
> +	int rc = 0;
>  
>  	down_write(&mm->mmap_sem);
>  	if (mm_use_skey(mm))
>  		goto out_up;
>  
>  	mm->context.use_skey = 1;
> +	for (vma = mm->mmap; vma; vma = vma->vm_next) {
> +		if (ksm_madvise(vma, vma->vm_start, vma->vm_end,
> +				MADV_UNMERGEABLE, &vma->vm_flags)) {
> +			mm->context.use_skey = 0;
> +			rc = -ENOMEM;
> +			goto out_up;
> +		}
> +	}
> +	mm->def_flags &= ~VM_MERGEABLE;
>  
>  	walk.mm = mm;
>  	walk_page_range(0, TASK_SIZE, &walk);
>  
>  out_up:
>  	up_write(&mm->mmap_sem);
> +	return rc;
>  }
>  EXPORT_SYMBOL_GPL(s390_enable_skey);
>  
> 

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org.  For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>

WARNING: multiple messages have this Message-ID (diff)
From: Paolo Bonzini <pbonzini@redhat.com>
To: Dominik Dingel <dingel@linux.vnet.ibm.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	linux-mm@kvack.org, Mel Gorman <mgorman@suse.de>,
	Michal Hocko <mhocko@suse.cz>,
	Dave Hansen <dave.hansen@intel.com>,
	Rik van Riel <riel@redhat.com>
Cc: Andrea Arcangeli <aarcange@redhat.com>,
	Andy Lutomirski <luto@amacapital.net>,
	"Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>,
	Bob Liu <lliubbo@gmail.com>,
	Christian Borntraeger <borntraeger@de.ibm.com>,
	Cornelia Huck <cornelia.huck@de.ibm.com>,
	Gleb Natapov <gleb@kernel.org>,
	Heiko Carstens <heiko.carstens@de.ibm.com>,
	"H. Peter Anvin" <hpa@linux.intel.com>,
	Hugh Dickins <hughd@google.com>, Ingo Molnar <mingo@kernel.org>,
	Jianyu Zhan <nasa4836@gmail.com>,
	Johannes Weiner <hannes@cmpxchg.org>,
	"Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>,
	kvm@vger.kernel.org, linux390@de.ibm.com,
	linux-kernel@vger.kernel.org, linux-s390@vger.kernel.org,
	Martin Schwidefsky <schwidefsky@de.ibm.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Sasha Levin <sasha.levin@oracle.com>
Subject: Re: [PATCH 4/4] s390/mm: disable KSM for storage key enabled pages
Date: Wed, 22 Oct 2014 16:00:20 +0200	[thread overview]
Message-ID: <5447B874.5060206@redhat.com> (raw)
In-Reply-To: <1413976170-42501-5-git-send-email-dingel@linux.vnet.ibm.com>

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>

(missing R-b on patch 1 is _not_ a mistake :))

Paolo

On 10/22/2014 01:09 PM, Dominik Dingel wrote:
> When storage keys are enabled unmerge already merged pages and prevent
> new pages from being merged.
> 
> Signed-off-by: Dominik Dingel <dingel@linux.vnet.ibm.com>
> Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
> ---
>  arch/s390/include/asm/pgtable.h |  2 +-
>  arch/s390/kvm/priv.c            | 17 ++++++++++++-----
>  arch/s390/mm/pgtable.c          | 16 +++++++++++++++-
>  3 files changed, 28 insertions(+), 7 deletions(-)
> 
> diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h
> index 0da98d6..dfb38af 100644
> --- a/arch/s390/include/asm/pgtable.h
> +++ b/arch/s390/include/asm/pgtable.h
> @@ -1754,7 +1754,7 @@ static inline pte_t mk_swap_pte(unsigned long type, unsigned long offset)
>  extern int vmem_add_mapping(unsigned long start, unsigned long size);
>  extern int vmem_remove_mapping(unsigned long start, unsigned long size);
>  extern int s390_enable_sie(void);
> -extern void s390_enable_skey(void);
> +extern int s390_enable_skey(void);
>  extern void s390_reset_cmma(struct mm_struct *mm);
>  
>  /*
> diff --git a/arch/s390/kvm/priv.c b/arch/s390/kvm/priv.c
> index f89c1cd..e0967fd 100644
> --- a/arch/s390/kvm/priv.c
> +++ b/arch/s390/kvm/priv.c
> @@ -156,21 +156,25 @@ static int handle_store_cpu_address(struct kvm_vcpu *vcpu)
>  	return 0;
>  }
>  
> -static void __skey_check_enable(struct kvm_vcpu *vcpu)
> +static int __skey_check_enable(struct kvm_vcpu *vcpu)
>  {
> +	int rc = 0;
>  	if (!(vcpu->arch.sie_block->ictl & (ICTL_ISKE | ICTL_SSKE | ICTL_RRBE)))
> -		return;
> +		return rc;
>  
> -	s390_enable_skey();
> +	rc = s390_enable_skey();
>  	trace_kvm_s390_skey_related_inst(vcpu);
>  	vcpu->arch.sie_block->ictl &= ~(ICTL_ISKE | ICTL_SSKE | ICTL_RRBE);
> +	return rc;
>  }
>  
>  
>  static int handle_skey(struct kvm_vcpu *vcpu)
>  {
> -	__skey_check_enable(vcpu);
> +	int rc = __skey_check_enable(vcpu);
>  
> +	if (rc)
> +		return rc;
>  	vcpu->stat.instruction_storage_key++;
>  
>  	if (vcpu->arch.sie_block->gpsw.mask & PSW_MASK_PSTATE)
> @@ -692,7 +696,10 @@ static int handle_pfmf(struct kvm_vcpu *vcpu)
>  		}
>  
>  		if (vcpu->run->s.regs.gprs[reg1] & PFMF_SK) {
> -			__skey_check_enable(vcpu);
> +			int rc = __skey_check_enable(vcpu);
> +
> +			if (rc)
> +				return rc;
>  			if (set_guest_storage_key(current->mm, useraddr,
>  					vcpu->run->s.regs.gprs[reg1] & PFMF_KEY,
>  					vcpu->run->s.regs.gprs[reg1] & PFMF_NQ))
> diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c
> index 58d7eb2..82aa528 100644
> --- a/arch/s390/mm/pgtable.c
> +++ b/arch/s390/mm/pgtable.c
> @@ -18,6 +18,8 @@
>  #include <linux/rcupdate.h>
>  #include <linux/slab.h>
>  #include <linux/swapops.h>
> +#include <linux/ksm.h>
> +#include <linux/mman.h>
>  
>  #include <asm/pgtable.h>
>  #include <asm/pgalloc.h>
> @@ -1328,22 +1330,34 @@ static int __s390_enable_skey(pte_t *pte, unsigned long addr,
>  	return 0;
>  }
>  
> -void s390_enable_skey(void)
> +int s390_enable_skey(void)
>  {
>  	struct mm_walk walk = { .pte_entry = __s390_enable_skey };
>  	struct mm_struct *mm = current->mm;
> +	struct vm_area_struct *vma;
> +	int rc = 0;
>  
>  	down_write(&mm->mmap_sem);
>  	if (mm_use_skey(mm))
>  		goto out_up;
>  
>  	mm->context.use_skey = 1;
> +	for (vma = mm->mmap; vma; vma = vma->vm_next) {
> +		if (ksm_madvise(vma, vma->vm_start, vma->vm_end,
> +				MADV_UNMERGEABLE, &vma->vm_flags)) {
> +			mm->context.use_skey = 0;
> +			rc = -ENOMEM;
> +			goto out_up;
> +		}
> +	}
> +	mm->def_flags &= ~VM_MERGEABLE;
>  
>  	walk.mm = mm;
>  	walk_page_range(0, TASK_SIZE, &walk);
>  
>  out_up:
>  	up_write(&mm->mmap_sem);
> +	return rc;
>  }
>  EXPORT_SYMBOL_GPL(s390_enable_skey);
>  
> 

  reply	other threads:[~2014-10-22 14:00 UTC|newest]

Thread overview: 57+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-10-22 11:09 [PATCH v3 0/4] mm: new function to forbid zeropage mappings for a process Dominik Dingel
2014-10-22 11:09 ` Dominik Dingel
2014-10-22 11:09 ` Dominik Dingel
2014-10-22 11:09 ` Dominik Dingel
2014-10-22 11:09 ` [PATCH 1/4] s390/mm: recfactor global pgste updates Dominik Dingel
2014-10-22 11:09   ` Dominik Dingel
2014-10-22 11:09   ` Dominik Dingel
2014-10-22 11:09   ` Dominik Dingel
2014-10-22 11:09 ` [PATCH 2/4] mm: introduce mm_forbids_zeropage function Dominik Dingel
2014-10-22 11:09   ` Dominik Dingel
2014-10-22 11:09   ` Dominik Dingel
2014-10-22 11:09   ` Dominik Dingel
2014-10-22 13:59   ` Paolo Bonzini
2014-10-22 13:59     ` Paolo Bonzini
2014-10-22 13:59     ` Paolo Bonzini
2014-10-22 13:59     ` Paolo Bonzini
2014-10-22 19:22   ` Andrew Morton
2014-10-22 19:22     ` Andrew Morton
2014-10-22 19:22     ` Andrew Morton
2014-10-22 19:22     ` Andrew Morton
2014-10-22 19:45     ` Dominik Dingel
2014-10-22 19:45       ` Dominik Dingel
2014-10-22 19:45       ` Dominik Dingel
2014-10-22 19:49       ` Andrew Morton
2014-10-22 19:49         ` Andrew Morton
2014-10-22 19:49         ` Andrew Morton
2014-10-22 19:49         ` Andrew Morton
2014-10-22 11:09 ` [PATCH 3/4] s390/mm: prevent and break zero page mappings in case of storage keys Dominik Dingel
2014-10-22 11:09   ` Dominik Dingel
2014-10-22 11:09   ` Dominik Dingel
2014-10-22 11:09   ` Dominik Dingel
2014-10-22 14:00   ` Paolo Bonzini
2014-10-22 14:00     ` Paolo Bonzini
2014-10-22 14:00     ` Paolo Bonzini
2014-10-22 14:00     ` Paolo Bonzini
2014-10-22 11:09 ` [PATCH 4/4] s390/mm: disable KSM for storage key enabled pages Dominik Dingel
2014-10-22 11:09   ` Dominik Dingel
2014-10-22 11:09   ` Dominik Dingel
2014-10-22 11:09   ` Dominik Dingel
2014-10-22 14:00   ` Paolo Bonzini [this message]
2014-10-22 14:00     ` Paolo Bonzini
2014-10-22 14:00     ` Paolo Bonzini
2014-10-22 14:00     ` Paolo Bonzini
2014-10-22 13:59 ` [PATCH v3 0/4] mm: new function to forbid zeropage mappings for a process Paolo Bonzini
2014-10-22 13:59   ` Paolo Bonzini
2014-10-22 13:59   ` Paolo Bonzini
2014-10-22 13:59   ` Paolo Bonzini
2014-10-23 10:19 ` Martin Schwidefsky
2014-10-23 10:19   ` Martin Schwidefsky
2014-10-23 10:19   ` Martin Schwidefsky
  -- strict thread matches above, loose matches on Subject: below --
2014-10-22  8:30 [PATCH v2 " Dominik Dingel
2014-10-22  8:30 ` [PATCH 4/4] s390/mm: disable KSM for storage key enabled pages Dominik Dingel
2014-10-22  8:30   ` Dominik Dingel
2014-10-22  8:30   ` Dominik Dingel
2014-10-22  8:30   ` Dominik Dingel
2014-10-17 14:09 [PATCH 0/4] mm: new flag to forbid zero page mappings for a vma Dominik Dingel
2014-10-17 14:09 ` [PATCH 4/4] s390/mm: disable KSM for storage key enabled pages Dominik Dingel
2014-10-17 14:09   ` Dominik Dingel
2014-10-17 14:09   ` Dominik Dingel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5447B874.5060206@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=aarcange@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=aneesh.kumar@linux.vnet.ibm.com \
    --cc=borntraeger@de.ibm.com \
    --cc=cornelia.huck@de.ibm.com \
    --cc=dave.hansen@intel.com \
    --cc=dingel@linux.vnet.ibm.com \
    --cc=gleb@kernel.org \
    --cc=hannes@cmpxchg.org \
    --cc=heiko.carstens@de.ibm.com \
    --cc=hpa@linux.intel.com \
    --cc=hughd@google.com \
    --cc=kirill.shutemov@linux.intel.com \
    --cc=kvm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=linux390@de.ibm.com \
    --cc=lliubbo@gmail.com \
    --cc=luto@amacapital.net \
    --cc=mgorman@suse.de \
    --cc=mhocko@suse.cz \
    --cc=mingo@kernel.org \
    --cc=nasa4836@gmail.com \
    --cc=peterz@infradead.org \
    --cc=riel@redhat.com \
    --cc=schwidefsky@de.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.