Received: by 2002:a05:6a10:c7d3:0:0:0:0 with SMTP id h19csp597783pxy; Sat, 14 Aug 2021 17:19:02 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxPc+jckZ9BNLkXhbAdZeXMdq9ymiJezui0gddKIXmF1f/LV2NH6iFDWfcuni33UaaoYyMw X-Received: by 2002:a17:906:4cc1:: with SMTP id q1mr390537ejt.415.1628986741933; Sat, 14 Aug 2021 17:19:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1628986741; cv=none; d=google.com; s=arc-20160816; b=rxm3KRHlmAn2M6a9usrcVRYMvB20x5XfoutICd7L6EeBGqEFxu/pieVxHVn1g3I4Um HghFglX0c6aVBVW9xcvYlhrkL6QomOiA7JM8joy6j8RC15aaJOzunyZXuOGbyJPvPLpb RT+1dgTRKzZmNXDoqsOI6Xy5R3jHuyglZtVzrpw7nRVRkLQ0HKGw6qtA8lLbMsLzk3y6 r49VlJg0oGww0X25Yizp3O9XP4w2MDTIRoZm3ZmDmygkyi/Y6cgVc3sxVo0l+BxtMIMY VDVWJgPyp+DGEQK3izXObZQbEhTELsl675m6htHELXWDgiMfNZ/c5ulYW8bJ9M0oy9U0 03EA== 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=hVwwKdXnrlF17rr7ICUpWrckXNK7bZs/jTIpWezDxag=; b=bt/9hFTvnRzYo3HnVztwIrXgWWQi4hCMrM2V2r7Qnx+DgI87n2QLqhxipMTyWYXA9W O54Oggaoj80FeDf5ok0t+URcYARVdklGXEgkVyeVE9pjtYDSaPlCz7hMEXoJN5T31qJB agDIyBx5JFFHlPsHig3NNMwUlnQn8QS52qzh7ZB7eSWL1QOW0HVGbh/qUzwXW2nxe5hL kw0s2VmzDntn6D2r2iby/whk2ftEfXSGPUcX/6dYYA2B42H9Grbc9E3qHfDkHSjf8GiK 0lRq8NohBmuwSdoMNeIiNPqGsKWM5NfmfkhhZHxfjIAb94cCzY7SrH4wkAv/Mothyfd7 IGrQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=aEESrs8x; 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 kl24si6332243ejc.190.2021.08.14.17.18.39; Sat, 14 Aug 2021 17:19:01 -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=aEESrs8x; 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 S234656AbhHOARL (ORCPT + 99 others); Sat, 14 Aug 2021 20:17:11 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:32799 "EHLO us-smtp-delivery-124.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235841AbhHOAQT (ORCPT ); Sat, 14 Aug 2021 20:16:19 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1628986549; 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=hVwwKdXnrlF17rr7ICUpWrckXNK7bZs/jTIpWezDxag=; b=aEESrs8x+mQ7QUkUCG0w4l66fcGxkKN1UM7H7Be1m0qcJoyLS8L40UaCar+p73n0tFd6sj n19vVti4sluDJDfrNnOWQkezf+z7EsJbwe2c+7DrG6BV09nYEaSTrOEUpkpB3DX1mG+ig8 wif8Zj/92xlcrTF2Xw6w8HISF+AL43M= 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-174-TEb3jDiwMryKxv77RlimrA-1; Sat, 14 Aug 2021 20:15:48 -0400 X-MC-Unique: TEb3jDiwMryKxv77RlimrA-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 35EB21008061; Sun, 15 Aug 2021 00:15:47 +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 224F010074E1; Sun, 15 Aug 2021 00:15:42 +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 19/21] KVM: arm64: Support SDEI event cancellation Date: Sun, 15 Aug 2021 08:13:50 +0800 Message-Id: <20210815001352.81927-20-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 injected SDEI event is to send notification to guest. The SDEI event might not be needed after it's injected. This introduces API to support cancellation on the injected SDEI event if it's not fired to the guest yet. This mechanism will be needed when we're going to support asynchronous page fault. Signed-off-by: Gavin Shan --- arch/arm64/include/asm/kvm_sdei.h | 1 + arch/arm64/kvm/sdei.c | 49 +++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/arch/arm64/include/asm/kvm_sdei.h b/arch/arm64/include/asm/kvm_sdei.h index 51087fe971ba..353744c7bad9 100644 --- a/arch/arm64/include/asm/kvm_sdei.h +++ b/arch/arm64/include/asm/kvm_sdei.h @@ -126,6 +126,7 @@ int kvm_sdei_register_notifier(struct kvm *kvm, unsigned long num, kvm_sdei_notifier notifier); int kvm_sdei_inject(struct kvm_vcpu *vcpu, unsigned long num, bool immediate); +int kvm_sdei_cancel(struct kvm_vcpu *vcpu, unsigned long num); void kvm_sdei_deliver(struct kvm_vcpu *vcpu); long kvm_sdei_vm_ioctl(struct kvm *kvm, unsigned long arg); long kvm_sdei_vcpu_ioctl(struct kvm_vcpu *vcpu, unsigned long arg); diff --git a/arch/arm64/kvm/sdei.c b/arch/arm64/kvm/sdei.c index 7c2789cd1421..4f5a582daa97 100644 --- a/arch/arm64/kvm/sdei.c +++ b/arch/arm64/kvm/sdei.c @@ -907,6 +907,55 @@ int kvm_sdei_inject(struct kvm_vcpu *vcpu, return ret; } +int kvm_sdei_cancel(struct kvm_vcpu *vcpu, unsigned long num) +{ + struct kvm *kvm = vcpu->kvm; + struct kvm_sdei_kvm *ksdei = kvm->arch.sdei; + struct kvm_sdei_vcpu *vsdei = vcpu->arch.sdei; + struct kvm_sdei_kvm_event *kske = NULL; + struct kvm_sdei_vcpu_event *ksve = NULL; + int ret = 0; + + if (!(ksdei && vsdei)) { + ret = -EPERM; + goto out; + } + + /* Find the vCPU event */ + spin_lock(&vsdei->lock); + ksve = kvm_sdei_find_vcpu_event(vcpu, num); + if (!ksve) { + ret = -EINVAL; + goto unlock; + } + + /* Event can't be cancelled if it has been delivered */ + if (ksve->state.refcount <= 1 && + (vsdei->critical_event == ksve || + vsdei->normal_event == ksve)) { + ret = -EINPROGRESS; + goto unlock; + } + + /* Free the vCPU event if necessary */ + kske = ksve->kske; + ksve->state.refcount--; + if (!ksve->state.refcount) { + list_del(&ksve->link); + kfree(ksve); + } + +unlock: + spin_unlock(&vsdei->lock); + if (kske) { + spin_lock(&ksdei->lock); + kske->state.refcount--; + spin_unlock(&ksdei->lock); + } +out: + return ret; +} + void kvm_sdei_deliver(struct kvm_vcpu *vcpu) { struct kvm *kvm = vcpu->kvm; -- 2.23.0