Received: by 2002:a05:6358:4e97:b0:b3:742d:4702 with SMTP id ce23csp1862775rwb; Fri, 19 Aug 2022 10:37:40 -0700 (PDT) X-Google-Smtp-Source: AA6agR4FGpri8Bfhp48f0IMw+dIwJoU20u0/xoHja5rqvzehLoDBxLq+RktXHkddMxf9G6pYV/4p X-Received: by 2002:a17:90b:2114:b0:1fa:f716:a426 with SMTP id kz20-20020a17090b211400b001faf716a426mr1150429pjb.19.1660930660141; Fri, 19 Aug 2022 10:37:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1660930660; cv=none; d=google.com; s=arc-20160816; b=LkrC6+hZ2pFkPpeYImNIgZV6zDhspu3C+OZzhB8WG+sGdSBEI9e0nfGCUmoT2+AtEX TdwBeaPmoie03/6vC/R/0ZA+hREix+uu5lvHen7uekUwfsQwsCKA/x16jabd/AFJou4S aa24SgNyFMxhsDMc8ZLUtAidigptF3aCuRrkQd7205Ce3Qd3cQYibl8KNxmQ5t9dqtzr 6ox8QPiYIP93gtoAJnAR5t9rGL80adZRhJZ22PNN0shsCqRVgWAbdqaQt39O6XHYQAPV hhH1unv6t5ERO6g89xpivMoRwAQhTJqtnQuPYphCeAQ4dvYjnXtl9wclnRElTEduCPgE hVkg== 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 :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=eJRmD05uk1GYzRW7/0LSHzzubOWDk3VoB2AogoRtNDg=; b=wUlwRjClllc1HrjAHtDquCDQaR4O9qSBYz6TON4jWyfFoq5TGYA6L6WlFnc0mSaebB 7+Vt4ZntD+sHn4Gg0+aTrTOEQaKg7t+Mi5/s4pNMZ0lTSH7f+cwffSTxjIg75vVR+xXk izT37HZXKOa55iosO+jmUmQEfekEXCg+jj27q0Tt2EZrRKCxMcOpd7nK//DjAa2eI1Im AJW85waukdPqjqhDotA9cDo+leBV+a5lUXsTq92mtfcOOmwQR2WmTrGJPtFqMz7PHFO5 mKzb6Tbr5q1Yiy6TmTeQEAuwJvBuh9kO8hL0jfa2sp3BwXl1IP7MgH9ckAQXSC+3DvlN pnDA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=wQZLUIPn; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id u184-20020a6385c1000000b0042a1235c022si3241178pgd.160.2022.08.19.10.37.28; Fri, 19 Aug 2022 10:37:40 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=wQZLUIPn; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1350291AbiHSPtQ (ORCPT + 99 others); Fri, 19 Aug 2022 11:49:16 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51296 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1350154AbiHSPsR (ORCPT ); Fri, 19 Aug 2022 11:48:17 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [IPv6:2604:1380:4641:c500::1]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 36B90140AC; Fri, 19 Aug 2022 08:47:20 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id 59E69616C0; Fri, 19 Aug 2022 15:47:19 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 61735C433C1; Fri, 19 Aug 2022 15:47:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1660924038; bh=wxkK3CGBBNCMKc/Xl1PPp5Cax6gSVTXDuNGWRE+qCUg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=wQZLUIPnlLPbgQv/ZKJ/6KlN5aQBeGoV/9E2Kq7ovcNrgLjEs1K6HIsISDNxqXahu t1GW/HjU2MzgRPdqEjV8vDN9P4yvdpxbU7drVJkgz9V21GJOdNr6G7UmLfu7XQDOuJ G20uh02L447U85TFdiwpFZFr+ehxFd5QX7N0Q6QQ= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Nico Boehr , Claudio Imbrenda , Janosch Frank , Christian Borntraeger Subject: [PATCH 5.10 017/545] KVM: s390: pv: dont present the ecall interrupt twice Date: Fri, 19 Aug 2022 17:36:27 +0200 Message-Id: <20220819153829.947767616@linuxfoundation.org> X-Mailer: git-send-email 2.37.2 In-Reply-To: <20220819153829.135562864@linuxfoundation.org> References: <20220819153829.135562864@linuxfoundation.org> User-Agent: quilt/0.67 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-7.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Nico Boehr commit c3f0e5fd2d33d80c5a5a8b5e5d2bab2841709cc8 upstream. When the SIGP interpretation facility is present and a VCPU sends an ecall to another VCPU in enabled wait, the sending VCPU receives a 56 intercept (partial execution), so KVM can wake up the receiving CPU. Note that the SIGP interpretation facility will take care of the interrupt delivery and KVM's only job is to wake the receiving VCPU. For PV, the sending VCPU will receive a 108 intercept (pv notify) and should continue like in the non-PV case, i.e. wake the receiving VCPU. For PV and non-PV guests the interrupt delivery will occur through the SIGP interpretation facility on SIE entry when SIE finds the X bit in the status field set. However, in handle_pv_notification(), there was no special handling for SIGP, which leads to interrupt injection being requested by KVM for the next SIE entry. This results in the interrupt being delivered twice: once by the SIGP interpretation facility and once by KVM through the IICTL. Add the necessary special handling in handle_pv_notification(), similar to handle_partial_execution(), which simply wakes the receiving VCPU and leave interrupt delivery to the SIGP interpretation facility. In contrast to external calls, emergency calls are not interpreted but also cause a 108 intercept, which is why we still need to call handle_instruction() for SIGP orders other than ecall. Since kvm_s390_handle_sigp_pei() is now called for all SIGP orders which cause a 108 intercept - even if they are actually handled by handle_instruction() - move the tracepoint in kvm_s390_handle_sigp_pei() to avoid possibly confusing trace messages. Signed-off-by: Nico Boehr Cc: # 5.7 Fixes: da24a0cc58ed ("KVM: s390: protvirt: Instruction emulation") Reviewed-by: Claudio Imbrenda Reviewed-by: Janosch Frank Reviewed-by: Christian Borntraeger Link: https://lore.kernel.org/r/20220718130434.73302-1-nrb@linux.ibm.com Message-Id: <20220718130434.73302-1-nrb@linux.ibm.com> Signed-off-by: Claudio Imbrenda Signed-off-by: Greg Kroah-Hartman --- arch/s390/kvm/intercept.c | 15 +++++++++++++++ arch/s390/kvm/sigp.c | 4 ++-- 2 files changed, 17 insertions(+), 2 deletions(-) --- a/arch/s390/kvm/intercept.c +++ b/arch/s390/kvm/intercept.c @@ -521,12 +521,27 @@ static int handle_pv_uvc(struct kvm_vcpu static int handle_pv_notification(struct kvm_vcpu *vcpu) { + int ret; + if (vcpu->arch.sie_block->ipa == 0xb210) return handle_pv_spx(vcpu); if (vcpu->arch.sie_block->ipa == 0xb220) return handle_pv_sclp(vcpu); if (vcpu->arch.sie_block->ipa == 0xb9a4) return handle_pv_uvc(vcpu); + if (vcpu->arch.sie_block->ipa >> 8 == 0xae) { + /* + * Besides external call, other SIGP orders also cause a + * 108 (pv notify) intercept. In contrast to external call, + * these orders need to be emulated and hence the appropriate + * place to handle them is in handle_instruction(). + * So first try kvm_s390_handle_sigp_pei() and if that isn't + * successful, go on with handle_instruction(). + */ + ret = kvm_s390_handle_sigp_pei(vcpu); + if (!ret) + return ret; + } return handle_instruction(vcpu); } --- a/arch/s390/kvm/sigp.c +++ b/arch/s390/kvm/sigp.c @@ -492,9 +492,9 @@ int kvm_s390_handle_sigp_pei(struct kvm_ struct kvm_vcpu *dest_vcpu; u8 order_code = kvm_s390_get_base_disp_rs(vcpu, NULL); - trace_kvm_s390_handle_sigp_pei(vcpu, order_code, cpu_addr); - if (order_code == SIGP_EXTERNAL_CALL) { + trace_kvm_s390_handle_sigp_pei(vcpu, order_code, cpu_addr); + dest_vcpu = kvm_get_vcpu_by_id(vcpu->kvm, cpu_addr); BUG_ON(dest_vcpu == NULL);