Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp13657824pxu; Mon, 4 Jan 2021 00:18:47 -0800 (PST) X-Google-Smtp-Source: ABdhPJyvjrY3O6z0V3n4EOAIp4U3AgGqjX52KrTIvH8UJ6Y2Gw8SvOO/nml97ySxwhEyEIkSpbnA X-Received: by 2002:aa7:d915:: with SMTP id a21mr18056501edr.251.1609748327363; Mon, 04 Jan 2021 00:18:47 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1609748327; cv=none; d=google.com; s=arc-20160816; b=jI/FPVzLwFlc84WGUqwhXFNFaAsFuwh/XePC1LMAWhyUKdrjYhh5OOF2Xk0v8GyxDz b5edSOIjyniU8ioe7RGjsNvO0kPdCbRh2ofwb9A4g9V+zS4CmqPehvAQIIHTkLCEISNk tfjCw/2O+JMlYj5YrEa+oXXJkCJNnmzfSSO+2AmLjCYZhBW5VQHEgRUfNaExsWiYE6ii JUL4qKAT9ES6/y8xzVao8g+cy+pQoIT30T9lOscfr8fc+mr5ZWxt8/+4iQx/8F73CyKR nljIe1vTaUJzBjaPI/g1qOpEamqIbKYLhYnYylEQomMVsNpMEWkZfMStvsJT9VR99aMz l5Vw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=o8rZuXcA6HiwwNZWdFcvcu4t924xayvOyMArpKsY9fA=; b=tA7i0KDiklUu8DooCtKSFyvnXNVrHNf0AzQthGkr8oU9cHf0ZbPTy0luWjl6sGehKH YK6sGVK3Mn+ZbwqFkXL3wbWOK84P6kqnT1Jx45hEkIphfZgAwaEJT52ZiGjD7NjCSVKc OxtOLvdrpp+7Uopi4ZXSeEVV1l1sG8uBCEJj12828lpRVA5co7Lk+AbPnuaXu9a1vFnJ ezgfdZNzj9AUEO9vw7CQdyP6A8AmJgDB72m1gLhUQdAZzZQw0EV0VZX9mG3hFhXcEdRz 1eWDl0dFUvkFLiN8zZOG5mHthJiykeS0NXoFbH4FLsAmFb3bNUS6AZn4uf8pys6wxMT5 1P8A== 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 n16si32195947edb.217.2021.01.04.00.18.24; Mon, 04 Jan 2021 00:18:47 -0800 (PST) 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 S1726807AbhADIRq (ORCPT + 99 others); Mon, 4 Jan 2021 03:17:46 -0500 Received: from szxga05-in.huawei.com ([45.249.212.191]:10103 "EHLO szxga05-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726655AbhADIRq (ORCPT ); Mon, 4 Jan 2021 03:17:46 -0500 Received: from DGGEMS403-HUB.china.huawei.com (unknown [172.30.72.60]) by szxga05-in.huawei.com (SkyGuard) with ESMTP id 4D8T3G3CvKzMF8l; Mon, 4 Jan 2021 16:15:54 +0800 (CST) Received: from DESKTOP-7FEPK9S.china.huawei.com (10.174.184.196) by DGGEMS403-HUB.china.huawei.com (10.3.19.203) with Microsoft SMTP Server id 14.3.498.0; Mon, 4 Jan 2021 16:16:52 +0800 From: Shenming Lu To: Marc Zyngier , Eric Auger , "Will Deacon" , , , , CC: Alex Williamson , Cornelia Huck , Lorenzo Pieralisi , , , Subject: [RFC PATCH v2 2/4] KVM: arm64: GICv4.1: Try to save hw pending state in save_pending_tables Date: Mon, 4 Jan 2021 16:16:11 +0800 Message-ID: <20210104081613.100-3-lushenming@huawei.com> X-Mailer: git-send-email 2.27.0.windows.1 In-Reply-To: <20210104081613.100-1-lushenming@huawei.com> References: <20210104081613.100-1-lushenming@huawei.com> MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit X-Originating-IP: [10.174.184.196] X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org After pausing all vCPUs and devices capable of interrupting, in order to save the information of all interrupts, besides flushing the pending states in kvm’s vgic, we also try to flush the states of VLPIs in the virtual pending tables into guest RAM, but we need to have GICv4.1 and safely unmap the vPEs first. Signed-off-by: Shenming Lu --- arch/arm64/kvm/vgic/vgic-v3.c | 58 +++++++++++++++++++++++++++++++---- 1 file changed, 52 insertions(+), 6 deletions(-) diff --git a/arch/arm64/kvm/vgic/vgic-v3.c b/arch/arm64/kvm/vgic/vgic-v3.c index 9cdf39a94a63..a58c94127cb0 100644 --- a/arch/arm64/kvm/vgic/vgic-v3.c +++ b/arch/arm64/kvm/vgic/vgic-v3.c @@ -1,6 +1,8 @@ // SPDX-License-Identifier: GPL-2.0-only #include +#include +#include #include #include #include @@ -356,6 +358,38 @@ int vgic_v3_lpi_sync_pending_status(struct kvm *kvm, struct vgic_irq *irq) return 0; } +/* + * The deactivation of the doorbell interrupt will trigger the + * unmapping of the associated vPE. + */ +static void unmap_all_vpes(struct vgic_dist *dist) +{ + struct irq_desc *desc; + int i; + + if (!kvm_vgic_global_state.has_gicv4_1) + return; + + for (i = 0; i < dist->its_vm.nr_vpes; i++) { + desc = irq_to_desc(dist->its_vm.vpes[i]->irq); + irq_domain_deactivate_irq(irq_desc_get_irq_data(desc)); + } +} + +static void map_all_vpes(struct vgic_dist *dist) +{ + struct irq_desc *desc; + int i; + + if (!kvm_vgic_global_state.has_gicv4_1) + return; + + for (i = 0; i < dist->its_vm.nr_vpes; i++) { + desc = irq_to_desc(dist->its_vm.vpes[i]->irq); + irq_domain_activate_irq(irq_desc_get_irq_data(desc), false); + } +} + /** * vgic_v3_save_pending_tables - Save the pending tables into guest RAM * kvm lock and all vcpu lock must be held @@ -365,14 +399,18 @@ int vgic_v3_save_pending_tables(struct kvm *kvm) struct vgic_dist *dist = &kvm->arch.vgic; struct vgic_irq *irq; gpa_t last_ptr = ~(gpa_t)0; - int ret; + int ret = 0; u8 val; + /* As a preparation for getting any VLPI states. */ + unmap_all_vpes(dist); + list_for_each_entry(irq, &dist->lpi_list_head, lpi_list) { int byte_offset, bit_nr; struct kvm_vcpu *vcpu; gpa_t pendbase, ptr; bool stored; + bool is_pending = irq->pending_latch; vcpu = irq->target_vcpu; if (!vcpu) @@ -387,24 +425,32 @@ int vgic_v3_save_pending_tables(struct kvm *kvm) if (ptr != last_ptr) { ret = kvm_read_guest_lock(kvm, ptr, &val, 1); if (ret) - return ret; + goto out; last_ptr = ptr; } stored = val & (1U << bit_nr); - if (stored == irq->pending_latch) + + if (irq->hw) + vgic_v4_get_vlpi_state(irq, &is_pending); + + if (stored == is_pending) continue; - if (irq->pending_latch) + if (is_pending) val |= 1 << bit_nr; else val &= ~(1 << bit_nr); ret = kvm_write_guest_lock(kvm, ptr, &val, 1); if (ret) - return ret; + goto out; } - return 0; + +out: + map_all_vpes(dist); + + return ret; } /** -- 2.19.1