KVM: s390: Fix gmap_helper_zap_one_page() again
A few checks were missing in gmap_helper_zap_one_page(), which can lead
to memory corruption in the guest under specific circumstances.
Add the missing checks.
Fixes: 5deafa27d9 ("KVM: s390: Fix to clear PTE when discarding a swapped page")
Cc: stable@vger.kernel.org
Reported-by: Marc Hartmayer <mhartmay@linux.ibm.com>
Tested-by: Marc Hartmayer <mhartmay@linux.ibm.com>
Acked-by: Christian Borntraeger <borntraeger@linux.ibm.com>
Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
pull/1354/merge
parent
f770950a47
commit
2f393c228c
|
|
@ -47,6 +47,7 @@ static void ptep_zap_softleaf_entry(struct mm_struct *mm, softleaf_t entry)
|
||||||
void gmap_helper_zap_one_page(struct mm_struct *mm, unsigned long vmaddr)
|
void gmap_helper_zap_one_page(struct mm_struct *mm, unsigned long vmaddr)
|
||||||
{
|
{
|
||||||
struct vm_area_struct *vma;
|
struct vm_area_struct *vma;
|
||||||
|
unsigned long pgstev;
|
||||||
spinlock_t *ptl;
|
spinlock_t *ptl;
|
||||||
pgste_t pgste;
|
pgste_t pgste;
|
||||||
pte_t *ptep;
|
pte_t *ptep;
|
||||||
|
|
@ -65,9 +66,13 @@ void gmap_helper_zap_one_page(struct mm_struct *mm, unsigned long vmaddr)
|
||||||
if (pte_swap(*ptep)) {
|
if (pte_swap(*ptep)) {
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
pgste = pgste_get_lock(ptep);
|
pgste = pgste_get_lock(ptep);
|
||||||
|
pgstev = pgste_val(pgste);
|
||||||
|
|
||||||
ptep_zap_softleaf_entry(mm, softleaf_from_pte(*ptep));
|
if ((pgstev & _PGSTE_GPS_USAGE_MASK) == _PGSTE_GPS_USAGE_UNUSED ||
|
||||||
pte_clear(mm, vmaddr, ptep);
|
(pgstev & _PGSTE_GPS_ZERO)) {
|
||||||
|
ptep_zap_softleaf_entry(mm, softleaf_from_pte(*ptep));
|
||||||
|
pte_clear(mm, vmaddr, ptep);
|
||||||
|
}
|
||||||
|
|
||||||
pgste_set_unlock(ptep, pgste);
|
pgste_set_unlock(ptep, pgste);
|
||||||
preempt_enable();
|
preempt_enable();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue