Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp2309071ybt; Tue, 16 Jun 2020 02:38:46 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxc5rScbWjp2lWqpEdGA6nNjjlr/CLSt1fWxYX35PEEcQ9smltY/1L6WCVpmqFXQEsB1MNH X-Received: by 2002:a05:6402:7cb:: with SMTP id u11mr1665239edy.316.1592300326636; Tue, 16 Jun 2020 02:38:46 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1592300326; cv=none; d=google.com; s=arc-20160816; b=CBz/k1IxGudRLOVl175vnNVbijnFBh0UKsnKVU4HCUMUQRwSqibPHOR9af96GXMc/a 4u/rwjs/yaWuYB1jbcYCv2Kwwc0YNfZ+Pf8gQmb+S/4dvNPOwh89+JQBdvT92cm/wLaU ATN4asCirMCwzoRi1Kux3eF2J3M6C3fgWt69mCmhFTfapa6UfyoK3kZNMeAf6toK80cs 6wozmMC0ZSC//MYGg4741TYULvSrhkAX/63QuYN47NFkyKg6JZFx1mSDfQqqu2oC2aB6 eecoT3NNqyFlLMUpVoyyLcu2ASZHOsTakR4JQb9BU8Cp+Dw7gPiO2R5XgSGEszffQ8vN D6VQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=nOEBQdFLJKcBgFjQMyp1TuOI1Fc1cD1GqR6iJJ1LZO0=; b=QX34YZct3VWgLxF2JmXtF1z3FWySWTQ5ijR6aAW/VqJdPgqWjHtgSOZu9jul+Gw3KX 3TnUZhm+k/fGLfF9Cf+qJUTVBkosRTpGjuJRp/fBoe0lgVRhQLXmhjK7zBNE1jsorz0b Y2QwyAiTu1snraVLqePPOtUekZX2p8GwedfXObCWU1ezFNpTtJfggXUb9zp38LmBeVJf 2aAEDywjrsZHnOtFagP5Lizd1dYVkU97hlWm+49pfjSZQ3gQ3VuGAtnkoPIDfA3LlFxJ JSBgE3a7lp1GGldKJ3bNpJibma1+cE8ReXhbAP1f+qwOvhfshaiM2PrEYzi/J0MTcc4o axgQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id ce14si10909394ejb.12.2020.06.16.02.38.24; Tue, 16 Jun 2020 02:38:46 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728365AbgFPJgV (ORCPT + 99 others); Tue, 16 Jun 2020 05:36:21 -0400 Received: from szxga04-in.huawei.com ([45.249.212.190]:6335 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1728243AbgFPJgQ (ORCPT ); Tue, 16 Jun 2020 05:36:16 -0400 Received: from DGGEMS414-HUB.china.huawei.com (unknown [172.30.72.60]) by Forcepoint Email with ESMTP id 9F912D563F9CEB625A78; Tue, 16 Jun 2020 17:36:13 +0800 (CST) Received: from DESKTOP-5IS4806.china.huawei.com (10.173.221.230) by DGGEMS414-HUB.china.huawei.com (10.3.19.214) with Microsoft SMTP Server id 14.3.487.0; Tue, 16 Jun 2020 17:36:06 +0800 From: Keqian Zhu To: , , , CC: Catalin Marinas , Marc Zyngier , James Morse , Will Deacon , "Suzuki K Poulose" , Sean Christopherson , Julien Thierry , Mark Brown , "Thomas Gleixner" , Andrew Morton , Alexios Zavras , , , , Keqian Zhu Subject: [PATCH 03/12] KVM: arm64: Report hardware dirty status of stage2 PTE if coverred Date: Tue, 16 Jun 2020 17:35:44 +0800 Message-ID: <20200616093553.27512-4-zhukeqian1@huawei.com> X-Mailer: git-send-email 2.8.4.windows.1 In-Reply-To: <20200616093553.27512-1-zhukeqian1@huawei.com> References: <20200616093553.27512-1-zhukeqian1@huawei.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.173.221.230] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org kvm_set_pte is called to replace a target PTE with a desired one. We always do this without changing the desired one, but if dirty status set by hardware is coverred, let caller know it. Signed-off-by: Keqian Zhu --- arch/arm64/kvm/mmu.c | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/arch/arm64/kvm/mmu.c b/arch/arm64/kvm/mmu.c index 5ad87bce23c0..27407153121b 100644 --- a/arch/arm64/kvm/mmu.c +++ b/arch/arm64/kvm/mmu.c @@ -194,11 +194,45 @@ static void clear_stage2_pmd_entry(struct kvm *kvm, pmd_t *pmd, phys_addr_t addr put_page(virt_to_page(pmd)); } -static inline void kvm_set_pte(pte_t *ptep, pte_t new_pte) +#ifdef CONFIG_ARM64_HW_AFDBM +/** + * @ret: true if dirty status set by hardware is coverred. + */ +static bool kvm_set_pte(pte_t *ptep, pte_t new_pte) +{ + pteval_t old_pteval, new_pteval, pteval; + bool old_logging, new_no_write; + + old_logging = kvm_hw_dbm_enabled() && !pte_none(*ptep) && + kvm_s2pte_dbm(ptep); + new_no_write = pte_none(new_pte) || kvm_s2pte_readonly(&new_pte); + + if (!old_logging || !new_no_write) { + WRITE_ONCE(*ptep, new_pte); + dsb(ishst); + return false; + } + + new_pteval = pte_val(new_pte); + pteval = READ_ONCE(pte_val(*ptep)); + do { + old_pteval = pteval; + pteval = cmpxchg_relaxed(&pte_val(*ptep), old_pteval, new_pteval); + } while (pteval != old_pteval); + + return !kvm_s2pte_readonly(&__pte(pteval)); +} +#else +/** + * @ret: true if dirty status set by hardware is coverred. + */ +static inline bool kvm_set_pte(pte_t *ptep, pte_t new_pte) { WRITE_ONCE(*ptep, new_pte); dsb(ishst); + return false; } +#endif /* CONFIG_ARM64_HW_AFDBM */ static inline void kvm_set_pmd(pmd_t *pmdp, pmd_t new_pmd) { -- 2.19.1