From patchwork Wed Nov 28 10:19:43 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Mueller X-Patchwork-Id: 10702285 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 9E43013A4 for ; Wed, 28 Nov 2018 10:20:58 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8F9192CF81 for ; Wed, 28 Nov 2018 10:20:58 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 83C0B2CFAC; Wed, 28 Nov 2018 10:20:58 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DE5ED2CFBE for ; Wed, 28 Nov 2018 10:20:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728259AbeK1VWF (ORCPT ); Wed, 28 Nov 2018 16:22:05 -0500 Received: from mx0a-001b2d01.pphosted.com ([148.163.156.1]:46634 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727815AbeK1VWF (ORCPT ); Wed, 28 Nov 2018 16:22:05 -0500 Received: from pps.filterd (m0098409.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.22/8.16.0.22) with SMTP id wASAKTnK125498 for ; Wed, 28 Nov 2018 05:20:56 -0500 Received: from e06smtp02.uk.ibm.com (e06smtp02.uk.ibm.com [195.75.94.98]) by mx0a-001b2d01.pphosted.com with ESMTP id 2p1hp5rjcn-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Wed, 28 Nov 2018 05:20:37 -0500 Received: from localhost by e06smtp02.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 28 Nov 2018 10:20:24 -0000 Received: from b06cxnps4076.portsmouth.uk.ibm.com (9.149.109.198) by e06smtp02.uk.ibm.com (192.168.101.132) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Wed, 28 Nov 2018 10:20:20 -0000 Received: from d06av21.portsmouth.uk.ibm.com (d06av21.portsmouth.uk.ibm.com [9.149.105.232]) by b06cxnps4076.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id wASAKIlq62128212 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 28 Nov 2018 10:20:18 GMT Received: from d06av21.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id AE27952051; Wed, 28 Nov 2018 10:20:18 +0000 (GMT) Received: from s38lp84.lnxne.boe (unknown [9.152.108.100]) by d06av21.portsmouth.uk.ibm.com (Postfix) with ESMTP id 602BE5204E; Wed, 28 Nov 2018 10:20:18 +0000 (GMT) From: Michael Mueller To: KVM Mailing List , Linux-S390 Mailing List Cc: Martin Schwidefsky , Heiko Carstens , Christian Borntraeger , Janosch Frank , David Hildenbrand , Cornelia Huck , Halil Pasic , Pierre Morel , Michael Mueller Subject: [PATCH v3 12/12] KVM: s390: allow to change the IAM clear strategy dynamically Date: Wed, 28 Nov 2018 11:19:43 +0100 X-Mailer: git-send-email 2.13.4 In-Reply-To: <20181128101943.155542-1-mimu@linux.ibm.com> References: <20181128101943.155542-1-mimu@linux.ibm.com> X-TM-AS-GCONF: 00 x-cbid: 18112810-0008-0000-0000-00000299B709 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 18112810-0009-0000-0000-00002203FE21 Message-Id: <20181128101943.155542-13-mimu@linux.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:,, definitions=2018-11-28_07:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 mlxscore=0 lowpriorityscore=0 mlxlogscore=999 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1810050000 definitions=main-1811280093 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The sysctl file /proc/sys/s390/iam_clear_strategy defines under which condition the GISA IAM is cleared before entering the SIE in routine vcpu_pre_run(). The following IAM clear strategies are available: 0 : the mask is never cleared 1 : the mask is cleared if I/O interruptions are not disabled by the PSW of the vcpu entering the SIE 2 : the mask is unconditionally cleared The default IAM clear strategy after system boot is 0. Set the new strategy by means of the sysctl command or write to the file. sysctl s390.iam_clear_strategy=1 echo 2 >/proc/sys/s390/iam_clear_strategy Signed-off-by: Michael Mueller --- arch/s390/kvm/interrupt.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++ arch/s390/kvm/kvm-s390.c | 1 + arch/s390/kvm/kvm-s390.h | 1 + 3 files changed, 71 insertions(+) diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c index dae78d91fa53..76fb37ed98f8 100644 --- a/arch/s390/kvm/interrupt.c +++ b/arch/s390/kvm/interrupt.c @@ -33,6 +33,7 @@ #define VIRTIO_PARAM 0x0d00 static struct kvm_s390_gib *gib; +static unsigned int iam_clear_strategy; /* handle external calls via sigp interpretation facility */ static int sca_ext_call_pending(struct kvm_vcpu *vcpu, int *src_id) @@ -2895,6 +2896,73 @@ int kvm_s390_get_irq_state(struct kvm_vcpu *vcpu, __u8 __user *buf, int len) return n; } +static int iam_clear_strategy_ctl_handler(struct ctl_table *ctl, int write, + void __user *buffer, size_t *lenp, + loff_t *ppos) +{ + unsigned int strategy = iam_clear_strategy; + unsigned int min = 0; + unsigned int max = 2; + int rc; + struct ctl_table ctl_entry = { + .procname = ctl->procname, + .data = &strategy, + .maxlen = sizeof(int), + .extra1 = &min, + .extra2 = &max, + }; + + rc = proc_douintvec_minmax(&ctl_entry, write, buffer, lenp, ppos); + if (rc < 0 || !write) + return rc; + + if (iam_clear_strategy != strategy) + iam_clear_strategy = strategy; + + return rc; +} + +static struct ctl_table iam_clear_strategy_ctl_table[] = { + { + .procname = "iam_clear_strategy", + .mode = 0644, + .proc_handler = iam_clear_strategy_ctl_handler, + }, + { }, +}; + +static struct ctl_table s390_dir_table[] = { + { + .procname = "s390", + .maxlen = 0, + .mode = 0555, + .child = iam_clear_strategy_ctl_table, + }, + { }, +}; + +void kvm_s390_try_clear_iam(struct kvm_vcpu *vcpu) +{ + if (!vcpu->kvm->arch.gib_in_use) + return; + + switch (iam_clear_strategy) { + case 0: /* never clear IAM on SIE entry */ + return; + case 1: /* + * clear IAM on SIE entry when I/O interruptions + * are not disabled by the vcpu PSW + */ + if (psw_ioint_disabled(vcpu)) + return; + case 2: /* always clear IAM on SIE entry */ + vcpu->kvm->arch.gisa->iam = 0; + return; + default: + break; + } +} + static void nullify_gisa(struct kvm_s390_gisa *gisa) { memset(gisa, 0, sizeof(struct kvm_s390_gisa)); @@ -3078,6 +3146,7 @@ int kvm_s390_gib_init(u8 nisc) goto out_unreg; } + register_sysctl_table(s390_dir_table); KVM_EVENT(3, "gib 0x%pK (nisc=%d) initialized", gib, gib->nisc); return rc; diff --git a/arch/s390/kvm/kvm-s390.c b/arch/s390/kvm/kvm-s390.c index 9b20017dda29..0b34be612172 100644 --- a/arch/s390/kvm/kvm-s390.c +++ b/arch/s390/kvm/kvm-s390.c @@ -3474,6 +3474,7 @@ static int vcpu_pre_run(struct kvm_vcpu *vcpu) } atomic_inc(&vcpu->kvm->arch.vcpus_in_sie); + kvm_s390_try_clear_iam(vcpu); vcpu->arch.sie_block->icptcode = 0; cpuflags = atomic_read(&vcpu->arch.sie_block->cpuflags); diff --git a/arch/s390/kvm/kvm-s390.h b/arch/s390/kvm/kvm-s390.h index 1c93ceaeb9e4..09fa5a559858 100644 --- a/arch/s390/kvm/kvm-s390.h +++ b/arch/s390/kvm/kvm-s390.h @@ -388,6 +388,7 @@ void kvm_s390_gisa_clear(struct kvm *kvm); void kvm_s390_gisa_destroy(struct kvm *kvm); int kvm_s390_gib_init(u8 nisc); void kvm_s390_gib_destroy(void); +void kvm_s390_try_clear_iam(struct kvm_vcpu *vcpu); /* implemented in guestdbg.c */ void kvm_s390_backup_guest_per_regs(struct kvm_vcpu *vcpu);