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=-8.2 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, USER_AGENT_SANE_1 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 E41D5C33C9E for ; Sat, 11 Jan 2020 07:33:22 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id A50072077C for ; Sat, 11 Jan 2020 07:33:22 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728560AbgAKHdV (ORCPT ); Sat, 11 Jan 2020 02:33:21 -0500 Received: from szxga01-in.huawei.com ([45.249.212.187]:2923 "EHLO huawei.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1728501AbgAKHdV (ORCPT ); Sat, 11 Jan 2020 02:33:21 -0500 Received: from DGGEMM401-HUB.china.huawei.com (unknown [172.30.72.56]) by Forcepoint Email with ESMTP id 85B55B68251585DA7E47; Sat, 11 Jan 2020 15:33:19 +0800 (CST) Received: from dggeme755-chm.china.huawei.com (10.3.19.101) by DGGEMM401-HUB.china.huawei.com (10.3.20.209) with Microsoft SMTP Server (TLS) id 14.3.439.0; Sat, 11 Jan 2020 15:33:19 +0800 Received: from [127.0.0.1] (10.173.221.248) by dggeme755-chm.china.huawei.com (10.3.19.101) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1713.5; Sat, 11 Jan 2020 15:33:18 +0800 Subject: Re: [PATCH v2 6/6] KVM: arm64: Support the VCPU preemption check To: Steven Price , , , , , , CC: , , , , , , , , , "Wanghaibin (D)" References: <20191226135833.1052-1-yezengruan@huawei.com> <20191226135833.1052-7-yezengruan@huawei.com> <5a1f6745-2deb-253b-7022-f2725d8d40ba@arm.com> From: yezengruan Message-ID: Date: Sat, 11 Jan 2020 15:33:16 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Thunderbird/68.3.0 MIME-Version: 1.0 In-Reply-To: <5a1f6745-2deb-253b-7022-f2725d8d40ba@arm.com> Content-Type: text/plain; charset="utf-8" Content-Language: en-US Content-Transfer-Encoding: 8bit X-Originating-IP: [10.173.221.248] X-ClientProxiedBy: dggeme701-chm.china.huawei.com (10.1.199.97) To dggeme755-chm.china.huawei.com (10.3.19.101) X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Steve, On 2020/1/9 23:09, Steven Price wrote: > On 26/12/2019 13:58, Zengruan Ye wrote: >> Support the vcpu_is_preempted() functionality under KVM/arm64. This will >> enhance lock performance on overcommitted hosts (more runnable VCPUs >> than physical CPUs in the system) as doing busy waits for preempted >> VCPUs will hurt system performance far worse than early yielding. >> >> unix benchmark result: >>    host:  kernel 5.5.0-rc1, HiSilicon Kunpeng920, 8 CPUs >>    guest: kernel 5.5.0-rc1, 16 VCPUs >> >>                 test-case                |    after-patch    |   before-patch >> ----------------------------------------+-------------------+------------------ >>   Dhrystone 2 using register variables   | 334600751.0 lps   | 335319028.3 lps >>   Double-Precision Whetstone             |     32856.1 MWIPS |     32849.6 MWIPS >>   Execl Throughput                       |      3662.1 lps   |      2718.0 lps >>   File Copy 1024 bufsize 2000 maxblocks  |    432906.4 KBps  |    158011.8 KBps >>   File Copy 256 bufsize 500 maxblocks    |    116023.0 KBps  |     37664.0 KBps >>   File Copy 4096 bufsize 8000 maxblocks  |   1432769.8 KBps  |    441108.8 KBps >>   Pipe Throughput                        |   6405029.6 lps   |   6021457.6 lps >>   Pipe-based Context Switching           |    185872.7 lps   |    184255.3 lps >>   Process Creation                       |      4025.7 lps   |      3706.6 lps >>   Shell Scripts (1 concurrent)           |      6745.6 lpm   |      6436.1 lpm >>   Shell Scripts (8 concurrent)           |       998.7 lpm   |       931.1 lpm >>   System Call Overhead                   |   3913363.1 lps   |   3883287.8 lps >> ----------------------------------------+-------------------+------------------ >>   System Benchmarks Index Score          |      1835.1       |      1327.6 >> >> Signed-off-by: Zengruan Ye >> --- >>   arch/arm64/include/asm/paravirt.h |   3 + >>   arch/arm64/kernel/paravirt.c      | 117 ++++++++++++++++++++++++++++++ >>   arch/arm64/kernel/setup.c         |   2 + >>   include/linux/cpuhotplug.h        |   1 + >>   4 files changed, 123 insertions(+) >> >> diff --git a/arch/arm64/include/asm/paravirt.h b/arch/arm64/include/asm/paravirt.h >> index 7b1c81b544bb..ca3a2c7881f3 100644 >> --- a/arch/arm64/include/asm/paravirt.h >> +++ b/arch/arm64/include/asm/paravirt.h >> @@ -29,6 +29,8 @@ static inline u64 paravirt_steal_clock(int cpu) >>     int __init pv_time_init(void); >>   +int __init pv_lock_init(void); >> + >>   __visible bool __native_vcpu_is_preempted(int cpu); >>     static inline bool pv_vcpu_is_preempted(int cpu) >> @@ -39,6 +41,7 @@ static inline bool pv_vcpu_is_preempted(int cpu) >>   #else >>     #define pv_time_init() do {} while (0) >> +#define pv_lock_init() do {} while (0) >>     #endif // CONFIG_PARAVIRT >>   diff --git a/arch/arm64/kernel/paravirt.c b/arch/arm64/kernel/paravirt.c >> index d8f1ba8c22ce..bd2ad6a17a26 100644 >> --- a/arch/arm64/kernel/paravirt.c >> +++ b/arch/arm64/kernel/paravirt.c >> @@ -22,6 +22,7 @@ >>   #include >>   #include >>   #include >> +#include >>     struct static_key paravirt_steal_enabled; >>   struct static_key paravirt_steal_rq_enabled; >> @@ -35,6 +36,10 @@ struct pv_time_stolen_time_region { >>       struct pvclock_vcpu_stolen_time *kaddr; >>   }; >>   +struct pv_lock_state_region { >> +    struct pvlock_vcpu_state *kaddr; >> +}; >> + >>   static DEFINE_PER_CPU(struct pv_time_stolen_time_region, stolen_time_region); >>     static bool steal_acc = true; >> @@ -158,3 +163,115 @@ int __init pv_time_init(void) >>         return 0; >>   } >> + >> +static DEFINE_PER_CPU(struct pv_lock_state_region, lock_state_region); >> + >> +static bool kvm_vcpu_is_preempted(int cpu) >> +{ >> +    struct pv_lock_state_region *reg; >> +    __le64 preempted_le; >> + >> +    reg = per_cpu_ptr(&lock_state_region, cpu); >> +    if (!reg->kaddr) { >> +        pr_warn_once("PV lock enabled but not configured for cpu %d\n", >> +                 cpu); >> +        return false; >> +    } >> + >> +    preempted_le = le64_to_cpu(READ_ONCE(reg->kaddr->preempted)); >> + >> +    return !!(preempted_le & 1); > > According to the documentation preempted != 0 means preempted, but here you are checking the LSB. You need to be consistent about the ABI. Thanks for posting this. I'll update the code. > >> +} >> + >> +static int pvlock_vcpu_state_dying_cpu(unsigned int cpu) >> +{ >> +    struct pv_lock_state_region *reg; >> + >> +    reg = this_cpu_ptr(&lock_state_region); >> +    if (!reg->kaddr) >> +        return 0; >> + >> +    memunmap(reg->kaddr); >> +    memset(reg, 0, sizeof(*reg)); >> + >> +    return 0; >> +} >> + >> +static int init_pvlock_vcpu_state(unsigned int cpu) >> +{ >> +    struct pv_lock_state_region *reg; >> +    struct arm_smccc_res res; >> + >> +    reg = this_cpu_ptr(&lock_state_region); >> + >> +    arm_smccc_1_1_invoke(ARM_SMCCC_HV_PV_LOCK_PREEMPTED, &res); >> + >> +    if (res.a0 == SMCCC_RET_NOT_SUPPORTED) { >> +        pr_warn("Failed to init PV lock data structure\n"); >> +        return -EINVAL; >> +    } >> + >> +    reg->kaddr = memremap(res.a0, >> +                  sizeof(struct pvlock_vcpu_state), >> +                  MEMREMAP_WB); >> + >> +    if (!reg->kaddr) { >> +        pr_warn("Failed to map PV lock data structure\n"); >> +        return -ENOMEM; >> +    } >> + >> +    return 0; >> +} >> + >> +static int kvm_arm_init_pvlock(void) >> +{ >> +    int ret; >> + >> +    ret = cpuhp_setup_state(CPUHP_AP_ARM_KVM_PVLOCK_STARTING, >> +                "hypervisor/arm/pvlock:starting", >> +                init_pvlock_vcpu_state, >> +                pvlock_vcpu_state_dying_cpu); >> +    if (ret < 0) { >> +        pr_warn("PV-lock init failed\n"); >> +        return ret; >> +    } >> + >> +    return 0; >> +} >> + >> +static bool has_kvm_pvlock(void) >> +{ >> +    struct arm_smccc_res res; >> + >> +    /* To detect the presence of PV lock support we require SMCCC 1.1+ */ >> +    if (psci_ops.smccc_version < SMCCC_VERSION_1_1) >> +        return false; >> + >> +    arm_smccc_1_1_invoke(ARM_SMCCC_ARCH_FEATURES_FUNC_ID, >> +                 ARM_SMCCC_HV_PV_LOCK_FEATURES, &res); > > As mentioned previously we could do with something more robust to check that the hypervisor is actually KVM before assuming that vendor specific IDs are valid. Will update next version. > > Steve > >> + >> +    if (res.a0 != SMCCC_RET_SUCCESS) >> +        return false; >> + >> +    return true; >> +} >> + >> +int __init pv_lock_init(void) >> +{ >> +    int ret; >> + >> +    if (is_hyp_mode_available()) >> +        return 0; >> + >> +    if (!has_kvm_pvlock()) >> +        return 0; >> + >> +    ret = kvm_arm_init_pvlock(); >> +    if (ret) >> +        return ret; >> + >> +    pv_ops.lock.vcpu_is_preempted = kvm_vcpu_is_preempted; >> +    pr_info("using PV-lock preempted\n"); >> + >> +    return 0; >> +} >> diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c >> index 56f664561754..aa3a8b9e710f 100644 >> --- a/arch/arm64/kernel/setup.c >> +++ b/arch/arm64/kernel/setup.c >> @@ -341,6 +341,8 @@ void __init setup_arch(char **cmdline_p) >>       smp_init_cpus(); >>       smp_build_mpidr_hash(); >>   +    pv_lock_init(); >> + >>       /* Init percpu seeds for random tags after cpus are set up. */ >>       kasan_init_tags(); >>   diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h >> index e51ee772b9f5..f72ff95ab63a 100644 >> --- a/include/linux/cpuhotplug.h >> +++ b/include/linux/cpuhotplug.h >> @@ -138,6 +138,7 @@ enum cpuhp_state { >>       CPUHP_AP_DUMMY_TIMER_STARTING, >>       CPUHP_AP_ARM_XEN_STARTING, >>       CPUHP_AP_ARM_KVMPV_STARTING, >> +    CPUHP_AP_ARM_KVM_PVLOCK_STARTING, >>       CPUHP_AP_ARM_CORESIGHT_STARTING, >>       CPUHP_AP_ARM64_ISNDEP_STARTING, >>       CPUHP_AP_SMPCFD_DYING, >> > > > . Thanks, Zengruan 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=-8.2 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS, USER_AGENT_SANE_1 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 E0F64C33CA3 for ; Sat, 11 Jan 2020 07:33:27 +0000 (UTC) Received: from mm01.cs.columbia.edu (mm01.cs.columbia.edu [128.59.11.253]) by mail.kernel.org (Postfix) with ESMTP id 7493E20842 for ; Sat, 11 Jan 2020 07:33:27 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7493E20842 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=huawei.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=kvmarm-bounces@lists.cs.columbia.edu Received: from localhost (localhost [127.0.0.1]) by mm01.cs.columbia.edu (Postfix) with ESMTP id EACF14B08D; Sat, 11 Jan 2020 02:33:26 -0500 (EST) X-Virus-Scanned: at lists.cs.columbia.edu Received: from mm01.cs.columbia.edu ([127.0.0.1]) by localhost (mm01.cs.columbia.edu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 5B5kDjrRKqUe; Sat, 11 Jan 2020 02:33:25 -0500 (EST) Received: from mm01.cs.columbia.edu (localhost [127.0.0.1]) by mm01.cs.columbia.edu (Postfix) with ESMTP id 814D04B0B5; Sat, 11 Jan 2020 02:33:25 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by mm01.cs.columbia.edu (Postfix) with ESMTP id AA2AD4B08D for ; Sat, 11 Jan 2020 02:33:24 -0500 (EST) X-Virus-Scanned: at lists.cs.columbia.edu Received: from mm01.cs.columbia.edu ([127.0.0.1]) by localhost (mm01.cs.columbia.edu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 0xE9DH1K3eUu for ; Sat, 11 Jan 2020 02:33:23 -0500 (EST) Received: from huawei.com (szxga01-in.huawei.com [45.249.212.187]) by mm01.cs.columbia.edu (Postfix) with ESMTPS id 0C3E34AFFB for ; Sat, 11 Jan 2020 02:33:23 -0500 (EST) Received: from DGGEMM401-HUB.china.huawei.com (unknown [172.30.72.56]) by Forcepoint Email with ESMTP id 85B55B68251585DA7E47; Sat, 11 Jan 2020 15:33:19 +0800 (CST) Received: from dggeme755-chm.china.huawei.com (10.3.19.101) by DGGEMM401-HUB.china.huawei.com (10.3.20.209) with Microsoft SMTP Server (TLS) id 14.3.439.0; Sat, 11 Jan 2020 15:33:19 +0800 Received: from [127.0.0.1] (10.173.221.248) by dggeme755-chm.china.huawei.com (10.3.19.101) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1713.5; Sat, 11 Jan 2020 15:33:18 +0800 Subject: Re: [PATCH v2 6/6] KVM: arm64: Support the VCPU preemption check To: Steven Price , , , , , , References: <20191226135833.1052-1-yezengruan@huawei.com> <20191226135833.1052-7-yezengruan@huawei.com> <5a1f6745-2deb-253b-7022-f2725d8d40ba@arm.com> From: yezengruan Message-ID: Date: Sat, 11 Jan 2020 15:33:16 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Thunderbird/68.3.0 MIME-Version: 1.0 In-Reply-To: <5a1f6745-2deb-253b-7022-f2725d8d40ba@arm.com> Content-Language: en-US X-Originating-IP: [10.173.221.248] X-ClientProxiedBy: dggeme701-chm.china.huawei.com (10.1.199.97) To dggeme755-chm.china.huawei.com (10.3.19.101) X-CFilter-Loop: Reflected Cc: catalin.marinas@arm.com, daniel.lezcano@linaro.org, linux@armlinux.org.uk, maz@kernel.org, will@kernel.org X-BeenThere: kvmarm@lists.cs.columbia.edu X-Mailman-Version: 2.1.14 Precedence: list List-Id: Where KVM/ARM decisions are made List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: kvmarm-bounces@lists.cs.columbia.edu Sender: kvmarm-bounces@lists.cs.columbia.edu SGkgU3RldmUsCgpPbiAyMDIwLzEvOSAyMzowOSwgU3RldmVuIFByaWNlIHdyb3RlOgo+IE9uIDI2 LzEyLzIwMTkgMTM6NTgsIFplbmdydWFuIFllIHdyb3RlOgo+PiBTdXBwb3J0IHRoZSB2Y3B1X2lz X3ByZWVtcHRlZCgpIGZ1bmN0aW9uYWxpdHkgdW5kZXIgS1ZNL2FybTY0LiBUaGlzIHdpbGwKPj4g ZW5oYW5jZSBsb2NrIHBlcmZvcm1hbmNlIG9uIG92ZXJjb21taXR0ZWQgaG9zdHMgKG1vcmUgcnVu bmFibGUgVkNQVXMKPj4gdGhhbiBwaHlzaWNhbCBDUFVzIGluIHRoZSBzeXN0ZW0pIGFzIGRvaW5n IGJ1c3kgd2FpdHMgZm9yIHByZWVtcHRlZAo+PiBWQ1BVcyB3aWxsIGh1cnQgc3lzdGVtIHBlcmZv cm1hbmNlIGZhciB3b3JzZSB0aGFuIGVhcmx5IHlpZWxkaW5nLgo+Pgo+PiB1bml4IGJlbmNobWFy ayByZXN1bHQ6Cj4+IMKgwqAgaG9zdDrCoCBrZXJuZWwgNS41LjAtcmMxLCBIaVNpbGljb24gS3Vu cGVuZzkyMCwgOCBDUFVzCj4+IMKgwqAgZ3Vlc3Q6IGtlcm5lbCA1LjUuMC1yYzEsIDE2IFZDUFVz Cj4+Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB0ZXN0LWNhc2XCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqDCoCBhZnRlci1wYXRjaMKgwqDCoCB8wqDCoCBiZWZv cmUtcGF0Y2gKPj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLQo+PiDCoCBEaHJ5c3RvbmUgMiB1c2lu ZyByZWdpc3RlciB2YXJpYWJsZXPCoMKgIHwgMzM0NjAwNzUxLjAgbHBzwqDCoCB8IDMzNTMxOTAy OC4zIGxwcwo+PiDCoCBEb3VibGUtUHJlY2lzaW9uIFdoZXRzdG9uZcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCB8wqDCoMKgwqAgMzI4NTYuMSBNV0lQUyB8wqDCoMKgwqAgMzI4NDkuNiBNV0lQUwo+ PiDCoCBFeGVjbCBUaHJvdWdocHV0wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgfMKgwqDCoMKgwqAgMzY2Mi4xIGxwc8KgwqAgfMKgwqDCoMKgwqAgMjcxOC4wIGxw cwo+PiDCoCBGaWxlIENvcHkgMTAyNCBidWZzaXplIDIwMDAgbWF4YmxvY2tzwqAgfMKgwqDCoCA0 MzI5MDYuNCBLQnBzwqAgfMKgwqDCoCAxNTgwMTEuOCBLQnBzCj4+IMKgIEZpbGUgQ29weSAyNTYg YnVmc2l6ZSA1MDAgbWF4YmxvY2tzwqDCoMKgIHzCoMKgwqAgMTE2MDIzLjAgS0Jwc8KgIHzCoMKg wqDCoCAzNzY2NC4wIEtCcHMKPj4gwqAgRmlsZSBDb3B5IDQwOTYgYnVmc2l6ZSA4MDAwIG1heGJs b2Nrc8KgIHzCoMKgIDE0MzI3NjkuOCBLQnBzwqAgfMKgwqDCoCA0NDExMDguOCBLQnBzCj4+IMKg IFBpcGUgVGhyb3VnaHB1dMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgfMKgwqAgNjQwNTAyOS42IGxwc8KgwqAgfMKgwqAgNjAyMTQ1Ny42IGxwcwo+PiDCoCBQ aXBlLWJhc2VkIENvbnRleHQgU3dpdGNoaW5nwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqDCoCAx ODU4NzIuNyBscHPCoMKgIHzCoMKgwqAgMTg0MjU1LjMgbHBzCj4+IMKgIFByb2Nlc3MgQ3JlYXRp b27CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8wqDCoMKgwqDC oCA0MDI1LjcgbHBzwqDCoCB8wqDCoMKgwqDCoCAzNzA2LjYgbHBzCj4+IMKgIFNoZWxsIFNjcmlw dHMgKDEgY29uY3VycmVudCnCoMKgwqDCoMKgwqDCoMKgwqDCoCB8wqDCoMKgwqDCoCA2NzQ1LjYg bHBtwqDCoCB8wqDCoMKgwqDCoCA2NDM2LjEgbHBtCj4+IMKgIFNoZWxsIFNjcmlwdHMgKDggY29u Y3VycmVudCnCoMKgwqDCoMKgwqDCoMKgwqDCoCB8wqDCoMKgwqDCoMKgIDk5OC43IGxwbcKgwqAg fMKgwqDCoMKgwqDCoCA5MzEuMSBscG0KPj4gwqAgU3lzdGVtIENhbGwgT3ZlcmhlYWTCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqAgMzkxMzM2My4xIGxwc8KgwqAgfMKg wqAgMzg4MzI4Ny44IGxwcwo+PiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tCj4+IMKgIFN5c3RlbSBC ZW5jaG1hcmtzIEluZGV4IFNjb3JlwqDCoMKgwqDCoMKgwqDCoMKgIHzCoMKgwqDCoMKgIDE4MzUu McKgwqDCoMKgwqDCoCB8wqDCoMKgwqDCoCAxMzI3LjYKPj4KPj4gU2lnbmVkLW9mZi1ieTogWmVu Z3J1YW4gWWUgPHllemVuZ3J1YW5AaHVhd2VpLmNvbT4KPj4gLS0tCj4+IMKgIGFyY2gvYXJtNjQv aW5jbHVkZS9hc20vcGFyYXZpcnQuaCB8wqDCoCAzICsKPj4gwqAgYXJjaC9hcm02NC9rZXJuZWwv cGFyYXZpcnQuY8KgwqDCoMKgwqAgfCAxMTcgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr Cj4+IMKgIGFyY2gvYXJtNjQva2VybmVsL3NldHVwLmPCoMKgwqDCoMKgwqDCoMKgIHzCoMKgIDIg Kwo+PiDCoCBpbmNsdWRlL2xpbnV4L2NwdWhvdHBsdWcuaMKgwqDCoMKgwqDCoMKgIHzCoMKgIDEg Kwo+PiDCoCA0IGZpbGVzIGNoYW5nZWQsIDEyMyBpbnNlcnRpb25zKCspCj4+Cj4+IGRpZmYgLS1n aXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BhcmF2aXJ0LmggYi9hcmNoL2FybTY0L2luY2x1 ZGUvYXNtL3BhcmF2aXJ0LmgKPj4gaW5kZXggN2IxYzgxYjU0NGJiLi5jYTNhMmM3ODgxZjMgMTAw NjQ0Cj4+IC0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcGFyYXZpcnQuaAo+PiArKysgYi9h cmNoL2FybTY0L2luY2x1ZGUvYXNtL3BhcmF2aXJ0LmgKPj4gQEAgLTI5LDYgKzI5LDggQEAgc3Rh dGljIGlubGluZSB1NjQgcGFyYXZpcnRfc3RlYWxfY2xvY2soaW50IGNwdSkKPj4gwqAgwqAgaW50 IF9faW5pdCBwdl90aW1lX2luaXQodm9pZCk7Cj4+IMKgICtpbnQgX19pbml0IHB2X2xvY2tfaW5p dCh2b2lkKTsKPj4gKwo+PiDCoCBfX3Zpc2libGUgYm9vbCBfX25hdGl2ZV92Y3B1X2lzX3ByZWVt cHRlZChpbnQgY3B1KTsKPj4gwqAgwqAgc3RhdGljIGlubGluZSBib29sIHB2X3ZjcHVfaXNfcHJl ZW1wdGVkKGludCBjcHUpCj4+IEBAIC0zOSw2ICs0MSw3IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBw dl92Y3B1X2lzX3ByZWVtcHRlZChpbnQgY3B1KQo+PiDCoCAjZWxzZQo+PiDCoCDCoCAjZGVmaW5l IHB2X3RpbWVfaW5pdCgpIGRvIHt9IHdoaWxlICgwKQo+PiArI2RlZmluZSBwdl9sb2NrX2luaXQo KSBkbyB7fSB3aGlsZSAoMCkKPj4gwqAgwqAgI2VuZGlmIC8vIENPTkZJR19QQVJBVklSVAo+PiDC oCBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvcGFyYXZpcnQuYyBiL2FyY2gvYXJtNjQv a2VybmVsL3BhcmF2aXJ0LmMKPj4gaW5kZXggZDhmMWJhOGMyMmNlLi5iZDJhZDZhMTdhMjYgMTAw NjQ0Cj4+IC0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3BhcmF2aXJ0LmMKPj4gKysrIGIvYXJjaC9h cm02NC9rZXJuZWwvcGFyYXZpcnQuYwo+PiBAQCAtMjIsNiArMjIsNyBAQAo+PiDCoCAjaW5jbHVk ZSA8YXNtL3BhcmF2aXJ0Lmg+Cj4+IMKgICNpbmNsdWRlIDxhc20vcHZjbG9jay1hYmkuaD4KPj4g wqAgI2luY2x1ZGUgPGFzbS9zbXBfcGxhdC5oPgo+PiArI2luY2x1ZGUgPGFzbS9wdmxvY2stYWJp Lmg+Cj4+IMKgIMKgIHN0cnVjdCBzdGF0aWNfa2V5IHBhcmF2aXJ0X3N0ZWFsX2VuYWJsZWQ7Cj4+ IMKgIHN0cnVjdCBzdGF0aWNfa2V5IHBhcmF2aXJ0X3N0ZWFsX3JxX2VuYWJsZWQ7Cj4+IEBAIC0z NSw2ICszNiwxMCBAQCBzdHJ1Y3QgcHZfdGltZV9zdG9sZW5fdGltZV9yZWdpb24gewo+PiDCoMKg wqDCoMKgIHN0cnVjdCBwdmNsb2NrX3ZjcHVfc3RvbGVuX3RpbWUgKmthZGRyOwo+PiDCoCB9Owo+ PiDCoCArc3RydWN0IHB2X2xvY2tfc3RhdGVfcmVnaW9uIHsKPj4gK8KgwqDCoCBzdHJ1Y3QgcHZs b2NrX3ZjcHVfc3RhdGUgKmthZGRyOwo+PiArfTsKPj4gKwo+PiDCoCBzdGF0aWMgREVGSU5FX1BF Ul9DUFUoc3RydWN0IHB2X3RpbWVfc3RvbGVuX3RpbWVfcmVnaW9uLCBzdG9sZW5fdGltZV9yZWdp b24pOwo+PiDCoCDCoCBzdGF0aWMgYm9vbCBzdGVhbF9hY2MgPSB0cnVlOwo+PiBAQCAtMTU4LDMg KzE2MywxMTUgQEAgaW50IF9faW5pdCBwdl90aW1lX2luaXQodm9pZCkKPj4gwqAgwqDCoMKgwqDC oCByZXR1cm4gMDsKPj4gwqAgfQo+PiArCj4+ICtzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0 IHB2X2xvY2tfc3RhdGVfcmVnaW9uLCBsb2NrX3N0YXRlX3JlZ2lvbik7Cj4+ICsKPj4gK3N0YXRp YyBib29sIGt2bV92Y3B1X2lzX3ByZWVtcHRlZChpbnQgY3B1KQo+PiArewo+PiArwqDCoMKgIHN0 cnVjdCBwdl9sb2NrX3N0YXRlX3JlZ2lvbiAqcmVnOwo+PiArwqDCoMKgIF9fbGU2NCBwcmVlbXB0 ZWRfbGU7Cj4+ICsKPj4gK8KgwqDCoCByZWcgPSBwZXJfY3B1X3B0cigmbG9ja19zdGF0ZV9yZWdp b24sIGNwdSk7Cj4+ICvCoMKgwqAgaWYgKCFyZWctPmthZGRyKSB7Cj4+ICvCoMKgwqDCoMKgwqDC oCBwcl93YXJuX29uY2UoIlBWIGxvY2sgZW5hYmxlZCBidXQgbm90IGNvbmZpZ3VyZWQgZm9yIGNw dSAlZFxuIiwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNwdSk7Cj4+ICvC oMKgwqDCoMKgwqDCoCByZXR1cm4gZmFsc2U7Cj4+ICvCoMKgwqAgfQo+PiArCj4+ICvCoMKgwqAg cHJlZW1wdGVkX2xlID0gbGU2NF90b19jcHUoUkVBRF9PTkNFKHJlZy0+a2FkZHItPnByZWVtcHRl ZCkpOwo+PiArCj4+ICvCoMKgwqAgcmV0dXJuICEhKHByZWVtcHRlZF9sZSAmIDEpOwo+IAo+IEFj Y29yZGluZyB0byB0aGUgZG9jdW1lbnRhdGlvbiBwcmVlbXB0ZWQgIT0gMCBtZWFucyBwcmVlbXB0 ZWQsIGJ1dCBoZXJlIHlvdSBhcmUgY2hlY2tpbmcgdGhlIExTQi4gWW91IG5lZWQgdG8gYmUgY29u c2lzdGVudCBhYm91dCB0aGUgQUJJLgoKVGhhbmtzIGZvciBwb3N0aW5nIHRoaXMuIEknbGwgdXBk YXRlIHRoZSBjb2RlLgoKPiAKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCBwdmxvY2tfdmNwdV9z dGF0ZV9keWluZ19jcHUodW5zaWduZWQgaW50IGNwdSkKPj4gK3sKPj4gK8KgwqDCoCBzdHJ1Y3Qg cHZfbG9ja19zdGF0ZV9yZWdpb24gKnJlZzsKPj4gKwo+PiArwqDCoMKgIHJlZyA9IHRoaXNfY3B1 X3B0cigmbG9ja19zdGF0ZV9yZWdpb24pOwo+PiArwqDCoMKgIGlmICghcmVnLT5rYWRkcikKPj4g K8KgwqDCoMKgwqDCoMKgIHJldHVybiAwOwo+PiArCj4+ICvCoMKgwqAgbWVtdW5tYXAocmVnLT5r YWRkcik7Cj4+ICvCoMKgwqAgbWVtc2V0KHJlZywgMCwgc2l6ZW9mKCpyZWcpKTsKPj4gKwo+PiAr wqDCoMKgIHJldHVybiAwOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IGluaXRfcHZsb2NrX3Zj cHVfc3RhdGUodW5zaWduZWQgaW50IGNwdSkKPj4gK3sKPj4gK8KgwqDCoCBzdHJ1Y3QgcHZfbG9j a19zdGF0ZV9yZWdpb24gKnJlZzsKPj4gK8KgwqDCoCBzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7 Cj4+ICsKPj4gK8KgwqDCoCByZWcgPSB0aGlzX2NwdV9wdHIoJmxvY2tfc3RhdGVfcmVnaW9uKTsK Pj4gKwo+PiArwqDCoMKgIGFybV9zbWNjY18xXzFfaW52b2tlKEFSTV9TTUNDQ19IVl9QVl9MT0NL X1BSRUVNUFRFRCwgJnJlcyk7Cj4+ICsKPj4gK8KgwqDCoCBpZiAocmVzLmEwID09IFNNQ0NDX1JF VF9OT1RfU1VQUE9SVEVEKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBwcl93YXJuKCJGYWlsZWQgdG8g aW5pdCBQViBsb2NrIGRhdGEgc3RydWN0dXJlXG4iKTsKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVy biAtRUlOVkFMOwo+PiArwqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgIHJlZy0+a2FkZHIgPSBtZW1y ZW1hcChyZXMuYTAsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNpemVv ZihzdHJ1Y3QgcHZsb2NrX3ZjcHVfc3RhdGUpLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBNRU1SRU1BUF9XQik7Cj4+ICsKPj4gK8KgwqDCoCBpZiAoIXJlZy0+a2FkZHIp IHsKPj4gK8KgwqDCoMKgwqDCoMKgIHByX3dhcm4oIkZhaWxlZCB0byBtYXAgUFYgbG9jayBkYXRh IHN0cnVjdHVyZVxuIik7Cj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVOT01FTTsKPj4gK8Kg wqDCoCB9Cj4+ICsKPj4gK8KgwqDCoCByZXR1cm4gMDsKPj4gK30KPj4gKwo+PiArc3RhdGljIGlu dCBrdm1fYXJtX2luaXRfcHZsb2NrKHZvaWQpCj4+ICt7Cj4+ICvCoMKgwqAgaW50IHJldDsKPj4g Kwo+PiArwqDCoMKgIHJldCA9IGNwdWhwX3NldHVwX3N0YXRlKENQVUhQX0FQX0FSTV9LVk1fUFZM T0NLX1NUQVJUSU5HLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJoeXBlcnZp c29yL2FybS9wdmxvY2s6c3RhcnRpbmciLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGluaXRfcHZsb2NrX3ZjcHVfc3RhdGUsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgcHZsb2NrX3ZjcHVfc3RhdGVfZHlpbmdfY3B1KTsKPj4gK8KgwqDCoCBpZiAocmV0IDwg MCkgewo+PiArwqDCoMKgwqDCoMKgwqAgcHJfd2FybigiUFYtbG9jayBpbml0IGZhaWxlZFxuIik7 Cj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0Owo+PiArwqDCoMKgIH0KPj4gKwo+PiArwqDC oMKgIHJldHVybiAwOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgYm9vbCBoYXNfa3ZtX3B2bG9jayh2 b2lkKQo+PiArewo+PiArwqDCoMKgIHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlczsKPj4gKwo+PiAr wqDCoMKgIC8qIFRvIGRldGVjdCB0aGUgcHJlc2VuY2Ugb2YgUFYgbG9jayBzdXBwb3J0IHdlIHJl cXVpcmUgU01DQ0MgMS4xKyAqLwo+PiArwqDCoMKgIGlmIChwc2NpX29wcy5zbWNjY192ZXJzaW9u IDwgU01DQ0NfVkVSU0lPTl8xXzEpCj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gZmFsc2U7Cj4+ ICsKPj4gK8KgwqDCoCBhcm1fc21jY2NfMV8xX2ludm9rZShBUk1fU01DQ0NfQVJDSF9GRUFUVVJF U19GVU5DX0lELAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgQVJNX1NNQ0ND X0hWX1BWX0xPQ0tfRkVBVFVSRVMsICZyZXMpOwo+IAo+IEFzIG1lbnRpb25lZCBwcmV2aW91c2x5 IHdlIGNvdWxkIGRvIHdpdGggc29tZXRoaW5nIG1vcmUgcm9idXN0IHRvIGNoZWNrIHRoYXQgdGhl IGh5cGVydmlzb3IgaXMgYWN0dWFsbHkgS1ZNIGJlZm9yZSBhc3N1bWluZyB0aGF0IHZlbmRvciBz cGVjaWZpYyBJRHMgYXJlIHZhbGlkLgoKV2lsbCB1cGRhdGUgbmV4dCB2ZXJzaW9uLgoKPiAKPiBT dGV2ZQo+IAo+PiArCj4+ICvCoMKgwqAgaWYgKHJlcy5hMCAhPSBTTUNDQ19SRVRfU1VDQ0VTUykK Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBmYWxzZTsKPj4gKwo+PiArwqDCoMKgIHJldHVybiB0 cnVlOwo+PiArfQo+PiArCj4+ICtpbnQgX19pbml0IHB2X2xvY2tfaW5pdCh2b2lkKQo+PiArewo+ PiArwqDCoMKgIGludCByZXQ7Cj4+ICsKPj4gK8KgwqDCoCBpZiAoaXNfaHlwX21vZGVfYXZhaWxh YmxlKCkpCj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gMDsKPj4gKwo+PiArwqDCoMKgIGlmICgh aGFzX2t2bV9wdmxvY2soKSkKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAwOwo+PiArCj4+ICvC oMKgwqAgcmV0ID0ga3ZtX2FybV9pbml0X3B2bG9jaygpOwo+PiArwqDCoMKgIGlmIChyZXQpCj4+ ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0Owo+PiArCj4+ICvCoMKgwqAgcHZfb3BzLmxvY2su dmNwdV9pc19wcmVlbXB0ZWQgPSBrdm1fdmNwdV9pc19wcmVlbXB0ZWQ7Cj4+ICvCoMKgwqAgcHJf aW5mbygidXNpbmcgUFYtbG9jayBwcmVlbXB0ZWRcbiIpOwo+PiArCj4+ICvCoMKgwqAgcmV0dXJu IDA7Cj4+ICt9Cj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9zZXR1cC5jIGIvYXJj aC9hcm02NC9rZXJuZWwvc2V0dXAuYwo+PiBpbmRleCA1NmY2NjQ1NjE3NTQuLmFhM2E4YjllNzEw ZiAxMDA2NDQKPj4gLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvc2V0dXAuYwo+PiArKysgYi9hcmNo L2FybTY0L2tlcm5lbC9zZXR1cC5jCj4+IEBAIC0zNDEsNiArMzQxLDggQEAgdm9pZCBfX2luaXQg c2V0dXBfYXJjaChjaGFyICoqY21kbGluZV9wKQo+PiDCoMKgwqDCoMKgIHNtcF9pbml0X2NwdXMo KTsKPj4gwqDCoMKgwqDCoCBzbXBfYnVpbGRfbXBpZHJfaGFzaCgpOwo+PiDCoCArwqDCoMKgIHB2 X2xvY2tfaW5pdCgpOwo+PiArCj4+IMKgwqDCoMKgwqAgLyogSW5pdCBwZXJjcHUgc2VlZHMgZm9y IHJhbmRvbSB0YWdzIGFmdGVyIGNwdXMgYXJlIHNldCB1cC4gKi8KPj4gwqDCoMKgwqDCoCBrYXNh bl9pbml0X3RhZ3MoKTsKPj4gwqAgZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1aG90cGx1 Zy5oIGIvaW5jbHVkZS9saW51eC9jcHVob3RwbHVnLmgKPj4gaW5kZXggZTUxZWU3NzJiOWY1Li5m NzJmZjk1YWI2M2EgMTAwNjQ0Cj4+IC0tLSBhL2luY2x1ZGUvbGludXgvY3B1aG90cGx1Zy5oCj4+ ICsrKyBiL2luY2x1ZGUvbGludXgvY3B1aG90cGx1Zy5oCj4+IEBAIC0xMzgsNiArMTM4LDcgQEAg ZW51bSBjcHVocF9zdGF0ZSB7Cj4+IMKgwqDCoMKgwqAgQ1BVSFBfQVBfRFVNTVlfVElNRVJfU1RB UlRJTkcsCj4+IMKgwqDCoMKgwqAgQ1BVSFBfQVBfQVJNX1hFTl9TVEFSVElORywKPj4gwqDCoMKg wqDCoCBDUFVIUF9BUF9BUk1fS1ZNUFZfU1RBUlRJTkcsCj4+ICvCoMKgwqAgQ1BVSFBfQVBfQVJN X0tWTV9QVkxPQ0tfU1RBUlRJTkcsCj4+IMKgwqDCoMKgwqAgQ1BVSFBfQVBfQVJNX0NPUkVTSUdI VF9TVEFSVElORywKPj4gwqDCoMKgwqDCoCBDUFVIUF9BUF9BUk02NF9JU05ERVBfU1RBUlRJTkcs Cj4+IMKgwqDCoMKgwqAgQ1BVSFBfQVBfU01QQ0ZEX0RZSU5HLAo+Pgo+IAo+IAo+IC4KClRoYW5r cywKClplbmdydWFuCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXwprdm1hcm0gbWFpbGluZyBsaXN0Cmt2bWFybUBsaXN0cy5jcy5jb2x1bWJpYS5lZHUKaHR0 cHM6Ly9saXN0cy5jcy5jb2x1bWJpYS5lZHUvbWFpbG1hbi9saXN0aW5mby9rdm1hcm0K From mboxrd@z Thu Jan 1 00:00:00 1970 From: yezengruan Subject: Re: [PATCH v2 6/6] KVM: arm64: Support the VCPU preemption check Date: Sat, 11 Jan 2020 15:33:16 +0800 Message-ID: References: <20191226135833.1052-1-yezengruan@huawei.com> <20191226135833.1052-7-yezengruan@huawei.com> <5a1f6745-2deb-253b-7022-f2725d8d40ba@arm.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit Return-path: In-Reply-To: <5a1f6745-2deb-253b-7022-f2725d8d40ba@arm.com> Content-Language: en-US Sender: linux-kernel-owner@vger.kernel.org To: Steven Price , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org, linux-doc@vger.kernel.org, virtualization@lists.linux-foundation.org Cc: maz@kernel.org, james.morse@arm.com, linux@armlinux.org.uk, suzuki.poulose@arm.com, julien.thierry.kdev@gmail.com, catalin.marinas@arm.com, mark.rutland@arm.com, will@kernel.org, daniel.lezcano@linaro.org, "Wanghaibin (D)" List-Id: virtualization@lists.linuxfoundation.org Hi Steve, On 2020/1/9 23:09, Steven Price wrote: > On 26/12/2019 13:58, Zengruan Ye wrote: >> Support the vcpu_is_preempted() functionality under KVM/arm64. This will >> enhance lock performance on overcommitted hosts (more runnable VCPUs >> than physical CPUs in the system) as doing busy waits for preempted >> VCPUs will hurt system performance far worse than early yielding. >> >> unix benchmark result: >>    host:  kernel 5.5.0-rc1, HiSilicon Kunpeng920, 8 CPUs >>    guest: kernel 5.5.0-rc1, 16 VCPUs >> >>                 test-case                |    after-patch    |   before-patch >> ----------------------------------------+-------------------+------------------ >>   Dhrystone 2 using register variables   | 334600751.0 lps   | 335319028.3 lps >>   Double-Precision Whetstone             |     32856.1 MWIPS |     32849.6 MWIPS >>   Execl Throughput                       |      3662.1 lps   |      2718.0 lps >>   File Copy 1024 bufsize 2000 maxblocks  |    432906.4 KBps  |    158011.8 KBps >>   File Copy 256 bufsize 500 maxblocks    |    116023.0 KBps  |     37664.0 KBps >>   File Copy 4096 bufsize 8000 maxblocks  |   1432769.8 KBps  |    441108.8 KBps >>   Pipe Throughput                        |   6405029.6 lps   |   6021457.6 lps >>   Pipe-based Context Switching           |    185872.7 lps   |    184255.3 lps >>   Process Creation                       |      4025.7 lps   |      3706.6 lps >>   Shell Scripts (1 concurrent)           |      6745.6 lpm   |      6436.1 lpm >>   Shell Scripts (8 concurrent)           |       998.7 lpm   |       931.1 lpm >>   System Call Overhead                   |   3913363.1 lps   |   3883287.8 lps >> ----------------------------------------+-------------------+------------------ >>   System Benchmarks Index Score          |      1835.1       |      1327.6 >> >> Signed-off-by: Zengruan Ye >> --- >>   arch/arm64/include/asm/paravirt.h |   3 + >>   arch/arm64/kernel/paravirt.c      | 117 ++++++++++++++++++++++++++++++ >>   arch/arm64/kernel/setup.c         |   2 + >>   include/linux/cpuhotplug.h        |   1 + >>   4 files changed, 123 insertions(+) >> >> diff --git a/arch/arm64/include/asm/paravirt.h b/arch/arm64/include/asm/paravirt.h >> index 7b1c81b544bb..ca3a2c7881f3 100644 >> --- a/arch/arm64/include/asm/paravirt.h >> +++ b/arch/arm64/include/asm/paravirt.h >> @@ -29,6 +29,8 @@ static inline u64 paravirt_steal_clock(int cpu) >>     int __init pv_time_init(void); >>   +int __init pv_lock_init(void); >> + >>   __visible bool __native_vcpu_is_preempted(int cpu); >>     static inline bool pv_vcpu_is_preempted(int cpu) >> @@ -39,6 +41,7 @@ static inline bool pv_vcpu_is_preempted(int cpu) >>   #else >>     #define pv_time_init() do {} while (0) >> +#define pv_lock_init() do {} while (0) >>     #endif // CONFIG_PARAVIRT >>   diff --git a/arch/arm64/kernel/paravirt.c b/arch/arm64/kernel/paravirt.c >> index d8f1ba8c22ce..bd2ad6a17a26 100644 >> --- a/arch/arm64/kernel/paravirt.c >> +++ b/arch/arm64/kernel/paravirt.c >> @@ -22,6 +22,7 @@ >>   #include >>   #include >>   #include >> +#include >>     struct static_key paravirt_steal_enabled; >>   struct static_key paravirt_steal_rq_enabled; >> @@ -35,6 +36,10 @@ struct pv_time_stolen_time_region { >>       struct pvclock_vcpu_stolen_time *kaddr; >>   }; >>   +struct pv_lock_state_region { >> +    struct pvlock_vcpu_state *kaddr; >> +}; >> + >>   static DEFINE_PER_CPU(struct pv_time_stolen_time_region, stolen_time_region); >>     static bool steal_acc = true; >> @@ -158,3 +163,115 @@ int __init pv_time_init(void) >>         return 0; >>   } >> + >> +static DEFINE_PER_CPU(struct pv_lock_state_region, lock_state_region); >> + >> +static bool kvm_vcpu_is_preempted(int cpu) >> +{ >> +    struct pv_lock_state_region *reg; >> +    __le64 preempted_le; >> + >> +    reg = per_cpu_ptr(&lock_state_region, cpu); >> +    if (!reg->kaddr) { >> +        pr_warn_once("PV lock enabled but not configured for cpu %d\n", >> +                 cpu); >> +        return false; >> +    } >> + >> +    preempted_le = le64_to_cpu(READ_ONCE(reg->kaddr->preempted)); >> + >> +    return !!(preempted_le & 1); > > According to the documentation preempted != 0 means preempted, but here you are checking the LSB. You need to be consistent about the ABI. Thanks for posting this. I'll update the code. > >> +} >> + >> +static int pvlock_vcpu_state_dying_cpu(unsigned int cpu) >> +{ >> +    struct pv_lock_state_region *reg; >> + >> +    reg = this_cpu_ptr(&lock_state_region); >> +    if (!reg->kaddr) >> +        return 0; >> + >> +    memunmap(reg->kaddr); >> +    memset(reg, 0, sizeof(*reg)); >> + >> +    return 0; >> +} >> + >> +static int init_pvlock_vcpu_state(unsigned int cpu) >> +{ >> +    struct pv_lock_state_region *reg; >> +    struct arm_smccc_res res; >> + >> +    reg = this_cpu_ptr(&lock_state_region); >> + >> +    arm_smccc_1_1_invoke(ARM_SMCCC_HV_PV_LOCK_PREEMPTED, &res); >> + >> +    if (res.a0 == SMCCC_RET_NOT_SUPPORTED) { >> +        pr_warn("Failed to init PV lock data structure\n"); >> +        return -EINVAL; >> +    } >> + >> +    reg->kaddr = memremap(res.a0, >> +                  sizeof(struct pvlock_vcpu_state), >> +                  MEMREMAP_WB); >> + >> +    if (!reg->kaddr) { >> +        pr_warn("Failed to map PV lock data structure\n"); >> +        return -ENOMEM; >> +    } >> + >> +    return 0; >> +} >> + >> +static int kvm_arm_init_pvlock(void) >> +{ >> +    int ret; >> + >> +    ret = cpuhp_setup_state(CPUHP_AP_ARM_KVM_PVLOCK_STARTING, >> +                "hypervisor/arm/pvlock:starting", >> +                init_pvlock_vcpu_state, >> +                pvlock_vcpu_state_dying_cpu); >> +    if (ret < 0) { >> +        pr_warn("PV-lock init failed\n"); >> +        return ret; >> +    } >> + >> +    return 0; >> +} >> + >> +static bool has_kvm_pvlock(void) >> +{ >> +    struct arm_smccc_res res; >> + >> +    /* To detect the presence of PV lock support we require SMCCC 1.1+ */ >> +    if (psci_ops.smccc_version < SMCCC_VERSION_1_1) >> +        return false; >> + >> +    arm_smccc_1_1_invoke(ARM_SMCCC_ARCH_FEATURES_FUNC_ID, >> +                 ARM_SMCCC_HV_PV_LOCK_FEATURES, &res); > > As mentioned previously we could do with something more robust to check that the hypervisor is actually KVM before assuming that vendor specific IDs are valid. Will update next version. > > Steve > >> + >> +    if (res.a0 != SMCCC_RET_SUCCESS) >> +        return false; >> + >> +    return true; >> +} >> + >> +int __init pv_lock_init(void) >> +{ >> +    int ret; >> + >> +    if (is_hyp_mode_available()) >> +        return 0; >> + >> +    if (!has_kvm_pvlock()) >> +        return 0; >> + >> +    ret = kvm_arm_init_pvlock(); >> +    if (ret) >> +        return ret; >> + >> +    pv_ops.lock.vcpu_is_preempted = kvm_vcpu_is_preempted; >> +    pr_info("using PV-lock preempted\n"); >> + >> +    return 0; >> +} >> diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c >> index 56f664561754..aa3a8b9e710f 100644 >> --- a/arch/arm64/kernel/setup.c >> +++ b/arch/arm64/kernel/setup.c >> @@ -341,6 +341,8 @@ void __init setup_arch(char **cmdline_p) >>       smp_init_cpus(); >>       smp_build_mpidr_hash(); >>   +    pv_lock_init(); >> + >>       /* Init percpu seeds for random tags after cpus are set up. */ >>       kasan_init_tags(); >>   diff --git a/include/linux/cpuhotplug.h b/include/linux/cpuhotplug.h >> index e51ee772b9f5..f72ff95ab63a 100644 >> --- a/include/linux/cpuhotplug.h >> +++ b/include/linux/cpuhotplug.h >> @@ -138,6 +138,7 @@ enum cpuhp_state { >>       CPUHP_AP_DUMMY_TIMER_STARTING, >>       CPUHP_AP_ARM_XEN_STARTING, >>       CPUHP_AP_ARM_KVMPV_STARTING, >> +    CPUHP_AP_ARM_KVM_PVLOCK_STARTING, >>       CPUHP_AP_ARM_CORESIGHT_STARTING, >>       CPUHP_AP_ARM64_ISNDEP_STARTING, >>       CPUHP_AP_SMPCFD_DYING, >> > > > . Thanks, Zengruan 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=-8.3 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=unavailable 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 7587FC33C9E for ; Sat, 11 Jan 2020 07:33:30 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 421472082E for ; Sat, 11 Jan 2020 07:33:30 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="Vvfqv7QS" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 421472082E Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=huawei.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date: Message-ID:From:References:To:Subject:Reply-To:Content-ID:Content-Description :Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=hLG444ZLcF9yd9/1+4rnMtaCdOBQx/lBf4qhV1CvSkQ=; b=Vvfqv7QSjsy9JQ g4ItnqKbHebUz94F3bnl5Te9+1lIVlc9FcGKtalw80xI9oDNkUvPorsCDQkSqxMpg6aSTU90EHssD LUgN2ssnHqE8kQc0jiFbuOBoqlTkIOuQsprbWCtSI9heJ8qqp148np2sFbABsV0cIIAeoKZ9xM8q4 g1MXJyzeNjRmkYqJgLd2Oz0SBuX43AZQe0ERgbRIp8E75VLrRtYJLZGnm71Jb2/cYfMAKf+F/ztdj nkyfFrCw/6kxAu9Qrr+VTOYjejZ0QOou+hJftmtMD4VW/GlgLCB7AsFhlrV44nklgAmfr+BGvpOi8 d7Oconw7bydRcxA4t7fQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1iqBGu-0002kS-C9; Sat, 11 Jan 2020 07:33:24 +0000 Received: from szxga01-in.huawei.com ([45.249.212.187] helo=huawei.com) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1iqBGr-0002k5-8E for linux-arm-kernel@lists.infradead.org; Sat, 11 Jan 2020 07:33:23 +0000 Received: from DGGEMM401-HUB.china.huawei.com (unknown [172.30.72.56]) by Forcepoint Email with ESMTP id 85B55B68251585DA7E47; Sat, 11 Jan 2020 15:33:19 +0800 (CST) Received: from dggeme755-chm.china.huawei.com (10.3.19.101) by DGGEMM401-HUB.china.huawei.com (10.3.20.209) with Microsoft SMTP Server (TLS) id 14.3.439.0; Sat, 11 Jan 2020 15:33:19 +0800 Received: from [127.0.0.1] (10.173.221.248) by dggeme755-chm.china.huawei.com (10.3.19.101) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1713.5; Sat, 11 Jan 2020 15:33:18 +0800 Subject: Re: [PATCH v2 6/6] KVM: arm64: Support the VCPU preemption check To: Steven Price , , , , , , References: <20191226135833.1052-1-yezengruan@huawei.com> <20191226135833.1052-7-yezengruan@huawei.com> <5a1f6745-2deb-253b-7022-f2725d8d40ba@arm.com> From: yezengruan Message-ID: Date: Sat, 11 Jan 2020 15:33:16 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Thunderbird/68.3.0 MIME-Version: 1.0 In-Reply-To: <5a1f6745-2deb-253b-7022-f2725d8d40ba@arm.com> Content-Language: en-US X-Originating-IP: [10.173.221.248] X-ClientProxiedBy: dggeme701-chm.china.huawei.com (10.1.199.97) To dggeme755-chm.china.huawei.com (10.3.19.101) X-CFilter-Loop: Reflected X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200110_233321_726365_E55764D5 X-CRM114-Status: GOOD ( 17.68 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: mark.rutland@arm.com, suzuki.poulose@arm.com, catalin.marinas@arm.com, daniel.lezcano@linaro.org, linux@armlinux.org.uk, james.morse@arm.com, maz@kernel.org, "Wanghaibin \(D\)" , will@kernel.org, julien.thierry.kdev@gmail.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgU3RldmUsCgpPbiAyMDIwLzEvOSAyMzowOSwgU3RldmVuIFByaWNlIHdyb3RlOgo+IE9uIDI2 LzEyLzIwMTkgMTM6NTgsIFplbmdydWFuIFllIHdyb3RlOgo+PiBTdXBwb3J0IHRoZSB2Y3B1X2lz X3ByZWVtcHRlZCgpIGZ1bmN0aW9uYWxpdHkgdW5kZXIgS1ZNL2FybTY0LiBUaGlzIHdpbGwKPj4g ZW5oYW5jZSBsb2NrIHBlcmZvcm1hbmNlIG9uIG92ZXJjb21taXR0ZWQgaG9zdHMgKG1vcmUgcnVu bmFibGUgVkNQVXMKPj4gdGhhbiBwaHlzaWNhbCBDUFVzIGluIHRoZSBzeXN0ZW0pIGFzIGRvaW5n IGJ1c3kgd2FpdHMgZm9yIHByZWVtcHRlZAo+PiBWQ1BVcyB3aWxsIGh1cnQgc3lzdGVtIHBlcmZv cm1hbmNlIGZhciB3b3JzZSB0aGFuIGVhcmx5IHlpZWxkaW5nLgo+Pgo+PiB1bml4IGJlbmNobWFy ayByZXN1bHQ6Cj4+IMKgwqAgaG9zdDrCoCBrZXJuZWwgNS41LjAtcmMxLCBIaVNpbGljb24gS3Vu cGVuZzkyMCwgOCBDUFVzCj4+IMKgwqAgZ3Vlc3Q6IGtlcm5lbCA1LjUuMC1yYzEsIDE2IFZDUFVz Cj4+Cj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB0ZXN0LWNhc2XCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqDCoCBhZnRlci1wYXRjaMKgwqDCoCB8wqDCoCBiZWZv cmUtcGF0Y2gKPj4gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0t LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLQo+PiDCoCBEaHJ5c3RvbmUgMiB1c2lu ZyByZWdpc3RlciB2YXJpYWJsZXPCoMKgIHwgMzM0NjAwNzUxLjAgbHBzwqDCoCB8IDMzNTMxOTAy OC4zIGxwcwo+PiDCoCBEb3VibGUtUHJlY2lzaW9uIFdoZXRzdG9uZcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCB8wqDCoMKgwqAgMzI4NTYuMSBNV0lQUyB8wqDCoMKgwqAgMzI4NDkuNiBNV0lQUwo+ PiDCoCBFeGVjbCBUaHJvdWdocHV0wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgfMKgwqDCoMKgwqAgMzY2Mi4xIGxwc8KgwqAgfMKgwqDCoMKgwqAgMjcxOC4wIGxw cwo+PiDCoCBGaWxlIENvcHkgMTAyNCBidWZzaXplIDIwMDAgbWF4YmxvY2tzwqAgfMKgwqDCoCA0 MzI5MDYuNCBLQnBzwqAgfMKgwqDCoCAxNTgwMTEuOCBLQnBzCj4+IMKgIEZpbGUgQ29weSAyNTYg YnVmc2l6ZSA1MDAgbWF4YmxvY2tzwqDCoMKgIHzCoMKgwqAgMTE2MDIzLjAgS0Jwc8KgIHzCoMKg wqDCoCAzNzY2NC4wIEtCcHMKPj4gwqAgRmlsZSBDb3B5IDQwOTYgYnVmc2l6ZSA4MDAwIG1heGJs b2Nrc8KgIHzCoMKgIDE0MzI3NjkuOCBLQnBzwqAgfMKgwqDCoCA0NDExMDguOCBLQnBzCj4+IMKg IFBpcGUgVGhyb3VnaHB1dMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgfMKgwqAgNjQwNTAyOS42IGxwc8KgwqAgfMKgwqAgNjAyMTQ1Ny42IGxwcwo+PiDCoCBQ aXBlLWJhc2VkIENvbnRleHQgU3dpdGNoaW5nwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqDCoCAx ODU4NzIuNyBscHPCoMKgIHzCoMKgwqAgMTg0MjU1LjMgbHBzCj4+IMKgIFByb2Nlc3MgQ3JlYXRp b27CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCB8wqDCoMKgwqDC oCA0MDI1LjcgbHBzwqDCoCB8wqDCoMKgwqDCoCAzNzA2LjYgbHBzCj4+IMKgIFNoZWxsIFNjcmlw dHMgKDEgY29uY3VycmVudCnCoMKgwqDCoMKgwqDCoMKgwqDCoCB8wqDCoMKgwqDCoCA2NzQ1LjYg bHBtwqDCoCB8wqDCoMKgwqDCoCA2NDM2LjEgbHBtCj4+IMKgIFNoZWxsIFNjcmlwdHMgKDggY29u Y3VycmVudCnCoMKgwqDCoMKgwqDCoMKgwqDCoCB8wqDCoMKgwqDCoMKgIDk5OC43IGxwbcKgwqAg fMKgwqDCoMKgwqDCoCA5MzEuMSBscG0KPj4gwqAgU3lzdGVtIENhbGwgT3ZlcmhlYWTCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgfMKgwqAgMzkxMzM2My4xIGxwc8KgwqAgfMKg wqAgMzg4MzI4Ny44IGxwcwo+PiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tCj4+IMKgIFN5c3RlbSBC ZW5jaG1hcmtzIEluZGV4IFNjb3JlwqDCoMKgwqDCoMKgwqDCoMKgIHzCoMKgwqDCoMKgIDE4MzUu McKgwqDCoMKgwqDCoCB8wqDCoMKgwqDCoCAxMzI3LjYKPj4KPj4gU2lnbmVkLW9mZi1ieTogWmVu Z3J1YW4gWWUgPHllemVuZ3J1YW5AaHVhd2VpLmNvbT4KPj4gLS0tCj4+IMKgIGFyY2gvYXJtNjQv aW5jbHVkZS9hc20vcGFyYXZpcnQuaCB8wqDCoCAzICsKPj4gwqAgYXJjaC9hcm02NC9rZXJuZWwv cGFyYXZpcnQuY8KgwqDCoMKgwqAgfCAxMTcgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr Cj4+IMKgIGFyY2gvYXJtNjQva2VybmVsL3NldHVwLmPCoMKgwqDCoMKgwqDCoMKgIHzCoMKgIDIg Kwo+PiDCoCBpbmNsdWRlL2xpbnV4L2NwdWhvdHBsdWcuaMKgwqDCoMKgwqDCoMKgIHzCoMKgIDEg Kwo+PiDCoCA0IGZpbGVzIGNoYW5nZWQsIDEyMyBpbnNlcnRpb25zKCspCj4+Cj4+IGRpZmYgLS1n aXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL3BhcmF2aXJ0LmggYi9hcmNoL2FybTY0L2luY2x1 ZGUvYXNtL3BhcmF2aXJ0LmgKPj4gaW5kZXggN2IxYzgxYjU0NGJiLi5jYTNhMmM3ODgxZjMgMTAw NjQ0Cj4+IC0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9hc20vcGFyYXZpcnQuaAo+PiArKysgYi9h cmNoL2FybTY0L2luY2x1ZGUvYXNtL3BhcmF2aXJ0LmgKPj4gQEAgLTI5LDYgKzI5LDggQEAgc3Rh dGljIGlubGluZSB1NjQgcGFyYXZpcnRfc3RlYWxfY2xvY2soaW50IGNwdSkKPj4gwqAgwqAgaW50 IF9faW5pdCBwdl90aW1lX2luaXQodm9pZCk7Cj4+IMKgICtpbnQgX19pbml0IHB2X2xvY2tfaW5p dCh2b2lkKTsKPj4gKwo+PiDCoCBfX3Zpc2libGUgYm9vbCBfX25hdGl2ZV92Y3B1X2lzX3ByZWVt cHRlZChpbnQgY3B1KTsKPj4gwqAgwqAgc3RhdGljIGlubGluZSBib29sIHB2X3ZjcHVfaXNfcHJl ZW1wdGVkKGludCBjcHUpCj4+IEBAIC0zOSw2ICs0MSw3IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBw dl92Y3B1X2lzX3ByZWVtcHRlZChpbnQgY3B1KQo+PiDCoCAjZWxzZQo+PiDCoCDCoCAjZGVmaW5l IHB2X3RpbWVfaW5pdCgpIGRvIHt9IHdoaWxlICgwKQo+PiArI2RlZmluZSBwdl9sb2NrX2luaXQo KSBkbyB7fSB3aGlsZSAoMCkKPj4gwqAgwqAgI2VuZGlmIC8vIENPTkZJR19QQVJBVklSVAo+PiDC oCBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rZXJuZWwvcGFyYXZpcnQuYyBiL2FyY2gvYXJtNjQv a2VybmVsL3BhcmF2aXJ0LmMKPj4gaW5kZXggZDhmMWJhOGMyMmNlLi5iZDJhZDZhMTdhMjYgMTAw NjQ0Cj4+IC0tLSBhL2FyY2gvYXJtNjQva2VybmVsL3BhcmF2aXJ0LmMKPj4gKysrIGIvYXJjaC9h cm02NC9rZXJuZWwvcGFyYXZpcnQuYwo+PiBAQCAtMjIsNiArMjIsNyBAQAo+PiDCoCAjaW5jbHVk ZSA8YXNtL3BhcmF2aXJ0Lmg+Cj4+IMKgICNpbmNsdWRlIDxhc20vcHZjbG9jay1hYmkuaD4KPj4g wqAgI2luY2x1ZGUgPGFzbS9zbXBfcGxhdC5oPgo+PiArI2luY2x1ZGUgPGFzbS9wdmxvY2stYWJp Lmg+Cj4+IMKgIMKgIHN0cnVjdCBzdGF0aWNfa2V5IHBhcmF2aXJ0X3N0ZWFsX2VuYWJsZWQ7Cj4+ IMKgIHN0cnVjdCBzdGF0aWNfa2V5IHBhcmF2aXJ0X3N0ZWFsX3JxX2VuYWJsZWQ7Cj4+IEBAIC0z NSw2ICszNiwxMCBAQCBzdHJ1Y3QgcHZfdGltZV9zdG9sZW5fdGltZV9yZWdpb24gewo+PiDCoMKg wqDCoMKgIHN0cnVjdCBwdmNsb2NrX3ZjcHVfc3RvbGVuX3RpbWUgKmthZGRyOwo+PiDCoCB9Owo+ PiDCoCArc3RydWN0IHB2X2xvY2tfc3RhdGVfcmVnaW9uIHsKPj4gK8KgwqDCoCBzdHJ1Y3QgcHZs b2NrX3ZjcHVfc3RhdGUgKmthZGRyOwo+PiArfTsKPj4gKwo+PiDCoCBzdGF0aWMgREVGSU5FX1BF Ul9DUFUoc3RydWN0IHB2X3RpbWVfc3RvbGVuX3RpbWVfcmVnaW9uLCBzdG9sZW5fdGltZV9yZWdp b24pOwo+PiDCoCDCoCBzdGF0aWMgYm9vbCBzdGVhbF9hY2MgPSB0cnVlOwo+PiBAQCAtMTU4LDMg KzE2MywxMTUgQEAgaW50IF9faW5pdCBwdl90aW1lX2luaXQodm9pZCkKPj4gwqAgwqDCoMKgwqDC oCByZXR1cm4gMDsKPj4gwqAgfQo+PiArCj4+ICtzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0 IHB2X2xvY2tfc3RhdGVfcmVnaW9uLCBsb2NrX3N0YXRlX3JlZ2lvbik7Cj4+ICsKPj4gK3N0YXRp YyBib29sIGt2bV92Y3B1X2lzX3ByZWVtcHRlZChpbnQgY3B1KQo+PiArewo+PiArwqDCoMKgIHN0 cnVjdCBwdl9sb2NrX3N0YXRlX3JlZ2lvbiAqcmVnOwo+PiArwqDCoMKgIF9fbGU2NCBwcmVlbXB0 ZWRfbGU7Cj4+ICsKPj4gK8KgwqDCoCByZWcgPSBwZXJfY3B1X3B0cigmbG9ja19zdGF0ZV9yZWdp b24sIGNwdSk7Cj4+ICvCoMKgwqAgaWYgKCFyZWctPmthZGRyKSB7Cj4+ICvCoMKgwqDCoMKgwqDC oCBwcl93YXJuX29uY2UoIlBWIGxvY2sgZW5hYmxlZCBidXQgbm90IGNvbmZpZ3VyZWQgZm9yIGNw dSAlZFxuIiwKPj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNwdSk7Cj4+ICvC oMKgwqDCoMKgwqDCoCByZXR1cm4gZmFsc2U7Cj4+ICvCoMKgwqAgfQo+PiArCj4+ICvCoMKgwqAg cHJlZW1wdGVkX2xlID0gbGU2NF90b19jcHUoUkVBRF9PTkNFKHJlZy0+a2FkZHItPnByZWVtcHRl ZCkpOwo+PiArCj4+ICvCoMKgwqAgcmV0dXJuICEhKHByZWVtcHRlZF9sZSAmIDEpOwo+IAo+IEFj Y29yZGluZyB0byB0aGUgZG9jdW1lbnRhdGlvbiBwcmVlbXB0ZWQgIT0gMCBtZWFucyBwcmVlbXB0 ZWQsIGJ1dCBoZXJlIHlvdSBhcmUgY2hlY2tpbmcgdGhlIExTQi4gWW91IG5lZWQgdG8gYmUgY29u c2lzdGVudCBhYm91dCB0aGUgQUJJLgoKVGhhbmtzIGZvciBwb3N0aW5nIHRoaXMuIEknbGwgdXBk YXRlIHRoZSBjb2RlLgoKPiAKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCBwdmxvY2tfdmNwdV9z dGF0ZV9keWluZ19jcHUodW5zaWduZWQgaW50IGNwdSkKPj4gK3sKPj4gK8KgwqDCoCBzdHJ1Y3Qg cHZfbG9ja19zdGF0ZV9yZWdpb24gKnJlZzsKPj4gKwo+PiArwqDCoMKgIHJlZyA9IHRoaXNfY3B1 X3B0cigmbG9ja19zdGF0ZV9yZWdpb24pOwo+PiArwqDCoMKgIGlmICghcmVnLT5rYWRkcikKPj4g K8KgwqDCoMKgwqDCoMKgIHJldHVybiAwOwo+PiArCj4+ICvCoMKgwqAgbWVtdW5tYXAocmVnLT5r YWRkcik7Cj4+ICvCoMKgwqAgbWVtc2V0KHJlZywgMCwgc2l6ZW9mKCpyZWcpKTsKPj4gKwo+PiAr wqDCoMKgIHJldHVybiAwOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IGluaXRfcHZsb2NrX3Zj cHVfc3RhdGUodW5zaWduZWQgaW50IGNwdSkKPj4gK3sKPj4gK8KgwqDCoCBzdHJ1Y3QgcHZfbG9j a19zdGF0ZV9yZWdpb24gKnJlZzsKPj4gK8KgwqDCoCBzdHJ1Y3QgYXJtX3NtY2NjX3JlcyByZXM7 Cj4+ICsKPj4gK8KgwqDCoCByZWcgPSB0aGlzX2NwdV9wdHIoJmxvY2tfc3RhdGVfcmVnaW9uKTsK Pj4gKwo+PiArwqDCoMKgIGFybV9zbWNjY18xXzFfaW52b2tlKEFSTV9TTUNDQ19IVl9QVl9MT0NL X1BSRUVNUFRFRCwgJnJlcyk7Cj4+ICsKPj4gK8KgwqDCoCBpZiAocmVzLmEwID09IFNNQ0NDX1JF VF9OT1RfU1VQUE9SVEVEKSB7Cj4+ICvCoMKgwqDCoMKgwqDCoCBwcl93YXJuKCJGYWlsZWQgdG8g aW5pdCBQViBsb2NrIGRhdGEgc3RydWN0dXJlXG4iKTsKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVy biAtRUlOVkFMOwo+PiArwqDCoMKgIH0KPj4gKwo+PiArwqDCoMKgIHJlZy0+a2FkZHIgPSBtZW1y ZW1hcChyZXMuYTAsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNpemVv ZihzdHJ1Y3QgcHZsb2NrX3ZjcHVfc3RhdGUpLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBNRU1SRU1BUF9XQik7Cj4+ICsKPj4gK8KgwqDCoCBpZiAoIXJlZy0+a2FkZHIp IHsKPj4gK8KgwqDCoMKgwqDCoMKgIHByX3dhcm4oIkZhaWxlZCB0byBtYXAgUFYgbG9jayBkYXRh IHN0cnVjdHVyZVxuIik7Cj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVOT01FTTsKPj4gK8Kg wqDCoCB9Cj4+ICsKPj4gK8KgwqDCoCByZXR1cm4gMDsKPj4gK30KPj4gKwo+PiArc3RhdGljIGlu dCBrdm1fYXJtX2luaXRfcHZsb2NrKHZvaWQpCj4+ICt7Cj4+ICvCoMKgwqAgaW50IHJldDsKPj4g Kwo+PiArwqDCoMKgIHJldCA9IGNwdWhwX3NldHVwX3N0YXRlKENQVUhQX0FQX0FSTV9LVk1fUFZM T0NLX1NUQVJUSU5HLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICJoeXBlcnZp c29yL2FybS9wdmxvY2s6c3RhcnRpbmciLAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIGluaXRfcHZsb2NrX3ZjcHVfc3RhdGUsCj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgcHZsb2NrX3ZjcHVfc3RhdGVfZHlpbmdfY3B1KTsKPj4gK8KgwqDCoCBpZiAocmV0IDwg MCkgewo+PiArwqDCoMKgwqDCoMKgwqAgcHJfd2FybigiUFYtbG9jayBpbml0IGZhaWxlZFxuIik7 Cj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0Owo+PiArwqDCoMKgIH0KPj4gKwo+PiArwqDC oMKgIHJldHVybiAwOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgYm9vbCBoYXNfa3ZtX3B2bG9jayh2 b2lkKQo+PiArewo+PiArwqDCoMKgIHN0cnVjdCBhcm1fc21jY2NfcmVzIHJlczsKPj4gKwo+PiAr wqDCoMKgIC8qIFRvIGRldGVjdCB0aGUgcHJlc2VuY2Ugb2YgUFYgbG9jayBzdXBwb3J0IHdlIHJl cXVpcmUgU01DQ0MgMS4xKyAqLwo+PiArwqDCoMKgIGlmIChwc2NpX29wcy5zbWNjY192ZXJzaW9u IDwgU01DQ0NfVkVSU0lPTl8xXzEpCj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gZmFsc2U7Cj4+ ICsKPj4gK8KgwqDCoCBhcm1fc21jY2NfMV8xX2ludm9rZShBUk1fU01DQ0NfQVJDSF9GRUFUVVJF U19GVU5DX0lELAo+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgQVJNX1NNQ0ND X0hWX1BWX0xPQ0tfRkVBVFVSRVMsICZyZXMpOwo+IAo+IEFzIG1lbnRpb25lZCBwcmV2aW91c2x5 IHdlIGNvdWxkIGRvIHdpdGggc29tZXRoaW5nIG1vcmUgcm9idXN0IHRvIGNoZWNrIHRoYXQgdGhl IGh5cGVydmlzb3IgaXMgYWN0dWFsbHkgS1ZNIGJlZm9yZSBhc3N1bWluZyB0aGF0IHZlbmRvciBz cGVjaWZpYyBJRHMgYXJlIHZhbGlkLgoKV2lsbCB1cGRhdGUgbmV4dCB2ZXJzaW9uLgoKPiAKPiBT dGV2ZQo+IAo+PiArCj4+ICvCoMKgwqAgaWYgKHJlcy5hMCAhPSBTTUNDQ19SRVRfU1VDQ0VTUykK Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBmYWxzZTsKPj4gKwo+PiArwqDCoMKgIHJldHVybiB0 cnVlOwo+PiArfQo+PiArCj4+ICtpbnQgX19pbml0IHB2X2xvY2tfaW5pdCh2b2lkKQo+PiArewo+ PiArwqDCoMKgIGludCByZXQ7Cj4+ICsKPj4gK8KgwqDCoCBpZiAoaXNfaHlwX21vZGVfYXZhaWxh YmxlKCkpCj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gMDsKPj4gKwo+PiArwqDCoMKgIGlmICgh aGFzX2t2bV9wdmxvY2soKSkKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAwOwo+PiArCj4+ICvC oMKgwqAgcmV0ID0ga3ZtX2FybV9pbml0X3B2bG9jaygpOwo+PiArwqDCoMKgIGlmIChyZXQpCj4+ ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0Owo+PiArCj4+ICvCoMKgwqAgcHZfb3BzLmxvY2su dmNwdV9pc19wcmVlbXB0ZWQgPSBrdm1fdmNwdV9pc19wcmVlbXB0ZWQ7Cj4+ICvCoMKgwqAgcHJf aW5mbygidXNpbmcgUFYtbG9jayBwcmVlbXB0ZWRcbiIpOwo+PiArCj4+ICvCoMKgwqAgcmV0dXJu IDA7Cj4+ICt9Cj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2tlcm5lbC9zZXR1cC5jIGIvYXJj aC9hcm02NC9rZXJuZWwvc2V0dXAuYwo+PiBpbmRleCA1NmY2NjQ1NjE3NTQuLmFhM2E4YjllNzEw ZiAxMDA2NDQKPj4gLS0tIGEvYXJjaC9hcm02NC9rZXJuZWwvc2V0dXAuYwo+PiArKysgYi9hcmNo L2FybTY0L2tlcm5lbC9zZXR1cC5jCj4+IEBAIC0zNDEsNiArMzQxLDggQEAgdm9pZCBfX2luaXQg c2V0dXBfYXJjaChjaGFyICoqY21kbGluZV9wKQo+PiDCoMKgwqDCoMKgIHNtcF9pbml0X2NwdXMo KTsKPj4gwqDCoMKgwqDCoCBzbXBfYnVpbGRfbXBpZHJfaGFzaCgpOwo+PiDCoCArwqDCoMKgIHB2 X2xvY2tfaW5pdCgpOwo+PiArCj4+IMKgwqDCoMKgwqAgLyogSW5pdCBwZXJjcHUgc2VlZHMgZm9y IHJhbmRvbSB0YWdzIGFmdGVyIGNwdXMgYXJlIHNldCB1cC4gKi8KPj4gwqDCoMKgwqDCoCBrYXNh bl9pbml0X3RhZ3MoKTsKPj4gwqAgZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1aG90cGx1 Zy5oIGIvaW5jbHVkZS9saW51eC9jcHVob3RwbHVnLmgKPj4gaW5kZXggZTUxZWU3NzJiOWY1Li5m NzJmZjk1YWI2M2EgMTAwNjQ0Cj4+IC0tLSBhL2luY2x1ZGUvbGludXgvY3B1aG90cGx1Zy5oCj4+ ICsrKyBiL2luY2x1ZGUvbGludXgvY3B1aG90cGx1Zy5oCj4+IEBAIC0xMzgsNiArMTM4LDcgQEAg ZW51bSBjcHVocF9zdGF0ZSB7Cj4+IMKgwqDCoMKgwqAgQ1BVSFBfQVBfRFVNTVlfVElNRVJfU1RB UlRJTkcsCj4+IMKgwqDCoMKgwqAgQ1BVSFBfQVBfQVJNX1hFTl9TVEFSVElORywKPj4gwqDCoMKg wqDCoCBDUFVIUF9BUF9BUk1fS1ZNUFZfU1RBUlRJTkcsCj4+ICvCoMKgwqAgQ1BVSFBfQVBfQVJN X0tWTV9QVkxPQ0tfU1RBUlRJTkcsCj4+IMKgwqDCoMKgwqAgQ1BVSFBfQVBfQVJNX0NPUkVTSUdI VF9TVEFSVElORywKPj4gwqDCoMKgwqDCoCBDUFVIUF9BUF9BUk02NF9JU05ERVBfU1RBUlRJTkcs Cj4+IMKgwqDCoMKgwqAgQ1BVSFBfQVBfU01QQ0ZEX0RZSU5HLAo+Pgo+IAo+IAo+IC4KClRoYW5r cywKClplbmdydWFuCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0 cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGlu Zm8vbGludXgtYXJtLWtlcm5lbAo=