From patchwork Fri Jun 10 14:58:43 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Roman Kagan X-Patchwork-Id: 9169979 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id E4AAC607D9 for ; Fri, 10 Jun 2016 15:00:22 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D34FD28325 for ; Fri, 10 Jun 2016 15:00:22 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C520128369; Fri, 10 Jun 2016 15:00:22 +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=-6.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,T_DKIM_INVALID 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 8FF3128325 for ; Fri, 10 Jun 2016 15:00:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932658AbcFJO7i (ORCPT ); Fri, 10 Jun 2016 10:59:38 -0400 Received: from mail-db3on0129.outbound.protection.outlook.com ([157.55.234.129]:44978 "EHLO emea01-db3-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S932371AbcFJO7h (ORCPT ); Fri, 10 Jun 2016 10:59:37 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=MY8hu4zkpg2gJa3Fogx5Wbl6rwrn838h9YA6MVSUzyk=; b=V3jmfwiQgXNOplDfYGCrGN6ROYHC+htwrebAl1O5GkE105APRxchKSchaNdPegxsL8wPozTo9GkoEX14dWc05MrK3PltfvW/DHAt5kWrIL4P1pa4xg81QTFjW/GEpvL36NaCP8n64FZwegu8VZ16BRVvdUFUm912qkS2A/W0Qyo= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=rkagan@virtuozzo.com; Received: from rkaganb.sw.ru (195.214.232.10) by HE1PR0801MB1259.eurprd08.prod.outlook.com (10.167.247.137) with Microsoft SMTP Server (TLS) id 15.1.517.8; Fri, 10 Jun 2016 14:59:12 +0000 From: Roman Kagan To: , Paolo Bonzini , =?UTF-8?q?Radim=20Kr=C4=8Dm=C3=A1=C5=99?= CC: Roman Kagan Subject: [PATCH kvm-unit-tests] x86/kvmclock_test: rework to avoid spinlocks Date: Fri, 10 Jun 2016 17:58:43 +0300 Message-ID: <1465570723-13575-1-git-send-email-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.5.5 MIME-Version: 1.0 X-Originating-IP: [195.214.232.10] X-ClientProxiedBy: AM5PR0901CA0034.eurprd09.prod.outlook.com (10.164.186.172) To HE1PR0801MB1259.eurprd08.prod.outlook.com (10.167.247.137) X-MS-Office365-Filtering-Correlation-Id: 13a55943-0e1f-43da-9e84-08d3913fc94a X-Microsoft-Exchange-Diagnostics: 1; HE1PR0801MB1259; 2:CkaSQxiz0yj0TIRBWaxtClhqZegxhvUXgb8ODWxd93aNx3ZXKKxOqvM3sH0F7f76DAtkLcgkCxvB7hnLtNE3aSkIw0NYiLbfXfVD85dHU2tYCQ8FO+1kXvtg3GfSA9kPbilfrDeXgicqW+1dXCOGAw2oVMWeNhitXg9ZyZ9XgI5v2LWi0ZKuBi+ZsOP7WVMQ; 3:aXCetVV35/IUw3IJQM3NIY1JlgszHhKozK6tkX2riwywCq1FTk/+x7WXnKMYtD0pxgQYR9dU30tlWAnikMuQLEbrSlLZ0q7zEI5a5kHZ3CUMhYTscPpclzZSb3Tp2A4p X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:HE1PR0801MB1259; X-Microsoft-Exchange-Diagnostics: 1; HE1PR0801MB1259; 25:D7Y5d7b3ToGPPX0u4PVeNkBO5+gClhuBLn10y61H8qvh/CMq7CNoECJrPgMqqprJ1fLc+I426AE4UsQZs5p1tqcYxKV014hHeQsDHqUN9xRaNxN2aSIWitvOTdU25KVMV2xMTDGkJB3jw6w7OgOqdUKk+YS++ISRj2fRJRzXhCTPgX7BfoVBOGgJH0HUeVquQfyrDX/63PHVwmmBenQ0JmU2dTe0hxqpw9z4anaB9U8Km+6s+09QNRO1njXcvdPqQk7V8RuHJo19YIv4wfJINRf5P2uT8d0UjzSY2Z1WQ1buiv19QJL7J9O9hbGa1WaxvBmOjJL5yAU/jDO80OEJOKJyeYyOFbwAaxqx/SivHoywi6sUBP7QIGdMs9OzgGSx6QKnu6EVbtmR4lPcBeEvPf0U+OgH0t+6/6fXT9Avc1UIfdf8HY5sRrvOKpTSscwVFr3td5T0B/unR3Kx9kf+AE4doFDJ1dmAWiXuxl5BVnQ8RkMdUpO+LBmF9ZyiHIp3mLPtoJwRDNDKEmnLt48Po90sT/XnwpZaCf5xmILNvuiLlFndOyvfDLMPPTqmOqs8HFfFp5keZBZU3pqiI4jP65pTtEULF9IqmbThQ1nz+8fdrScCqSyO1bnRutdmfbpcvicUUi3sZ4fpMY1A+dwG7X/tJJ5LKYGiWPvB6yzmW6X1BVc0xIaVjBrj/tI6tm8MZyt5m40NLBi7ZjQ0ZqioPg== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(211171220733660); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040130)(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046)(6041072)(6043046); SRVR:HE1PR0801MB1259; BCL:0; PCL:0; RULEID:; SRVR:HE1PR0801MB1259; X-Microsoft-Exchange-Diagnostics: 1; HE1PR0801MB1259; 4:3cleCBuDpDCmUPR0Ty1+A5VtHQDthi5B39AseCFQWlN2oKM2xblnkJ33Bl3kYlwJ3uBXoQcgDGQ/WOJ5q01WBDST9hVyDr5wLJ8BvAsCXyZs24ELGK3WMuVsduqHVDpW4mlMsb64oP+UJ3aiaOTWiRIVwpixHaV293r8MaBjXWGrLdXE+wXas0k5gdvKouv5e0Tnp9CZ6MEGssUwbddLvhUFbhnGq83oqJ7dK8YB7uKho7vvz2Z4w7JUxvF6J/xovdABDB2OkTq/di4BFfQq5pF1MT2w6lNDXxGNy26KawO5IiTMCUWfCJn/ArEXO1+FclpyLlP64Vcul4NekUyKfVa3tmjaD766sLvQMh0DWK+rPli5EkTcZg5JzMau2i+umJ6tL1zJOm0+HIKTS0yWR0Xy1cPx7DHcDV/UootmT/s/qUfer8NPNYnmeItlyUTV41az9pmbRy0M1X72DKmlbA== X-Forefront-PRVS: 096943F07A X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(4630300001)(6009001)(189002)(199003)(81166006)(81156014)(5008740100001)(66066001)(42186005)(69596002)(53416004)(8676002)(47776003)(4001430100002)(50986999)(230783001)(106356001)(92566002)(19580405001)(19580395003)(107886002)(5004730100002)(68736007)(2906002)(105586002)(50226002)(5001770100001)(229853001)(97736004)(6116002)(4326007)(3846002)(586003)(101416001)(36756003)(86362001)(50466002)(77096005)(5003940100001)(33646002)(189998001)(48376002); DIR:OUT; SFP:1102; SCL:1; SRVR:HE1PR0801MB1259; H:rkaganb.sw.ru; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; CAT:NONE; LANG:en; CAT:NONE; Received-SPF: None (protection.outlook.com: virtuozzo.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; HE1PR0801MB1259; 23:yjwY7nTaEWyWhmjXEPp6TIjFhCT479CMu3S0pn9?= =?us-ascii?Q?5ZVFKrZV/jq3kDvwx9LS9jnNhPvlHosmJ7EbAZFV5MHye9V5nxajTbP1y4Wz?= =?us-ascii?Q?IGpoyn91trnKgGT7RVuQ24G4DE4fgOokclwm4QqdYRjcXBWmNXTs59K8fy8F?= =?us-ascii?Q?dslJ/dXFNWLjhsX4z8/aeAnytFjOM3+TCa36YvxAeBcufShIWzFvpSwEcV8R?= =?us-ascii?Q?vwLcjpvmLgLJOxU7gtruC9Y0YUy9oqHd/QRelRLTaQhBLLHzvnf3Q/hGQIgH?= =?us-ascii?Q?YB16Ql+M+yD7LPMA1q8VpgS5r0BXjRHYSdDiur3fdCIvurS/3KqFPSkS71P3?= =?us-ascii?Q?8n0pMKpIvMbBVFlF9+lHeeP9WfLvBLt8hK03aAazSj8Dqaapf8nUOl6BagFJ?= =?us-ascii?Q?s+w/loTUPF3g7efOJQmimIKvnoho7KumqXEzSadKWRd0c1tox5Hf93eLQXwD?= =?us-ascii?Q?8DNFIfaeYEFPHoTMcqUXkCb15Q0IYQxudWXOwglLI6LtFpN4NBFFsGTMoogo?= =?us-ascii?Q?JgBFzv17M3LndNDPD/AjpU6joIl6DDL9in3cM2c/HWYG8q33PfihyBttB7iW?= =?us-ascii?Q?virc1jNH/zCHQMwwDdoyRCTDOJqKg2LJ0/kiHrDMG9J4gGH5pBnAb6cLbqgL?= =?us-ascii?Q?HwtYVYgunXn/S1ArMkC5F5xBFDQgYXcy5lUBO+wtDLW+iywKzqN9f1vfUQcM?= =?us-ascii?Q?it3UAFksJ4tOLg+TQKZXVzJfrRuWY9tsf3hITmEZhvcmUnH2p4U19tm63lko?= =?us-ascii?Q?RPAYClP5bxJf3kR5Hb92RRslnAYvqWp9LWpUeCafX+mnKXeA9w56hUsbyhRW?= =?us-ascii?Q?kKBQUNzfOaedSmjVtCuTNzDBt43oN/vkfv8hNuRmxyertSBLTkZrZMK+XG7c?= =?us-ascii?Q?Tt9OD+J6zkPtidG410vM+e6MtkaySSfYOJWDZI4a1k4u4azFTr88IuOj82mm?= =?us-ascii?Q?bW5BJjPngVoQfMw6bnVluhfVNbvTejSaH9epsPsaAPw7J0eyHvblY4ofs3SK?= =?us-ascii?Q?bbTqt9Xc21/RfoIVM1TT8cLbJF0CaWzJcpoeECRrqJmHE8/rJikmA2EcLnKH?= =?us-ascii?Q?MieOYU1kYjlrv45hiUXzA3sgUC2+yuQWmK2jiJuMv8yRwQI6scSyfW97O5wK?= =?us-ascii?Q?IyHIr0urnLgk=3D?= X-Microsoft-Exchange-Diagnostics: 1; HE1PR0801MB1259; 6:tVHbwbNyY1S3UQ6uNhVUi1JcKn2P7tpyXtL9jF3rS19BVMyZnb56u6EI9pQ8fpBcz7VzySm8uSbbSSkBXpQfO88GjJnmimrrv2odA62LQmkFuSCa8m/k5am1KtoSS7gFGzeljzA4oLrv+knj7dszVezWfFTUkjV/tu0aa3GmzQVzjv4IoSYU0K1FCTHpEB5AEAZOQn4J+VoqGMARSwR9NpyiOYsF1dRtZ67FkkXvvFhJU6ThO8smIyMaGWTVifJl+2DgT3FqAmOj79DoLYZszKgCITgkJiPXrMM8tWWIHjVvxbJy5iEz/fUTA9baeOiP; 5:4jQ2iuwzrQc9oI3hf8AHsIi1wu1slsfS0NeVtfxiqlfnDgAqspQyR0CYCLQ25kYsUke6AJKzH/l1Zn4TUAldJsuBC24lKJcRNrQ9g7hygXS6nzgsr0beDtOwEisgJipw4REN0a/8q6CDP0TzSipNJA==; 24:LaTmRyZmvQB7PsSVxjZSsEUWgF+oCPHAwwtbh6vyDtkElSD8PPjAGE/hAocDvxV2Qje54ME9kdgIHCl5aPOuknXen9bSvz1ic/O4HUdpb6s=; 7:1n4YcaIyM7RJFyNURGjcds6mJI3Dufig/kWarv5+Phvv7sIKUb5BRQh7PV/P4Pkk4Y1q4qWNGzpJrPtAvxhGGVz6yFxq+7u0uoUO5O8vWHi2RUR5jCiOWm+U3udMHZd/RD0hpyc1FaIJ1crWwA/MtBka8pmmhZ5EOtEC4H2Glo4Wx5SbQkkbVzQTwVf/E6E10aTpxnB1ZodCVGbQrNM9+awf8qP+PblFWIw2LaJQW6c= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; HE1PR0801MB1259; 20:XqI1/vx1V5sTDOPjyhVI7nSeEDevOIkcVz+W0pSBWDeumFU+gzPh9hyT+f9i48R33UeGY3g576jsBMyxCn+ZKtwKOns9in0p/LFYHW5AYycALIZVIVUCmSU5Rg5I8MxtXjXQI6FCCT0K9FIXc6+8GOhNrUmZH5zCzksbDbzAnfU= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 10 Jun 2016 14:59:12.8614 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0801MB1259 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP The test for kvmclock uses a data structure to hold intermediate data which is shared across cpus, and is protected by a spinlock. As a result, the vCPUs are mostly contending on the spinlock rather than doing kvmclock reads. Rework the test to keep the intermediate data on per-cpu structures, and only merge the results at the end. As this resulted in a fairly big change to the test structure, go ahead and make other enhancements, namely: - use library functions for test results reporting - stop passing command-line parameters which can be sensibly set at compile time - limit the testcases by duration in seconds rather than by iterations - differentiate between kvmclock using TSC_STABLE bit and not using it by forcing either mode explicitly regardless of the host properties - yield test results that are easier to compare Signed-off-by: Roman Kagan --- x86/kvmclock_test.c | 290 +++++++++++++++++++++++++++------------------------- x86/unittests.cfg | 2 +- 2 files changed, 152 insertions(+), 140 deletions(-) diff --git a/x86/kvmclock_test.c b/x86/kvmclock_test.c index c8ffa12..fc3cb2e 100644 --- a/x86/kvmclock_test.c +++ b/x86/kvmclock_test.c @@ -4,164 +4,176 @@ #include "processor.h" #include "kvmclock.h" -#define DEFAULT_TEST_LOOPS 100000000L -#define DEFAULT_THRESHOLD 5L - -long loops = DEFAULT_TEST_LOOPS; -long sec = 0; -long threshold = DEFAULT_THRESHOLD; - -struct test_info { - struct spinlock lock; - u64 warps; /* warp count */ - u64 stalls; /* stall count */ - long long worst; /* worst warp */ - volatile cycle_t last; /* last cycle seen by test */ - atomic_t ncpus; /* number of cpu in the test*/ - int check; /* check cycle ? */ +#define DURATION 2 /* testcase duration (s) */ +#define WC_DELTA_MAX 5 /* max delta of wallclock from expected */ +#define CPI_STABLE_MAX 1000 /* max cycles per iteration with TSC_STABLE */ +#define CPI_UNSTABLE_MAX 4000 /* ditto for no TSC_STABLE */ + +struct warp_test_info { + unsigned long long warps; + unsigned long long stalls; + long long worst; }; +struct warp_test_info wti[MAX_CPU]; -struct test_info ti[4]; - -static void wallclock_test(void *data) -{ - int *p_err = data; - long ksec, offset; - struct timespec ts; +struct perf_test_info { + unsigned long long cycles; + unsigned long long loops; +}; +struct perf_test_info pti[MAX_CPU]; - kvm_get_wallclock(&ts); - ksec = ts.tv_sec; +atomic_t cpus_left; - offset = ksec - sec; - printf("Seconds get from kvmclock: %ld (cpu %d, offset: %ld)\n", ksec, smp_id(), offset); +static void get_wallclock_secs(void *data) +{ + struct timespec ts; + long *ksec = data; - if (offset > threshold || offset < -threshold) { - printf("offset too large!\n"); - (*p_err)++; - } + kvm_get_wallclock(&ts); + *ksec = ts.tv_sec; } -static void kvm_clock_test(void *data) +static void wallclock_test(int ncpus, long sec) { - struct test_info *hv_test_info = (struct test_info *)data; - long i, check = hv_test_info->check; - - for (i = 0; i < loops; i++){ - cycle_t t0, t1; - long long delta; - - if (check == 0) { - kvm_clock_read(); - continue; - } - - spin_lock(&hv_test_info->lock); - t1 = kvm_clock_read(); - t0 = hv_test_info->last; - hv_test_info->last = kvm_clock_read(); - spin_unlock(&hv_test_info->lock); - - delta = t1 - t0; - if (delta < 0) { - spin_lock(&hv_test_info->lock); - ++hv_test_info->warps; - if (delta < hv_test_info->worst){ - hv_test_info->worst = delta; - printf("Worst warp %lld\n", hv_test_info->worst); - } - spin_unlock(&hv_test_info->lock); - } - if (delta == 0) - ++hv_test_info->stalls; - - if (!((unsigned long)i & 31)) - asm volatile("rep; nop"); - } - - atomic_dec(&hv_test_info->ncpus); + int i; + for (i = 0; i < ncpus; ++i) { + long wc_sec, delta; + on_cpu(i, get_wallclock_secs, &wc_sec); + + delta = wc_sec - sec; + + if (delta > WC_DELTA_MAX || delta < -WC_DELTA_MAX) { + report("wallclock: %ld s, expected: %ld s, " + "delta: %ld s (expected < %ld s)", false, wc_sec, + sec, delta, WC_DELTA_MAX); + return; + } + } + report("all wallclocks within %ld s from expected", true, + WC_DELTA_MAX); } -static int cycle_test(int ncpus, int check, struct test_info *ti) +static void warp_test_cpu(void *data) { - int i; - unsigned long long begin, end; + struct warp_test_info *ti = data; + unsigned long long t = kvm_clock_read(); + unsigned long long end = t + DURATION * NSEC_PER_SEC; + ti->warps = 0; + ti->stalls = 0; + ti->worst = 0; + + do { + unsigned long long now = kvm_clock_read(); + long long delta = now - t; + + if (delta < 0) { + ti->warps++; + if (delta < ti->worst) + ti->worst = delta; + } + if (delta == 0) + ti->stalls++; + + t = now; + } while (t < end); + + atomic_dec(&cpus_left); +} - begin = rdtsc(); +static void perf_test_cpu(void *data) +{ + struct perf_test_info *ti = data; + unsigned long long end = kvm_clock_read() + + DURATION * NSEC_PER_SEC; + ti->loops = 0; + ti->cycles = rdtsc(); - atomic_set(&ti->ncpus, ncpus); - ti->check = check; - for (i = ncpus - 1; i >= 0; i--) - on_cpu_async(i, kvm_clock_test, (void *)ti); + do + ti->loops++; + while (kvm_clock_read() < end); - /* Wait for the end of other vcpu */ - while(atomic_read(&ti->ncpus)) - ; + ti->cycles = rdtsc() - ti->cycles; - end = rdtsc(); + atomic_dec(&cpus_left); +} - printf("Total vcpus: %d\n", ncpus); - printf("Test loops: %ld\n", loops); - if (check == 1) { - printf("Total warps: %" PRId64 "\n", ti->warps); - printf("Total stalls: %" PRId64 "\n", ti->stalls); - printf("Worst warp: %lld\n", ti->worst); - } else - printf("TSC cycles: %lld\n", end - begin); +static void warp_test(int ncpus, bool stable) +{ + int i; + unsigned long long warps = 0, stalls = 0; + long long worst = 0; + + pvclock_set_flags(stable ? PVCLOCK_RAW_CYCLE_BIT : 0); + + atomic_set(&cpus_left, ncpus); + for (i = ncpus - 1; i >= 0; i--) + on_cpu_async(i, warp_test_cpu, &wti[i]); + while (atomic_read(&cpus_left)); + + for (i = 0; i < ncpus; i++) { + warps += wti[i].warps; + stalls += wti[i].stalls; + if (wti[i].worst < worst) + worst = wti[i].worst; + } + + report("with%s TSC_STABLE: warps: %llu (worst %lld), stalls: %llu", + warps == 0, stable ? "" : "out", warps, worst, stalls); +} - return ti->warps ? 1 : 0; +static void perf_test(int ncpus, bool stable) +{ + int i; + unsigned long long loops = 0, cycles = 0; + unsigned long long cpi_max; + + pvclock_set_flags(stable ? PVCLOCK_RAW_CYCLE_BIT : 0); + cpi_max = stable ? CPI_STABLE_MAX : CPI_UNSTABLE_MAX; + + atomic_set(&cpus_left, ncpus); + for (i = ncpus - 1; i >= 0; i--) + on_cpu_async(i, perf_test_cpu, &pti[i]); + while (atomic_read(&cpus_left)); + + for (i = 0; i < ncpus; i++) { + loops += pti[i].loops; + cycles += pti[i].cycles; + } + + cycles /= loops; + report("with%s TSC_STABLE: iterations/s/cpu: %llu, " + "cycles/iteration: %llu (expected < %u)", + cycles < cpi_max, stable ? "" : "out", + loops / DURATION / ncpus, cycles, cpi_max); } int main(int ac, char **av) { - int nerr = 0; - int ncpus; - int i; - - if (ac > 1) - loops = atol(av[1]); - if (ac > 2) - sec = atol(av[2]); - if (ac > 3) - threshold = atol(av[3]); - - smp_init(); - - ncpus = cpu_count(); - if (ncpus > MAX_CPU) - ncpus = MAX_CPU; - for (i = 0; i < ncpus; ++i) - on_cpu(i, kvm_clock_init, (void *)0); - - if (ac > 2) { - printf("Wallclock test, threshold %ld\n", threshold); - printf("Seconds get from host: %ld\n", sec); - for (i = 0; i < ncpus; ++i) - on_cpu(i, wallclock_test, &nerr); - } - - printf("Check the stability of raw cycle ...\n"); - pvclock_set_flags(PVCLOCK_TSC_STABLE_BIT - | PVCLOCK_RAW_CYCLE_BIT); - if (cycle_test(ncpus, 1, &ti[0])) - printf("Raw cycle is not stable\n"); - else - printf("Raw cycle is stable\n"); - - pvclock_set_flags(PVCLOCK_TSC_STABLE_BIT); - printf("Monotonic cycle test:\n"); - nerr += cycle_test(ncpus, 1, &ti[1]); - - printf("Measure the performance of raw cycle ...\n"); - pvclock_set_flags(PVCLOCK_TSC_STABLE_BIT - | PVCLOCK_RAW_CYCLE_BIT); - cycle_test(ncpus, 0, &ti[2]); - - printf("Measure the performance of adjusted cycle ...\n"); - pvclock_set_flags(PVCLOCK_TSC_STABLE_BIT); - cycle_test(ncpus, 0, &ti[3]); - - for (i = 0; i < ncpus; ++i) - on_cpu(i, kvm_clock_clear, (void *)0); - - return nerr > 0 ? 1 : 0; + int ncpus; + int i; + long sec = -1; + + if (ac > 1) + sec = atol(av[1]); + + smp_init(); + + ncpus = cpu_count(); + if (ncpus > MAX_CPU) + ncpus = MAX_CPU; + for (i = 0; i < ncpus; ++i) + on_cpu(i, kvm_clock_init, (void *)0); + + if (sec > 0) + wallclock_test(ncpus, sec); + + warp_test(ncpus, true); + warp_test(ncpus, false); + perf_test(ncpus, true); + perf_test(ncpus, false); + + for (i = 0; i < ncpus; ++i) + on_cpu(i, kvm_clock_clear, (void *)0); + + return report_summary(); } diff --git a/x86/unittests.cfg b/x86/unittests.cfg index 60747cf..ef66591 100644 --- a/x86/unittests.cfg +++ b/x86/unittests.cfg @@ -172,7 +172,7 @@ groups = tasks [kvmclock_test] file = kvmclock_test.flat smp = 2 -extra_params = --append "10000000 `date +%s`" +extra_params = --append "`date +%s`" [pcid] file = pcid.flat