Received: by 2002:a05:7412:8d10:b0:f3:1519:9f41 with SMTP id bj16csp4514887rdb; Tue, 12 Dec 2023 01:22:49 -0800 (PST) X-Google-Smtp-Source: AGHT+IGzlhG4o4lejuDxd9n+1LsyArWWUc4RBAjL1hrb1fvMsQXCcp2XuWJGtEApia3FozN+XTuH X-Received: by 2002:a05:6a20:948c:b0:190:8e40:6f2a with SMTP id hs12-20020a056a20948c00b001908e406f2amr5236749pzb.44.1702372968663; Tue, 12 Dec 2023 01:22:48 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1702372968; cv=none; d=google.com; s=arc-20160816; b=TzooMHrgIBw03v+/zE1gt5WZErgis5cFA9rJEjUQ49D7qqSi0LlcMCvG8vs1hCNZbk Eec0HQ6n4nRffzB7EkGnABVLTdHoAO8gIEQs5EIFTZ92ob5TUZqeiE1FY5Wl7DkJVkke KK19VBZ5sDsfHYbR1tsidBeUBEBCp2JKOZa8xQkD66gNAWljt11W2qy64MlsBJA2l9ix 2gwPY23Gyhw5cErFjUuyQEguO7oOmvtW5V0dLUvomunC/VV1PHPbidIZL9QNR8gtp/Hx HMpvdWr6TEv8RTXgX2eJZpvQhE0dYBlWjFOYiO6625eNWUW+CfbGhfmwN2ItvKDbbW8o VEaQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:to:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:from :dkim-signature; bh=/DtCbTQ8wnTerklDY7jWPga6f7CatITBd2RAwKj9KyI=; fh=6zvCms6BWgVKyR2iKI0BXiVX07Vjspg+YoI0bP+ZJfs=; b=lrBuWIEtspHbTkPhbHW+bth1H49Guq/n4/kdIbk5pMGZHBDaR0qJWxTtwFierCyGnu 0j1Kk8l9HvxYyQZk/pidbT2Vf5P+/AfNB1lhx6Xfu6qFMgXHy9xOlcNb5WMqYShVqsrP yJqYRzkUYK34k6V8DKE1OUzxgTca5Hbz5aKS1MvtGLyxWWpgJSy0zhY1zCVdm43rkJDK J+xOu12ihFDszoCjdovzuYmfle2Vp0j6bu6Mxxp1oqkSoQlOX8e1qZya00cpryHesWgT UnLmojG7sC2Dpi9ANzFVThj2jdhuXmhZJBO8b7+8tyNBlRKYdYwt/5EikibC9GvCaa4Q ZKHA== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@intel.com header.s=Intel header.b=JgNiL7xy; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.33 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from lipwig.vger.email (lipwig.vger.email. [23.128.96.33]) by mx.google.com with ESMTPS id m32-20020a635820000000b005bdbeb537bcsi7384190pgb.37.2023.12.12.01.22.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Dec 2023 01:22:48 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.33 as permitted sender) client-ip=23.128.96.33; Authentication-Results: mx.google.com; dkim=fail header.i=@intel.com header.s=Intel header.b=JgNiL7xy; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.33 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by lipwig.vger.email (Postfix) with ESMTP id 0430380ABB29; Tue, 12 Dec 2023 01:22:46 -0800 (PST) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.11 at lipwig.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231674AbjLLJWM (ORCPT + 99 others); Tue, 12 Dec 2023 04:22:12 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45382 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235182AbjLLJWE (ORCPT ); Tue, 12 Dec 2023 04:22:04 -0500 Received: from mgamail.intel.com (mgamail.intel.com [192.55.52.43]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 27BFD115; Tue, 12 Dec 2023 01:22:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1702372929; x=1733908929; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=X1Re0rpen3+bPCj3ZhqAM9xIObnQKsPUQRo4nXCFHEA=; b=JgNiL7xyIOCB1wAdU+Lb5Tln00GaDaUEAha+cHEGTbZ4iGXvyEYy6G9f 00Q/yOS64rkKgqZWezcTwj0gB+WFwGha7jHZanRfo/uiJS02B+kqVphQ3 UTPO6+P8g2OtQJ+5zEMmxntf1CY3oI88QtJsOVs+xlsLn0AV2zahuNhdn gK4h3LbkEk/moVYYKAHmKG6i8WUY3xLtjiq+LBer0rFCdvNJ907dpJOqD t0BVNT7SR7BRDwjTU48+801LpjkR6CSQPh9IVCHauntgPAoLFmQeHSl1Q BCrlEH+AJ7/F/FBpRhW7Q6w/qU9+hpUd/RiMhQ5sv5TzncetQ5fz03eLu Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10921"; a="480974533" X-IronPort-AV: E=Sophos;i="6.04,269,1695711600"; d="scan'208";a="480974533" Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Dec 2023 01:22:03 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10921"; a="917213639" X-IronPort-AV: E=Sophos;i="6.04,269,1695711600"; d="scan'208";a="917213639" Received: from haibo-optiplex-7090.sh.intel.com ([10.239.159.132]) by fmsmga001-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Dec 2023 01:21:55 -0800 From: Haibo Xu Cc: xiaobo55x@gmail.com, haibo1.xu@intel.com, ajones@ventanamicro.com, Paul Walmsley , Palmer Dabbelt , Albert Ou , Paolo Bonzini , Shuah Khan , Marc Zyngier , Oliver Upton , James Morse , Suzuki K Poulose , Zenghui Yu , Anup Patel , Atish Patra , Guo Ren , Mayuresh Chitale , Greentime Hu , wchen , Conor Dooley , Heiko Stuebner , Minda Chen , Samuel Holland , Jisheng Zhang , Sean Christopherson , Peter Xu , Like Xu , Vipin Sharma , Maciej Wieczor-Retman , Aaron Lewis , Thomas Huth , linux-kernel@vger.kernel.org, linux-riscv@lists.infradead.org, kvm@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, kvm-riscv@lists.infradead.org Subject: [PATCH v4 11/11] KVM: selftests: Enable tunning of err_margin_us in arch timer test Date: Tue, 12 Dec 2023 17:31:20 +0800 Message-Id: <0343a9e4bfa8011fbb6bca0286cee7eab1f17d5d.1702371136.git.haibo1.xu@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-0.6 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lipwig.vger.email To: unlisted-recipients:; (no To-header on input) Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (lipwig.vger.email [0.0.0.0]); Tue, 12 Dec 2023 01:22:46 -0800 (PST) There are intermittent failures occured when stressing the arch-timer test in a Qemu VM: Guest assert failed, vcpu 0; stage; 4; iter: 3 ==== Test Assertion Failure ==== aarch64/arch_timer.c:196: config_iter + 1 == irq_iter pid=4048 tid=4049 errno=4 - Interrupted system call 1 0x000000000040253b: test_vcpu_run at arch_timer.c:248 2 0x0000ffffb60dd5c7: ?? ??:0 3 0x0000ffffb6145d1b: ?? ??:0 0x3 != 0x2 (config_iter + 1 != irq_iter)e Further test and debug show that the timeout for an interrupt to arrive do have random high fluctuation, espectially when testing in an virtual environment. To alleviate this issue, just expose the timeout value as user configurable and print some hint message to increase the value when hitting the failure.. Signed-off-by: Haibo Xu --- .../selftests/kvm/aarch64/arch_timer.c | 8 +++++-- tools/testing/selftests/kvm/arch_timer.c | 22 +++++++++++++------ .../selftests/kvm/include/timer_test.h | 1 + .../testing/selftests/kvm/riscv/arch_timer.c | 8 +++++-- 4 files changed, 28 insertions(+), 11 deletions(-) diff --git a/tools/testing/selftests/kvm/aarch64/arch_timer.c b/tools/testing/selftests/kvm/aarch64/arch_timer.c index 4b421d421c3f..139eecbf77e7 100644 --- a/tools/testing/selftests/kvm/aarch64/arch_timer.c +++ b/tools/testing/selftests/kvm/aarch64/arch_timer.c @@ -131,10 +131,14 @@ static void guest_run_stage(struct test_vcpu_shared_data *shared_data, /* Setup a timeout for the interrupt to arrive */ udelay(msecs_to_usecs(test_args.timer_period_ms) + - TIMER_TEST_ERR_MARGIN_US); + test_args.timer_err_margin_us); irq_iter = READ_ONCE(shared_data->nr_iter); - GUEST_ASSERT_EQ(config_iter + 1, irq_iter); + __GUEST_ASSERT(config_iter + 1 == irq_iter, + "config_iter + 1 = 0x%lx, irq_iter = 0x%lx.\n" + " Guest timer interrupt was not trigged within the specified\n" + " interval, try to increase the error margin by [-e] option.\n", + config_iter + 1, irq_iter); } } diff --git a/tools/testing/selftests/kvm/arch_timer.c b/tools/testing/selftests/kvm/arch_timer.c index 60963fce16f2..5050022fd345 100644 --- a/tools/testing/selftests/kvm/arch_timer.c +++ b/tools/testing/selftests/kvm/arch_timer.c @@ -5,16 +5,17 @@ * The guest's main thread configures the timer interrupt and waits * for it to fire, with a timeout equal to the timer period. * It asserts that the timeout doesn't exceed the timer period plus - * an error margin of 100us. + * an user configurable error margin(default to 100us). * * On the other hand, upon receipt of an interrupt, the guest's interrupt * handler validates the interrupt by checking if the architectural state * is in compliance with the specifications. * * The test provides command-line options to configure the timer's - * period (-p), number of vCPUs (-n), and iterations per stage (-i). - * To stress-test the timer stack even more, an option to migrate the - * vCPUs across pCPUs (-m), at a particular rate, is also provided. + * period (-p), number of vCPUs (-n), iterations per stage (-i), and timer + * interrupt arrival error margin (-e). To stress-test the timer stack even + * more, an option to migrate the vCPUs across pCPUs (-m), at a particular + * rate, is also provided. * * Copyright (c) 2021, Google LLC. */ @@ -34,6 +35,7 @@ struct test_args test_args = { .nr_iter = NR_TEST_ITERS_DEF, .timer_period_ms = TIMER_TEST_PERIOD_MS_DEF, .migration_freq_ms = TIMER_TEST_MIGRATION_FREQ_MS, + .timer_err_margin_us = TIMER_TEST_ERR_MARGIN_US, .reserved = 1, }; @@ -179,8 +181,9 @@ static void test_run(struct kvm_vm *vm) static void test_print_help(char *name) { - pr_info("Usage: %s [-h] [-n nr_vcpus] [-i iterations] [-p timer_period_ms]\n", - name); + pr_info("Usage: %s [-h] [-n nr_vcpus] [-i iterations] [-p timer_period_ms]\n" + "\t\t [-m migration_freq_ms] [-o counter_offset]\n" + "\t\t [-e timer_err_margin_us]\n", name); pr_info("\t-n: Number of vCPUs to configure (default: %u; max: %u)\n", NR_VCPUS_DEF, KVM_MAX_VCPUS); pr_info("\t-i: Number of iterations per stage (default: %u)\n", @@ -190,6 +193,8 @@ static void test_print_help(char *name) pr_info("\t-m: Frequency (in ms) of vCPUs to migrate to different pCPU. 0 to turn off (default: %u)\n", TIMER_TEST_MIGRATION_FREQ_MS); pr_info("\t-o: Counter offset (in counter cycles, default: 0) [aarch64-only]\n"); + pr_info("\t-e: Interrupt arrival error margin(in us) of the guest timer (default: %u)\n", + TIMER_TEST_ERR_MARGIN_US); pr_info("\t-h: print this help screen\n"); } @@ -197,7 +202,7 @@ static bool parse_args(int argc, char *argv[]) { int opt; - while ((opt = getopt(argc, argv, "hn:i:p:m:o:")) != -1) { + while ((opt = getopt(argc, argv, "hn:i:p:m:o:e:")) != -1) { switch (opt) { case 'n': test_args.nr_vcpus = atoi_positive("Number of vCPUs", optarg); @@ -216,6 +221,9 @@ static bool parse_args(int argc, char *argv[]) case 'm': test_args.migration_freq_ms = atoi_non_negative("Frequency", optarg); break; + case 'e': + test_args.timer_err_margin_us = atoi_non_negative("Error Margin", optarg); + break; case 'o': test_args.counter_offset = strtol(optarg, NULL, 0); test_args.reserved = 0; diff --git a/tools/testing/selftests/kvm/include/timer_test.h b/tools/testing/selftests/kvm/include/timer_test.h index 968257b893a7..b1d405e7157d 100644 --- a/tools/testing/selftests/kvm/include/timer_test.h +++ b/tools/testing/selftests/kvm/include/timer_test.h @@ -22,6 +22,7 @@ struct test_args { int nr_iter; int timer_period_ms; int migration_freq_ms; + int timer_err_margin_us; /* Members of struct kvm_arm_counter_offset */ uint64_t counter_offset; uint64_t reserved; diff --git a/tools/testing/selftests/kvm/riscv/arch_timer.c b/tools/testing/selftests/kvm/riscv/arch_timer.c index 13bf184d1ff5..45a139dc7ce3 100644 --- a/tools/testing/selftests/kvm/riscv/arch_timer.c +++ b/tools/testing/selftests/kvm/riscv/arch_timer.c @@ -55,10 +55,14 @@ static void guest_run(struct test_vcpu_shared_data *shared_data) /* Setup a timeout for the interrupt to arrive */ udelay(msecs_to_usecs(test_args.timer_period_ms) + - TIMER_TEST_ERR_MARGIN_US); + test_args.timer_err_margin_us); irq_iter = READ_ONCE(shared_data->nr_iter); - GUEST_ASSERT_EQ(config_iter + 1, irq_iter); + __GUEST_ASSERT(config_iter + 1 == irq_iter, + "config_iter + 1 = 0x%lx, irq_iter = 0x%lx.\n" + " Guest timer interrupt was not trigged within the specified\n" + " interval, try to increase the error margin by [-e] option.\n", + config_iter + 1, irq_iter); } } -- 2.34.1