From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Message-ID: <53FD8503.8040802@de.ibm.com> Date: Wed, 27 Aug 2014 09:13:07 +0200 From: Christian Borntraeger MIME-Version: 1.0 To: Ben Hutchings CC: Paolo Bonzini , KVM , Gleb Natapov , Alexander Graf , Cornelia Huck , Jens Freimann , linux-s390 , stable@vger.kernel.org Subject: Re: [GIT PULL 2/2] KVM: s390/mm: try a cow on read only pages for key ops References: <1408972211-27122-1-git-send-email-borntraeger@de.ibm.com> <1408972211-27122-3-git-send-email-borntraeger@de.ibm.com> <1409108771.30127.21.camel@deadeye.wl.decadent.org.uk> In-Reply-To: <1409108771.30127.21.camel@deadeye.wl.decadent.org.uk> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Sender: kvm-owner@vger.kernel.org List-ID: On 27/08/14 05:06, Ben Hutchings wrote: > On Mon, 2014-08-25 at 15:10 +0200, Christian Borntraeger wrote: >> The PFMF instruction handler blindly wrote the storage key even if >> the page was mapped R/O in the host. Lets try a COW before continuing >> and bail out in case of errors. >> >> Signed-off-by: Christian Borntraeger >> Reviewed-by: Dominik Dingel >> Cc: stable@vger.kernel.org >> --- >> arch/s390/mm/pgtable.c | 10 ++++++++++ >> 1 file changed, 10 insertions(+) >> >> diff --git a/arch/s390/mm/pgtable.c b/arch/s390/mm/pgtable.c >> index 19daa53..5404a62 100644 >> --- a/arch/s390/mm/pgtable.c >> +++ b/arch/s390/mm/pgtable.c >> @@ -986,11 +986,21 @@ int set_guest_storage_key(struct mm_struct *mm, unsigned long addr, >> pte_t *ptep; >> >> down_read(&mm->mmap_sem); >> +retry: >> ptep = get_locked_pte(current->mm, addr, &ptl); >> if (unlikely(!ptep)) { >> up_read(&mm->mmap_sem); >> return -EFAULT; >> } >> + if (!(pte_val(*ptep) & _PAGE_INVALID) && >> + (pte_val(*ptep) & _PAGE_PROTECT)) { >> + pte_unmap_unlock(*ptep, ptl); >> + if (fixup_user_fault(current, mm, addr, FAULT_FLAG_WRITE)) { >> + up_read(&mm->mmap_sem); >> + return -EFAULT; >> + } >> + goto retry; >> + } > > Every line below the first 'if' is indented one tab stop too far. > > Ben. > >> new = old = pgste_get_lock(ptep); >> pgste_val(new) &= ~(PGSTE_GR_BIT | PGSTE_GC_BIT | > Hmm, indeed. Drat. Paolo, do you want a revert, resend? Christian