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=-2.2 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=no 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 E9934C433FF for ; Wed, 7 Aug 2019 15:26:59 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id B3BF42199C for ; Wed, 7 Aug 2019 15:26:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388549AbfHGP06 (ORCPT ); Wed, 7 Aug 2019 11:26:58 -0400 Received: from foss.arm.com ([217.140.110.172]:50204 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2387815AbfHGP06 (ORCPT ); Wed, 7 Aug 2019 11:26:58 -0400 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id C05F5344; Wed, 7 Aug 2019 08:26:56 -0700 (PDT) Received: from [10.1.196.133] (e112269-lin.cambridge.arm.com [10.1.196.133]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 69BC03F706; Wed, 7 Aug 2019 08:26:55 -0700 (PDT) Subject: Re: [PATCH 1/9] KVM: arm64: Document PV-time interface To: Christophe de Dinechin Cc: KVM list , Catalin Marinas , linux-doc@vger.kernel.org, Russell King , open list , Marc Zyngier , Paolo Bonzini , Will Deacon , kvmarm@lists.cs.columbia.edu, linux-arm-kernel@lists.infradead.org References: <20190802145017.42543-1-steven.price@arm.com> <20190802145017.42543-2-steven.price@arm.com> <9F77FA64-C71B-4025-A58D-3AC07E6688DE@dinechin.org> From: Steven Price Message-ID: Date: Wed, 7 Aug 2019 16:26:54 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: <9F77FA64-C71B-4025-A58D-3AC07E6688DE@dinechin.org> Content-Type: text/plain; charset=utf-8 Content-Language: en-GB Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 07/08/2019 15:28, Christophe de Dinechin wrote: > > >> On 7 Aug 2019, at 15:21, Steven Price > > wrote: >> >> On 05/08/2019 17:40, Christophe de Dinechin wrote: >>> >>> Steven Price writes: >>> >>>> Introduce a paravirtualization interface for KVM/arm64 based on the >>>> "Arm Paravirtualized Time for Arm-Base Systems" specification DEN 0057A. >>>> >>>> This only adds the details about "Stolen Time" as the details of "Live >>>> Physical Time" have not been fully agreed. >>>> >>> [...] >>> >>>> + >>>> +Stolen Time >>>> +----------- >>>> + >>>> +The structure pointed to by the PV_TIME_ST hypercall is as follows: >>>> + >>>> +  Field       | Byte Length | Byte Offset | Description >>>> +  ----------- | ----------- | ----------- | -------------------------- >>>> +  Revision    |      4      |      0      | Must be 0 for version 0.1 >>>> +  Attributes  |      4      |      4      | Must be 0 >>>> +  Stolen time |      8      |      8      | Stolen time in unsigned >>>> +              |             |             | nanoseconds indicating how >>>> +              |             |             | much time this VCPU thread >>>> +              |             |             | was involuntarily not >>>> +              |             |             | running on a physical CPU. >>> >>> I know very little about the topic, but I don't understand how the spec >>> as proposed allows an accurate reading of the relation between physical >>> time and stolen time simultaneously. In other words, could you draw >>> Figure 1 of the spec from within the guest? Or is it a non-objective? >> >> Figure 1 is mostly attempting to explain Live Physical Time (LPT), which >> is not part of this patch series. But it does touch on stolen time by >> the difference between "live physical time" and "virtual time". >> >> I'm not sure what you mean by "from within the guest". From the >> perspective of the guest the parts of the diagram where the guest isn't >> running don't exist (therefore there are discontinuities in the >> "physical time" and "live physical time" lines). > > I meant: If I run code within the guest that attempts to draw Figure 1, > race conditions may cause the diagram actually drawn by your guest > program to look completely wrong on occasions. > >> This patch series doesn't attempt to provide the guest with a view of >> "physical time" (or LPT) - but it might be able to observe that by >> consulting something external (e.g. an NTP server, or an emulated RTC >> which reports wall-clock time). > > … with what appear to be like a built-in race condition, as you correctly > identified. I was wondering if the built-in race condition was deliberate > and/or necessary, or if it was irrelevant for the planned uses of the value. > >> What it does provide is a mechanism for obtaining the difference (as >> reported by the host) between "live physical time" and "virtual time" - >> this is reported in nanoseconds in the above structure. >> >>> For example, if you read the stolen time before you read CNTVCT_EL0, >>> isn't it possible for a lengthy event like a migration to occur between >>> the two reads, causing the stolen time to be obsolete and off by seconds? >> >> "Lengthy events" like migration are represented by the "paused" state in >> the diagram - i.e. it's the difference between "physical time" and "live >> physical time". So stolen time doesn't attempt to represent that. >> >> And yes, there is a race between reading CNTVCT_EL0 and reading stolen >> time - but in practice this doesn't really matter. The usual pseudo-code >> way of using stolen time is: > > I’m assuming this is the guest scheduler you are talking about, yes > and I’m assuming virtualization can preempt that code anywhere. > Maybe that’s where I’m wrong? You are correct, the guest can be preempted at any point. > > For the sake of the argument, assume there is a 1s pause. > Not completely unreasonable in a migration scenario. As I mentioned before, events like migration are not represented by stolen time. They would be represented by CNTVCT_EL0 appearing to pause during the migration (so showing a difference between "physical time" and "live physical time"). The stolen time value would not be incremented. >>  * scheduler captures stolen time from structure and CNTVCT_EL0: >>      before_timer = CNTVCT_EL0 > > [insert optional 1s pause here, case A] > >>      before_stolen = stolen >>  * schedule in process >>  * process is pre-empted (or blocked in some way) >>  * scheduler captures stolen time from structure and CNTVCT_EL0: >>      after_timer = CNTVCT_EL0 > > [insert optional 1s pause here, case B] > >>      after_stolen = stolen >>      time = to_nsecs(after_timer - before_timer) - >>             (after_stolen - before_stolen) > > In case A, time is too big by one second. In case B, it is too small, > to the point where your code might need to be ready for > “time” unexpectedly showing up as negative. So a 1 second pause is unlikely for stolen time - this means that the VCPU was ready to run, but the host didn't run it for some reason. But in theory you are correct this could happen. The core code deals with it like this (update_rq_clock_task): > if (static_key_false((¶virt_steal_rq_enabled))) { > steal = paravirt_steal_clock(cpu_of(rq)); > steal -= rq->prev_steal_time_rq; > > if (unlikely(steal > delta)) > steal = delta; > > rq->prev_steal_time_rq += steal; > delta -= steal; > } So if (steal > delta) then steal is capped to delta, preventing the final delta from going negative. >> >> The scheduler can then charge the process for "time" nanoseconds of >> time. This ensures that a process isn't unfairly penalised if the host >> doesn't schedule the VCPU while it is supposed to be running. >> >> The race is very small in comparison to the time the process is running, >> and in the worst case just means the process is charged slightly more >> (or less) than it should be. > > At this point, what I don’t understand is why the race would be > “very small” or why you would only be charged “slightly” more or less? The window between measuring the time using CNTVCT_EL0 and getting the stolen time from the hypervisor is pretty short. The amount of time that is (normally) stolen in one go is also small. So the race is unlikely and the error when it occurs is (usually) small. Long events (such as migration or pausing the guest) are not considered "stolen time" and should be reflected to the guest in other ways. >> I guess if you're really worried about it, you could do a dance like: >> >> do { >> before = stolen >> timer = CNTVCT_EL0 >> after = stolen >> } while (before != after); > > That will work as long as nothing in that loop requires something > that would cause `stolen` to jump. If there is such a guarantee, > then that’s even efficient, because in most cases the loop > would only run once, at the cost of one extra read and one test. Note that other architectures don't have such loops, so arm64 is just following the lead of existing architecture. >> But I don't see the need to have such an accurate view of elapsed time >> that the VCPU was scheduled. And of course at the moment (without this >> series) the guest has no idea about time stolen by the host. > > I’m certainly not arguing that exposing stolen time is a bad idea, > I’m only wondering if the proposed solution is racy, and if so, if > it is intentional. > > If it’s indeed racy, the problem could be mitigated in a number of > ways > > a) document your loop or something similar as being the recommended > way to avoid the race, and then ensure that the loop actually > will always work as intended. The upside is that it’s just a change in > some comments or documentation. > > b) having a single interface that exposes multiple times. For example, > you could have a copy of CNTVCT_EL0 written alongside stolen time, > and then the scheduler could use that copy for its decision. That would still be racy - the structure can be updated at any time (as the host could interrupt the VCPU at any time), so you would still be left with the problem of reading both atomically - which would mean going back to the loop. This is the approach that LPT takes and is documented in the spec. Also I can't see why you would want to know the CNTVCT_EL0 value at the point the stolen time was updated, it's much more useful to know the current CNTVCT_EL0 value. Ultimately reading the stolen time is always going to be slightly racy because you are including some of the scheduler's time in the calculation of how much time the process was running for. The pauses you describe above are instances where time has been stolen from the scheduler, but that time is being accounted for/against a user space process. While the algorithm could be changed so that it's always a positive for the user space process I'm not sure that's a benefit (it's probably better that statistically it can go either way). Steve 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=-2.2 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=no 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 6A7E4C433FF for ; Wed, 7 Aug 2019 15:27:03 +0000 (UTC) Received: from mm01.cs.columbia.edu (mm01.cs.columbia.edu [128.59.11.253]) by mail.kernel.org (Postfix) with ESMTP id 00F9822295 for ; Wed, 7 Aug 2019 15:27:02 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 00F9822295 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=arm.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 80A724A51C; Wed, 7 Aug 2019 11:27:02 -0400 (EDT) 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 UfdbqK++nsE4; Wed, 7 Aug 2019 11:27:00 -0400 (EDT) Received: from mm01.cs.columbia.edu (localhost [127.0.0.1]) by mm01.cs.columbia.edu (Postfix) with ESMTP id 9E6B14A548; Wed, 7 Aug 2019 11:27:00 -0400 (EDT) Received: from localhost (localhost [127.0.0.1]) by mm01.cs.columbia.edu (Postfix) with ESMTP id 0CCE24A523 for ; Wed, 7 Aug 2019 11:26:59 -0400 (EDT) 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 cYYdf66DLdaF for ; Wed, 7 Aug 2019 11:26:57 -0400 (EDT) Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mm01.cs.columbia.edu (Postfix) with ESMTP id 26F494A51C for ; Wed, 7 Aug 2019 11:26:57 -0400 (EDT) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id C05F5344; Wed, 7 Aug 2019 08:26:56 -0700 (PDT) Received: from [10.1.196.133] (e112269-lin.cambridge.arm.com [10.1.196.133]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 69BC03F706; Wed, 7 Aug 2019 08:26:55 -0700 (PDT) Subject: Re: [PATCH 1/9] KVM: arm64: Document PV-time interface To: Christophe de Dinechin References: <20190802145017.42543-1-steven.price@arm.com> <20190802145017.42543-2-steven.price@arm.com> <9F77FA64-C71B-4025-A58D-3AC07E6688DE@dinechin.org> From: Steven Price Message-ID: Date: Wed, 7 Aug 2019 16:26:54 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: <9F77FA64-C71B-4025-A58D-3AC07E6688DE@dinechin.org> Content-Language: en-GB Cc: KVM list , linux-doc@vger.kernel.org, Marc Zyngier , open list , Russell King , Catalin Marinas , Paolo Bonzini , Will Deacon , kvmarm@lists.cs.columbia.edu, linux-arm-kernel@lists.infradead.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 T24gMDcvMDgvMjAxOSAxNToyOCwgQ2hyaXN0b3BoZSBkZSBEaW5lY2hpbiB3cm90ZToKPiAKPiAK Pj4gT24gNyBBdWcgMjAxOSwgYXQgMTU6MjEsIFN0ZXZlbiBQcmljZSA8c3RldmVuLnByaWNlQGFy bS5jb20KPj4gPG1haWx0bzpzdGV2ZW4ucHJpY2VAYXJtLmNvbT4+IHdyb3RlOgo+Pgo+PiBPbiAw NS8wOC8yMDE5IDE3OjQwLCBDaHJpc3RvcGhlIGRlIERpbmVjaGluIHdyb3RlOgo+Pj4KPj4+IFN0 ZXZlbiBQcmljZSB3cml0ZXM6Cj4+Pgo+Pj4+IEludHJvZHVjZSBhIHBhcmF2aXJ0dWFsaXphdGlv biBpbnRlcmZhY2UgZm9yIEtWTS9hcm02NCBiYXNlZCBvbiB0aGUKPj4+PiAiQXJtIFBhcmF2aXJ0 dWFsaXplZCBUaW1lIGZvciBBcm0tQmFzZSBTeXN0ZW1zIiBzcGVjaWZpY2F0aW9uIERFTiAwMDU3 QS4KPj4+Pgo+Pj4+IFRoaXMgb25seSBhZGRzIHRoZSBkZXRhaWxzIGFib3V0ICJTdG9sZW4gVGlt ZSIgYXMgdGhlIGRldGFpbHMgb2YgIkxpdmUKPj4+PiBQaHlzaWNhbCBUaW1lIiBoYXZlIG5vdCBi ZWVuIGZ1bGx5IGFncmVlZC4KPj4+Pgo+Pj4gWy4uLl0KPj4+Cj4+Pj4gKwo+Pj4+ICtTdG9sZW4g VGltZQo+Pj4+ICstLS0tLS0tLS0tLQo+Pj4+ICsKPj4+PiArVGhlIHN0cnVjdHVyZSBwb2ludGVk IHRvIGJ5IHRoZSBQVl9USU1FX1NUIGh5cGVyY2FsbCBpcyBhcyBmb2xsb3dzOgo+Pj4+ICsKPj4+ PiArIMKgRmllbGQgwqDCoMKgwqDCoMKgfCBCeXRlIExlbmd0aCB8IEJ5dGUgT2Zmc2V0IHwgRGVz Y3JpcHRpb24KPj4+PiArIMKgLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0t IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPj4+PiArIMKgUmV2aXNpb24gwqDCoMKgfCDC oMKgwqDCoMKgNCDCoMKgwqDCoMKgfCDCoMKgwqDCoMKgMCDCoMKgwqDCoMKgfCBNdXN0IGJlIDAg Zm9yIHZlcnNpb24gMC4xCj4+Pj4gKyDCoEF0dHJpYnV0ZXMgwqB8IMKgwqDCoMKgwqA0IMKgwqDC oMKgwqB8IMKgwqDCoMKgwqA0IMKgwqDCoMKgwqB8IE11c3QgYmUgMAo+Pj4+ICsgwqBTdG9sZW4g dGltZSB8IMKgwqDCoMKgwqA4IMKgwqDCoMKgwqB8IMKgwqDCoMKgwqA4IMKgwqDCoMKgwqB8IFN0 b2xlbiB0aW1lIGluIHVuc2lnbmVkCj4+Pj4gKyDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHwg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfCDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB8IG5hbm9z ZWNvbmRzIGluZGljYXRpbmcgaG93Cj4+Pj4gKyDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHwg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfCDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB8IG11Y2gg dGltZSB0aGlzIFZDUFUgdGhyZWFkCj4+Pj4gKyDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHwg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfCDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB8IHdhcyBp bnZvbHVudGFyaWx5IG5vdAo+Pj4+ICsgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB8IMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHwgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfCBydW5uaW5nIG9u IGEgcGh5c2ljYWwgQ1BVLgo+Pj4KPj4+IEkga25vdyB2ZXJ5IGxpdHRsZSBhYm91dCB0aGUgdG9w aWMsIGJ1dCBJIGRvbid0IHVuZGVyc3RhbmQgaG93IHRoZSBzcGVjCj4+PiBhcyBwcm9wb3NlZCBh bGxvd3MgYW4gYWNjdXJhdGUgcmVhZGluZyBvZiB0aGUgcmVsYXRpb24gYmV0d2VlbiBwaHlzaWNh bAo+Pj4gdGltZSBhbmQgc3RvbGVuIHRpbWUgc2ltdWx0YW5lb3VzbHkuIEluIG90aGVyIHdvcmRz LCBjb3VsZCB5b3UgZHJhdwo+Pj4gRmlndXJlIDEgb2YgdGhlIHNwZWMgZnJvbSB3aXRoaW4gdGhl IGd1ZXN0PyBPciBpcyBpdCBhIG5vbi1vYmplY3RpdmU/Cj4+Cj4+IEZpZ3VyZSAxIGlzIG1vc3Rs eSBhdHRlbXB0aW5nIHRvIGV4cGxhaW4gTGl2ZSBQaHlzaWNhbCBUaW1lIChMUFQpLCB3aGljaAo+ PiBpcyBub3QgcGFydCBvZiB0aGlzIHBhdGNoIHNlcmllcy4gQnV0IGl0IGRvZXMgdG91Y2ggb24g c3RvbGVuIHRpbWUgYnkKPj4gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAibGl2ZSBwaHlzaWNhbCB0 aW1lIiBhbmQgInZpcnR1YWwgdGltZSIuCj4+Cj4+IEknbSBub3Qgc3VyZSB3aGF0IHlvdSBtZWFu IGJ5ICJmcm9tIHdpdGhpbiB0aGUgZ3Vlc3QiLiBGcm9tIHRoZQo+PiBwZXJzcGVjdGl2ZSBvZiB0 aGUgZ3Vlc3QgdGhlIHBhcnRzIG9mIHRoZSBkaWFncmFtIHdoZXJlIHRoZSBndWVzdCBpc24ndAo+ PiBydW5uaW5nIGRvbid0IGV4aXN0ICh0aGVyZWZvcmUgdGhlcmUgYXJlIGRpc2NvbnRpbnVpdGll cyBpbiB0aGUKPj4gInBoeXNpY2FsIHRpbWUiIGFuZCAibGl2ZSBwaHlzaWNhbCB0aW1lIiBsaW5l cykuCj4gCj4gSSBtZWFudDogSWYgSSBydW4gY29kZSB3aXRoaW4gdGhlIGd1ZXN0IHRoYXQgYXR0 ZW1wdHMgdG8gZHJhdyBGaWd1cmUgMSwKPiByYWNlIGNvbmRpdGlvbnMgbWF5IGNhdXNlIHRoZSBk aWFncmFtIGFjdHVhbGx5IGRyYXduIGJ5IHlvdXIgZ3Vlc3QKPiBwcm9ncmFtIHRvIGxvb2sgY29t cGxldGVseSB3cm9uZyBvbiBvY2Nhc2lvbnMuCj4gCj4+IFRoaXMgcGF0Y2ggc2VyaWVzIGRvZXNu J3QgYXR0ZW1wdCB0byBwcm92aWRlIHRoZSBndWVzdCB3aXRoIGEgdmlldyBvZgo+PiAicGh5c2lj YWwgdGltZSIgKG9yIExQVCkgLSBidXQgaXQgbWlnaHQgYmUgYWJsZSB0byBvYnNlcnZlIHRoYXQg YnkKPj4gY29uc3VsdGluZyBzb21ldGhpbmcgZXh0ZXJuYWwgKGUuZy4gYW4gTlRQIHNlcnZlciwg b3IgYW4gZW11bGF0ZWQgUlRDCj4+IHdoaWNoIHJlcG9ydHMgd2FsbC1jbG9jayB0aW1lKS4KPiAK PiDigKYgd2l0aCB3aGF0IGFwcGVhciB0byBiZSBsaWtlIGEgYnVpbHQtaW4gcmFjZSBjb25kaXRp b24sIGFzIHlvdSBjb3JyZWN0bHkKPiBpZGVudGlmaWVkLiBJIHdhcyB3b25kZXJpbmcgaWYgdGhl IGJ1aWx0LWluIHJhY2UgY29uZGl0aW9uIHdhcyBkZWxpYmVyYXRlCj4gYW5kL29yIG5lY2Vzc2Fy eSwgb3IgaWYgaXQgd2FzIGlycmVsZXZhbnQgZm9yIHRoZSBwbGFubmVkIHVzZXMgb2YgdGhlIHZh bHVlLgo+IAo+PiBXaGF0IGl0IGRvZXMgcHJvdmlkZSBpcyBhIG1lY2hhbmlzbSBmb3Igb2J0YWlu aW5nIHRoZSBkaWZmZXJlbmNlIChhcwo+PiByZXBvcnRlZCBieSB0aGUgaG9zdCkgYmV0d2VlbiAi bGl2ZSBwaHlzaWNhbCB0aW1lIiBhbmQgInZpcnR1YWwgdGltZSIgLQo+PiB0aGlzIGlzIHJlcG9y dGVkIGluIG5hbm9zZWNvbmRzIGluIHRoZSBhYm92ZSBzdHJ1Y3R1cmUuCj4+Cj4+PiBGb3IgZXhh bXBsZSwgaWYgeW91IHJlYWQgdGhlIHN0b2xlbiB0aW1lIGJlZm9yZSB5b3UgcmVhZCBDTlRWQ1Rf RUwwLAo+Pj4gaXNuJ3QgaXQgcG9zc2libGUgZm9yIGEgbGVuZ3RoeSBldmVudCBsaWtlIGEgbWln cmF0aW9uIHRvIG9jY3VyIGJldHdlZW4KPj4+IHRoZSB0d28gcmVhZHMsIGNhdXNpbmcgdGhlIHN0 b2xlbiB0aW1lIHRvIGJlIG9ic29sZXRlIGFuZCBvZmYgYnkgc2Vjb25kcz8KPj4KPj4gIkxlbmd0 aHkgZXZlbnRzIiBsaWtlIG1pZ3JhdGlvbiBhcmUgcmVwcmVzZW50ZWQgYnkgdGhlICJwYXVzZWQi IHN0YXRlIGluCj4+IHRoZSBkaWFncmFtIC0gaS5lLiBpdCdzIHRoZSBkaWZmZXJlbmNlIGJldHdl ZW4gInBoeXNpY2FsIHRpbWUiIGFuZCAibGl2ZQo+PiBwaHlzaWNhbCB0aW1lIi4gU28gc3RvbGVu IHRpbWUgZG9lc24ndCBhdHRlbXB0IHRvIHJlcHJlc2VudCB0aGF0Lgo+Pgo+PiBBbmQgeWVzLCB0 aGVyZSBpcyBhIHJhY2UgYmV0d2VlbiByZWFkaW5nIENOVFZDVF9FTDAgYW5kIHJlYWRpbmcgc3Rv bGVuCj4+IHRpbWUgLSBidXQgaW4gcHJhY3RpY2UgdGhpcyBkb2Vzbid0IHJlYWxseSBtYXR0ZXIu IFRoZSB1c3VhbCBwc2V1ZG8tY29kZQo+PiB3YXkgb2YgdXNpbmcgc3RvbGVuIHRpbWUgaXM6Cj4g Cj4gSeKAmW0gYXNzdW1pbmcgdGhpcyBpcyB0aGUgZ3Vlc3Qgc2NoZWR1bGVyIHlvdSBhcmUgdGFs a2luZyBhYm91dCwKCnllcwoKPiBhbmQgSeKAmW0gYXNzdW1pbmcgdmlydHVhbGl6YXRpb24gY2Fu IHByZWVtcHQgdGhhdCBjb2RlIGFueXdoZXJlLgo+IE1heWJlIHRoYXTigJlzIHdoZXJlIEnigJlt IHdyb25nPwoKWW91IGFyZSBjb3JyZWN0LCB0aGUgZ3Vlc3QgY2FuIGJlIHByZWVtcHRlZCBhdCBh bnkgcG9pbnQuCgo+IAo+IEZvciB0aGUgc2FrZSBvZiB0aGUgYXJndW1lbnQsIGFzc3VtZSB0aGVy ZSBpcyBhIDFzIHBhdXNlLgo+IE5vdCBjb21wbGV0ZWx5IHVucmVhc29uYWJsZSBpbiBhIG1pZ3Jh dGlvbiBzY2VuYXJpby4KCkFzIEkgbWVudGlvbmVkIGJlZm9yZSwgZXZlbnRzIGxpa2UgbWlncmF0 aW9uIGFyZSBub3QgcmVwcmVzZW50ZWQgYnkKc3RvbGVuIHRpbWUuIFRoZXkgd291bGQgYmUgcmVw cmVzZW50ZWQgYnkgQ05UVkNUX0VMMCBhcHBlYXJpbmcgdG8gcGF1c2UKZHVyaW5nIHRoZSBtaWdy YXRpb24gKHNvIHNob3dpbmcgYSBkaWZmZXJlbmNlIGJldHdlZW4gInBoeXNpY2FsIHRpbWUiCmFu ZCAibGl2ZSBwaHlzaWNhbCB0aW1lIikuIFRoZSBzdG9sZW4gdGltZSB2YWx1ZSB3b3VsZCBub3Qg YmUgaW5jcmVtZW50ZWQuCgo+PiDCoCogc2NoZWR1bGVyIGNhcHR1cmVzIHN0b2xlbiB0aW1lIGZy b20gc3RydWN0dXJlIGFuZCBDTlRWQ1RfRUwwOgo+PiDCoMKgwqDCoMKgYmVmb3JlX3RpbWVyID0g Q05UVkNUX0VMMAo+IAo+IFtpbnNlcnQgb3B0aW9uYWwgMXMgcGF1c2UgaGVyZSwgY2FzZSBBXQo+ IAo+PiDCoMKgwqDCoMKgYmVmb3JlX3N0b2xlbiA9IHN0b2xlbgo+PiDCoCogc2NoZWR1bGUgaW4g cHJvY2Vzcwo+PiDCoCogcHJvY2VzcyBpcyBwcmUtZW1wdGVkIChvciBibG9ja2VkIGluIHNvbWUg d2F5KQo+PiDCoCogc2NoZWR1bGVyIGNhcHR1cmVzIHN0b2xlbiB0aW1lIGZyb20gc3RydWN0dXJl IGFuZCBDTlRWQ1RfRUwwOgo+PiDCoMKgwqDCoMKgYWZ0ZXJfdGltZXIgPSBDTlRWQ1RfRUwwCj4g Cj4gW2luc2VydCBvcHRpb25hbCAxcyBwYXVzZSBoZXJlLCBjYXNlIEJdCj4gCj4+IMKgwqDCoMKg wqBhZnRlcl9zdG9sZW4gPSBzdG9sZW4KPj4gwqDCoMKgwqDCoHRpbWUgPSB0b19uc2VjcyhhZnRl cl90aW1lciAtIGJlZm9yZV90aW1lcikgLQo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAoYWZ0 ZXJfc3RvbGVuIC0gYmVmb3JlX3N0b2xlbikKPiAKPiBJbiBjYXNlIEEsIHRpbWUgaXMgdG9vIGJp ZyBieSBvbmUgc2Vjb25kLiBJbiBjYXNlIEIsIGl0IGlzIHRvbyBzbWFsbCwKPiB0byB0aGUgcG9p bnQgd2hlcmUgeW91ciBjb2RlIG1pZ2h0IG5lZWQgdG8gYmUgcmVhZHkgZm9yCj4g4oCcdGltZeKA nSB1bmV4cGVjdGVkbHkgc2hvd2luZyB1cCBhcyBuZWdhdGl2ZS4KClNvIGEgMSBzZWNvbmQgcGF1 c2UgaXMgdW5saWtlbHkgZm9yIHN0b2xlbiB0aW1lIC0gdGhpcyBtZWFucyB0aGF0IHRoZQpWQ1BV IHdhcyByZWFkeSB0byBydW4sIGJ1dCB0aGUgaG9zdCBkaWRuJ3QgcnVuIGl0IGZvciBzb21lIHJl YXNvbi4gQnV0CmluIHRoZW9yeSB5b3UgYXJlIGNvcnJlY3QgdGhpcyBjb3VsZCBoYXBwZW4uIFRo ZSBjb3JlIGNvZGUgZGVhbHMgd2l0aCBpdApsaWtlIHRoaXMgKHVwZGF0ZV9ycV9jbG9ja190YXNr KToKPiAJaWYgKHN0YXRpY19rZXlfZmFsc2UoKCZwYXJhdmlydF9zdGVhbF9ycV9lbmFibGVkKSkp IHsKPiAJCXN0ZWFsID0gcGFyYXZpcnRfc3RlYWxfY2xvY2soY3B1X29mKHJxKSk7Cj4gCQlzdGVh bCAtPSBycS0+cHJldl9zdGVhbF90aW1lX3JxOwo+IAo+IAkJaWYgKHVubGlrZWx5KHN0ZWFsID4g ZGVsdGEpKQo+IAkJCXN0ZWFsID0gZGVsdGE7Cj4gCj4gCQlycS0+cHJldl9zdGVhbF90aW1lX3Jx ICs9IHN0ZWFsOwo+IAkJZGVsdGEgLT0gc3RlYWw7Cj4gCX0KClNvIGlmIChzdGVhbCA+IGRlbHRh KSB0aGVuIHN0ZWFsIGlzIGNhcHBlZCB0byBkZWx0YSwgcHJldmVudGluZyB0aGUKZmluYWwgZGVs dGEgZnJvbSBnb2luZyBuZWdhdGl2ZS4KCj4+Cj4+IFRoZSBzY2hlZHVsZXIgY2FuIHRoZW4gY2hh cmdlIHRoZSBwcm9jZXNzIGZvciAidGltZSIgbmFub3NlY29uZHMgb2YKPj4gdGltZS4gVGhpcyBl bnN1cmVzIHRoYXQgYSBwcm9jZXNzIGlzbid0IHVuZmFpcmx5IHBlbmFsaXNlZCBpZiB0aGUgaG9z dAo+PiBkb2Vzbid0IHNjaGVkdWxlIHRoZSBWQ1BVIHdoaWxlIGl0IGlzIHN1cHBvc2VkIHRvIGJl IHJ1bm5pbmcuCj4+Cj4+IFRoZSByYWNlIGlzIHZlcnkgc21hbGwgaW4gY29tcGFyaXNvbiB0byB0 aGUgdGltZSB0aGUgcHJvY2VzcyBpcyBydW5uaW5nLAo+PiBhbmQgaW4gdGhlIHdvcnN0IGNhc2Ug anVzdCBtZWFucyB0aGUgcHJvY2VzcyBpcyBjaGFyZ2VkIHNsaWdodGx5IG1vcmUKPj4gKG9yIGxl c3MpIHRoYW4gaXQgc2hvdWxkIGJlLgo+IAo+IEF0IHRoaXMgcG9pbnQsIHdoYXQgSSBkb27igJl0 IHVuZGVyc3RhbmQgaXMgd2h5IHRoZSByYWNlIHdvdWxkIGJlCj4g4oCcdmVyeSBzbWFsbOKAnSBv ciB3aHkgeW91IHdvdWxkIG9ubHkgYmUgY2hhcmdlZCDigJxzbGlnaHRseeKAnSBtb3JlIG9yIGxl c3M/CgpUaGUgd2luZG93IGJldHdlZW4gbWVhc3VyaW5nIHRoZSB0aW1lIHVzaW5nIENOVFZDVF9F TDAgYW5kIGdldHRpbmcgdGhlCnN0b2xlbiB0aW1lIGZyb20gdGhlIGh5cGVydmlzb3IgaXMgcHJl dHR5IHNob3J0LiBUaGUgYW1vdW50IG9mIHRpbWUgdGhhdAppcyAobm9ybWFsbHkpIHN0b2xlbiBp biBvbmUgZ28gaXMgYWxzbyBzbWFsbC4gU28gdGhlIHJhY2UgaXMgdW5saWtlbHkKYW5kIHRoZSBl cnJvciB3aGVuIGl0IG9jY3VycyBpcyAodXN1YWxseSkgc21hbGwuCgpMb25nIGV2ZW50cyAoc3Vj aCBhcyBtaWdyYXRpb24gb3IgcGF1c2luZyB0aGUgZ3Vlc3QpIGFyZSBub3QgY29uc2lkZXJlZAoi c3RvbGVuIHRpbWUiIGFuZCBzaG91bGQgYmUgcmVmbGVjdGVkIHRvIHRoZSBndWVzdCBpbiBvdGhl ciB3YXlzLgoKPj4gSSBndWVzcyBpZiB5b3UncmUgcmVhbGx5IHdvcnJpZWQgYWJvdXQgaXQsIHlv dSBjb3VsZCBkbyBhIGRhbmNlIGxpa2U6Cj4+Cj4+IGRvIHsKPj4gYmVmb3JlID0gc3RvbGVuCj4+ IHRpbWVyID0gQ05UVkNUX0VMMAo+PiBhZnRlciA9IHN0b2xlbgo+PiB9IHdoaWxlIChiZWZvcmUg IT0gYWZ0ZXIpOwo+IAo+IFRoYXQgd2lsbCB3b3JrIGFzIGxvbmcgYXMgbm90aGluZyBpbiB0aGF0 IGxvb3AgcmVxdWlyZXMgc29tZXRoaW5nCj4gdGhhdCB3b3VsZCBjYXVzZSBgc3RvbGVuYCB0byBq dW1wLiBJZiB0aGVyZSBpcyBzdWNoIGEgZ3VhcmFudGVlLAo+IHRoZW4gdGhhdOKAmXMgZXZlbiBl ZmZpY2llbnQsIGJlY2F1c2UgaW4gbW9zdCBjYXNlcyB0aGUgbG9vcAo+IHdvdWxkIG9ubHkgcnVu IG9uY2UsIGF0IHRoZSBjb3N0IG9mIG9uZSBleHRyYSByZWFkIGFuZCBvbmUgdGVzdC4KCk5vdGUg dGhhdCBvdGhlciBhcmNoaXRlY3R1cmVzIGRvbid0IGhhdmUgc3VjaCBsb29wcywgc28gYXJtNjQg aXMganVzdApmb2xsb3dpbmcgdGhlIGxlYWQgb2YgZXhpc3RpbmcgYXJjaGl0ZWN0dXJlLgoKPj4g QnV0IEkgZG9uJ3Qgc2VlIHRoZSBuZWVkIHRvIGhhdmUgc3VjaCBhbiBhY2N1cmF0ZSB2aWV3IG9m IGVsYXBzZWQgdGltZQo+PiB0aGF0IHRoZSBWQ1BVIHdhcyBzY2hlZHVsZWQuIEFuZCBvZiBjb3Vy c2UgYXQgdGhlIG1vbWVudCAod2l0aG91dCB0aGlzCj4+IHNlcmllcykgdGhlIGd1ZXN0IGhhcyBu byBpZGVhIGFib3V0IHRpbWUgc3RvbGVuIGJ5IHRoZSBob3N0Lgo+IAo+IEnigJltIGNlcnRhaW5s eSBub3QgYXJndWluZyB0aGF0IGV4cG9zaW5nIHN0b2xlbiB0aW1lIGlzIGEgYmFkIGlkZWEsCj4g SeKAmW0gb25seSB3b25kZXJpbmcgaWYgdGhlIHByb3Bvc2VkIHNvbHV0aW9uIGlzIHJhY3ksIGFu ZCBpZiBzbywgaWYKPiBpdCBpcyBpbnRlbnRpb25hbC4KPiAKPiBJZiBpdOKAmXMgaW5kZWVkIHJh Y3ksIHRoZSBwcm9ibGVtIGNvdWxkIGJlIG1pdGlnYXRlZCBpbiBhIG51bWJlciBvZgo+IHdheXMK PiAKPiBhKSBkb2N1bWVudCB5b3VyIGxvb3Agb3Igc29tZXRoaW5nIHNpbWlsYXIgYXMgYmVpbmcg dGhlIHJlY29tbWVuZGVkCj4gd2F5IHRvIGF2b2lkIHRoZSByYWNlLCBhbmQgdGhlbiBlbnN1cmUg dGhhdCB0aGUgbG9vcCBhY3R1YWxseQo+IHdpbGwgYWx3YXlzIHdvcmsgYXMgaW50ZW5kZWQuIFRo ZSB1cHNpZGUgaXMgdGhhdCBpdOKAmXMganVzdCBhIGNoYW5nZSBpbgo+IHNvbWUgY29tbWVudHMg b3IgZG9jdW1lbnRhdGlvbi4KPiAKPiBiKSBoYXZpbmcgYSBzaW5nbGUgaW50ZXJmYWNlIHRoYXQg ZXhwb3NlcyBtdWx0aXBsZSB0aW1lcy4gRm9yIGV4YW1wbGUsCj4geW91IGNvdWxkIGhhdmUgYSBj b3B5IG9mIENOVFZDVF9FTDAgd3JpdHRlbiBhbG9uZ3NpZGUgc3RvbGVuIHRpbWUsCj4gYW5kIHRo ZW4gdGhlIHNjaGVkdWxlciBjb3VsZCB1c2UgdGhhdCBjb3B5IGZvciBpdHMgZGVjaXNpb24uCgpU aGF0IHdvdWxkIHN0aWxsIGJlIHJhY3kgLSB0aGUgc3RydWN0dXJlIGNhbiBiZSB1cGRhdGVkIGF0 IGFueSB0aW1lIChhcwp0aGUgaG9zdCBjb3VsZCBpbnRlcnJ1cHQgdGhlIFZDUFUgYXQgYW55IHRp bWUpLCBzbyB5b3Ugd291bGQgc3RpbGwgYmUKbGVmdCB3aXRoIHRoZSBwcm9ibGVtIG9mIHJlYWRp bmcgYm90aCBhdG9taWNhbGx5IC0gd2hpY2ggd291bGQgbWVhbgpnb2luZyBiYWNrIHRvIHRoZSBs b29wLiBUaGlzIGlzIHRoZSBhcHByb2FjaCB0aGF0IExQVCB0YWtlcyBhbmQgaXMKZG9jdW1lbnRl ZCBpbiB0aGUgc3BlYy4KCkFsc28gSSBjYW4ndCBzZWUgd2h5IHlvdSB3b3VsZCB3YW50IHRvIGtu b3cgdGhlIENOVFZDVF9FTDAgdmFsdWUgYXQgdGhlCnBvaW50IHRoZSBzdG9sZW4gdGltZSB3YXMg dXBkYXRlZCwgaXQncyBtdWNoIG1vcmUgdXNlZnVsIHRvIGtub3cgdGhlCmN1cnJlbnQgQ05UVkNU X0VMMCB2YWx1ZS4KClVsdGltYXRlbHkgcmVhZGluZyB0aGUgc3RvbGVuIHRpbWUgaXMgYWx3YXlz IGdvaW5nIHRvIGJlIHNsaWdodGx5IHJhY3kKYmVjYXVzZSB5b3UgYXJlIGluY2x1ZGluZyBzb21l IG9mIHRoZSBzY2hlZHVsZXIncyB0aW1lIGluIHRoZQpjYWxjdWxhdGlvbiBvZiBob3cgbXVjaCB0 aW1lIHRoZSBwcm9jZXNzIHdhcyBydW5uaW5nIGZvci4gVGhlIHBhdXNlcyB5b3UKZGVzY3JpYmUg YWJvdmUgYXJlIGluc3RhbmNlcyB3aGVyZSB0aW1lIGhhcyBiZWVuIHN0b2xlbiBmcm9tIHRoZQpz Y2hlZHVsZXIsIGJ1dCB0aGF0IHRpbWUgaXMgYmVpbmcgYWNjb3VudGVkIGZvci9hZ2FpbnN0IGEg dXNlciBzcGFjZQpwcm9jZXNzLiBXaGlsZSB0aGUgYWxnb3JpdGhtIGNvdWxkIGJlIGNoYW5nZWQg c28gdGhhdCBpdCdzIGFsd2F5cyBhCnBvc2l0aXZlIGZvciB0aGUgdXNlciBzcGFjZSBwcm9jZXNz IEknbSBub3Qgc3VyZSB0aGF0J3MgYSBiZW5lZml0IChpdCdzCnByb2JhYmx5IGJldHRlciB0aGF0 IHN0YXRpc3RpY2FsbHkgaXQgY2FuIGdvIGVpdGhlciB3YXkpLgoKU3RldmUKCl9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmt2bWFybSBtYWlsaW5nIGxpc3QK a3ZtYXJtQGxpc3RzLmNzLmNvbHVtYmlhLmVkdQpodHRwczovL2xpc3RzLmNzLmNvbHVtYmlhLmVk dS9tYWlsbWFuL2xpc3RpbmZvL2t2bWFybQo= 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=-2.3 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE, SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=no 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 B5B07C32751 for ; Wed, 7 Aug 2019 15:27:01 +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 857262199C for ; Wed, 7 Aug 2019 15:27:01 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="UDK2CgVP" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 857262199C Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=arm.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=mt25JRKaPA8/feelikZ4f0ocDJ3tUKTlWhehEIflDmc=; b=UDK2CgVPsO8xwn CrvnVUI4uDODIkoj6HzGZNP2+GkuRewpzf4r6xjIb7sek2h4kG5sBKybPdqOCnmWU9P540+hvQk3i e+3/IPv2x8+qEt7RI29Px4p5j43Ynzqrytl2UXSpOhFzZM3fQ1QDgGsX18bjF+AYCI8YlAuP24T17 Ckc3wYDI8H8qoj+ApFp03wEUx83pDe+4EpUl/2kfT0cUr/dst6Tdl1ozxuCwyYY6hdlwUrXeHIdZd 2FQ+0YSUEstd30A3iM4IEdDlfIb41/7Tr+H6NiMnhZsscnVflkt+lKpdOK0gqq2mc5t37d/XV4QAh 4tSj9dY4WNf0trg7fsow==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92 #3 (Red Hat Linux)) id 1hvNq9-0002lC-2E; Wed, 07 Aug 2019 15:27:01 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.92 #3 (Red Hat Linux)) id 1hvNq5-0002kV-UH for linux-arm-kernel@lists.infradead.org; Wed, 07 Aug 2019 15:26:59 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id C05F5344; Wed, 7 Aug 2019 08:26:56 -0700 (PDT) Received: from [10.1.196.133] (e112269-lin.cambridge.arm.com [10.1.196.133]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 69BC03F706; Wed, 7 Aug 2019 08:26:55 -0700 (PDT) Subject: Re: [PATCH 1/9] KVM: arm64: Document PV-time interface To: Christophe de Dinechin References: <20190802145017.42543-1-steven.price@arm.com> <20190802145017.42543-2-steven.price@arm.com> <9F77FA64-C71B-4025-A58D-3AC07E6688DE@dinechin.org> From: Steven Price Message-ID: Date: Wed, 7 Aug 2019 16:26:54 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 In-Reply-To: <9F77FA64-C71B-4025-A58D-3AC07E6688DE@dinechin.org> Content-Language: en-GB X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190807_082658_062662_B84604EF X-CRM114-Status: GOOD ( 46.35 ) 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: KVM list , linux-doc@vger.kernel.org, Marc Zyngier , open list , Russell King , Catalin Marinas , Paolo Bonzini , Will Deacon , kvmarm@lists.cs.columbia.edu, linux-arm-kernel@lists.infradead.org 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 T24gMDcvMDgvMjAxOSAxNToyOCwgQ2hyaXN0b3BoZSBkZSBEaW5lY2hpbiB3cm90ZToKPiAKPiAK Pj4gT24gNyBBdWcgMjAxOSwgYXQgMTU6MjEsIFN0ZXZlbiBQcmljZSA8c3RldmVuLnByaWNlQGFy bS5jb20KPj4gPG1haWx0bzpzdGV2ZW4ucHJpY2VAYXJtLmNvbT4+IHdyb3RlOgo+Pgo+PiBPbiAw NS8wOC8yMDE5IDE3OjQwLCBDaHJpc3RvcGhlIGRlIERpbmVjaGluIHdyb3RlOgo+Pj4KPj4+IFN0 ZXZlbiBQcmljZSB3cml0ZXM6Cj4+Pgo+Pj4+IEludHJvZHVjZSBhIHBhcmF2aXJ0dWFsaXphdGlv biBpbnRlcmZhY2UgZm9yIEtWTS9hcm02NCBiYXNlZCBvbiB0aGUKPj4+PiAiQXJtIFBhcmF2aXJ0 dWFsaXplZCBUaW1lIGZvciBBcm0tQmFzZSBTeXN0ZW1zIiBzcGVjaWZpY2F0aW9uIERFTiAwMDU3 QS4KPj4+Pgo+Pj4+IFRoaXMgb25seSBhZGRzIHRoZSBkZXRhaWxzIGFib3V0ICJTdG9sZW4gVGlt ZSIgYXMgdGhlIGRldGFpbHMgb2YgIkxpdmUKPj4+PiBQaHlzaWNhbCBUaW1lIiBoYXZlIG5vdCBi ZWVuIGZ1bGx5IGFncmVlZC4KPj4+Pgo+Pj4gWy4uLl0KPj4+Cj4+Pj4gKwo+Pj4+ICtTdG9sZW4g VGltZQo+Pj4+ICstLS0tLS0tLS0tLQo+Pj4+ICsKPj4+PiArVGhlIHN0cnVjdHVyZSBwb2ludGVk IHRvIGJ5IHRoZSBQVl9USU1FX1NUIGh5cGVyY2FsbCBpcyBhcyBmb2xsb3dzOgo+Pj4+ICsKPj4+ PiArIMKgRmllbGQgwqDCoMKgwqDCoMKgfCBCeXRlIExlbmd0aCB8IEJ5dGUgT2Zmc2V0IHwgRGVz Y3JpcHRpb24KPj4+PiArIMKgLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0t IHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPj4+PiArIMKgUmV2aXNpb24gwqDCoMKgfCDC oMKgwqDCoMKgNCDCoMKgwqDCoMKgfCDCoMKgwqDCoMKgMCDCoMKgwqDCoMKgfCBNdXN0IGJlIDAg Zm9yIHZlcnNpb24gMC4xCj4+Pj4gKyDCoEF0dHJpYnV0ZXMgwqB8IMKgwqDCoMKgwqA0IMKgwqDC oMKgwqB8IMKgwqDCoMKgwqA0IMKgwqDCoMKgwqB8IE11c3QgYmUgMAo+Pj4+ICsgwqBTdG9sZW4g dGltZSB8IMKgwqDCoMKgwqA4IMKgwqDCoMKgwqB8IMKgwqDCoMKgwqA4IMKgwqDCoMKgwqB8IFN0 b2xlbiB0aW1lIGluIHVuc2lnbmVkCj4+Pj4gKyDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHwg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfCDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB8IG5hbm9z ZWNvbmRzIGluZGljYXRpbmcgaG93Cj4+Pj4gKyDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHwg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfCDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB8IG11Y2gg dGltZSB0aGlzIFZDUFUgdGhyZWFkCj4+Pj4gKyDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoHwg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfCDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB8IHdhcyBp bnZvbHVudGFyaWx5IG5vdAo+Pj4+ICsgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqB8IMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoHwgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfCBydW5uaW5nIG9u IGEgcGh5c2ljYWwgQ1BVLgo+Pj4KPj4+IEkga25vdyB2ZXJ5IGxpdHRsZSBhYm91dCB0aGUgdG9w aWMsIGJ1dCBJIGRvbid0IHVuZGVyc3RhbmQgaG93IHRoZSBzcGVjCj4+PiBhcyBwcm9wb3NlZCBh bGxvd3MgYW4gYWNjdXJhdGUgcmVhZGluZyBvZiB0aGUgcmVsYXRpb24gYmV0d2VlbiBwaHlzaWNh bAo+Pj4gdGltZSBhbmQgc3RvbGVuIHRpbWUgc2ltdWx0YW5lb3VzbHkuIEluIG90aGVyIHdvcmRz LCBjb3VsZCB5b3UgZHJhdwo+Pj4gRmlndXJlIDEgb2YgdGhlIHNwZWMgZnJvbSB3aXRoaW4gdGhl IGd1ZXN0PyBPciBpcyBpdCBhIG5vbi1vYmplY3RpdmU/Cj4+Cj4+IEZpZ3VyZSAxIGlzIG1vc3Rs eSBhdHRlbXB0aW5nIHRvIGV4cGxhaW4gTGl2ZSBQaHlzaWNhbCBUaW1lIChMUFQpLCB3aGljaAo+ PiBpcyBub3QgcGFydCBvZiB0aGlzIHBhdGNoIHNlcmllcy4gQnV0IGl0IGRvZXMgdG91Y2ggb24g c3RvbGVuIHRpbWUgYnkKPj4gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAibGl2ZSBwaHlzaWNhbCB0 aW1lIiBhbmQgInZpcnR1YWwgdGltZSIuCj4+Cj4+IEknbSBub3Qgc3VyZSB3aGF0IHlvdSBtZWFu IGJ5ICJmcm9tIHdpdGhpbiB0aGUgZ3Vlc3QiLiBGcm9tIHRoZQo+PiBwZXJzcGVjdGl2ZSBvZiB0 aGUgZ3Vlc3QgdGhlIHBhcnRzIG9mIHRoZSBkaWFncmFtIHdoZXJlIHRoZSBndWVzdCBpc24ndAo+ PiBydW5uaW5nIGRvbid0IGV4aXN0ICh0aGVyZWZvcmUgdGhlcmUgYXJlIGRpc2NvbnRpbnVpdGll cyBpbiB0aGUKPj4gInBoeXNpY2FsIHRpbWUiIGFuZCAibGl2ZSBwaHlzaWNhbCB0aW1lIiBsaW5l cykuCj4gCj4gSSBtZWFudDogSWYgSSBydW4gY29kZSB3aXRoaW4gdGhlIGd1ZXN0IHRoYXQgYXR0 ZW1wdHMgdG8gZHJhdyBGaWd1cmUgMSwKPiByYWNlIGNvbmRpdGlvbnMgbWF5IGNhdXNlIHRoZSBk aWFncmFtIGFjdHVhbGx5IGRyYXduIGJ5IHlvdXIgZ3Vlc3QKPiBwcm9ncmFtIHRvIGxvb2sgY29t cGxldGVseSB3cm9uZyBvbiBvY2Nhc2lvbnMuCj4gCj4+IFRoaXMgcGF0Y2ggc2VyaWVzIGRvZXNu J3QgYXR0ZW1wdCB0byBwcm92aWRlIHRoZSBndWVzdCB3aXRoIGEgdmlldyBvZgo+PiAicGh5c2lj YWwgdGltZSIgKG9yIExQVCkgLSBidXQgaXQgbWlnaHQgYmUgYWJsZSB0byBvYnNlcnZlIHRoYXQg YnkKPj4gY29uc3VsdGluZyBzb21ldGhpbmcgZXh0ZXJuYWwgKGUuZy4gYW4gTlRQIHNlcnZlciwg b3IgYW4gZW11bGF0ZWQgUlRDCj4+IHdoaWNoIHJlcG9ydHMgd2FsbC1jbG9jayB0aW1lKS4KPiAK PiDigKYgd2l0aCB3aGF0IGFwcGVhciB0byBiZSBsaWtlIGEgYnVpbHQtaW4gcmFjZSBjb25kaXRp b24sIGFzIHlvdSBjb3JyZWN0bHkKPiBpZGVudGlmaWVkLiBJIHdhcyB3b25kZXJpbmcgaWYgdGhl IGJ1aWx0LWluIHJhY2UgY29uZGl0aW9uIHdhcyBkZWxpYmVyYXRlCj4gYW5kL29yIG5lY2Vzc2Fy eSwgb3IgaWYgaXQgd2FzIGlycmVsZXZhbnQgZm9yIHRoZSBwbGFubmVkIHVzZXMgb2YgdGhlIHZh bHVlLgo+IAo+PiBXaGF0IGl0IGRvZXMgcHJvdmlkZSBpcyBhIG1lY2hhbmlzbSBmb3Igb2J0YWlu aW5nIHRoZSBkaWZmZXJlbmNlIChhcwo+PiByZXBvcnRlZCBieSB0aGUgaG9zdCkgYmV0d2VlbiAi bGl2ZSBwaHlzaWNhbCB0aW1lIiBhbmQgInZpcnR1YWwgdGltZSIgLQo+PiB0aGlzIGlzIHJlcG9y dGVkIGluIG5hbm9zZWNvbmRzIGluIHRoZSBhYm92ZSBzdHJ1Y3R1cmUuCj4+Cj4+PiBGb3IgZXhh bXBsZSwgaWYgeW91IHJlYWQgdGhlIHN0b2xlbiB0aW1lIGJlZm9yZSB5b3UgcmVhZCBDTlRWQ1Rf RUwwLAo+Pj4gaXNuJ3QgaXQgcG9zc2libGUgZm9yIGEgbGVuZ3RoeSBldmVudCBsaWtlIGEgbWln cmF0aW9uIHRvIG9jY3VyIGJldHdlZW4KPj4+IHRoZSB0d28gcmVhZHMsIGNhdXNpbmcgdGhlIHN0 b2xlbiB0aW1lIHRvIGJlIG9ic29sZXRlIGFuZCBvZmYgYnkgc2Vjb25kcz8KPj4KPj4gIkxlbmd0 aHkgZXZlbnRzIiBsaWtlIG1pZ3JhdGlvbiBhcmUgcmVwcmVzZW50ZWQgYnkgdGhlICJwYXVzZWQi IHN0YXRlIGluCj4+IHRoZSBkaWFncmFtIC0gaS5lLiBpdCdzIHRoZSBkaWZmZXJlbmNlIGJldHdl ZW4gInBoeXNpY2FsIHRpbWUiIGFuZCAibGl2ZQo+PiBwaHlzaWNhbCB0aW1lIi4gU28gc3RvbGVu IHRpbWUgZG9lc24ndCBhdHRlbXB0IHRvIHJlcHJlc2VudCB0aGF0Lgo+Pgo+PiBBbmQgeWVzLCB0 aGVyZSBpcyBhIHJhY2UgYmV0d2VlbiByZWFkaW5nIENOVFZDVF9FTDAgYW5kIHJlYWRpbmcgc3Rv bGVuCj4+IHRpbWUgLSBidXQgaW4gcHJhY3RpY2UgdGhpcyBkb2Vzbid0IHJlYWxseSBtYXR0ZXIu IFRoZSB1c3VhbCBwc2V1ZG8tY29kZQo+PiB3YXkgb2YgdXNpbmcgc3RvbGVuIHRpbWUgaXM6Cj4g Cj4gSeKAmW0gYXNzdW1pbmcgdGhpcyBpcyB0aGUgZ3Vlc3Qgc2NoZWR1bGVyIHlvdSBhcmUgdGFs a2luZyBhYm91dCwKCnllcwoKPiBhbmQgSeKAmW0gYXNzdW1pbmcgdmlydHVhbGl6YXRpb24gY2Fu IHByZWVtcHQgdGhhdCBjb2RlIGFueXdoZXJlLgo+IE1heWJlIHRoYXTigJlzIHdoZXJlIEnigJlt IHdyb25nPwoKWW91IGFyZSBjb3JyZWN0LCB0aGUgZ3Vlc3QgY2FuIGJlIHByZWVtcHRlZCBhdCBh bnkgcG9pbnQuCgo+IAo+IEZvciB0aGUgc2FrZSBvZiB0aGUgYXJndW1lbnQsIGFzc3VtZSB0aGVy ZSBpcyBhIDFzIHBhdXNlLgo+IE5vdCBjb21wbGV0ZWx5IHVucmVhc29uYWJsZSBpbiBhIG1pZ3Jh dGlvbiBzY2VuYXJpby4KCkFzIEkgbWVudGlvbmVkIGJlZm9yZSwgZXZlbnRzIGxpa2UgbWlncmF0 aW9uIGFyZSBub3QgcmVwcmVzZW50ZWQgYnkKc3RvbGVuIHRpbWUuIFRoZXkgd291bGQgYmUgcmVw cmVzZW50ZWQgYnkgQ05UVkNUX0VMMCBhcHBlYXJpbmcgdG8gcGF1c2UKZHVyaW5nIHRoZSBtaWdy YXRpb24gKHNvIHNob3dpbmcgYSBkaWZmZXJlbmNlIGJldHdlZW4gInBoeXNpY2FsIHRpbWUiCmFu ZCAibGl2ZSBwaHlzaWNhbCB0aW1lIikuIFRoZSBzdG9sZW4gdGltZSB2YWx1ZSB3b3VsZCBub3Qg YmUgaW5jcmVtZW50ZWQuCgo+PiDCoCogc2NoZWR1bGVyIGNhcHR1cmVzIHN0b2xlbiB0aW1lIGZy b20gc3RydWN0dXJlIGFuZCBDTlRWQ1RfRUwwOgo+PiDCoMKgwqDCoMKgYmVmb3JlX3RpbWVyID0g Q05UVkNUX0VMMAo+IAo+IFtpbnNlcnQgb3B0aW9uYWwgMXMgcGF1c2UgaGVyZSwgY2FzZSBBXQo+ IAo+PiDCoMKgwqDCoMKgYmVmb3JlX3N0b2xlbiA9IHN0b2xlbgo+PiDCoCogc2NoZWR1bGUgaW4g cHJvY2Vzcwo+PiDCoCogcHJvY2VzcyBpcyBwcmUtZW1wdGVkIChvciBibG9ja2VkIGluIHNvbWUg d2F5KQo+PiDCoCogc2NoZWR1bGVyIGNhcHR1cmVzIHN0b2xlbiB0aW1lIGZyb20gc3RydWN0dXJl IGFuZCBDTlRWQ1RfRUwwOgo+PiDCoMKgwqDCoMKgYWZ0ZXJfdGltZXIgPSBDTlRWQ1RfRUwwCj4g Cj4gW2luc2VydCBvcHRpb25hbCAxcyBwYXVzZSBoZXJlLCBjYXNlIEJdCj4gCj4+IMKgwqDCoMKg wqBhZnRlcl9zdG9sZW4gPSBzdG9sZW4KPj4gwqDCoMKgwqDCoHRpbWUgPSB0b19uc2VjcyhhZnRl cl90aW1lciAtIGJlZm9yZV90aW1lcikgLQo+PiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAoYWZ0 ZXJfc3RvbGVuIC0gYmVmb3JlX3N0b2xlbikKPiAKPiBJbiBjYXNlIEEsIHRpbWUgaXMgdG9vIGJp ZyBieSBvbmUgc2Vjb25kLiBJbiBjYXNlIEIsIGl0IGlzIHRvbyBzbWFsbCwKPiB0byB0aGUgcG9p bnQgd2hlcmUgeW91ciBjb2RlIG1pZ2h0IG5lZWQgdG8gYmUgcmVhZHkgZm9yCj4g4oCcdGltZeKA nSB1bmV4cGVjdGVkbHkgc2hvd2luZyB1cCBhcyBuZWdhdGl2ZS4KClNvIGEgMSBzZWNvbmQgcGF1 c2UgaXMgdW5saWtlbHkgZm9yIHN0b2xlbiB0aW1lIC0gdGhpcyBtZWFucyB0aGF0IHRoZQpWQ1BV IHdhcyByZWFkeSB0byBydW4sIGJ1dCB0aGUgaG9zdCBkaWRuJ3QgcnVuIGl0IGZvciBzb21lIHJl YXNvbi4gQnV0CmluIHRoZW9yeSB5b3UgYXJlIGNvcnJlY3QgdGhpcyBjb3VsZCBoYXBwZW4uIFRo ZSBjb3JlIGNvZGUgZGVhbHMgd2l0aCBpdApsaWtlIHRoaXMgKHVwZGF0ZV9ycV9jbG9ja190YXNr KToKPiAJaWYgKHN0YXRpY19rZXlfZmFsc2UoKCZwYXJhdmlydF9zdGVhbF9ycV9lbmFibGVkKSkp IHsKPiAJCXN0ZWFsID0gcGFyYXZpcnRfc3RlYWxfY2xvY2soY3B1X29mKHJxKSk7Cj4gCQlzdGVh bCAtPSBycS0+cHJldl9zdGVhbF90aW1lX3JxOwo+IAo+IAkJaWYgKHVubGlrZWx5KHN0ZWFsID4g ZGVsdGEpKQo+IAkJCXN0ZWFsID0gZGVsdGE7Cj4gCj4gCQlycS0+cHJldl9zdGVhbF90aW1lX3Jx ICs9IHN0ZWFsOwo+IAkJZGVsdGEgLT0gc3RlYWw7Cj4gCX0KClNvIGlmIChzdGVhbCA+IGRlbHRh KSB0aGVuIHN0ZWFsIGlzIGNhcHBlZCB0byBkZWx0YSwgcHJldmVudGluZyB0aGUKZmluYWwgZGVs dGEgZnJvbSBnb2luZyBuZWdhdGl2ZS4KCj4+Cj4+IFRoZSBzY2hlZHVsZXIgY2FuIHRoZW4gY2hh cmdlIHRoZSBwcm9jZXNzIGZvciAidGltZSIgbmFub3NlY29uZHMgb2YKPj4gdGltZS4gVGhpcyBl bnN1cmVzIHRoYXQgYSBwcm9jZXNzIGlzbid0IHVuZmFpcmx5IHBlbmFsaXNlZCBpZiB0aGUgaG9z dAo+PiBkb2Vzbid0IHNjaGVkdWxlIHRoZSBWQ1BVIHdoaWxlIGl0IGlzIHN1cHBvc2VkIHRvIGJl IHJ1bm5pbmcuCj4+Cj4+IFRoZSByYWNlIGlzIHZlcnkgc21hbGwgaW4gY29tcGFyaXNvbiB0byB0 aGUgdGltZSB0aGUgcHJvY2VzcyBpcyBydW5uaW5nLAo+PiBhbmQgaW4gdGhlIHdvcnN0IGNhc2Ug anVzdCBtZWFucyB0aGUgcHJvY2VzcyBpcyBjaGFyZ2VkIHNsaWdodGx5IG1vcmUKPj4gKG9yIGxl c3MpIHRoYW4gaXQgc2hvdWxkIGJlLgo+IAo+IEF0IHRoaXMgcG9pbnQsIHdoYXQgSSBkb27igJl0 IHVuZGVyc3RhbmQgaXMgd2h5IHRoZSByYWNlIHdvdWxkIGJlCj4g4oCcdmVyeSBzbWFsbOKAnSBv ciB3aHkgeW91IHdvdWxkIG9ubHkgYmUgY2hhcmdlZCDigJxzbGlnaHRseeKAnSBtb3JlIG9yIGxl c3M/CgpUaGUgd2luZG93IGJldHdlZW4gbWVhc3VyaW5nIHRoZSB0aW1lIHVzaW5nIENOVFZDVF9F TDAgYW5kIGdldHRpbmcgdGhlCnN0b2xlbiB0aW1lIGZyb20gdGhlIGh5cGVydmlzb3IgaXMgcHJl dHR5IHNob3J0LiBUaGUgYW1vdW50IG9mIHRpbWUgdGhhdAppcyAobm9ybWFsbHkpIHN0b2xlbiBp biBvbmUgZ28gaXMgYWxzbyBzbWFsbC4gU28gdGhlIHJhY2UgaXMgdW5saWtlbHkKYW5kIHRoZSBl cnJvciB3aGVuIGl0IG9jY3VycyBpcyAodXN1YWxseSkgc21hbGwuCgpMb25nIGV2ZW50cyAoc3Vj aCBhcyBtaWdyYXRpb24gb3IgcGF1c2luZyB0aGUgZ3Vlc3QpIGFyZSBub3QgY29uc2lkZXJlZAoi c3RvbGVuIHRpbWUiIGFuZCBzaG91bGQgYmUgcmVmbGVjdGVkIHRvIHRoZSBndWVzdCBpbiBvdGhl ciB3YXlzLgoKPj4gSSBndWVzcyBpZiB5b3UncmUgcmVhbGx5IHdvcnJpZWQgYWJvdXQgaXQsIHlv dSBjb3VsZCBkbyBhIGRhbmNlIGxpa2U6Cj4+Cj4+IGRvIHsKPj4gYmVmb3JlID0gc3RvbGVuCj4+ IHRpbWVyID0gQ05UVkNUX0VMMAo+PiBhZnRlciA9IHN0b2xlbgo+PiB9IHdoaWxlIChiZWZvcmUg IT0gYWZ0ZXIpOwo+IAo+IFRoYXQgd2lsbCB3b3JrIGFzIGxvbmcgYXMgbm90aGluZyBpbiB0aGF0 IGxvb3AgcmVxdWlyZXMgc29tZXRoaW5nCj4gdGhhdCB3b3VsZCBjYXVzZSBgc3RvbGVuYCB0byBq dW1wLiBJZiB0aGVyZSBpcyBzdWNoIGEgZ3VhcmFudGVlLAo+IHRoZW4gdGhhdOKAmXMgZXZlbiBl ZmZpY2llbnQsIGJlY2F1c2UgaW4gbW9zdCBjYXNlcyB0aGUgbG9vcAo+IHdvdWxkIG9ubHkgcnVu IG9uY2UsIGF0IHRoZSBjb3N0IG9mIG9uZSBleHRyYSByZWFkIGFuZCBvbmUgdGVzdC4KCk5vdGUg dGhhdCBvdGhlciBhcmNoaXRlY3R1cmVzIGRvbid0IGhhdmUgc3VjaCBsb29wcywgc28gYXJtNjQg aXMganVzdApmb2xsb3dpbmcgdGhlIGxlYWQgb2YgZXhpc3RpbmcgYXJjaGl0ZWN0dXJlLgoKPj4g QnV0IEkgZG9uJ3Qgc2VlIHRoZSBuZWVkIHRvIGhhdmUgc3VjaCBhbiBhY2N1cmF0ZSB2aWV3IG9m IGVsYXBzZWQgdGltZQo+PiB0aGF0IHRoZSBWQ1BVIHdhcyBzY2hlZHVsZWQuIEFuZCBvZiBjb3Vy c2UgYXQgdGhlIG1vbWVudCAod2l0aG91dCB0aGlzCj4+IHNlcmllcykgdGhlIGd1ZXN0IGhhcyBu byBpZGVhIGFib3V0IHRpbWUgc3RvbGVuIGJ5IHRoZSBob3N0Lgo+IAo+IEnigJltIGNlcnRhaW5s eSBub3QgYXJndWluZyB0aGF0IGV4cG9zaW5nIHN0b2xlbiB0aW1lIGlzIGEgYmFkIGlkZWEsCj4g SeKAmW0gb25seSB3b25kZXJpbmcgaWYgdGhlIHByb3Bvc2VkIHNvbHV0aW9uIGlzIHJhY3ksIGFu ZCBpZiBzbywgaWYKPiBpdCBpcyBpbnRlbnRpb25hbC4KPiAKPiBJZiBpdOKAmXMgaW5kZWVkIHJh Y3ksIHRoZSBwcm9ibGVtIGNvdWxkIGJlIG1pdGlnYXRlZCBpbiBhIG51bWJlciBvZgo+IHdheXMK PiAKPiBhKSBkb2N1bWVudCB5b3VyIGxvb3Agb3Igc29tZXRoaW5nIHNpbWlsYXIgYXMgYmVpbmcg dGhlIHJlY29tbWVuZGVkCj4gd2F5IHRvIGF2b2lkIHRoZSByYWNlLCBhbmQgdGhlbiBlbnN1cmUg dGhhdCB0aGUgbG9vcCBhY3R1YWxseQo+IHdpbGwgYWx3YXlzIHdvcmsgYXMgaW50ZW5kZWQuIFRo ZSB1cHNpZGUgaXMgdGhhdCBpdOKAmXMganVzdCBhIGNoYW5nZSBpbgo+IHNvbWUgY29tbWVudHMg b3IgZG9jdW1lbnRhdGlvbi4KPiAKPiBiKSBoYXZpbmcgYSBzaW5nbGUgaW50ZXJmYWNlIHRoYXQg ZXhwb3NlcyBtdWx0aXBsZSB0aW1lcy4gRm9yIGV4YW1wbGUsCj4geW91IGNvdWxkIGhhdmUgYSBj b3B5IG9mIENOVFZDVF9FTDAgd3JpdHRlbiBhbG9uZ3NpZGUgc3RvbGVuIHRpbWUsCj4gYW5kIHRo ZW4gdGhlIHNjaGVkdWxlciBjb3VsZCB1c2UgdGhhdCBjb3B5IGZvciBpdHMgZGVjaXNpb24uCgpU aGF0IHdvdWxkIHN0aWxsIGJlIHJhY3kgLSB0aGUgc3RydWN0dXJlIGNhbiBiZSB1cGRhdGVkIGF0 IGFueSB0aW1lIChhcwp0aGUgaG9zdCBjb3VsZCBpbnRlcnJ1cHQgdGhlIFZDUFUgYXQgYW55IHRp bWUpLCBzbyB5b3Ugd291bGQgc3RpbGwgYmUKbGVmdCB3aXRoIHRoZSBwcm9ibGVtIG9mIHJlYWRp bmcgYm90aCBhdG9taWNhbGx5IC0gd2hpY2ggd291bGQgbWVhbgpnb2luZyBiYWNrIHRvIHRoZSBs b29wLiBUaGlzIGlzIHRoZSBhcHByb2FjaCB0aGF0IExQVCB0YWtlcyBhbmQgaXMKZG9jdW1lbnRl ZCBpbiB0aGUgc3BlYy4KCkFsc28gSSBjYW4ndCBzZWUgd2h5IHlvdSB3b3VsZCB3YW50IHRvIGtu b3cgdGhlIENOVFZDVF9FTDAgdmFsdWUgYXQgdGhlCnBvaW50IHRoZSBzdG9sZW4gdGltZSB3YXMg dXBkYXRlZCwgaXQncyBtdWNoIG1vcmUgdXNlZnVsIHRvIGtub3cgdGhlCmN1cnJlbnQgQ05UVkNU X0VMMCB2YWx1ZS4KClVsdGltYXRlbHkgcmVhZGluZyB0aGUgc3RvbGVuIHRpbWUgaXMgYWx3YXlz IGdvaW5nIHRvIGJlIHNsaWdodGx5IHJhY3kKYmVjYXVzZSB5b3UgYXJlIGluY2x1ZGluZyBzb21l IG9mIHRoZSBzY2hlZHVsZXIncyB0aW1lIGluIHRoZQpjYWxjdWxhdGlvbiBvZiBob3cgbXVjaCB0 aW1lIHRoZSBwcm9jZXNzIHdhcyBydW5uaW5nIGZvci4gVGhlIHBhdXNlcyB5b3UKZGVzY3JpYmUg YWJvdmUgYXJlIGluc3RhbmNlcyB3aGVyZSB0aW1lIGhhcyBiZWVuIHN0b2xlbiBmcm9tIHRoZQpz Y2hlZHVsZXIsIGJ1dCB0aGF0IHRpbWUgaXMgYmVpbmcgYWNjb3VudGVkIGZvci9hZ2FpbnN0IGEg dXNlciBzcGFjZQpwcm9jZXNzLiBXaGlsZSB0aGUgYWxnb3JpdGhtIGNvdWxkIGJlIGNoYW5nZWQg c28gdGhhdCBpdCdzIGFsd2F5cyBhCnBvc2l0aXZlIGZvciB0aGUgdXNlciBzcGFjZSBwcm9jZXNz IEknbSBub3Qgc3VyZSB0aGF0J3MgYSBiZW5lZml0IChpdCdzCnByb2JhYmx5IGJldHRlciB0aGF0 IHN0YXRpc3RpY2FsbHkgaXQgY2FuIGdvIGVpdGhlciB3YXkpLgoKU3RldmUKCgpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1h aWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xp c3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==