Received: by 2002:a05:6a10:c7d3:0:0:0:0 with SMTP id h19csp597641pxy; Sat, 14 Aug 2021 17:18:44 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxL4d1u4C9b2umPzUuf3QaDq5YA6/3yMV790mfu/D5JQL0q+BqJtK8BdW27ML3Dnk/t0J46 X-Received: by 2002:a17:906:3ada:: with SMTP id z26mr9185143ejd.404.1628986723809; Sat, 14 Aug 2021 17:18:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1628986723; cv=none; d=google.com; s=arc-20160816; b=V+KttqsHl4tqKV0ky/9h7PVmiq+zBDA8NlzP/UHQkqNka+0DrE/TCN6BLrrgtpQeyx hKdJY7+iuEj4iNS78Kzrv0tADgbGY5bzmd937XFppDFsC1kCa9rzFyIoZ7Y2bgkVONml TC9gaLIyLO7zK3RwqCgaHlNhwnM1jrZmC7GPQbkWtSBg38m/yoWLtQNTfq8/n3bRYRnV mnYmrxy/FlDR1ZPuZVSNV1CgHuS/qYGcNN7t/8SI90lxA52NzHwI8IA8oAfmdVgPBrYt zkbcO4iO9PYPBus/0JuvVW2bQxUhEm2DVbEjpG9dnpdVtBqxHw5J7+em/SJpIpCXHehd 20rw== 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 :dkim-signature; bh=sW1X3gp7m/GFtVG+z9c8/k60gef/0uXdphaW+9SFdnQ=; b=DgmC1LF5FSmYOvZP6dT9R10OaeDDBExpMD8lWWHO/73eDX7AVOXBXhNW8TAj12q+VQ HTRr3Koq1lIC8TkkNBOsl/pL/Zw4/eGp+bAWJ66CroIBz9yi1SrEZwD8VO1aMkOHQv5t 6/1WXXkE3QfqIePozDd6xZ//cFc+l1IZcTxDzzwVEIKO+m9hVzDnYVeva7wfuZrqCThN QRinVaQ7fYW1cV1xmgGKpkwRDkEaAfURaMoGHyExQpv3wFvLzbeE9hcv51WRgQTPejQB FDQVbLi6s1Xly3kN52mb6H2vb0sic6NnXOJlQHBWbz5oIarHCOe/6R9L19ahYSj6eNS0 v3qg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=eFdzhEej; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id y2si4534938eje.137.2021.08.14.17.18.21; Sat, 14 Aug 2021 17:18:43 -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; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=eFdzhEej; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235994AbhHOAQZ (ORCPT + 99 others); Sat, 14 Aug 2021 20:16:25 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:38348 "EHLO us-smtp-delivery-124.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235029AbhHOAP6 (ORCPT ); Sat, 14 Aug 2021 20:15:58 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1628986528; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=sW1X3gp7m/GFtVG+z9c8/k60gef/0uXdphaW+9SFdnQ=; b=eFdzhEejphhI3KvYKil9Tt8dk1JUtPNFWi3mK/VeOus4DF5+CZ1vlDT+u8UYbnxm5mpFvo rsEH2qiNJabTPcmvnwzeP3G3FJiDJyDsjgLf9Pk0z2jMRmePEbTR3Fwq1JGJPUjX6vjno/ 70w3MhiN41IW8fyQn/ceJEH53LBo35s= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-232-XoiDwPOUOyaoGvvTFvid5w-1; Sat, 14 Aug 2021 20:15:27 -0400 X-MC-Unique: XoiDwPOUOyaoGvvTFvid5w-1 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id E897187122E; Sun, 15 Aug 2021 00:15:25 +0000 (UTC) Received: from gshan.redhat.com (vpn2-54-103.bne.redhat.com [10.64.54.103]) by smtp.corp.redhat.com (Postfix) with ESMTPS id C70DD10016FF; Sun, 15 Aug 2021 00:15:22 +0000 (UTC) From: Gavin Shan To: kvmarm@lists.cs.columbia.edu Cc: linux-kernel@vger.kernel.org, james.morse@arm.com, mark.rutland@arm.com, Jonathan.Cameron@huawei.com, will@kernel.org, maz@kernel.org, pbonzini@redhat.com Subject: [PATCH v4 15/21] KVM: arm64: Support SDEI event notifier Date: Sun, 15 Aug 2021 08:13:46 +0800 Message-Id: <20210815001352.81927-16-gshan@redhat.com> In-Reply-To: <20210815001352.81927-1-gshan@redhat.com> References: <20210815001352.81927-1-gshan@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The owner of the SDEI event, like asynchronous page fault, need know the state of injected SDEI event. This supports SDEI event state updating by introducing notifier mechanism. It's notable the notifier (handler) should be capable of migration. Signed-off-by: Gavin Shan --- arch/arm64/include/asm/kvm_sdei.h | 12 +++++++ arch/arm64/include/uapi/asm/kvm_sdei.h | 1 + arch/arm64/kvm/sdei.c | 45 +++++++++++++++++++++++++- 3 files changed, 57 insertions(+), 1 deletion(-) diff --git a/arch/arm64/include/asm/kvm_sdei.h b/arch/arm64/include/asm/kvm_sdei.h index 7f5f5ad689e6..19f2d9b91f85 100644 --- a/arch/arm64/include/asm/kvm_sdei.h +++ b/arch/arm64/include/asm/kvm_sdei.h @@ -16,6 +16,16 @@ #include #include +struct kvm_vcpu; + +typedef void (*kvm_sdei_notifier)(struct kvm_vcpu *vcpu, + unsigned long num, + unsigned int state); +enum { + KVM_SDEI_NOTIFY_DELIVERED, + KVM_SDEI_NOTIFY_COMPLETED, +}; + struct kvm_sdei_event { struct kvm_sdei_event_state state; struct kvm *kvm; @@ -112,6 +122,8 @@ KVM_SDEI_FLAG_FUNC(enabled) void kvm_sdei_init_vm(struct kvm *kvm); void kvm_sdei_create_vcpu(struct kvm_vcpu *vcpu); int kvm_sdei_hypercall(struct kvm_vcpu *vcpu); +int kvm_sdei_register_notifier(struct kvm *kvm, unsigned long num, + kvm_sdei_notifier notifier); void kvm_sdei_deliver(struct kvm_vcpu *vcpu); void kvm_sdei_destroy_vcpu(struct kvm_vcpu *vcpu); void kvm_sdei_destroy_vm(struct kvm *kvm); diff --git a/arch/arm64/include/uapi/asm/kvm_sdei.h b/arch/arm64/include/uapi/asm/kvm_sdei.h index 8928027023f6..4ef661d106fe 100644 --- a/arch/arm64/include/uapi/asm/kvm_sdei.h +++ b/arch/arm64/include/uapi/asm/kvm_sdei.h @@ -23,6 +23,7 @@ struct kvm_sdei_event_state { __u8 type; __u8 signaled; __u8 priority; + __u64 notifier; }; struct kvm_sdei_kvm_event_state { diff --git a/arch/arm64/kvm/sdei.c b/arch/arm64/kvm/sdei.c index 1e8e213c9d70..5f7a37dcaa77 100644 --- a/arch/arm64/kvm/sdei.c +++ b/arch/arm64/kvm/sdei.c @@ -314,9 +314,11 @@ static unsigned long kvm_sdei_hypercall_complete(struct kvm_vcpu *vcpu, struct kvm *kvm = vcpu->kvm; struct kvm_sdei_kvm *ksdei = kvm->arch.sdei; struct kvm_sdei_vcpu *vsdei = vcpu->arch.sdei; + struct kvm_sdei_event *kse = NULL; struct kvm_sdei_kvm_event *kske = NULL; struct kvm_sdei_vcpu_event *ksve = NULL; struct kvm_sdei_vcpu_regs *regs; + kvm_sdei_notifier notifier; unsigned long ret = SDEI_SUCCESS; int index; @@ -349,6 +351,13 @@ static unsigned long kvm_sdei_hypercall_complete(struct kvm_vcpu *vcpu, *vcpu_cpsr(vcpu) = regs->pstate; *vcpu_pc(vcpu) = regs->pc; + /* Notifier */ + kske = ksve->kske; + kse = kske->kse; + notifier = (kvm_sdei_notifier)(kse->state.notifier); + if (notifier) + notifier(vcpu, kse->state.num, KVM_SDEI_NOTIFY_COMPLETED); + /* Inject interrupt if needed */ if (resume) kvm_inject_irq(vcpu); @@ -358,7 +367,6 @@ static unsigned long kvm_sdei_hypercall_complete(struct kvm_vcpu *vcpu, * event state as it's not destroyed because of the reference * count. */ - kske = ksve->kske; ksve->state.refcount--; kske->state.refcount--; if (!ksve->state.refcount) { @@ -746,6 +754,35 @@ int kvm_sdei_hypercall(struct kvm_vcpu *vcpu) return 1; } +int kvm_sdei_register_notifier(struct kvm *kvm, + unsigned long num, + kvm_sdei_notifier notifier) +{ + struct kvm_sdei_kvm *ksdei = kvm->arch.sdei; + struct kvm_sdei_event *kse = NULL; + int ret = 0; + + if (!ksdei) { + ret = -EPERM; + goto out; + } + + spin_lock(&ksdei->lock); + + kse = kvm_sdei_find_event(kvm, num); + if (!kse) { + ret = -EINVAL; + goto unlock; + } + + kse->state.notifier = (unsigned long)notifier; + +unlock: + spin_unlock(&ksdei->lock); +out: + return ret; +} + void kvm_sdei_deliver(struct kvm_vcpu *vcpu) { struct kvm *kvm = vcpu->kvm; @@ -755,6 +792,7 @@ void kvm_sdei_deliver(struct kvm_vcpu *vcpu) struct kvm_sdei_kvm_event *kske = NULL; struct kvm_sdei_vcpu_event *ksve = NULL; struct kvm_sdei_vcpu_regs *regs = NULL; + kvm_sdei_notifier notifier; unsigned long pstate; int index = 0; @@ -826,6 +864,11 @@ void kvm_sdei_deliver(struct kvm_vcpu *vcpu) *vcpu_cpsr(vcpu) = pstate; *vcpu_pc(vcpu) = kske->state.entries[index]; + /* Notifier */ + notifier = (kvm_sdei_notifier)(kse->state.notifier); + if (notifier) + notifier(vcpu, kse->state.num, KVM_SDEI_NOTIFY_DELIVERED); + unlock: spin_unlock(&vsdei->lock); } -- 2.23.0