From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7822BC35240 for ; Wed, 29 Jan 2020 20:03:37 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 5C2162067C for ; Wed, 29 Jan 2020 20:03:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727385AbgA2UDg (ORCPT ); Wed, 29 Jan 2020 15:03:36 -0500 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:52094 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726672AbgA2UDg (ORCPT ); Wed, 29 Jan 2020 15:03:36 -0500 Received: from pps.filterd (m0098421.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.16.0.42/8.16.0.42) with SMTP id 00TJtMpx042608 for ; Wed, 29 Jan 2020 15:03:34 -0500 Received: from e06smtp05.uk.ibm.com (e06smtp05.uk.ibm.com [195.75.94.101]) by mx0a-001b2d01.pphosted.com with ESMTP id 2xttnu240e-1 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=NOT) for ; Wed, 29 Jan 2020 15:03:34 -0500 Received: from localhost by e06smtp05.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Wed, 29 Jan 2020 20:03:32 -0000 Received: from b06cxnps4075.portsmouth.uk.ibm.com (9.149.109.197) by e06smtp05.uk.ibm.com (192.168.101.135) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; (version=TLSv1/SSLv3 cipher=AES256-GCM-SHA384 bits=256/256) Wed, 29 Jan 2020 20:03:30 -0000 Received: from d06av25.portsmouth.uk.ibm.com (d06av25.portsmouth.uk.ibm.com [9.149.105.61]) by b06cxnps4075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 00TK3T7R35258472 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 29 Jan 2020 20:03:29 GMT Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id B778E11C052; Wed, 29 Jan 2020 20:03:29 +0000 (GMT) Received: from d06av25.portsmouth.uk.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 2F5B011C04A; Wed, 29 Jan 2020 20:03:28 +0000 (GMT) Received: from localhost.localdomain (unknown [9.145.2.173]) by d06av25.portsmouth.uk.ibm.com (Postfix) with ESMTP; Wed, 29 Jan 2020 20:03:27 +0000 (GMT) From: Janosch Frank To: kvm@vger.kernel.org Cc: thuth@redhat.com, borntraeger@de.ibm.com, david@redhat.com, cohuck@redhat.com, linux-s390@vger.kernel.org Subject: [PATCH v8 4/4] selftests: KVM: testing the local IRQs resets Date: Wed, 29 Jan 2020 15:03:12 -0500 X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200129200312.3200-1-frankja@linux.ibm.com> References: <20200129200312.3200-1-frankja@linux.ibm.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-TM-AS-GCONF: 00 x-cbid: 20012920-0020-0000-0000-000003A52B52 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 20012920-0021-0000-0000-000021FCDD92 Message-Id: <20200129200312.3200-5-frankja@linux.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10434:6.0.138,18.0.572 definitions=2020-01-29_06:2020-01-28,2020-01-29 signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 mlxscore=0 malwarescore=0 spamscore=0 impostorscore=0 phishscore=0 bulkscore=0 suspectscore=3 adultscore=0 priorityscore=1501 mlxlogscore=999 lowpriorityscore=0 clxscore=1015 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-1911200001 definitions=main-2001290154 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org From: Pierre Morel Local IRQs are reset by a normal cpu reset. The initial cpu reset and the clear cpu reset, as superset of the normal reset, both clear the IRQs too. Let's inject an interrupt to a vCPU before calling a reset and see if it is gone after the reset. We choose to inject only an emergency interrupt at this point and can extend the test to other types of IRQs later. Signed-off-by: Pierre Morel --- tools/testing/selftests/kvm/s390x/resets.c | 57 ++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/tools/testing/selftests/kvm/s390x/resets.c b/tools/testing/selftests/kvm/s390x/resets.c index 2b2378cc9e80..299c1686f98c 100644 --- a/tools/testing/selftests/kvm/s390x/resets.c +++ b/tools/testing/selftests/kvm/s390x/resets.c @@ -14,6 +14,9 @@ #include "kvm_util.h" #define VCPU_ID 3 +#define LOCAL_IRQS 32 + +struct kvm_s390_irq buf[VCPU_ID + LOCAL_IRQS]; struct kvm_vm *vm; struct kvm_run *run; @@ -52,6 +55,29 @@ static void test_one_reg(uint64_t id, uint64_t value) TEST_ASSERT(eval_reg == value, "value == %s", value); } +static void assert_noirq(void) +{ + struct kvm_s390_irq_state irq_state; + int irqs; + + if (!(kvm_check_cap(KVM_CAP_S390_INJECT_IRQ) && + kvm_check_cap(KVM_CAP_S390_IRQ_STATE))) + return; + + irq_state.len = sizeof(buf); + irq_state.buf = (unsigned long)buf; + irqs = _vcpu_ioctl(vm, VCPU_ID, KVM_S390_GET_IRQ_STATE, &irq_state); + /* + * irqs contains the number of retrieved interrupts, apart from the + * emergency call that should be cleared by the resets, there should be + * none. + */ + if (irqs < 0) + printf("Error by getting IRQ: errno %d\n", errno); + + TEST_ASSERT(!irqs, "IRQ pending"); +} + static void assert_clear(void) { struct kvm_sregs sregs; @@ -93,6 +119,31 @@ static void assert_initial(void) static void assert_normal(void) { test_one_reg(KVM_REG_S390_PFTOKEN, KVM_S390_PFAULT_TOKEN_INVALID); + assert_noirq(); +} + +static int inject_irq(int cpu_id) +{ + struct kvm_s390_irq_state irq_state; + struct kvm_s390_irq *irq = &buf[0]; + int irqs; + + if (!(kvm_check_cap(KVM_CAP_S390_INJECT_IRQ) && + kvm_check_cap(KVM_CAP_S390_IRQ_STATE))) + return 0; + + /* Inject IRQ */ + irq_state.len = sizeof(struct kvm_s390_irq); + irq_state.buf = (unsigned long)buf; + irq->type = KVM_S390_INT_EMERGENCY; + irq->u.emerg.code = cpu_id; + irqs = _vcpu_ioctl(vm, cpu_id, KVM_S390_SET_IRQ_STATE, &irq_state); + if (irqs < 0) { + printf("Error by injecting INT_EMERGENCY: errno %d\n", errno); + return errno; + } + + return 0; } static void test_normal(void) @@ -105,6 +156,8 @@ static void test_normal(void) _vcpu_run(vm, VCPU_ID); + inject_irq(VCPU_ID); + vcpu_ioctl(vm, VCPU_ID, KVM_S390_NORMAL_RESET, 0); assert_normal(); kvm_vm_free(vm); @@ -122,6 +175,8 @@ static int test_initial(void) rv = _vcpu_run(vm, VCPU_ID); + inject_irq(VCPU_ID); + vcpu_ioctl(vm, VCPU_ID, KVM_S390_INITIAL_RESET, 0); assert_normal(); assert_initial(); @@ -141,6 +196,8 @@ static int test_clear(void) rv = _vcpu_run(vm, VCPU_ID); + inject_irq(VCPU_ID); + vcpu_ioctl(vm, VCPU_ID, KVM_S390_CLEAR_RESET, 0); assert_normal(); assert_initial(); -- 2.20.1