From patchwork Fri Jun 17 01:41:47 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Xu X-Patchwork-Id: 12885026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 932F3CCA47A for ; Fri, 17 Jun 2022 01:42:07 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id CDE2D6B0078; Thu, 16 Jun 2022 21:42:06 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id C66066B007B; Thu, 16 Jun 2022 21:42:06 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id A6A746B007D; Thu, 16 Jun 2022 21:42:06 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 928F06B0078 for ; Thu, 16 Jun 2022 21:42:06 -0400 (EDT) Received: from smtpin27.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 6BA7920888 for ; Fri, 17 Jun 2022 01:42:06 +0000 (UTC) X-FDA: 79586027052.27.4C28B1B Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by imf24.hostedemail.com (Postfix) with ESMTP id 81942180087 for ; Fri, 17 Jun 2022 01:42:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1655430124; 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=+Bc6oiDMKyczPP3MnRg+YG2Ibpmu1/F27D1fgoc2Uo0=; b=TV6DXJjY1kXgx3weTVnI3QEAXEKKgojclb8llBf9yXc6d8TMbKatV0JrYOZZssOrr4cLNk V7hNdtFB7JSh5H4EbE8a2IN0RZG48LXE5lKpGNgThX+Pa9s3GgHL74QKQ0cfA5BxiFGXnf AkfrLKwdTFENpTAhTN9e80aC2z4gmio= Received: from mail-io1-f70.google.com (mail-io1-f70.google.com [209.85.166.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-331-P3Sl5d1AMSGXugtCEWDiFw-1; Thu, 16 Jun 2022 21:42:01 -0400 X-MC-Unique: P3Sl5d1AMSGXugtCEWDiFw-1 Received: by mail-io1-f70.google.com with SMTP id h4-20020a056602008400b0066a011ac3d6so1752083iob.14 for ; Thu, 16 Jun 2022 18:42:00 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=+Bc6oiDMKyczPP3MnRg+YG2Ibpmu1/F27D1fgoc2Uo0=; b=UC4YlQEmk6zA+7yHIhPLBCy1GfqTU4Pqm10LYjZEPfAzNrAo4XBGs9BiucYqb9yPG+ PoaNc118n9emTHSkLgWWvctJb/IWuA+dJfLY8j2ShQVZep22wdsTLzwvTVLTQYgVxn9A FhJR+7JEagX4raT8Z1IZqsuGiYmOg5rzEOKdETgVD00G3FiEE0OAempa1pLAvxxw+rWM ZpWANhig/579uB4nxgRJmDepGU5sO3CTpbq/U369VxhE3azqAMhAoFRQXKQBwtJGWa8J inPc2Sz8tnt8NkZ74ivDyySgAkKYrjdx8qJomTp2FJf0Bh+Vds9BNH9SsmTeuZcyirpN 5YVA== X-Gm-Message-State: AJIora8EhiFbCo8DDQxFHu8zVJsyxn4UlNbg3R3VC90Q8a6OzDTqvcoq Pr4TdDeb5EH8D4n4cSOgGe5ooEqXYfU2+lSTCcyWNjQVg+ZqRWJobefzq5YCfiGrV/7qF2S4pNG rxQdDmGKhtnA= X-Received: by 2002:a92:da4e:0:b0:2d6:6554:a33b with SMTP id p14-20020a92da4e000000b002d66554a33bmr4355223ilq.10.1655430118246; Thu, 16 Jun 2022 18:41:58 -0700 (PDT) X-Google-Smtp-Source: AGRyM1vLhgSniNb4wQ9rsYIx2n9iJ0unph2M/HKN3cx1HhnNV8Tgz+efjRctqDyhOiUvQlicAOOc3w== X-Received: by 2002:a92:da4e:0:b0:2d6:6554:a33b with SMTP id p14-20020a92da4e000000b002d66554a33bmr4355213ilq.10.1655430117980; Thu, 16 Jun 2022 18:41:57 -0700 (PDT) Received: from localhost.localdomain (cpec09435e3e0ee-cmc09435e3e0ec.cpe.net.cable.rogers.com. [99.241.198.116]) by smtp.gmail.com with ESMTPSA id n4-20020a056e02140400b002d522958fb4sm1726538ilo.2.2022.06.16.18.41.56 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Thu, 16 Jun 2022 18:41:57 -0700 (PDT) From: Peter Xu To: kvm@vger.kernel.org, linux-kernel@vger.kernel.org Cc: "Dr . David Alan Gilbert" , Linux MM Mailing List , Sean Christopherson , Paolo Bonzini , Andrea Arcangeli , Andrew Morton , peterx@redhat.com Subject: [PATCH RFC 4/4] kvm/x86: Allow to respond to generic signals during slow page faults Date: Thu, 16 Jun 2022 21:41:47 -0400 Message-Id: <20220617014147.7299-5-peterx@redhat.com> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220617014147.7299-1-peterx@redhat.com> References: <20220617014147.7299-1-peterx@redhat.com> MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-type: text/plain ARC-Authentication-Results: i=1; imf24.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=TV6DXJjY; dmarc=pass (policy=none) header.from=redhat.com; spf=none (imf24.hostedemail.com: domain of peterx@redhat.com has no SPF policy when checking 170.10.129.124) smtp.mailfrom=peterx@redhat.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1655430126; h=from:from:sender: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:dkim-signature; bh=+Bc6oiDMKyczPP3MnRg+YG2Ibpmu1/F27D1fgoc2Uo0=; b=51onhB7YBnGOj0UvmAUDbfrXnF2Ineviz2FJej9Cg/avPufbdbvlIWiRQifHOyH4R1kKuF 7WuI2pxTv6isnXK/2d/OFcA+Zk3vjSuBnLyqYSkqrPKQc7gSuIvlBJzB596c/BBjbtDeLl EF6fViB/Ee5UyrIwACELSCONSnRkOFc= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1655430126; a=rsa-sha256; cv=none; b=wg/Th4tNK8nFX0jRC5/1zXznqQst3HJMsTT9+pmpRB+Z9QC/j4w2qlstZe8U41E4akuGbH TY/PGhGdSfYXW+Mu3j0sOJUwdh1p29vgTht2SJLkfbfGK8Qhey26aR8dlh4zBiibo9TfGP v/9Y6BN3ZJGB/azrBpRNbORa2BvyTug= X-Rspam-User: X-Stat-Signature: j4437szq5qyb3s7fwr1fihn43q7oucaz X-Rspamd-Queue-Id: 81942180087 Authentication-Results: imf24.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=TV6DXJjY; dmarc=pass (policy=none) header.from=redhat.com; spf=none (imf24.hostedemail.com: domain of peterx@redhat.com has no SPF policy when checking 170.10.129.124) smtp.mailfrom=peterx@redhat.com X-Rspamd-Server: rspam05 X-HE-Tag: 1655430125-439202 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: All the facilities should be ready for this, what we need to do is to add a new KVM_GTP_INTERRUPTIBLE flag showing that we're willing to be interrupted by common signals during the __gfn_to_pfn_memslot() request, and wire it up with a FOLL_INTERRUPTIBLE flag that we've just introduced. Note that only x86 slow page fault routine will set this new bit. The new bit is not used in non-x86 arch or on other gup paths even for x86. However it can actually be used elsewhere too but not yet covered. When we see the PFN fetching was interrupted, do early exit to userspace with an KVM_EXIT_INTR exit reason. Signed-off-by: Peter Xu --- arch/x86/kvm/mmu/mmu.c | 9 +++++++++ include/linux/kvm_host.h | 1 + virt/kvm/kvm_main.c | 4 ++++ 3 files changed, 14 insertions(+) diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c index e92f1ab63d6a..b39acb7cb16d 100644 --- a/arch/x86/kvm/mmu/mmu.c +++ b/arch/x86/kvm/mmu/mmu.c @@ -3012,6 +3012,13 @@ static int kvm_handle_bad_page(struct kvm_vcpu *vcpu, gfn_t gfn, kvm_pfn_t pfn) static int handle_abnormal_pfn(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault, unsigned int access) { + /* NOTE: not all error pfn is fatal; handle intr before the other ones */ + if (unlikely(is_intr_pfn(fault->pfn))) { + vcpu->run->exit_reason = KVM_EXIT_INTR; + ++vcpu->stat.signal_exits; + return -EINTR; + } + /* The pfn is invalid, report the error! */ if (unlikely(is_error_pfn(fault->pfn))) return kvm_handle_bad_page(vcpu, fault->gfn, fault->pfn); @@ -4017,6 +4024,8 @@ static int kvm_faultin_pfn(struct kvm_vcpu *vcpu, struct kvm_page_fault *fault) } } + /* Allow to respond to generic signals in slow page faults */ + flags |= KVM_GTP_INTERRUPTIBLE; fault->pfn = __gfn_to_pfn_memslot(slot, fault->gfn, flags, NULL, &fault->map_writable, &fault->hva); return RET_PF_CONTINUE; diff --git a/include/linux/kvm_host.h b/include/linux/kvm_host.h index 4f84a442f67f..c8d98e435537 100644 --- a/include/linux/kvm_host.h +++ b/include/linux/kvm_host.h @@ -1163,6 +1163,7 @@ typedef unsigned int __bitwise kvm_gtp_flag_t; #define KVM_GTP_WRITE ((__force kvm_gtp_flag_t) BIT(0)) #define KVM_GTP_ATOMIC ((__force kvm_gtp_flag_t) BIT(1)) +#define KVM_GTP_INTERRUPTIBLE ((__force kvm_gtp_flag_t) BIT(2)) kvm_pfn_t __gfn_to_pfn_memslot(const struct kvm_memory_slot *slot, gfn_t gfn, kvm_gtp_flag_t gtp_flags, bool *async, diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 952400b42ee9..b3873cac5672 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c @@ -2462,6 +2462,8 @@ static int hva_to_pfn_slow(unsigned long addr, bool *async, flags |= FOLL_WRITE; if (async) flags |= FOLL_NOWAIT; + if (gtp_flags & KVM_GTP_INTERRUPTIBLE) + flags |= FOLL_INTERRUPTIBLE; npages = get_user_pages_unlocked(addr, 1, &page, flags); if (npages != 1) @@ -2599,6 +2601,8 @@ kvm_pfn_t hva_to_pfn(unsigned long addr, kvm_gtp_flag_t gtp_flags, bool *async, npages = hva_to_pfn_slow(addr, async, gtp_flags, writable, &pfn); if (npages == 1) return pfn; + if (npages == -EINTR) + return KVM_PFN_ERR_INTR; mmap_read_lock(current->mm); if (npages == -EHWPOISON ||