Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vkhq8-0019oK-11 for pgsql-hackers@arkaria.postgresql.org; Tue, 27 Jan 2026 12:06:37 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vkhq6-00DZOB-0p for pgsql-hackers@arkaria.postgresql.org; Tue, 27 Jan 2026 12:06:34 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1vkhq5-00DZO1-1g for pgsql-hackers@lists.postgresql.org; Tue, 27 Jan 2026 12:06:34 +0000 Received: from mail-lf1-x134.google.com ([2a00:1450:4864:20::134]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1vkhpz-002Ymp-20 for pgsql-hackers@lists.postgresql.org; Tue, 27 Jan 2026 12:06:32 +0000 Received: by mail-lf1-x134.google.com with SMTP id 2adb3069b0e04-59dd4bec4ecso5819220e87.0 for ; Tue, 27 Jan 2026 04:06:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1769515586; cv=none; d=google.com; s=arc-20240605; b=k6NPiAk7m5ymt/3BaMynE805iVoey7LrDA9Wu86TtfT9Bf2eiopNwdQehpW/2hE6dj dqAG0sAJRnEY5ww8N3IY7uQGNCL+Y++O+8H+2PeWJ/xD85LxkP3KWoMsa/9SHwQrihk1 tM7k3uiA/JWMha6O2jOpiwABOb4XfURGFf1uSHZAIEsZ5tBDLT51YYmIMpG4S5+iEf3j dlZkgFjCgjWFq7qzyHsGZ2Gz+EEHyf8qXk81b4Aw2ezpZ2IZUyHGZdTXVmO1/2E76W50 w3Y0C75k8G4ca53PWbB1S5HX1/PENy0666eyPov31gEcfLuILxnONzSoFR+gu7L/2Lt9 lVXQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=W2VrhVf8pT7ihQ2QfwsuopuZVl9ZNs20NlsjiKBr/gQ=; fh=5lisVc/SdZrXESFhj6i3cPQivKRq2wrqq/p4/OVduqw=; b=GMSssxdzwqUyZ3Vc4A9QmWNIQDzJ4zdoN1pMoxLxlynLg0efwaPT0JvtD7aAJ8CR28 XghSqlwJudBmzFV5QleD4vTdYEDZWf26x7XEvWpO5dqNhgB9NYV6q/BvIjMpn/DLZ47A azODh4tHlRxs1iyENh3dPaC+/1unZGRtqfkylRvRMN94JemthwG1cL+Qpt3icVaE5sGZ o7fX38YfeloIsZCpbUj0atYQrPppCgWwc+camU646eCnakE0pST65sbWiilEXPgFpBe8 +zDBw1DLqT3jW1sNq/p1CjGTtem6Ke4RMcRB6CQSpEn/+BweXQKcKSfGHdy/IyRZjcbd TGFg==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=enterprisedb.com; s=google; t=1769515586; x=1770120386; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=W2VrhVf8pT7ihQ2QfwsuopuZVl9ZNs20NlsjiKBr/gQ=; b=f3S3TJZFoose7yA+OVDT0J/ss9KEYeCegNHXoEfVTCmzgFAtA5MbhxOjUGjM1NEMhD VzlQLpkzkss9AOl+l4+aEhjwaM7kNrUqMEDhN+I5vmu7PLtqzXtmx91xBVJJ0XbDnF0t My9592BYZYrJNU84A3+pEez4Fy0E0unYTF1DOUXN8QHIIVd1R8bZbIPJZIuDysdB1D4X DNf/8Kimjkp3ZApSSxzwxdG5jGqQyajEZuDY7oIOgznR+9y3H+Q21O0SjuY8mpaX3qVo qmT9/EYpUsMHUQQF9aLuFLPp+rI9Ti+sHVV4FSrfRW2G4VUU36x6J6I5vE3c+CVlL4mA p0CA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769515586; x=1770120386; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=W2VrhVf8pT7ihQ2QfwsuopuZVl9ZNs20NlsjiKBr/gQ=; b=fvfnLWiuBIq2gE5ggbEJ9W+qmn8hdec52NgLvimQZhkQT7cGuO9Xgv1DkrxLfrkQW9 Yl2I4QGYEEVzNOjf9wKUiaxiACBl1l29pXN8sBKMb1yxx7Vwq9ul9mPVDoXl1K81lQWz x2eBkG2EkPqiE/9ULurrgYDBvKgGr+ZLGUVFSxl2GTP4YanSkUcQJSmH+ycnVXgcldrp 6qlxXNn73RCbZE6Y5NCg+0esi2ZhD4yNEexxbZIMANwZRD4G7CKHCEkqNWEWMHEdtJjp lXh/iYSY7d8sSZ0L7RH6lkqQDzngL9PQ4Gg+X5GLOwCH6ZSb4LC8hxmx2eo+RUhV40UY ptYQ== X-Gm-Message-State: AOJu0YwxaS4DkQNjZdg+PB1UR7C5FJ1Zkab+plsOrf3tl7LhIefj79Et BspXVqkVCtGJOa19jrsSYMx4+xpyffZAI9ANUR5ER3njTV+E8jW6PQlePDBhhtD1V1eaNBxqa/i xGR4yUlO8jbW8B4qve8oze+W+vht5XYgoZDH/ayOY X-Gm-Gg: AZuq6aIeZdpp83CVfKOQbTROwWWI0jvC8E6TX4hoytz4z96Drf7ZzTciIGZGYFSXfGH q3SONcGCTVtm34RqQInKgeSoGo4JNhd3p1ycaX1DP3MWvtZOa+D17tGVVqHqCIxyWl7OQA2kE0o gnGGa5E3lFDJVcCPuLTQayukvHjnrdpZYO0dOLKSVqUeSEQwkABDOPhbZm7/IeFfeEXS7Ffp4PN 9ll25AxEcVRCFVIwVPO602YIbTmYzdxRha3Ukl3qP3qAeVZZ3aPqNU3RM39NzViF8DkjWg3SmpX 06xNoMSyFNuLNoHMcu2QqQPG4U8T4Euylu12PqGr/Yz6uKlvNqXtdxA= X-Received: by 2002:ac2:4e08:0:b0:59d:fd21:66e3 with SMTP id 2adb3069b0e04-59e0401727emr732055e87.16.1769515585974; Tue, 27 Jan 2026 04:06:25 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Jakub Wartak Date: Tue, 27 Jan 2026 13:06:13 +0100 X-Gm-Features: AZwV_QjV9j_TGln2gTAmxaP9SS3nHVlawpI9gt5m3t5H1Z0WXrOpMConHo2iDfg Message-ID: Subject: Re: pg_stat_io_histogram To: Andres Freund Cc: PostgreSQL Hackers Content-Type: multipart/mixed; boundary="000000000000edccda06495d73b5" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000edccda06495d73b5 Content-Type: multipart/alternative; boundary="000000000000edccd906495d73b3" --000000000000edccd906495d73b3 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Mon, Jan 26, 2026 at 4:08=E2=80=AFPM Andres Freund = wrote: > > Hi, > > On 2026-01-26 10:40:52 +0100, Jakub Wartak wrote: > > I'm proposing that we add pg_stat_io_histogram that would track/show I/= O > > latencies profile, so we could quickly identify I/O outliers. > > I think that's an interesting feature! Hi Andres, thanks for kind words and review! [..] > > For measuring particularly stuck things, I've been wondering about having a > regular timer that starts to collect more information if stuck in a place for > a while. That would probably end up being lower overhead than constantly > measuring... But it would also be a lot more work. Well if something is really stuck, I think the wait events are covering us on that, aren't they? One can argue if they carry enough information (for me they mostly do, but I'm trying to squeeze some more stuff into them in a nearby thread [1], BTW: it's kind of "blocked" due to that 56-bit relfilenode idea/question, any thoughts on that?) > > Right now the patch does not include per-backend/PID tracking, hopefully if > > there will be interest in this, I'll add it, but I would like to first hear > > if that's a good idea. The current implementation uses fast bucket > > calculation to avoid overheads and tries to cover most useful range of > > devices via buckets (128us..256ms, so that covers both NVMe/SSD/HDD and > > abnormally high latency too as from time to time I'm try to help with I/O > > stuck for *seconds*, usually a sign of some I/O multipath issues, devic= e > > resetting, or hypervisor woes). > > Hm. Isn't 128us a pretty high floor for at least reads and writes? On a good > NVMe disk you'll get < 10us, after all. I was blind and concentrated way too much on the bad-behaving I/O rather than good I/O - let's call it I/O negativity bias 8) Now v2 contains the min bucket lowered to 8us (but max then is just ~131ms, I didn't want it to use more than 64b total, 16*4b (uint32)=3D64b and well 16*8b(uint64)=3D128b already, so that's why it's capped max at 131072us rig= ht now). > I see a few problems with the source of the latency measurements though: > > - The latency gathered is that it's quite heavily affected by scheduler > noise. If your process isn't scheduled because other processes are busy > doing stuff on the CPU, it's quite possible to get results many orders of > magnitude wrong. > > - With AIO, you're measuring wait time, and that time can be affected by other > IOs in the queue. That will often *drastically* overestimate IO latency > measured this way. > > I don't see how we can do better absent cooperation from the kernel (by > putting lower-level measurements into io_uring completions, for example) > though. So maybe this is just how it has to be and we ought to just document > it. Right, I think this is a complex topic on it's own, I've added a small section into the docs. I didn't want to start the thread with undermining my own results, but indeed I'm getting "bad" numbers. Bad in essence that perceived latency numbers do not match with other stuff: E.g.checkpointer's fsync/fdatasync latency is awful, although i've been using this to simulate latency (just 2ms!, but it ended up adding way more): dd if=3D/dev/zero of=3D/fs bs=3D1M count=3D1024 losetup /dev/loop15 /fs echo "0 $(blockdev --getsz /dev/loop15) delay /dev/loop15 0 2" | \ dmsetup create delay mkfs.ext4 /dev/mapper/delay mount /dev/mapper/delay /mnt ... and it has e.g. quite interesting effects: - lack of "noatime" the impact is clearly visible on fsync - even with noatime I'm was getting spikes of latenices above 131ms (sic!) with this: select pg_stat_reset_shared(); pgbench -i -s 10 -p 1234 -h /tmp postgres checkpoint; - I've created attached bpftrace to see the gap between kernel and uprobes, but it's not that high, sample of the view backend | object | context | io_type | lat_us | lat_ms | count ----------+----------+---------+-----------+--------+---------+------- checkpoi | relation | normal | fsync | 32768 | 32.768 | 42 checkpoi | relation | normal | fsync | 65536 | 65.536 | 3 checkpoi | relation | normal | fsync | 262144 | 262.144 | 1 vs eBPF, which does not seem to see that, worst case seem to be like wasted ~20us (gap is between user and kernel) [fdatasync] PID 54197 | Kernel: 12943 us | User: 12964 us | Lag: 21u= s [..but usually it's just:] [ fsync] PID 52266 | Kernel: 1711 us | User: 1714 us | Lag: 3us [ fsync] PID 52266 | Kernel: 19913 us | User: 19916 us | Lag: 3us [ fsync] PID 52266 | Kernel: 1993 us | User: 1996 us | Lag: 3us [ fsync] PID 52266 | Kernel: 1994 us | User: 1995 us | Lag: 1us [ fsync] PID 52266 | Kernel: 53734 us | User: 53736 us | Lag: 2us [ fsync] PID 52266 | Kernel: 8066 us | User: 8072 us | Lag: 6us [ fsync] PID 52266 | Kernel: 2107 us | User: 2109 us | Lag: 2us [ fsync] PID 52266 | Kernel: 1972 us | User: 1974 us | Lag: 2us (this is on 2ms delayed + noatime fs + with CONFIG_HZ=3D1000 + laptop's NVMe that's idle). - in mdsyncfiletag() we seem to have pgstat_count_io_op_time() *after* potential FileClose(), but I haven't witnessed long close(), it's still context-switch - I've spotted that power mgmt might be influencing it even further (but that's not in the docs yet, dunno if I should add it there like the next item on the list) > > backend | object | context | io_type | lat_us | lat_ms | count > > ----------+----------+-----------+-----------+--------+--------+------- > > autovacu | relation | normal | read | 128 | 0.128 | 54 > > Perhaps the latency should be represented as a range? Cool idea, I haven't even thought about this one! From now v2 shows: postgres=3D# select substring(backend_type,1,8) as btype, object, context, io_type, bucket_latency_us as lat_us, bucket_count as cnt from pg_stat_get_io_histogram() where bucket_count > 0 order by 1,2,3,4,5 ; btype | object | context | io_type | lat_us | cnt ----------+----------+---------+-----------+-------------+----- [..] checkpoi | relation | normal | write | [0,9) | 33 checkpoi | relation | normal | write | [8,17) | 8 checkpoi | relation | normal | write | [16,33) | 1 > > Of course most of the I/O calls today are hitting page cache, so one would > > expect they'll be < 128us most of the time > > Have you measured whether overhead is measurable when hitting the page cache? > I'd hope that it doesn't, due to io combing amortizing the cost somewhat. But > it seems worth measuring. Not yet, I first wanted to hear if I'm not sailing into some plain stupid direction somewhere with this idea or implementation (e.g. that INSTR_TIME_GET_MICROSEC() was a really stupid omission from my side). I'll try to perform this test overhead measurement hopefully with v3 once we settle on how to do that bit shifting/clz(). > I assume you made pgstat_get_io_op_name() return "hit?" because you don't > expect that to ever be hit? Yes, my patch seems to always return 0 for "hit?". I'll need to investigate that further. > > +static inline int get_bucket_index(uint32_t val) { > > +#define MIN_PG_STAT_IO_HIST_LATENCY 127 > > + const uint32_t max_index =3D PGSTAT_IO_HIST_BUCKETS - 1; > > + /* > > + * hopefully calculated to be 25 by the compiler: > > + * clz(127) =3D clz(01111111b on uint32) =3D 25 > > + */ > > + const uint32_t min_latency_leading_zeros =3D > > + pg_leading_zero_bits32(MIN_PG_STAT_IO_HIST_LATENCY); > > + > > + /* > > + * make sure the tmp value at least 127 (our minimum bucket size) > > + * as __builtin_clz might return undefined behavior when operating on 0 > > + */ > > + uint32_t tmp =3D val | MIN_PG_STAT_IO_HIST_LATENCY; > > > + /* count leading zeros */ > > + int leading_zeros =3D pg_leading_zero_bits32(tmp); > > + > > + /* normalize the index */ > > + uint32_t index =3D min_latency_leading_zeros - leading_zeros; > > + > > + /* clamp it to the maximum */ > > + return (index > max_index) ? max_index : index; > > +} > > Wouldn't it be easier to handle the minimum latency by shifting right? What you seem to suggest seems to be equally width buckets {1,2,3,4..ms} an= d not logarithmic buckets {1,2,4,8..ms} or am I missing something? The patch as is stands has two ways #ifdef implementations now, with bitwise shifting working now, but even in objdump on -O2 there's plenty of those jumps because of current code. > I think we may also need to handle inputs that don't fit a uint32. Fixed. > [..] For things > like a stopped VM or such we could see IOs that that don't fit into a uint32 > when measured in microseconds. So perhaps I'd make the input to the bucket > calc 64 bits, then shift to the minimum precision and mask to implement > clamping. > > @@ -152,6 +189,10 @@ pgstat_count_io_op_time(IOObject io_object, IOContext io_context, IOOp io_op, > > INSTR_TIME_ADD(PendingIOStats.pending_times[io_object][io_context][io_op], > > io_time); > > > > + /* calculate the bucket_index based on latency in us */ > > + bucket_index =3D get_bucket_index(INSTR_TIME_GET_MICROSEC(io_time)); > > + PendingIOStats.pending_hist_time_buckets[io_object][io_context][io_op][buck= et_index]++; > > + > > /* Add the per-backend count */ > > pgstat_count_backend_io_op_time(io_object, io_context, io_op, > > It's annoying to have to convert to microseconds here, that's not free :(= . Oooops, fixed, get_bucket_index() now operates directly on nanos/int64. [..] > > + HIST_IO_COL_COUNT, > > + HIST_IO_COL_RESET_TIME, > > + HIST_IO_NUM_COLUMNS > > +} history_get_history_state; > ]> Think the IO_NUM_COLUMNS reference in the comment is a copy-pasto. I don't > think this should be introduced in the middle of the pg_stat_io implementation. Right, I've moved it to just before pg_stat_io_histogram_build_tuples(). > > > +/* > > + * pg_leading_zero_bits32 > > + * Returns the number of leading 0-bits in x, starting at the most significant bit position. > > + * Word must not be 0 (as it is undefined behavior). > > + */ > > +static inline int > > +pg_leading_zero_bits32(uint32 word) > > Do we really need this in addition to the already existing > pg_leftmost_one_pos32()? Particularly because that already has an msvc > implementation... Well, I would be all in for removal , but please see above the get_bucket_index() discussion. I've tried to get rid of it (but maybe i misunderstood something), but in the end I think it is more elegant/faster to have it there so that code in get_bucket_index() stays more readable, rather than throw more bitwise voodoo there(?) -J. [1] - https://www.postgresql.org/message-id/CAKZiRmyZzmOODYS6n8mns9zN4RcS3o9kfrdQ= DyeRupqaGp9PmQ%40mail.gmail.com --000000000000edccd906495d73b3 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
On Mon, Jan 26, 2026 at 4:08=E2=80=AFPM Andres Freund <= andres@anarazel.de> wrote:
= >
> Hi,
>
> On 2026-01-26 10:40:52 +0100, Jakub Wartak= wrote:
> > I'm proposing that we add pg_stat_io_histogram tha= t would track/show I/O
> > latencies profile, so we could quickly = identify I/O outliers.
>
> I think that's an interesting fe= ature!

Hi Andres, thanks for kind words and review!

[..]
&= gt;
> For measuring particularly stuck things, I've been wonderin= g about having a
> regular timer that starts to collect more informat= ion if stuck in a place for
> a while. That would probably end up bei= ng lower overhead than constantly
> measuring... But it would also be= a lot more work.

Well if something is really stuck, I think the wai= t events are covering us on that,
aren't they? One can argue if they= carry enough information (for me they mostly
do, but I'm trying to = squeeze some more stuff into them in a nearby thread [1],
BTW: it's = kind of "blocked" due to that 56-bit relfilenode idea/question,any thoughts on that?)

> > Right now the patch does not incl= ude per-backend/PID tracking, hopefully if
> > there will be inter= est in this, I'll add it, but I would like to first hear
> > i= f that's a good idea. The current implementation uses fast bucket
&g= t; > calculation to avoid overheads and tries to cover most useful range= of
> > devices via buckets (128us..256ms, so that covers both NVM= e/SSD/HDD and
> > abnormally high latency too as from time to time= I'm try to help with I/O
> > stuck for *seconds*, usually a s= ign of some I/O multipath issues, device
> > resetting, or hypervi= sor woes).
>
> Hm. Isn't 128us a pretty high floor for at l= east reads and writes? On a good
> NVMe disk you'll get < 10us= , after all.

I was blind and concentrated way too much on the b= ad-behaving I/O rather than good
=C2=A0I/O - let's call it I/= O negativity bias 8)

Now v2 contains the min bucket lowered to 8us= (but max then is just ~131ms, I
didn't want it to use more than 64b= total, 16*4b (uint32)=3D64b and well
16*8b(uint64)=3D128b already, so t= hat's why it's capped max at 131072us right now).

> I see= a few problems with the source of the latency measurements though:
>=
> - The latency gathered is that it's quite heavily affected by = scheduler
> =C2=A0 noise. If your process isn't scheduled because= other processes are busy
> =C2=A0 doing stuff on the CPU, it's q= uite possible to get results many orders of
> =C2=A0 magnitude wrong.=
>
> - With AIO, you're measuring wait time, and that time = can be affected by other
> =C2=A0 IOs in the queue. That will often *= drastically* overestimate IO latency
> =C2=A0 measured this way.
&= gt;
> I don't see how we can do better absent cooperation from th= e kernel (by
> putting lower-level measurements into io_uring complet= ions, for example)
> though.=C2=A0 So maybe this is just how it has t= o be and we ought to just document
> it.

Right, I think this i= s a complex topic on it's own, I've added a small section into
t= he docs. I didn't want to start the thread with undermining my own resu= lts, but
indeed I'm getting "bad" numbers. Bad in essence = that perceived latency
numbers do not match with other stuff:

E.g= .checkpointer's fsync/fdatasync latency is awful, although i've bee= n using
this to simulate latency (just 2ms!, but it ended up adding way = more):
=C2=A0 =C2=A0 dd if=3D/dev/zero of=3D/fs bs=3D1M count=3D1024
= =C2=A0 =C2=A0 losetup /dev/loop15 /fs
=C2=A0 =C2=A0 echo "0 $(block= dev --getsz /dev/loop15) delay /dev/loop15 0 2" | \
=C2=A0 =C2=A0 = =C2=A0 =C2=A0 dmsetup create delay
=C2=A0 =C2=A0 mkfs.ext4 /dev/mapper/d= elay
=C2=A0 =C2=A0 mount /dev/mapper/delay /mnt

... and it has e.= g. quite interesting effects:

- lack of "noatime" the impa= ct is clearly visible on fsync

- even with noatime I'm was getti= ng spikes of latenices above 131ms
=C2=A0 (sic!) with this:
=C2=A0 = =C2=A0 select pg_stat_reset_shared();
=C2=A0 =C2=A0 pgbench -i -s 10 -p = 1234 -h /tmp postgres
=C2=A0 =C2=A0 checkpoint;

- I've create= d attached bpftrace to see the gap between kernel and uprobes, but
=C2= =A0 it's not that high, sample of the view

=C2=A0 =C2=A0 backend= =C2=A0| =C2=A0object =C2=A0| context | =C2=A0io_type =C2=A0| lat_us | lat_= ms =C2=A0| count
=C2=A0 =C2=A0 ----------+----------+---------+---------= --+--------+---------+-------
=C2=A0 =C2=A0 checkpoi | relation | normal= =C2=A0| fsync =C2=A0 =C2=A0 | =C2=A032768 | =C2=A032.768 | =C2=A0 =C2=A042=
=C2=A0 =C2=A0 checkpoi | relation | normal =C2=A0| fsync =C2=A0 =C2=A0 = | =C2=A065536 | =C2=A065.536 | =C2=A0 =C2=A0 3
=C2=A0 =C2=A0 checkpoi | = relation | normal =C2=A0| fsync =C2=A0 =C2=A0 | 262144 | 262.144 | =C2=A0 = =C2=A0 1

=C2=A0 vs eBPF, which does not seem to see that, worst case= seem to be like wasted
=C2=A0 ~20us (gap is between user and kernel)
=C2=A0 =C2=A0 [fdatasync] PID 54197 =C2=A0| Kernel: 12943 =C2=A0us | U= ser: 12964 =C2=A0us | Lag: 21us
=C2=A0 =C2=A0 [..but usually it's ju= st:]
=C2=A0 =C2=A0 [ =C2=A0 =C2=A0fsync] PID 52266 =C2=A0| Kernel: 1711 = =C2=A0 us | User: 1714 =C2=A0 us | Lag: 3us
=C2=A0 =C2=A0 [ =C2=A0 =C2= =A0fsync] PID 52266 =C2=A0| Kernel: 19913 =C2=A0us | User: 19916 =C2=A0us |= Lag: 3us
=C2=A0 =C2=A0 [ =C2=A0 =C2=A0fsync] PID 52266 =C2=A0| Kernel: = 1993 =C2=A0 us | User: 1996 =C2=A0 us | Lag: 3us
=C2=A0 =C2=A0 [ =C2=A0 = =C2=A0fsync] PID 52266 =C2=A0| Kernel: 1994 =C2=A0 us | User: 1995 =C2=A0 u= s | Lag: 1us
=C2=A0 =C2=A0 [ =C2=A0 =C2=A0fsync] PID 52266 =C2=A0| Kerne= l: 53734 =C2=A0us | User: 53736 =C2=A0us | Lag: 2us
=C2=A0 =C2=A0 [ =C2= =A0 =C2=A0fsync] PID 52266 =C2=A0| Kernel: 8066 =C2=A0 us | User: 8072 =C2= =A0 us | Lag: 6us
=C2=A0 =C2=A0 [ =C2=A0 =C2=A0fsync] PID 52266 =C2=A0| = Kernel: 2107 =C2=A0 us | User: 2109 =C2=A0 us | Lag: 2us
=C2=A0 =C2=A0 [= =C2=A0 =C2=A0fsync] PID 52266 =C2=A0| Kernel: 1972 =C2=A0 us | User: 1974 = =C2=A0 us | Lag: 2us
=C2=A0 =C2=A0(this is on 2ms delayed + noatime fs += with CONFIG_HZ=3D1000 + laptop's NVMe
=C2=A0 =C2=A0that's idle)= .

- in mdsyncfiletag() we seem to have pgstat_count_io_op_time() *af= ter* potential
=C2=A0 FileClose(), but I haven't witnessed long clos= e(), it's still context-switch

- I've spotted that power mgm= t might be influencing it even further (but that's not
=C2=A0 in the= docs yet, dunno if I should add it there like the next item on the list)
> > =C2=A0backend =C2=A0| =C2=A0object =C2=A0| =C2=A0context = =C2=A0| =C2=A0io_type =C2=A0| lat_us | lat_ms | count
> > --------= --+----------+-----------+-----------+--------+--------+-------
> >= ; =C2=A0autovacu | relation | normal =C2=A0 =C2=A0| read =C2=A0 =C2=A0 =C2= =A0| =C2=A0 =C2=A0128 | =C2=A00.128 | =C2=A0 =C2=A054
>
> Perha= ps the latency should be represented as a range?

Cool idea, I haven&= #39;t even thought about this one! From now v2 shows:

postgres=3D# s= elect
=C2=A0 =C2=A0 substring(backend_type,1,8) as btype,
=C2=A0 =C2= =A0 object, context, io_type, bucket_latency_us as lat_us, bucket_count as = cnt
from pg_stat_get_io_histogram()
where
=C2=A0 =C2=A0 bucket_cou= nt > 0
order by 1,2,3,4,5 ;
=C2=A0 btype =C2=A0 | =C2=A0object =C2= =A0| context | =C2=A0io_type =C2=A0| =C2=A0 lat_us =C2=A0 =C2=A0| cnt
--= --------+----------+---------+-----------+-------------+-----
[..]
= =C2=A0checkpoi | relation | normal =C2=A0| write =C2=A0 =C2=A0 | [0,9) =C2= =A0 =C2=A0 =C2=A0 | =C2=A033
=C2=A0checkpoi | relation | normal =C2=A0| = write =C2=A0 =C2=A0 | [8,17) =C2=A0 =C2=A0 =C2=A0| =C2=A0 8
=C2=A0checkp= oi | relation | normal =C2=A0| write =C2=A0 =C2=A0 | [16,33) =C2=A0 =C2=A0 = | =C2=A0 1


> > Of course most of the I/O calls today are h= itting page cache, so one would
> > expect they'll be < 128= us most of the time
>
> Have you measured whether overhead is m= easurable when hitting the page cache?
> I'd hope that it doesn&#= 39;t, due to io combing amortizing the cost somewhat. But
> it seems = worth measuring.

Not yet, I first wanted to hear if I'm not sail= ing into some plain stupid
direction somewhere with this idea or impleme= ntation (e.g.
that INSTR_TIME_GET_MICROSEC() was a really stupid omissio= n from my side).

I'll try to perform this test overhead measurem= ent hopefully with v3 once
we settle on how to do that bit shifting/clz(= ).

> I assume you made pgstat_get_io_op_name() return "hit?&= quot; because you don't
> expect that to ever be hit?

Yes,= my patch seems to always return 0 for "hit?". I'll need to i= nvestigate that
further.

> > +static inline int get_bucket_= index(uint32_t val) {
> > +#define MIN_PG_STAT_IO_HIST_LATENCY 127=
> > + =C2=A0 =C2=A0 const uint32_t max_index =3D PGSTAT_IO_HIST_B= UCKETS - 1;
> > + =C2=A0 =C2=A0 /*
> > + =C2=A0 =C2=A0 = =C2=A0* hopefully calculated to be 25 by the compiler:
> > + =C2= =A0 =C2=A0 =C2=A0* clz(127) =3D clz(01111111b on uint32) =3D 25
> >= ; + =C2=A0 =C2=A0 =C2=A0*/
> > + =C2=A0 =C2=A0 const uint32_t min_= latency_leading_zeros =3D
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 pg_leading_zero_bits32(MIN_PG_STAT_IO_HIST_LATENCY);
> > +=
> > + =C2=A0 =C2=A0 /*
> > + =C2=A0 =C2=A0 =C2=A0* make = sure the tmp value at least 127 (our minimum bucket size)
> > + = =C2=A0 =C2=A0 =C2=A0* as __builtin_clz might return undefined behavior when= operating on 0
> > + =C2=A0 =C2=A0 =C2=A0*/
> > + =C2=A0= =C2=A0 uint32_t tmp =3D val | MIN_PG_STAT_IO_HIST_LATENCY;
>
>= > + =C2=A0 =C2=A0 /* count leading zeros */
> > + =C2=A0 =C2= =A0 int leading_zeros =3D pg_leading_zero_bits32(tmp);
> > +
&g= t; > + =C2=A0 =C2=A0 /* normalize the index */
> > + =C2=A0 =C2= =A0 uint32_t index =3D min_latency_leading_zeros - leading_zeros;
> &= gt; +
> > + =C2=A0 =C2=A0 /* clamp it to the maximum */
> &g= t; + =C2=A0 =C2=A0 return (index > max_index) ? max_index : index;
&g= t; > +}
>
> Wouldn't it be easier to handle the minimum = latency by shifting right?

What you seem to suggest seems to be equa= lly width buckets {1,2,3,4..ms} and
not logarithmic buckets {1,2,4,8..ms= } or am I missing something? The patch as is
stands has two ways #ifdef = implementations now, with bitwise shifting working
now, but even in objd= ump on -O2 there's plenty of those jumps because of current
code.
> I think we may also need to handle inputs that don't fit a ui= nt32.

Fixed.

> [..] For things
> like a stopped VM o= r such we could see IOs that that don't fit into a uint32
> when = measured in microseconds.=C2=A0 So perhaps I'd make the input to the bu= cket
> calc 64 bits, then shift to the minimum precision and mask to = implement
> clamping.

> > @@ -152,6 +189,10 @@ pgstat_co= unt_io_op_time(IOObject io_object, IOContext io_context, IOOp io_op,
>= ; > =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 INSTR_TIME_ADD(Pend= ingIOStats.pending_times[io_object][io_context][io_op],
> > =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0io_time);=
> >
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* c= alculate the bucket_index based on latency in us */
> > + =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 bucket_index =3D get_bucket_index(INSTR_= TIME_GET_MICROSEC(io_time));
> > + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 PendingIOStats.pending_hist_time_buckets[io_object][io_context][= io_op][bucket_index]++;
> > +
> > =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* Add the per-backend count */
> > = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pgstat_count_backend_io_op= _time(io_object, io_context, io_op,
>
> It's annoying to ha= ve to convert to microseconds here, that's not free :(.

Oooops, = fixed, get_bucket_index() now operates directly on nanos/int64.

[..]=
> > + =C2=A0 =C2=A0 HIST_IO_COL_COUNT,
> > + =C2=A0 =C2= =A0 HIST_IO_COL_RESET_TIME,
> > + =C2=A0 =C2=A0 HIST_IO_NUM_COLUMN= S
> > +} history_get_history_state;
>
]> Think the IO_= NUM_COLUMNS reference in the comment is a copy-pasto.=C2=A0 I don't
= > think this should be introduced in the middle of the pg_stat_io implem= entation.

Right, I've moved it to just before pg_stat_io_histogr= am_build_tuples().

>
> > +/*
> > + * pg_leading= _zero_bits32
> > + * =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Returns th= e number of leading 0-bits in x, starting at the most significant bit posit= ion.
> > + * =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Word must not be 0= (as it is undefined behavior).
> > + */
> > +static inli= ne int
> > +pg_leading_zero_bits32(uint32 word)
>
> Do= we really need this in addition to the already existing
> pg_leftmos= t_one_pos32()? Particularly because that already has an msvc
> implem= entation...

Well, I would be all in for removal , but please se= e above the get_bucket_index() discussion.=C2=A0
I've tried t= o get rid of it (but maybe i misunderstood something), but=C2=A0in the end = I think it is more
=C2=A0elegant/faster to have it there so that = code in get_bucket_index()=C2=A0stays more readable, rather=C2=A0
than throw more bitwise voodoo there(?)

-J.

[1] - https://www.postgresql.org/message-id/= CAKZiRmyZzmOODYS6n8mns9zN4RcS3o9kfrdQDyeRupqaGp9PmQ%40mail.gmail.com --000000000000edccd906495d73b3-- --000000000000edccda06495d73b5 Content-Type: text/x-patch; charset="US-ASCII"; name="v2-0001-Add-pg_stat_io_histogram-view-to-provide-more-det.patch" Content-Disposition: attachment; filename="v2-0001-Add-pg_stat_io_histogram-view-to-provide-more-det.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mkwjtj6v0 RnJvbSA5YWMwZjMxOWU4YTk0YWVlMmMyZDczZTg0ZjkwMTM4ODk4Y2MzYjZlIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKYWt1YiBXYXJ0YWsgPGpha3ViLndhcnRha0BlbnRlcnByaXNl ZGIuY29tPgpEYXRlOiBGcmksIDIzIEphbiAyMDI2IDA4OjEwOjA5ICswMTAwClN1YmplY3Q6IFtQ QVRDSCB2Ml0gQWRkIHBnX3N0YXRfaW9faGlzdG9ncmFtIHZpZXcgdG8gcHJvdmlkZSBtb3JlIGRl dGFpbGVkCiBpbnNpZ2h0IGludG8gSU8gcHJvZmlsZQoKcGdfc3RhdF9pb19oaXN0b2dyYW0gZGlz cGxheXMgYSBoaXN0b2dyYW0gb2YgSU8gbGF0ZW5jaWVzIGZvciBzcGVjaWZpYwpiYWNrZW5kX3R5 cGUsIG9iamVjdCwgY29udGV4dCBhbmQgaW9fdHlwZS4gVGhlIGhpc3RvZ3JhbSBoYXMgYnVja2V0 cyB0aGF0IGFsbG93CmZhc3RlciBpZGVudGlmaWNhdGlvbiBvZiBJL08gbGF0ZW5jeSBvdXRsaWVy cyBkdWUgdG8gZmF1bHR5IGhhcmR3YXJlIGFuZC9vcgptaXNiZWhhdmluZyBJL08gc3RhY2suIFN1 Y2ggSS9PIG91dGxpZXJzIGUuZy4gc2xvdyBmc3luY3MgY291bGQgc29tZXRpbWVzCmNhdXNlIGlu dGVybWl0dGVudCBpc3N1ZXMgZS5nLiBmb3IgQ09NTUlUIG9yIGFmZmVjdCB0aGUgc3luY2hyb25v dXMgc3RhbmRieXMKcGVyZm9ybWFuY2UuCgpBdXRob3I6IEpha3ViIFdhcnRhayA8amFrdWIud2Fy dGFrQGVudGVycHJpc2VkYi5jb20+ClJldmlld2VkLWJ5OiBBbmRyZXMgRnJldW5kIDxhbmRyZXNA YW5hcmF6ZWwuZGU+ClJldmlld2VkLWJ5OgpEaXNjdXNzaW9uOiBodHRwczovL3Bvc3Rnci5lcy9t L0NBS1ppUm13dkU0dUpMS1RnUFhlQkE0bSUyQmQ0dFRnaGF5b2VmY2FNOSUzRHozX1M3aTcyR0El NDBtYWlsLmdtYWlsLmNvbQotLS0KIGRvYy9zcmMvc2dtbC9jb25maWcuc2dtbCAgICAgICAgICAg ICAgIHwgIDEyICstCiBkb2Mvc3JjL3NnbWwvbW9uaXRvcmluZy5zZ21sICAgICAgICAgICB8IDI3 MCArKysrKysrKysrKysrKysrKysrKysrKystCiBkb2Mvc3JjL3NnbWwvd2FsLnNnbWwgICAgICAg ICAgICAgICAgICB8ICAgNSArLQogc3JjL2JhY2tlbmQvY2F0YWxvZy9zeXN0ZW1fdmlld3Muc3Fs ICAgfCAgMTEgKwogc3JjL2JhY2tlbmQvdXRpbHMvYWN0aXZpdHkvcGdzdGF0X2lvLiAgfCAgIDAK IHNyYy9iYWNrZW5kL3V0aWxzL2FjdGl2aXR5L3Bnc3RhdF9pby5jIHwgIDk3ICsrKysrKysrKwog c3JjL2JhY2tlbmQvdXRpbHMvYWR0L3Bnc3RhdGZ1bmNzLmMgICAgfCAxNDYgKysrKysrKysrKysr Kwogc3JjL2luY2x1ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdCAgICAgICAgfCAgIDkgKwogc3JjL2lu Y2x1ZGUvcGdzdGF0LmggICAgICAgICAgICAgICAgICAgfCAgMTQgKysKIHNyYy9pbmNsdWRlL3Bv cnQvcGdfYml0dXRpbHMuaCAgICAgICAgIHwgIDI3ICsrKwogc3JjL3Rlc3QvcmVncmVzcy9leHBl Y3RlZC9ydWxlcy5vdXQgICAgfCAgIDggKwogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zdGF0 cy5vdXQgICAgfCAgMjMgKysrCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9zdGF0cy5zcWwgICAgICAg ICB8ICAxNSArKwogMTMgZmlsZXMgY2hhbmdlZCwgNjMwIGluc2VydGlvbnMoKyksIDcgZGVsZXRp b25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL2JhY2tlbmQvdXRpbHMvYWN0aXZpdHkvcGdz dGF0X2lvLgoKZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9jb25maWcuc2dtbCBiL2RvYy9zcmMv c2dtbC9jb25maWcuc2dtbAppbmRleCA1NTYwYjk1ZWU2MC4uNjE0YWYzODdlZTUgMTAwNjQ0Ci0t LSBhL2RvYy9zcmMvc2dtbC9jb25maWcuc2dtbAorKysgYi9kb2Mvc3JjL3NnbWwvY29uZmlnLnNn bWwKQEAgLTg3MjksOSArODcyOSwxMSBAQCBDT1BZIHBvc3RncmVzX2xvZyBGUk9NICcvZnVsbC9w YXRoL3RvL2xvZ2ZpbGUuY3N2JyBXSVRIIGNzdjsKICAgICAgICAgZGlzcGxheWVkIGluIDxsaW5r IGxpbmtlbmQ9Im1vbml0b3JpbmctcGctc3RhdC1kYXRhYmFzZS12aWV3Ij4KICAgICAgICAgPHN0 cnVjdG5hbWU+cGdfc3RhdF9kYXRhYmFzZTwvc3RydWN0bmFtZT48L2xpbms+LAogICAgICAgICA8 bGluayBsaW5rZW5kPSJtb25pdG9yaW5nLXBnLXN0YXQtaW8tdmlldyI+Ci0gICAgICAgIDxzdHJ1 Y3RuYW1lPnBnX3N0YXRfaW88L3N0cnVjdG5hbWU+PC9saW5rPiAoaWYgPHZhcm5hbWU+b2JqZWN0 PC92YXJuYW1lPgotICAgICAgICBpcyBub3QgPGxpdGVyYWw+d2FsPC9saXRlcmFsPiksIGluIHRo ZSBvdXRwdXQgb2YgdGhlCi0gICAgICAgIDxsaW5rIGxpbmtlbmQ9InBnLXN0YXQtZ2V0LWJhY2tl bmQtaW8iPgorICAgICAgICA8c3RydWN0bmFtZT5wZ19zdGF0X2lvPC9zdHJ1Y3RuYW1lPjwvbGlu az4gYW5kCisgICAgICAgIDxsaW5rIGxpbmtlbmQ9Im1vbml0b3JpbmctcGctc3RhdC1pby1oaXN0 b2dyYW0tdmlldyI+CisgICAgICAgIDxzdHJ1Y3RuYW1lPnBnX3N0YXRfaW9faGlzdG9ncmFtPC9z dHJ1Y3RuYW1lPjwvbGluaz4KKyAgICAgICAgKGlmIDx2YXJuYW1lPm9iamVjdDwvdmFybmFtZT4g aXMgbm90IDxsaXRlcmFsPndhbDwvbGl0ZXJhbD4pLAorICAgICAgICBpbiB0aGUgb3V0cHV0IG9m IHRoZSA8bGluayBsaW5rZW5kPSJwZy1zdGF0LWdldC1iYWNrZW5kLWlvIj4KICAgICAgICAgPGZ1 bmN0aW9uPnBnX3N0YXRfZ2V0X2JhY2tlbmRfaW8oKTwvZnVuY3Rpb24+PC9saW5rPiBmdW5jdGlv biAoaWYKICAgICAgICAgPHZhcm5hbWU+b2JqZWN0PC92YXJuYW1lPiBpcyBub3QgPGxpdGVyYWw+ d2FsPC9saXRlcmFsPiksIGluIHRoZQogICAgICAgICBvdXRwdXQgb2YgPHhyZWYgbGlua2VuZD0i c3FsLWV4cGxhaW4iLz4gd2hlbiB0aGUgPGxpdGVyYWw+QlVGRkVSUzwvbGl0ZXJhbD4KQEAgLTg3 NjEsNyArODc2Myw5IEBAIENPUFkgcG9zdGdyZXNfbG9nIEZST00gJy9mdWxsL3BhdGgvdG8vbG9n ZmlsZS5jc3YnIFdJVEggY3N2OwogICAgICAgICBtZWFzdXJlIHRoZSBvdmVyaGVhZCBvZiB0aW1p bmcgb24geW91ciBzeXN0ZW0uCiAgICAgICAgIEkvTyB0aW1pbmcgaW5mb3JtYXRpb24gaXMgZGlz cGxheWVkIGluCiAgICAgICAgIDxsaW5rIGxpbmtlbmQ9Im1vbml0b3JpbmctcGctc3RhdC1pby12 aWV3Ij4KLSAgICAgICAgPHN0cnVjdG5hbWU+cGdfc3RhdF9pbzwvc3RydWN0bmFtZT48L2xpbms+ IGZvciB0aGUKKyAgICAgICAgPHN0cnVjdG5hbWU+cGdfc3RhdF9pbzwvc3RydWN0bmFtZT48L2xp bms+IGFuZAorICAgICAgICA8bGluayBsaW5rZW5kPSJtb25pdG9yaW5nLXBnLXN0YXQtaW8taGlz dG9ncmFtLXZpZXciPgorICAgICAgICA8c3RydWN0bmFtZT5wZ19zdGF0X2lvX2hpc3RvZ3JhbTwv c3RydWN0bmFtZT48L2xpbms+IGZvciB0aGUKICAgICAgICAgPHZhcm5hbWU+b2JqZWN0PC92YXJu YW1lPiA8bGl0ZXJhbD53YWw8L2xpdGVyYWw+IGFuZCBpbiB0aGUgb3V0cHV0IG9mCiAgICAgICAg IHRoZSA8bGluayBsaW5rZW5kPSJwZy1zdGF0LWdldC1iYWNrZW5kLWlvIj4KICAgICAgICAgPGZ1 bmN0aW9uPnBnX3N0YXRfZ2V0X2JhY2tlbmRfaW8oKTwvZnVuY3Rpb24+PC9saW5rPiBmdW5jdGlv biBmb3IgdGhlCmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvbW9uaXRvcmluZy5zZ21sIGIvZG9j L3NyYy9zZ21sL21vbml0b3Jpbmcuc2dtbAppbmRleCA4ODQ1MGZhY2ViZC4uZjhjZTlmOTFiYTIg MTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9tb25pdG9yaW5nLnNnbWwKKysrIGIvZG9jL3NyYy9z Z21sL21vbml0b3Jpbmcuc2dtbApAQCAtNDkzLDYgKzQ5MywxNyBAQCBwb3N0Z3JlcyAgIDI3MDkz ICAwLjAgIDAuMCAgMzAwOTYgIDI3NTIgPyAgICAgICAgU3MgICAxMTozNCAgIDA6MDAgcG9zdGdy ZXM6IHNlcgogICAgICA8L2VudHJ5PgogICAgICA8L3Jvdz4KIAorICAgICA8cm93PgorICAgICAg PGVudHJ5PjxzdHJ1Y3RuYW1lPnBnX3N0YXRfaW9faGlzdG9ncmFtPC9zdHJ1Y3RuYW1lPjxpbmRl eHRlcm0+PHByaW1hcnk+cGdfc3RhdF9pb19oaXN0b2dyYW08L3ByaW1hcnk+PC9pbmRleHRlcm0+ PC9lbnRyeT4KKyAgICAgIDxlbnRyeT4KKyAgICAgICBPbmUgcm93IGZvciBlYWNoIGNvbWJpbmF0 aW9uIG9mIGJhY2tlbmQgdHlwZSwgY29udGV4dCwgdGFyZ2V0IG9iamVjdCwKKyAgICAgICBJTyBv cGVyYXRpb24gdHlwZSBhbmQgbGF0ZW5jeSBidWNrZXQgKGluIG1pY3Jvc2Vjb25kcykgY29udGFp bmluZworICAgICAgIGNsdXN0ZXItd2lkZSBJL08gc3RhdGlzdGljcy4KKyAgICAgICBTZWUgPGxp bmsgbGlua2VuZD0ibW9uaXRvcmluZy1wZy1zdGF0LWlvLWhpc3RvZ3JhbS12aWV3Ij4KKyAgICAg ICA8c3RydWN0bmFtZT5wZ19zdGF0X2lvX2hpc3RvZ3JhbTwvc3RydWN0bmFtZT48L2xpbms+IGZv ciBkZXRhaWxzLgorICAgICA8L2VudHJ5PgorICAgICA8L3Jvdz4KKwogICAgICA8cm93PgogICAg ICAgPGVudHJ5PjxzdHJ1Y3RuYW1lPnBnX3N0YXRfcmVwbGljYXRpb25fc2xvdHM8L3N0cnVjdG5h bWU+PGluZGV4dGVybT48cHJpbWFyeT5wZ19zdGF0X3JlcGxpY2F0aW9uX3Nsb3RzPC9wcmltYXJ5 PjwvaW5kZXh0ZXJtPjwvZW50cnk+CiAgICAgICA8ZW50cnk+T25lIHJvdyBwZXIgcmVwbGljYXRp b24gc2xvdCwgc2hvd2luZyBzdGF0aXN0aWNzIGFib3V0IHRoZQpAQCAtNjkwLDcgKzcwMSw3IEBA IHBvc3RncmVzICAgMjcwOTMgIDAuMCAgMC4wICAzMDA5NiAgMjc1MiA/ICAgICAgICBTcyAgIDEx OjM0ICAgMDowMCBwb3N0Z3Jlczogc2VyCiAKICAgPHBhcmE+CiAgICBUaGUgPHN0cnVjdG5hbWU+ cGdfc3RhdF9pbzwvc3RydWN0bmFtZT4gYW5kCi0gICA8c3RydWN0bmFtZT5wZ19zdGF0aW9fPC9z dHJ1Y3RuYW1lPiBzZXQgb2Ygdmlld3MgYXJlIHVzZWZ1bCBmb3IgZGV0ZXJtaW5pbmcKKyAgIDxz dHJ1Y3RuYW1lPnBnX3N0YXRpb19oaXN0b2dyYW08L3N0cnVjdG5hbWU+IHNldCBvZiB2aWV3cyBh cmUgdXNlZnVsIGZvciBkZXRlcm1pbmluZwogICAgdGhlIGVmZmVjdGl2ZW5lc3Mgb2YgdGhlIGJ1 ZmZlciBjYWNoZS4gVGhleSBjYW4gYmUgdXNlZCB0byBjYWxjdWxhdGUgYSBjYWNoZQogICAgaGl0 IHJhdGlvLiBOb3RlIHRoYXQgd2hpbGUgPHByb2R1Y3RuYW1lPlBvc3RncmVTUUw8L3Byb2R1Y3Ru YW1lPidzIEkvTwogICAgc3RhdGlzdGljcyBjYXB0dXJlIG1vc3QgaW5zdGFuY2VzIGluIHdoaWNo IHRoZSBrZXJuZWwgd2FzIGludm9rZWQgaW4gb3JkZXIKQEAgLTY5OSw2ICs3MTAsOCBAQCBwb3N0 Z3JlcyAgIDI3MDkzICAwLjAgIDAuMCAgMzAwOTYgIDI3NTIgPyAgICAgICAgU3MgICAxMTozNCAg IDA6MDAgcG9zdGdyZXM6IHNlcgogICAgVXNlcnMgYXJlIGFkdmlzZWQgdG8gdXNlIHRoZSA8cHJv ZHVjdG5hbWU+UG9zdGdyZVNRTDwvcHJvZHVjdG5hbWU+CiAgICBzdGF0aXN0aWNzIHZpZXdzIGlu IGNvbWJpbmF0aW9uIHdpdGggb3BlcmF0aW5nIHN5c3RlbSB1dGlsaXRpZXMgZm9yIGEgbW9yZQog ICAgY29tcGxldGUgcGljdHVyZSBvZiB0aGVpciBkYXRhYmFzZSdzIEkvTyBwZXJmb3JtYW5jZS4K KyAgIEZ1cnRoZXJtb3JlIHRoZSA8c3RydWN0bmFtZT5wZ19zdGF0X2lvX2hpc3RvZ3JhbTwvc3Ry dWN0bmFtZT4gdmlldyBjYW4gYmUgaGVscGZ1bAorICAgaWRlbnRpZmluZyBsYXRlbmN5IG91dGxp ZXJzIGZvciBzcGVjaWZpYyBJL08gb3BlcmF0aW9ucy4KICAgPC9wYXJhPgogCiAgPC9zZWN0Mj4K QEAgLTMxMTgsNiArMzEzMSwyNjEgQEAgZGVzY3JpcHRpb24gfCBXYWl0aW5nIGZvciBhIG5ld2x5 IGluaXRpYWxpemVkIFdBTCBmaWxlIHRvIHJlYWNoIGR1cmFibGUgc3RvcmFnZQogCiAgPC9zZWN0 Mj4KIAorIDxzZWN0MiBpZD0ibW9uaXRvcmluZy1wZy1zdGF0LWlvLWhpc3RvZ3JhbS12aWV3Ij4K KyAgPHRpdGxlPjxzdHJ1Y3RuYW1lPnBnX3N0YXRfaW88L3N0cnVjdG5hbWU+PC90aXRsZT4KKwor ICA8aW5kZXh0ZXJtPgorICAgPHByaW1hcnk+cGdfc3RhdF9pb19oaXN0b2dyYW08L3ByaW1hcnk+ CisgIDwvaW5kZXh0ZXJtPgorCisgIDxwYXJhPgorICAgVGhlIDxzdHJ1Y3RuYW1lPnBnX3N0YXRf aW9faGlzdG9ncmFtPC9zdHJ1Y3RuYW1lPiB2aWV3IHdpbGwgY29udGFpbiBvbmUgcm93IGZvciBl YWNoCisgICBjb21iaW5hdGlvbiBvZiBiYWNrZW5kIHR5cGUsIHRhcmdldCBJL08gb2JqZWN0LCBh bmQgSS9PIGNvbnRleHQsIElPIG9wZXJhdGlvbgorICAgdHlwZSwgYnVja2V0IGxhdGVuY3kgY2x1 c3Rlci13aWRlIEkvTyBzdGF0aXN0aWNzLiBDb21iaW5hdGlvbnMgd2hpY2ggZG8gbm90IG1ha2Ug c2Vuc2UKKyAgIGFyZSBvbWl0dGVkLgorICA8L3BhcmE+CisKKyAgPHBhcmE+CisgICBUaGUgdmll dyBzaG93cyBtZWFzdXJlZCBwZXJjZWl2ZWQgSS9PIGxhdGVuY3kgYnkgdGhlIGJhY2tlbmQsIG5v dCB0aGUga2VybmVsIG9yIGRldmljZQorICAgb25lLiBUaGlzIGlzIGltcG9ydGFudCBkaXN0aW5j dGlvbiB3aGVuIHRyb3VibGVzaG9vdGluZywgYXMgdGhlIEkvTyBsYXRlbmN5IG9ic2VydmVkIGJ5 CisgICB0aGUgYmFja2VuZCBtaWdodCBnZXQgYWZmZWN0ZWQgYnk6CisgICA8aXRlbWl6ZWRsaXN0 PgorICAgICA8bGlzdGl0ZW0+CisgICAgICAgIDxwYXJhPk9TIHNjaGVkdWxlciBkZWNpc2lvbnMg YW5kIGF2YWlsYWJsZSBDUFUgcmVzb3VyY2VzLjwvcGFyYT4KKyAgICAgICAgPHBhcmE+V2l0aCBB SU8sIGl0IG1pZ2h0IGluY2x1ZGUgdGltZSB0byBzZXJ2aWNlIG90aGVyIElPcyBmcm9tIHRoZSBx dWV1ZS4gVGhhdCB3aWxsIG9mdGVuIGluZmxhdGUgSU8gbGF0ZW5jeS48L3BhcmE+CisgICAgICAg IDxwYXJhPkluIGNhc2Ugb2Ygd3JpdGluZywgYWRkaXRpb25hbCBmaWxlc3lzdGVtIGpvdXJuYWxp bmcgb3BlcmF0aW9ucy48L3BhcmE+CisgICAgIDwvbGlzdGl0ZW0+CisgIDwvaXRlbWl6ZWRsaXN0 PgorICA8L3BhcmE+CisKKyAgPHBhcmE+CisgICBDdXJyZW50bHksIEkvTyBvbiByZWxhdGlvbnMg KGUuZy4gdGFibGVzLCBpbmRleGVzKSBhbmQgV0FMIGFjdGl2aXR5IGFyZQorICAgdHJhY2tlZC4g SG93ZXZlciwgcmVsYXRpb24gSS9PIHdoaWNoIGJ5cGFzc2VzIHNoYXJlZCBidWZmZXJzCisgICAo ZS5nLiB3aGVuIG1vdmluZyBhIHRhYmxlIGZyb20gb25lIHRhYmxlc3BhY2UgdG8gYW5vdGhlcikg aXMgY3VycmVudGx5CisgICBub3QgdHJhY2tlZC4KKyAgPC9wYXJhPgorCisgIDx0YWJsZSBpZD0i cGctc3RhdC1pby1oaXN0b2dyYW0tdmlldyIgeHJlZmxhYmVsPSJwZ19zdGF0X2lvIj4KKyAgIDx0 aXRsZT48c3RydWN0bmFtZT5wZ19zdGF0X2lvX2hpc3RvZ3JhbTwvc3RydWN0bmFtZT4gVmlldzwv dGl0bGU+CisgICA8dGdyb3VwIGNvbHM9IjEiPgorICAgIDx0aGVhZD4KKyAgICAgPHJvdz4KKyAg ICAgIDxlbnRyeSByb2xlPSJjYXRhbG9nX3RhYmxlX2VudHJ5Ij4KKyAgICAgICA8cGFyYSByb2xl PSJjb2x1bW5fZGVmaW5pdGlvbiI+CisgICAgICAgIENvbHVtbiBUeXBlCisgICAgICAgPC9wYXJh PgorICAgICAgIDxwYXJhPgorICAgICAgICBEZXNjcmlwdGlvbgorICAgICAgIDwvcGFyYT4KKyAg ICAgIDwvZW50cnk+CisgICAgIDwvcm93PgorICAgIDwvdGhlYWQ+CisgICAgPHRib2R5PgorICAg ICA8cm93PgorICAgICAgPGVudHJ5IHJvbGU9ImNhdGFsb2dfdGFibGVfZW50cnkiPgorICAgICAg IDxwYXJhIHJvbGU9ImNvbHVtbl9kZWZpbml0aW9uIj4KKyAgICAgICAgPHN0cnVjdGZpZWxkPmJh Y2tlbmRfdHlwZTwvc3RydWN0ZmllbGQ+IDx0eXBlPnRleHQ8L3R5cGU+CisgICAgICAgPC9wYXJh PgorICAgICAgIDxwYXJhPgorICAgICAgICBUeXBlIG9mIGJhY2tlbmQgKGUuZy4gYmFja2dyb3Vu ZCB3b3JrZXIsIGF1dG92YWN1dW0gd29ya2VyKS4gU2VlIDxsaW5rCisgICAgICAgIGxpbmtlbmQ9 Im1vbml0b3JpbmctcGctc3RhdC1hY3Rpdml0eS12aWV3Ij4KKyAgICAgICAgPHN0cnVjdG5hbWU+ cGdfc3RhdF9hY3Rpdml0eTwvc3RydWN0bmFtZT48L2xpbms+IGZvciBtb3JlIGluZm9ybWF0aW9u CisgICAgICAgIG9uIDx2YXJuYW1lPmJhY2tlbmRfdHlwZTwvdmFybmFtZT5zLiBTb21lCisgICAg ICAgIDx2YXJuYW1lPmJhY2tlbmRfdHlwZTwvdmFybmFtZT5zIGRvIG5vdCBhY2N1bXVsYXRlIEkv TyBvcGVyYXRpb24KKyAgICAgICAgc3RhdGlzdGljcyBhbmQgd2lsbCBub3QgYmUgaW5jbHVkZWQg aW4gdGhlIHZpZXcuCisgICAgICAgPC9wYXJhPgorICAgICAgPC9lbnRyeT4KKyAgICAgPC9yb3c+ CisKKyAgICAgPHJvdz4KKyAgICAgIDxlbnRyeSByb2xlPSJjYXRhbG9nX3RhYmxlX2VudHJ5Ij4K KyAgICAgICA8cGFyYSByb2xlPSJjb2x1bW5fZGVmaW5pdGlvbiI+CisgICAgICAgIDxzdHJ1Y3Rm aWVsZD5vYmplY3Q8L3N0cnVjdGZpZWxkPiA8dHlwZT50ZXh0PC90eXBlPgorICAgICAgIDwvcGFy YT4KKyAgICAgICA8cGFyYT4KKyAgICAgICAgVGFyZ2V0IG9iamVjdCBvZiBhbiBJL08gb3BlcmF0 aW9uLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOgorICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAg IDxsaXN0aXRlbT4KKyAgICAgICAgIDxwYXJhPgorICAgICAgICAgIDxsaXRlcmFsPnJlbGF0aW9u PC9saXRlcmFsPjogUGVybWFuZW50IHJlbGF0aW9ucy4KKyAgICAgICAgIDwvcGFyYT4KKyAgICAg ICAgPC9saXN0aXRlbT4KKyAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgPHBhcmE+CisgICAg ICAgICAgPGxpdGVyYWw+dGVtcCByZWxhdGlvbjwvbGl0ZXJhbD46IFRlbXBvcmFyeSByZWxhdGlv bnMuCisgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0 aXRlbT4KKyAgICAgICAgIDxwYXJhPgorICAgICAgICAgIDxsaXRlcmFsPndhbDwvbGl0ZXJhbD46 IFdyaXRlIEFoZWFkIExvZ3MuCisgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+ CisgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgPC9wYXJhPgorICAgICAgPC9lbnRyeT4K KyAgICAgPC9yb3c+CisKKyAgICAgPHJvdz4KKyAgICAgIDxlbnRyeSByb2xlPSJjYXRhbG9nX3Rh YmxlX2VudHJ5Ij4KKyAgICAgICA8cGFyYSByb2xlPSJjb2x1bW5fZGVmaW5pdGlvbiI+CisgICAg ICAgIDxzdHJ1Y3RmaWVsZD5jb250ZXh0PC9zdHJ1Y3RmaWVsZD4gPHR5cGU+dGV4dDwvdHlwZT4K KyAgICAgICA8L3BhcmE+CisgICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBjb250ZXh0IG9mIGFu IEkvTyBvcGVyYXRpb24uIFBvc3NpYmxlIHZhbHVlcyBhcmU6CisgICAgICAgPC9wYXJhPgorICAg ICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgIDxwYXJhPgor ICAgICAgICAgIDxsaXRlcmFsPm5vcm1hbDwvbGl0ZXJhbD46IFRoZSBkZWZhdWx0IG9yIHN0YW5k YXJkCisgICAgICAgICAgPHZhcm5hbWU+Y29udGV4dDwvdmFybmFtZT4gZm9yIGEgdHlwZSBvZiBJ L08gb3BlcmF0aW9uLiBGb3IKKyAgICAgICAgICBleGFtcGxlLCBieSBkZWZhdWx0LCByZWxhdGlv biBkYXRhIGlzIHJlYWQgaW50byBhbmQgd3JpdHRlbiBvdXQgZnJvbQorICAgICAgICAgIHNoYXJl ZCBidWZmZXJzLiBUaHVzLCByZWFkcyBhbmQgd3JpdGVzIG9mIHJlbGF0aW9uIGRhdGEgdG8gYW5k IGZyb20KKyAgICAgICAgICBzaGFyZWQgYnVmZmVycyBhcmUgdHJhY2tlZCBpbiA8dmFybmFtZT5j b250ZXh0PC92YXJuYW1lPgorICAgICAgICAgIDxsaXRlcmFsPm5vcm1hbDwvbGl0ZXJhbD4uCisg ICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4K KyAgICAgICAgIDxwYXJhPgorICAgICAgICAgIDxsaXRlcmFsPmluaXQ8L2xpdGVyYWw+OiBJL08g b3BlcmF0aW9ucyBwZXJmb3JtZWQgd2hpbGUgY3JlYXRpbmcgdGhlCisgICAgICAgICAgV0FMIHNl Z21lbnRzIGFyZSB0cmFja2VkIGluIDx2YXJuYW1lPmNvbnRleHQ8L3Zhcm5hbWU+CisgICAgICAg ICAgPGxpdGVyYWw+aW5pdDwvbGl0ZXJhbD4uCisgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwv bGlzdGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgIDxwYXJhPgorICAgICAgICAg IDxsaXRlcmFsPnZhY3V1bTwvbGl0ZXJhbD46IEkvTyBvcGVyYXRpb25zIHBlcmZvcm1lZCBvdXRz aWRlIG9mIHNoYXJlZAorICAgICAgICAgIGJ1ZmZlcnMgd2hpbGUgdmFjdXVtaW5nIGFuZCBhbmFs eXppbmcgcGVybWFuZW50IHJlbGF0aW9ucy4gVGVtcG9yYXJ5CisgICAgICAgICAgdGFibGUgdmFj dXVtcyB1c2UgdGhlIHNhbWUgbG9jYWwgYnVmZmVyIHBvb2wgYXMgb3RoZXIgdGVtcG9yYXJ5IHRh YmxlCisgICAgICAgICAgSS9PIG9wZXJhdGlvbnMgYW5kIGFyZSB0cmFja2VkIGluIDx2YXJuYW1l PmNvbnRleHQ8L3Zhcm5hbWU+CisgICAgICAgICAgPGxpdGVyYWw+bm9ybWFsPC9saXRlcmFsPi4K KyAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgPGxpc3RpdGVt PgorICAgICAgICAgPHBhcmE+CisgICAgICAgICAgPGxpdGVyYWw+YnVsa3JlYWQ8L2xpdGVyYWw+ OiBDZXJ0YWluIGxhcmdlIHJlYWQgSS9PIG9wZXJhdGlvbnMKKyAgICAgICAgICBkb25lIG91dHNp ZGUgb2Ygc2hhcmVkIGJ1ZmZlcnMsIGZvciBleGFtcGxlLCBhIHNlcXVlbnRpYWwgc2NhbiBvZiBh CisgICAgICAgICAgbGFyZ2UgdGFibGUuCisgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlz dGl0ZW0+CisgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgIDxwYXJhPgorICAgICAgICAgIDxs aXRlcmFsPmJ1bGt3cml0ZTwvbGl0ZXJhbD46IENlcnRhaW4gbGFyZ2Ugd3JpdGUgSS9PIG9wZXJh dGlvbnMKKyAgICAgICAgICBkb25lIG91dHNpZGUgb2Ygc2hhcmVkIGJ1ZmZlcnMsIHN1Y2ggYXMg PGNvbW1hbmQ+Q09QWTwvY29tbWFuZD4uCisgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbGlz dGl0ZW0+CisgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICA8L2VudHJ5PgorICAgICA8L3Jv dz4KKworICAgICA8cm93PgorICAgICAgPGVudHJ5IHJvbGU9ImNhdGFsb2dfdGFibGVfZW50cnki PgorICAgICAgIDxwYXJhIHJvbGU9ImNvbHVtbl9kZWZpbml0aW9uIj4KKyAgICAgICAgPHN0cnVj dGZpZWxkPmlvX3R5cGU8L3N0cnVjdGZpZWxkPiA8dHlwZT50ZXh0PC90eXBlPgorICAgICAgIDwv cGFyYT4KKyAgICAgICA8cGFyYT4KKyAgICAgICAgVHlwZSBvZiBJTyBvcGVyYXRpb24uIFBvc3Np YmxlIHZhbHVlcyBhcmU6IEZJWE1FIQorICAgICAgIDwvcGFyYT4KKyAgICAgIDwvZW50cnk+Cisg ICAgIDwvcm93PgorCisgICAgIDxyb3c+CisgICAgICA8ZW50cnkgcm9sZT0iY2F0YWxvZ190YWJs ZV9lbnRyeSI+CisgICAgICAgPHBhcmEgcm9sZT0iY29sdW1uX2RlZmluaXRpb24iPgorICAgICAg ICA8c3RydWN0ZmllbGQ+YnVja2V0X2xhdGVuY3lfdXM8L3N0cnVjdGZpZWxkPiA8dHlwZT5pbnQ0 cmFuZ2U8L3R5cGU+CisgICAgICAgPC9wYXJhPgorICAgICAgIDxwYXJhPgorICAgICAgICBUaGUg bGF0ZW5jeSBidWNrZXQgKGluIG1pY3Jvc2Vjb25kcykuCisgICAgICAgPC9wYXJhPgorICAgICAg PC9lbnRyeT4KKyAgICAgPC9yb3c+CisKKyAgICAgPHJvdz4KKyAgICAgIDxlbnRyeSByb2xlPSJj YXRhbG9nX3RhYmxlX2VudHJ5Ij4KKyAgICAgICA8cGFyYSByb2xlPSJjb2x1bW5fZGVmaW5pdGlv biI+CisgICAgICAgIDxzdHJ1Y3RmaWVsZD5idWNrZXRfY291bnQ8L3N0cnVjdGZpZWxkPiA8dHlw ZT5iaWdpbnQ8L3R5cGU+CisgICAgICAgPC9wYXJhPgorICAgICAgIDxwYXJhPgorICAgICAgICBO dW1lciBvZiB0aW1lcyBsYXRlbmN5IG9mIHRoZSBJL08gb3BlcmF0aW9uIGhpdCB0aGlzIHNwZWNp ZmljIGJ1Y2tldCAod2l0aAorICAgICAgICB1cCB0byA8dmFybmFtZT5idWNrZXRfbGF0ZW5jeV91 czwvdmFybmFtZT4gbWljcm9zZWNvbmRzKS4KKyAgICAgICA8L3BhcmE+CisgICAgICA8L2VudHJ5 PgorICAgICA8L3Jvdz4KKworICAgICA8cm93PgorICAgICAgPGVudHJ5IHJvbGU9ImNhdGFsb2df dGFibGVfZW50cnkiPgorICAgICAgIDxwYXJhIHJvbGU9ImNvbHVtbl9kZWZpbml0aW9uIj4KKyAg ICAgICAgPHN0cnVjdGZpZWxkPnN0YXRzX3Jlc2V0PC9zdHJ1Y3RmaWVsZD4gPHR5cGU+dGltZXN0 YW1wIHdpdGggdGltZSB6b25lPC90eXBlPgorICAgICAgIDwvcGFyYT4KKyAgICAgICA8cGFyYT4K KyAgICAgICAgVGltZSBhdCB3aGljaCB0aGVzZSBzdGF0aXN0aWNzIHdlcmUgbGFzdCByZXNldC4K KyAgICAgICA8L3BhcmE+CisgICAgICA8L2VudHJ5PgorICAgICA8L3Jvdz4KKyAgICA8L3Rib2R5 PgorICAgPC90Z3JvdXA+CisgIDwvdGFibGU+CisKKyAgPHBhcmE+CisgICBTb21lIGJhY2tlbmQg dHlwZXMgbmV2ZXIgcGVyZm9ybSBJL08gb3BlcmF0aW9ucyBvbiBzb21lIEkvTyBvYmplY3RzIGFu ZC9vcgorICAgaW4gc29tZSBJL08gY29udGV4dHMuIFRoZXNlIHJvd3MgYXJlIG9taXR0ZWQgZnJv bSB0aGUgdmlldy4gRm9yIGV4YW1wbGUsIHRoZQorICAgY2hlY2twb2ludGVyIGRvZXMgbm90IGNo ZWNrcG9pbnQgdGVtcG9yYXJ5IHRhYmxlcywgc28gdGhlcmUgd2lsbCBiZSBubyByb3dzCisgICBm b3IgPHZhcm5hbWU+YmFja2VuZF90eXBlPC92YXJuYW1lPiA8bGl0ZXJhbD5jaGVja3BvaW50ZXI8 L2xpdGVyYWw+IGFuZAorICAgPHZhcm5hbWU+b2JqZWN0PC92YXJuYW1lPiA8bGl0ZXJhbD50ZW1w IHJlbGF0aW9uPC9saXRlcmFsPi4KKyAgPC9wYXJhPgorCisgIDxwYXJhPgorICAgSW4gYWRkaXRp b24sIHNvbWUgSS9PIG9wZXJhdGlvbnMgd2lsbCBuZXZlciBiZSBwZXJmb3JtZWQgZWl0aGVyIGJ5 IGNlcnRhaW4KKyAgIGJhY2tlbmQgdHlwZXMgb3Igb24gY2VydGFpbiBJL08gb2JqZWN0cyBhbmQv b3IgaW4gY2VydGFpbiBJL08gY29udGV4dHMuCisgICBUaGVzZSBjZWxscyB3aWxsIGJlIE5VTEwu IEZvciBleGFtcGxlLCB0ZW1wb3JhcnkgdGFibGVzIGFyZSBub3QKKyAgIDxsaXRlcmFsPmZzeW5j PC9saXRlcmFsPmVkLCBzbyA8dmFybmFtZT5mc3luY3M8L3Zhcm5hbWU+IHdpbGwgYmUgTlVMTCBm b3IKKyAgIDx2YXJuYW1lPm9iamVjdDwvdmFybmFtZT4gPGxpdGVyYWw+dGVtcCByZWxhdGlvbjwv bGl0ZXJhbD4uIEFsc28sIHRoZQorICAgYmFja2dyb3VuZCB3cml0ZXIgZG9lcyBub3QgcGVyZm9y bSByZWFkcywgc28gPHZhcm5hbWU+cmVhZHM8L3Zhcm5hbWU+IHdpbGwKKyAgIGJlIE5VTEwgaW4g cm93cyBmb3IgPHZhcm5hbWU+YmFja2VuZF90eXBlPC92YXJuYW1lPiA8bGl0ZXJhbD5iYWNrZ3Jv dW5kCisgICB3cml0ZXI8L2xpdGVyYWw+LgorICA8L3BhcmE+CisKKyAgPHBhcmE+CisgICBGb3Ig dGhlIDx2YXJuYW1lPm9iamVjdDwvdmFybmFtZT4gPGxpdGVyYWw+d2FsPC9saXRlcmFsPiwKKyAg IDx2YXJuYW1lPmZzeW5jczwvdmFybmFtZT4gYW5kIDx2YXJuYW1lPmZzeW5jX3RpbWU8L3Zhcm5h bWU+IHRyYWNrIHRoZQorICAgZnN5bmMgYWN0aXZpdHkgb2YgV0FMIGZpbGVzIGRvbmUgaW4gPGZ1 bmN0aW9uPmlzc3VlX3hsb2dfZnN5bmM8L2Z1bmN0aW9uPi4KKyAgIDx2YXJuYW1lPndyaXRlczwv dmFybmFtZT4gYW5kIDx2YXJuYW1lPndyaXRlX3RpbWU8L3Zhcm5hbWU+CisgICB0cmFjayB0aGUg d3JpdGUgYWN0aXZpdHkgb2YgV0FMIGZpbGVzIGRvbmUgaW4KKyAgIDxmdW5jdGlvbj5YTG9nV3Jp dGU8L2Z1bmN0aW9uPi4KKyAgIFNlZSA8eHJlZiBsaW5rZW5kPSJ3YWwtY29uZmlndXJhdGlvbiIv PiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgPC9wYXJhPgorCisgIDxwYXJhPgorICAgPHN0cnVj dG5hbWU+cGdfc3RhdF9pb19oaXN0b2dyYW08L3N0cnVjdG5hbWU+IGNhbiBiZSB1c2VkIHRvIGlk ZW50aWZ5CisgICBJL08gc3RvcmFnZSBpc3N1ZXMKKyAgIEZvciBleGFtcGxlOgorICAgPGl0ZW1p emVkbGlzdD4KKyAgICA8bGlzdGl0ZW0+CisgICAgIDxwYXJhPgorICAgICAgUHJlc2VuY2Ugb2Yg YWJub3JtYWxseSBoaWdoIGxhdGVuY3kgZm9yIDx2YXJuYW1lPmZzeW5jczwvdmFybmFtZT4gbWln aHQKKyAgICAgIGluZGljYXRlIEkvTyBzYXR1cmF0aW9uLCBvdmVyc3Vic2NyaXB0aW9uIG9yIGhh cmR3YXJlIGNvbm5lY3Rpdml0eSBpc3N1ZXMuCisgICAgIDwvcGFyYT4KKyAgICA8L2xpc3RpdGVt PgorICAgIDxsaXN0aXRlbT4KKyAgICAgPHBhcmE+CisgICAgICBVbnVzdWFsbHkgaGlnaCBsYXRl bmN5IGZvciA8dmFybmFtZT5mc3luY3M8L3Zhcm5hbWU+IG9uIHN0YW5kYnkncyBzdGFydHVwCisg ICAgICBiYWNrZW5kIHR5cGUsIG1pZ2h0IGJlIHJlc3BvbnNpYmxlIGZvciBoaWdoIGR1cmF0aW9u IG9mIGNvbW1pdHMgaW4KKyAgICAgIHN5bmNocm9ub3VzIHJlcGxpY2F0aW9uIHNldHVwcy4KKyAg ICAgPC9wYXJhPgorICAgIDwvbGlzdGl0ZW0+CisgICA8L2l0ZW1pemVkbGlzdD4KKyAgPC9wYXJh PgorCisgIDxub3RlPgorICAgPHBhcmE+CisgICAgQ29sdW1ucyB0cmFja2luZyBJL08gd2FpdCB0 aW1lIHdpbGwgb25seSBiZSBub24temVybyB3aGVuCisgICAgPHhyZWYgbGlua2VuZD0iZ3VjLXRy YWNrLWlvLXRpbWluZyIvPiBpcyBlbmFibGVkLiBUaGUgdXNlciBzaG91bGQgYmUKKyAgICBjYXJl ZnVsIHdoZW4gcmVmZXJlbmNpbmcgdGhlc2UgY29sdW1ucyBpbiBjb21iaW5hdGlvbiB3aXRoIHRo ZWlyCisgICAgY29ycmVzcG9uZGluZyBJL08gb3BlcmF0aW9ucyBpbiBjYXNlIDx2YXJuYW1lPnRy YWNrX2lvX3RpbWluZzwvdmFybmFtZT4KKyAgICB3YXMgbm90IGVuYWJsZWQgZm9yIHRoZSBlbnRp cmUgdGltZSBzaW5jZSB0aGUgbGFzdCBzdGF0cyByZXNldC4KKyAgIDwvcGFyYT4KKyAgPC9ub3Rl PgorIDwvc2VjdDI+CisKICA8c2VjdDIgaWQ9Im1vbml0b3JpbmctcGctc3RhdC1iZ3dyaXRlci12 aWV3Ij4KICAgPHRpdGxlPjxzdHJ1Y3RuYW1lPnBnX3N0YXRfYmd3cml0ZXI8L3N0cnVjdG5hbWU+ PC90aXRsZT4KIApkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL3dhbC5zZ21sIGIvZG9jL3NyYy9z Z21sL3dhbC5zZ21sCmluZGV4IGYzYjg2YjI2YmU5Li44YjhjNDA3ZTY5ZiAxMDA2NDQKLS0tIGEv ZG9jL3NyYy9zZ21sL3dhbC5zZ21sCisrKyBiL2RvYy9zcmMvc2dtbC93YWwuc2dtbApAQCAtODMy LDggKzgzMiw5IEBACiAgICBvZiB0aW1lcyA8ZnVuY3Rpb24+WExvZ1dyaXRlPC9mdW5jdGlvbj4g d3JpdGVzIGFuZAogICAgPGZ1bmN0aW9uPmlzc3VlX3hsb2dfZnN5bmM8L2Z1bmN0aW9uPiBzeW5j cyBXQUwgZGF0YSB0byBkaXNrIGFyZSBhbHNvCiAgICBjb3VudGVkIGFzIDx2YXJuYW1lPndyaXRl czwvdmFybmFtZT4gYW5kIDx2YXJuYW1lPmZzeW5jczwvdmFybmFtZT4KLSAgIGluIDxzdHJ1Y3Ru YW1lPnBnX3N0YXRfaW88L3N0cnVjdG5hbWU+IGZvciB0aGUgPHZhcm5hbWU+b2JqZWN0PC92YXJu YW1lPgotICAgPGxpdGVyYWw+d2FsPC9saXRlcmFsPiwgcmVzcGVjdGl2ZWx5LgorICAgaW4gPHN0 cnVjdG5hbWU+cGdfc3RhdF9pbzwvc3RydWN0bmFtZT4gYW5kCisgICA8c3RydWN0bmFtZT5wZ19z dGF0X2lvX2hpc3RvZ3JhbTwvc3RydWN0bmFtZT4gZm9yIHRoZQorICAgPHZhcm5hbWU+b2JqZWN0 PC92YXJuYW1lPiA8bGl0ZXJhbD53YWw8L2xpdGVyYWw+LCByZXNwZWN0aXZlbHkuCiAgIDwvcGFy YT4KIAogICA8cGFyYT4KZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NhdGFsb2cvc3lzdGVtX3Zp ZXdzLnNxbCBiL3NyYy9iYWNrZW5kL2NhdGFsb2cvc3lzdGVtX3ZpZXdzLnNxbAppbmRleCA3NTUz ZjMxZmVmMC4uYzQ0YzQxNjc2NDYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NhdGFsb2cvc3lz dGVtX3ZpZXdzLnNxbAorKysgYi9zcmMvYmFja2VuZC9jYXRhbG9nL3N5c3RlbV92aWV3cy5zcWwK QEAgLTEyMTksNiArMTIxOSwxNyBAQCBTRUxFQ1QKICAgICAgICBiLnN0YXRzX3Jlc2V0CiBGUk9N IHBnX3N0YXRfZ2V0X2lvKCkgYjsKIAorQ1JFQVRFIFZJRVcgcGdfc3RhdF9pb19oaXN0b2dyYW0g QVMKK1NFTEVDVAorICAgICAgIGIuYmFja2VuZF90eXBlLAorICAgICAgIGIub2JqZWN0LAorICAg ICAgIGIuY29udGV4dCwKKyAgICAgICBiLmlvX3R5cGUsCisgICAgICAgYi5idWNrZXRfbGF0ZW5j eV91cywKKyAgICAgICBiLmJ1Y2tldF9jb3VudCwKKyAgICAgICBiLnN0YXRzX3Jlc2V0CitGUk9N IHBnX3N0YXRfZ2V0X2lvX2hpc3RvZ3JhbSgpIGI7CisKIENSRUFURSBWSUVXIHBnX3N0YXRfd2Fs IEFTCiAgICAgU0VMRUNUCiAgICAgICAgIHcud2FsX3JlY29yZHMsCmRpZmYgLS1naXQgYS9zcmMv YmFja2VuZC91dGlscy9hY3Rpdml0eS9wZ3N0YXRfaW8uIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWN0 aXZpdHkvcGdzdGF0X2lvLgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4u ZTY5ZGUyOWJiMmQKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FjdGl2aXR5L3Bnc3Rh dF9pby5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWN0aXZpdHkvcGdzdGF0X2lvLmMKaW5kZXggMjhk ZTI0NTM4ZGMuLmMzNTEyNDEwOWEzIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9hY3Rp dml0eS9wZ3N0YXRfaW8uYworKysgYi9zcmMvYmFja2VuZC91dGlscy9hY3Rpdml0eS9wZ3N0YXRf aW8uYwpAQCAtMTA3LDYgKzEwNyw2NiBAQCBwZ3N0YXRfcHJlcGFyZV9pb190aW1lKGJvb2wgdHJh Y2tfaW9fZ3VjKQogCXJldHVybiBpb19zdGFydDsKIH0KIAorI2lmIDAKK3N0YXRpYyBpbmxpbmUg aW50IGdldF9idWNrZXRfaW5kZXgodWludDMyX3QgdmFsKSB7CisjZGVmaW5lIE1JTl9QR19TVEFU X0lPX0hJU1RfTEFURU5DWSAxMjcKKwljb25zdCB1aW50MzJfdCBtYXhfaW5kZXggPSBQR1NUQVRf SU9fSElTVF9CVUNLRVRTIC0gMTsKKwkvKgorCSAqIGhvcGVmdWxseSBjYWxjdWxhdGVkIHRvIGJl IDI1IGJ5IHRoZSBjb21waWxlcjoKKwkgKiBjbHooMTI3KSA9IGNseigwMTExMTExMWIgb24gdWlu dDMyKSA9IDI1CisJICovCisJY29uc3QgdWludDMyX3QgbWluX2xhdGVuY3lfbGVhZGluZ196ZXJv cyA9CisJCXBnX2xlYWRpbmdfemVyb19iaXRzMzIoTUlOX1BHX1NUQVRfSU9fSElTVF9MQVRFTkNZ KTsKKworCS8qCisJICogbWFrZSBzdXJlIHRoZSB0bXAgdmFsdWUgYXQgbGVhc3QgMTI3IChvdXIg bWluaW11bSBidWNrZXQgc2l6ZSkKKwkgKiBhcyBfX2J1aWx0aW5fY2x6IG1pZ2h0IHJldHVybiB1 bmRlZmluZWQgYmVoYXZpb3Igd2hlbiBvcGVyYXRpbmcgb24gMAorCSAqLworCXVpbnQzMl90IHRt cCA9IHZhbCB8IE1JTl9QR19TVEFUX0lPX0hJU1RfTEFURU5DWTsKKworCS8qIGNvdW50IGxlYWRp bmcgemVyb3MgKi8KKwlpbnQgbGVhZGluZ196ZXJvcyA9IHBnX2xlYWRpbmdfemVyb19iaXRzMzIo dG1wKTsKKworCS8qIG5vcm1hbGl6ZSB0aGUgaW5kZXggKi8KKwl1aW50MzJfdCBpbmRleCA9IG1p bl9sYXRlbmN5X2xlYWRpbmdfemVyb3MgLSBsZWFkaW5nX3plcm9zOworCisJLyogY2xhbXAgaXQg dG8gdGhlIG1heGltdW0gKi8KKwlyZXR1cm4gKGluZGV4ID4gbWF4X2luZGV4KSA/IG1heF9pbmRl eCA6IGluZGV4OworfQorI2Vsc2UKKy8qCisgKiBDYWxjdWxhdGUgYnVja2V0IGluZGV4IGJhc2Vk IG9uIHZhbHVlIGluIG1pY3Jvc2Vjb25kcy4gV2UgaGF2ZSB1cCB0bworICogUEdTVEFUX0lPX0hJ U1RfQlVDS0VUUyBidWNrZXRzLgorICoJSWYgPCA4ICgyXjMpIC0+IGJ1Y2tldCAwCisgKglJZiA8 IDE2ICgyXjQpIC0+IGJ1Y2tldCAxCisgKgkuLgorICovCitzdGF0aWMgaW5saW5lIGludAorZ2V0 X2J1Y2tldF9pbmRleCh1aW50NjRfdCBucykgeworCXVpbnQ4X3QgYnVja2V0ID0gMCwgcmVzdWx0 OworCXVpbnQ2NF90IHRlbXAgPSBuczsKKworCS8qIEZpbmQgTW9zdCBTaWduaWZpY2FudCBCaXQg KExvZzIpIHVzaW5nIG1hbnVhbCBzaGlmdHMgKi8KKwlpZiAodGVtcCA+PSA2NTUzNikgeyB0ZW1w ID4+PSAxNjsgYnVja2V0ICs9IDE2OyB9CisJaWYgKHRlbXAgPj0gMjU2KSAgIHsgdGVtcCA+Pj0g ODsgIGJ1Y2tldCArPSA4OyAgfQorCWlmICh0ZW1wID49IDE2KSAgICB7IHRlbXAgPj49IDQ7ICBi dWNrZXQgKz0gNDsgIH0KKwlpZiAodGVtcCA+PSA0KSAgICAgeyB0ZW1wID4+PSAyOyAgYnVja2V0 ICs9IDI7ICB9CisJaWYgKHRlbXAgPj0gMikgICAgIHsgdGVtcCA+Pj0gMTsgIGJ1Y2tldCArPSAx OyAgfQorCisjZGVmaW5lIE1JTl9CVUNLRVRfUE9XIDEyCisJLyogQ2xhbXAgdG8gb3VyIGJhc2Vs aW5lIG9mIDgxOTJucyA9IDJeMTMsIHNvIGV2ZXJ5dGhpbmcgYmVsb3cgc2hvdWxkIGJlCisJICog cHV0IGludG8gYnVja2V0IDAuCisJICovCisJaWYgKGJ1Y2tldCA8PSBNSU5fQlVDS0VUX1BPVykK KwkJcmV0dXJuIDA7CisJZWxzZQorCQlyZXN1bHQgPSBidWNrZXQgLSBNSU5fQlVDS0VUX1BPVzsK KworCS8qIEZpbmFsbHkgZW5zdXJlIHdlIGFyZSB3aXRoaW4gcHJvcGVyIDAtMTUgcmFuZ2UgKi8K KwlyZXR1cm4gKHJlc3VsdCA+IFBHU1RBVF9JT19ISVNUX0JVQ0tFVFMtMSkgPyBQR1NUQVRfSU9f SElTVF9CVUNLRVRTLTEgOiByZXN1bHQ7Cit9CisjZW5kaWYKKwogLyoKICAqIExpa2UgcGdzdGF0 X2NvdW50X2lvX29wKCkgZXhjZXB0IGl0IGFsc28gYWNjdW11bGF0ZXMgdGltZS4KICAqCkBAIC0x MjUsNiArMTg1LDcgQEAgcGdzdGF0X2NvdW50X2lvX29wX3RpbWUoSU9PYmplY3QgaW9fb2JqZWN0 LCBJT0NvbnRleHQgaW9fY29udGV4dCwgSU9PcCBpb19vcCwKIAlpZiAoIUlOU1RSX1RJTUVfSVNf WkVSTyhzdGFydF90aW1lKSkKIAl7CiAJCWluc3RyX3RpbWUJaW9fdGltZTsKKwkJaW50IGJ1Y2tl dF9pbmRleDsKIAogCQlJTlNUUl9USU1FX1NFVF9DVVJSRU5UKGlvX3RpbWUpOwogCQlJTlNUUl9U SU1FX1NVQlRSQUNUKGlvX3RpbWUsIHN0YXJ0X3RpbWUpOwpAQCAtMTUyLDYgKzIxMywxMCBAQCBw Z3N0YXRfY291bnRfaW9fb3BfdGltZShJT09iamVjdCBpb19vYmplY3QsIElPQ29udGV4dCBpb19j b250ZXh0LCBJT09wIGlvX29wLAogCQlJTlNUUl9USU1FX0FERChQZW5kaW5nSU9TdGF0cy5wZW5k aW5nX3RpbWVzW2lvX29iamVjdF1baW9fY29udGV4dF1baW9fb3BdLAogCQkJCQkgICBpb190aW1l KTsKIAorCQkvKiBjYWxjdWxhdGUgdGhlIGJ1Y2tldF9pbmRleCBiYXNlZCBvbiBsYXRlbmN5IGlu IG5hbm9zZWNvbmRzICh1aW50NjQpICovCisJCWJ1Y2tldF9pbmRleCA9IGdldF9idWNrZXRfaW5k ZXgoSU5TVFJfVElNRV9HRVRfTkFOT1NFQyhpb190aW1lKSk7CisJCVBlbmRpbmdJT1N0YXRzLnBl bmRpbmdfaGlzdF90aW1lX2J1Y2tldHNbaW9fb2JqZWN0XVtpb19jb250ZXh0XVtpb19vcF1bYnVj a2V0X2luZGV4XSsrOworCiAJCS8qIEFkZCB0aGUgcGVyLWJhY2tlbmQgY291bnQgKi8KIAkJcGdz dGF0X2NvdW50X2JhY2tlbmRfaW9fb3BfdGltZShpb19vYmplY3QsIGlvX2NvbnRleHQsIGlvX29w LAogCQkJCQkJCQkJCWlvX3RpbWUpOwpAQCAtMjIxLDYgKzI4NiwxMCBAQCBwZ3N0YXRfaW9fZmx1 c2hfY2IoYm9vbCBub3dhaXQpCiAKIAkJCQlia3R5cGVfc2hzdGF0cy0+dGltZXNbaW9fb2JqZWN0 XVtpb19jb250ZXh0XVtpb19vcF0gKz0KIAkJCQkJSU5TVFJfVElNRV9HRVRfTUlDUk9TRUModGlt ZSk7CisKKwkJCQlmb3IoaW50IGIgPSAwOyBiIDwgUEdTVEFUX0lPX0hJU1RfQlVDS0VUUzsgYisr KQorCQkJCQlia3R5cGVfc2hzdGF0cy0+aGlzdF90aW1lX2J1Y2tldHNbaW9fb2JqZWN0XVtpb19j b250ZXh0XVtpb19vcF1bYl0gKz0KKwkJCQkJCVBlbmRpbmdJT1N0YXRzLnBlbmRpbmdfaGlzdF90 aW1lX2J1Y2tldHNbaW9fb2JqZWN0XVtpb19jb250ZXh0XVtpb19vcF1bYl07CiAJCQl9CiAJCX0K IAl9CkBAIC0yNzQsNiArMzQzLDM0IEBAIHBnc3RhdF9nZXRfaW9fb2JqZWN0X25hbWUoSU9PYmpl Y3QgaW9fb2JqZWN0KQogCXBnX3VucmVhY2hhYmxlKCk7CiB9CiAKK2NvbnN0IGNoYXIgKgorcGdz dGF0X2dldF9pb19vcF9uYW1lKElPT3AgaW9fb3ApCit7CisJc3dpdGNoIChpb19vcCkKKwl7CisJ CWNhc2UgSU9PUF9FVklDVDoKKwkJCXJldHVybiAiZXZpY3QiOworCQljYXNlIElPT1BfRlNZTkM6 CisJCQlyZXR1cm4gImZzeW5jIjsKKwkJY2FzZSBJT09QX0hJVDoKKwkJCS8qIFRPRE86IGludmVz dGlnYXRlIHRoaXMhICovCisJCQlyZXR1cm4gImhpdD8iOworCQljYXNlIElPT1BfUkVVU0U6CisJ CQlyZXR1cm4gInJldXNlIjsKKwkJY2FzZSBJT09QX1dSSVRFQkFDSzoKKwkJCXJldHVybiAid3Jp dGViYWNrIjsKKwkJY2FzZSBJT09QX0VYVEVORDoKKwkJCXJldHVybiAiZXh0ZW5kIjsKKwkJY2Fz ZSBJT09QX1JFQUQ6CisJCQlyZXR1cm4gInJlYWQiOworCQljYXNlIElPT1BfV1JJVEU6CisJCQly ZXR1cm4gIndyaXRlIjsKKwl9CisKKwllbG9nKEVSUk9SLCAidW5yZWNvZ25pemVkIElPT3AgdmFs dWU6ICVkIiwgaW9fb3ApOworCXBnX3VucmVhY2hhYmxlKCk7Cit9CisKIHZvaWQKIHBnc3RhdF9p b19pbml0X3NobWVtX2NiKHZvaWQgKnN0YXRzKQogewpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQv dXRpbHMvYWR0L3Bnc3RhdGZ1bmNzLmMgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvcGdzdGF0ZnVu Y3MuYwppbmRleCA3M2NhMGJiMGI3Zi4uNzhlZmI3OGY1ZmIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNr ZW5kL3V0aWxzL2FkdC9wZ3N0YXRmdW5jcy5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9w Z3N0YXRmdW5jcy5jCkBAIC0xOCw5ICsxOCwxMSBAQAogI2luY2x1ZGUgImFjY2Vzcy94bG9nLmgi CiAjaW5jbHVkZSAiYWNjZXNzL3hsb2dwcmVmZXRjaGVyLmgiCiAjaW5jbHVkZSAiY2F0YWxvZy9j YXRhbG9nLmgiCisjaW5jbHVkZSAiY2F0YWxvZy9uYW1lc3BhY2UuaCIKICNpbmNsdWRlICJjYXRh bG9nL3BnX2F1dGhpZC5oIgogI2luY2x1ZGUgImNhdGFsb2cvcGdfdHlwZS5oIgogI2luY2x1ZGUg ImNvbW1vbi9pcC5oIgorLy8jaW5jbHVkZSAiZm1nci5oIgogI2luY2x1ZGUgImZ1bmNhcGkuaCIK ICNpbmNsdWRlICJtaXNjYWRtaW4uaCIKICNpbmNsdWRlICJwZ3N0YXQuaCIKQEAgLTMwLDYgKzMy LDcgQEAKICNpbmNsdWRlICJzdG9yYWdlL3Byb2NhcnJheS5oIgogI2luY2x1ZGUgInV0aWxzL2Fj bC5oIgogI2luY2x1ZGUgInV0aWxzL2J1aWx0aW5zLmgiCisjaW5jbHVkZSAidXRpbHMvcmFuZ2V0 eXBlcy5oIgogI2luY2x1ZGUgInV0aWxzL3RpbWVzdGFtcC5oIgogCiAjZGVmaW5lIFVJTlQzMl9B Q0NFU1NfT05DRSh2YXIpCQkgKCh1aW50MzIpKCooKHZvbGF0aWxlIHVpbnQzMiAqKSYodmFyKSkp KQpAQCAtMTYyNyw2ICsxNjMwLDE0OSBAQCBwZ19zdGF0X2dldF9iYWNrZW5kX2lvKFBHX0ZVTkNU SU9OX0FSR1MpCiAJcmV0dXJuIChEYXR1bSkgMDsKIH0KIAorLyoKKyogV2hlbiBhZGRpbmcgYSBu ZXcgY29sdW1uIHRvIHRoZSBwZ19zdGF0X2lvX2hpc3RvZ3JhbSB2aWV3IGFuZCB0aGUKKyogcGdf c3RhdF9nZXRfYmFja2VuZF9pbygpIGZ1bmN0aW9uLCBhZGQgYSBuZXcgZW51bSB2YWx1ZSBoZXJl IGFib3ZlCisqIEhJU1RfSU9fTlVNX0NPTFVNTlMuCisqLwordHlwZWRlZiBlbnVtIGhpc3RfaW9f c3RhdF9jb2wKK3sKKwlISVNUX0lPX0NPTF9JTlZBTElEID0gLTEsCisJSElTVF9JT19DT0xfQkFD S0VORF9UWVBFLAorCUhJU1RfSU9fQ09MX09CSkVDVCwKKwlISVNUX0lPX0NPTF9DT05URVhULAor CUhJU1RfSU9fQ09MX0lPVFlQRSwKKwlISVNUX0lPX0NPTF9CVUNLRVRfVVMsCisJSElTVF9JT19D T0xfQ09VTlQsCisJSElTVF9JT19DT0xfUkVTRVRfVElNRSwKKwlISVNUX0lPX05VTV9DT0xVTU5T Cit9IGhpc3RvZ3JhbV9pb19zdGF0X2NvbDsKKworLyoKKyAqIHBnX3N0YXRfaW9faGlzdG9ncmFt X2J1aWxkX3R1cGxlcworICoKKyAqIEhlbHBlciByb3V0aW5lIGZvciBwZ19zdGF0X2dldF9pb19o aXN0b2dyYW0oKSBhbmQgcGdfc3RhdF9nZXRfYmFja2VuZF9pbygpWFhYCisgKiBmaWxsaW5nIGEg cmVzdWx0IHR1cGxlc3RvcmUgd2l0aCBvbmUgdHVwbGUgZm9yIGVhY2ggb2JqZWN0IGFuZCBlYWNo CisgKiBjb250ZXh0IHN1cHBvcnRlZCBieSB0aGUgY2FsbGVyLCBiYXNlZCBvbiB0aGUgY29udGVu dHMgb2YgYmt0eXBlX3N0YXRzLgorICovCitzdGF0aWMgdm9pZAorcGdfc3RhdF9pb19oaXN0b2dy YW1fYnVpbGRfdHVwbGVzKFJldHVyblNldEluZm8gKnJzaW5mbywKKwkJCQkJCVBnU3RhdF9Ca3R5 cGVJTyAqYmt0eXBlX3N0YXRzLAorCQkJCQkJQmFja2VuZFR5cGUgYmt0eXBlLAorCQkJCQkJVGlt ZXN0YW1wVHogc3RhdF9yZXNldF90aW1lc3RhbXApCit7CisJLyogR2V0IE9JRCBmb3IgaW50NHJh bmdlIHR5cGUgKi8KKwlEYXR1bQkJYmt0eXBlX2Rlc2MgPSBDU3RyaW5nR2V0VGV4dERhdHVtKEdl dEJhY2tlbmRUeXBlRGVzYyhia3R5cGUpKTsKKwlPaWQJCQlyYW5nZV90eXBpZCA9IFR5cGVuYW1l R2V0VHlwaWQoImludDRyYW5nZSIpOworCVR5cGVDYWNoZUVudHJ5ICp0eXBjYWNoZSA9IGxvb2t1 cF90eXBlX2NhY2hlKHJhbmdlX3R5cGlkLCBUWVBFQ0FDSEVfUkFOR0VfSU5GTyk7CisKKwlmb3Ig KGludCBpb19vYmogPSAwOyBpb19vYmogPCBJT09CSkVDVF9OVU1fVFlQRVM7IGlvX29iaisrKQor CXsKKwkJY29uc3QgY2hhciAqb2JqX25hbWUgPSBwZ3N0YXRfZ2V0X2lvX29iamVjdF9uYW1lKGlv X29iaik7CisKKwkJZm9yIChpbnQgaW9fY29udGV4dCA9IDA7IGlvX2NvbnRleHQgPCBJT0NPTlRF WFRfTlVNX1RZUEVTOyBpb19jb250ZXh0KyspCisJCXsKKwkJCWNvbnN0IGNoYXIgKmNvbnRleHRf bmFtZSA9IHBnc3RhdF9nZXRfaW9fY29udGV4dF9uYW1lKGlvX2NvbnRleHQpOworCisJCQkvKgor CQkJICogU29tZSBjb21iaW5hdGlvbnMgb2YgQmFja2VuZFR5cGUsIElPT2JqZWN0LCBhbmQgSU9D b250ZXh0IGFyZQorCQkJICogbm90IHZhbGlkIGZvciBhbnkgdHlwZSBvZiBJT09wLiBJbiBzdWNo IGNhc2VzLCBvbWl0IHRoZSBlbnRpcmUKKwkJCSAqIHJvdyBmcm9tIHRoZSB2aWV3LgorCQkJICov CisJCQlpZiAoIXBnc3RhdF90cmFja3NfaW9fb2JqZWN0KGJrdHlwZSwgaW9fb2JqLCBpb19jb250 ZXh0KSkKKwkJCQljb250aW51ZTsKKworCQkJZm9yIChpbnQgaW9fb3AgPSAwOyBpb19vcCA8IElP T1BfTlVNX1RZUEVTOyBpb19vcCsrKQorCQkJeworCQkJCWNvbnN0IGNoYXIgKm9wX25hbWUgPSBw Z3N0YXRfZ2V0X2lvX29wX25hbWUoaW9fb3ApOworCisJCQkJZm9yKGludCBidWNrZXQgPSAwOyBi dWNrZXQgPCBQR1NUQVRfSU9fSElTVF9CVUNLRVRTOyBidWNrZXQrKykgeworCQkJCQlEYXR1bQkJ dmFsdWVzW0hJU1RfSU9fTlVNX0NPTFVNTlNdID0gezB9OworCQkJCQlib29sCQludWxsc1tISVNU X0lPX05VTV9DT0xVTU5TXSA9IHswfTsKKwkJCQkJUmFuZ2VCb3VuZAlsb3dlciwgdXBwZXI7CisJ CQkJCVJhbmdlVHlwZQkqcmFuZ2U7CisKKwkJCQkJdmFsdWVzW0hJU1RfSU9fQ09MX0JBQ0tFTkRf VFlQRV0gPSBia3R5cGVfZGVzYzsKKwkJCQkJdmFsdWVzW0hJU1RfSU9fQ09MX09CSkVDVF0gPSBD U3RyaW5nR2V0VGV4dERhdHVtKG9ial9uYW1lKTsKKwkJCQkJdmFsdWVzW0hJU1RfSU9fQ09MX0NP TlRFWFRdID0gQ1N0cmluZ0dldFRleHREYXR1bShjb250ZXh0X25hbWUpOworCQkJCQl2YWx1ZXNb SElTVF9JT19DT0xfSU9UWVBFXSA9IENTdHJpbmdHZXRUZXh0RGF0dW0ob3BfbmFtZSk7CisKKwkJ CQkJLyogdGhpcyBidWNrZXQncyBtYXggbGF0ZW5jeTogIDJeMiA9IE1JTl9CVUNLRVRfUE9XID0g KHVzKSAqLworCQkJCQlpZihidWNrZXQgPT0gMCkKKwkJCQkJCWxvd2VyLnZhbCA9IEludDMyR2V0 RGF0dW0oMCk7CisJCQkJCWVsc2UKKwkJCQkJCWxvd2VyLnZhbCA9IEludDMyR2V0RGF0dW0oMSA8 PCAoMiArIGJ1Y2tldCkpOworCQkJCQlsb3dlci5pbmZpbml0ZSA9IGZhbHNlOworCQkJCQlsb3dl ci5pbmNsdXNpdmUgPSB0cnVlOworCQkJCQlsb3dlci5sb3dlciA9IHRydWU7CisKKwkJCQkJaWYo YnVja2V0ID09IFBHU1RBVF9JT19ISVNUX0JVQ0tFVFMgLSAxKQorCQkJCQkJdXBwZXIuaW5maW5p dGUgPSB0cnVlOworCQkJCQllbHNlIHsKKwkJCQkJCXVwcGVyLnZhbCA9IEludDMyR2V0RGF0dW0o MSA8PCAoMiArIGJ1Y2tldCArIDEpKTsKKwkJCQkJCXVwcGVyLmluZmluaXRlID0gZmFsc2U7CisJ CQkJCX0KKwkJCQkJdXBwZXIuaW5jbHVzaXZlID0gdHJ1ZTsKKwkJCQkJdXBwZXIubG93ZXIgPSBm YWxzZTsKKworCQkJCQlyYW5nZSA9IG1ha2VfcmFuZ2UodHlwY2FjaGUsICZsb3dlciwgJnVwcGVy LCBmYWxzZSwgTlVMTCk7CisJCQkJCXZhbHVlc1tISVNUX0lPX0NPTF9CVUNLRVRfVVNdID0gUmFu Z2VUeXBlUEdldERhdHVtKHJhbmdlKTsKKworCQkJCQkvKiBidWNrZXQgY291bnQgKi8KKwkJCQkJ dmFsdWVzW0hJU1RfSU9fQ09MX0NPVU5UXSA9IEludDY0R2V0RGF0dW0oCisJCQkJCQlia3R5cGVf c3RhdHMtPmhpc3RfdGltZV9idWNrZXRzW2lvX29ial1baW9fY29udGV4dF1baW9fb3BdW2J1Y2tl dF0pOworCisJCQkJCWlmIChzdGF0X3Jlc2V0X3RpbWVzdGFtcCAhPSAwKQorCQkJCQkJdmFsdWVz W0hJU1RfSU9fQ09MX1JFU0VUX1RJTUVdID0gVGltZXN0YW1wVHpHZXREYXR1bShzdGF0X3Jlc2V0 X3RpbWVzdGFtcCk7CisJCQkJCWVsc2UKKwkJCQkJCW51bGxzW0hJU1RfSU9fQ09MX1JFU0VUX1RJ TUVdID0gdHJ1ZTsKKworCQkJCQl0dXBsZXN0b3JlX3B1dHZhbHVlcyhyc2luZm8tPnNldFJlc3Vs dCwgcnNpbmZvLT5zZXREZXNjLAorCQkJCQkJCQkgdmFsdWVzLCBudWxscyk7CisJCQkJfQorCQkJ fQorCQl9CisJfQorfQorCitEYXR1bQorcGdfc3RhdF9nZXRfaW9faGlzdG9ncmFtKFBHX0ZVTkNU SU9OX0FSR1MpCit7CisJUmV0dXJuU2V0SW5mbyAqcnNpbmZvOworCVBnU3RhdF9JTyAgKmJhY2tl bmRzX2lvX3N0YXRzOworCisJSW5pdE1hdGVyaWFsaXplZFNSRihmY2luZm8sIDApOworCXJzaW5m byA9IChSZXR1cm5TZXRJbmZvICopIGZjaW5mby0+cmVzdWx0aW5mbzsKKworCWJhY2tlbmRzX2lv X3N0YXRzID0gcGdzdGF0X2ZldGNoX3N0YXRfaW8oKTsKKworCWZvciAoaW50IGJrdHlwZSA9IDA7 IGJrdHlwZSA8IEJBQ0tFTkRfTlVNX1RZUEVTOyBia3R5cGUrKykKKwl7CisJCVBnU3RhdF9Ca3R5 cGVJTyAqYmt0eXBlX3N0YXRzID0gJmJhY2tlbmRzX2lvX3N0YXRzLT5zdGF0c1tia3R5cGVdOwor CisJCS8qCisJCSAqIEluIEFzc2VydCBidWlsZHMsIHdlIGNhbiBhZmZvcmQgYW4gZXh0cmEgbG9v cCB0aHJvdWdoIGFsbCBvZiB0aGUKKwkJICogY291bnRlcnMgKGluIHBnX3N0YXRfaW9fYnVpbGRf dHVwbGVzKCkpLCBjaGVja2luZyB0aGF0IG9ubHkKKwkJICogZXhwZWN0ZWQgc3RhdHMgYXJlIG5v bi16ZXJvLCBzaW5jZSBpdCBrZWVwcyB0aGUgbm9uLUFzc2VydCBjb2RlCisJCSAqIGNsZWFuZXIu CisJCSAqLworCQlBc3NlcnQocGdzdGF0X2JrdHlwZV9pb19zdGF0c192YWxpZChia3R5cGVfc3Rh dHMsIGJrdHlwZSkpOworCisJCS8qCisJCSAqIEZvciB0aG9zZSBCYWNrZW5kVHlwZXMgd2l0aG91 dCBJTyBPcGVyYXRpb24gc3RhdHMsIHNraXAKKwkJICogcmVwcmVzZW50aW5nIHRoZW0gaW4gdGhl IHZpZXcgYWx0b2dldGhlci4KKwkJICovCisJCWlmICghcGdzdGF0X3RyYWNrc19pb19ia3R5cGUo Ymt0eXBlKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIHNhdmUgdHVwbGVzIHdpdGggZGF0YSBmcm9t IHRoaXMgUGdTdGF0X0JrdHlwZUlPICovCisJCXBnX3N0YXRfaW9faGlzdG9ncmFtX2J1aWxkX3R1 cGxlcyhyc2luZm8sIGJrdHlwZV9zdGF0cywgYmt0eXBlLAorCQkJCQkJCQliYWNrZW5kc19pb19z dGF0cy0+c3RhdF9yZXNldF90aW1lc3RhbXApOworCX0KKworCXJldHVybiAoRGF0dW0pIDA7Cit9 CisKIC8qCiAgKiBwZ19zdGF0X3dhbF9idWlsZF90dXBsZQogICoKZGlmZiAtLWdpdCBhL3NyYy9p bmNsdWRlL2NhdGFsb2cvcGdfcHJvYy5kYXQgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2Mu ZGF0CmluZGV4IDg5NGI2YTFiNmQ2Li5jMmZmMzEwNDljZiAxMDA2NDQKLS0tIGEvc3JjL2luY2x1 ZGUvY2F0YWxvZy9wZ19wcm9jLmRhdAorKysgYi9zcmMvaW5jbHVkZS9jYXRhbG9nL3BnX3Byb2Mu ZGF0CkBAIC02MDI2LDYgKzYwMjYsMTUgQEAKICAgcHJvYXJnbmFtZXMgPT4gJ3tiYWNrZW5kX3R5 cGUsb2JqZWN0LGNvbnRleHQscmVhZHMscmVhZF9ieXRlcyxyZWFkX3RpbWUsd3JpdGVzLHdyaXRl X2J5dGVzLHdyaXRlX3RpbWUsd3JpdGViYWNrcyx3cml0ZWJhY2tfdGltZSxleHRlbmRzLGV4dGVu ZF9ieXRlcyxleHRlbmRfdGltZSxoaXRzLGV2aWN0aW9ucyxyZXVzZXMsZnN5bmNzLGZzeW5jX3Rp bWUsc3RhdHNfcmVzZXR9JywKICAgcHJvc3JjID0+ICdwZ19zdGF0X2dldF9pbycgfSwKIAoreyBv aWQgPT4gJzYxNDknLCBkZXNjciA9PiAnc3RhdGlzdGljczogcGVyIGJhY2tlbmQgdHlwZSBJTyBs YXRlbmN5IGhpc3RvZ3JhbScsCisgIHByb25hbWUgPT4gJ3BnX3N0YXRfZ2V0X2lvX2hpc3RvZ3Jh bScsIHByb3Jvd3MgPT4gJzMwJywgcHJvcmV0c2V0ID0+ICd0JywKKyAgcHJvdm9sYXRpbGUgPT4g J3YnLCBwcm9wYXJhbGxlbCA9PiAncicsIHByb3JldHR5cGUgPT4gJ3JlY29yZCcsCisgIHByb2Fy Z3R5cGVzID0+ICcnLAorICBwcm9hbGxhcmd0eXBlcyA9PiAne3RleHQsdGV4dCx0ZXh0LHRleHQs aW50NHJhbmdlLGludDgsdGltZXN0YW1wdHp9JywKKyAgcHJvYXJnbW9kZXMgPT4gJ3tvLG8sbyxv LG8sbyxvfScsCisgIHByb2FyZ25hbWVzID0+ICd7YmFja2VuZF90eXBlLG9iamVjdCxjb250ZXh0 LGlvX3R5cGUsYnVja2V0X2xhdGVuY3lfdXMsYnVja2V0X2NvdW50LHN0YXRzX3Jlc2V0fScsCisg IHByb3NyYyA9PiAncGdfc3RhdF9nZXRfaW9faGlzdG9ncmFtJyB9LAorCiB7IG9pZCA9PiAnNjM4 NicsIGRlc2NyID0+ICdzdGF0aXN0aWNzOiBiYWNrZW5kIElPIHN0YXRpc3RpY3MnLAogICBwcm9u YW1lID0+ICdwZ19zdGF0X2dldF9iYWNrZW5kX2lvJywgcHJvcm93cyA9PiAnNScsIHByb3JldHNl dCA9PiAndCcsCiAgIHByb3ZvbGF0aWxlID0+ICd2JywgcHJvcGFyYWxsZWwgPT4gJ3InLCBwcm9y ZXR0eXBlID0+ICdyZWNvcmQnLApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvcGdzdGF0LmggYi9z cmMvaW5jbHVkZS9wZ3N0YXQuaAppbmRleCBmZmY3ZWNjMjUzMy4uOTBlNWIwOGFjYjkgMTAwNjQ0 Ci0tLSBhL3NyYy9pbmNsdWRlL3Bnc3RhdC5oCisrKyBiL3NyYy9pbmNsdWRlL3Bnc3RhdC5oCkBA IC0zMjIsMTEgKzMyMiwyMyBAQCB0eXBlZGVmIGVudW0gSU9PcAogCSgoKHVuc2lnbmVkIGludCkg KGlvX29wKSkgPCBJT09QX05VTV9UWVBFUyAmJiBcCiAJICgodW5zaWduZWQgaW50KSAoaW9fb3Ap KSA+PSBJT09QX0VYVEVORCkKIAorLyoKKyAqIFRoaXMgc2hvdWxkIHJlcHJlc2VudCBiYWxhbmNl IGJldHdlZW4gYmVpbmcgZmFzdCBhbmQgcHJvdmlkaW5nIHZhbHVlCisgKiB0byB0aGUgdXNlcnM6 CisgKiAxLiBXZSB3YW50IHRvIGNvdmVyIHZhcmlvdXMgZmFzdCBhbmQgc2xvdyBkZXZpY2UgdHlw ZXMgKDAuMDFtcyAtIDE1bXMpCisgKiAyLiBXZSB3YW50IHRvIGFsc28gY292ZXIgc3BvcmFkaWMg bG9uZyB0YWlsIGxhdGVuY2llcyAoaGFyZHdhcmUgaXNzdWVzLAorICogICAgZGVsYXllZCBmc3lu Y3MsIHN0dWNrIEkvTykKKyAqIDMuIFdlIHdhbnQgdG8gYmUgYXNsb3cgIGJlbG93IGNhY2hlbGlu ZSBzaXplIGhlcmUgcHJvYmFibHk6CisgKiAgICAxNiAqIHNpemVvZih1aW50NjQpID0gd2hpY2gg c2hvdWxkIGJlIGxlc3MgdGhhbiB0d28gY2FjaGVsaW5lcy4KKyAqLworI2RlZmluZSBQR1NUQVRf SU9fSElTVF9CVUNLRVRTIDE2CisKIHR5cGVkZWYgc3RydWN0IFBnU3RhdF9Ca3R5cGVJTwogewog CXVpbnQ2NAkJYnl0ZXNbSU9PQkpFQ1RfTlVNX1RZUEVTXVtJT0NPTlRFWFRfTlVNX1RZUEVTXVtJ T09QX05VTV9UWVBFU107CiAJUGdTdGF0X0NvdW50ZXIgY291bnRzW0lPT0JKRUNUX05VTV9UWVBF U11bSU9DT05URVhUX05VTV9UWVBFU11bSU9PUF9OVU1fVFlQRVNdOwogCVBnU3RhdF9Db3VudGVy IHRpbWVzW0lPT0JKRUNUX05VTV9UWVBFU11bSU9DT05URVhUX05VTV9UWVBFU11bSU9PUF9OVU1f VFlQRVNdOworCXVpbnQ2NAkJaGlzdF90aW1lX2J1Y2tldHNbSU9PQkpFQ1RfTlVNX1RZUEVTXVtJ T0NPTlRFWFRfTlVNX1RZUEVTXVtJT09QX05VTV9UWVBFU11bUEdTVEFUX0lPX0hJU1RfQlVDS0VU U107CiB9IFBnU3RhdF9Ca3R5cGVJTzsKIAogdHlwZWRlZiBzdHJ1Y3QgUGdTdGF0X1BlbmRpbmdJ TwpAQCAtMzM0LDYgKzM0Niw3IEBAIHR5cGVkZWYgc3RydWN0IFBnU3RhdF9QZW5kaW5nSU8KIAl1 aW50NjQJCWJ5dGVzW0lPT0JKRUNUX05VTV9UWVBFU11bSU9DT05URVhUX05VTV9UWVBFU11bSU9P UF9OVU1fVFlQRVNdOwogCVBnU3RhdF9Db3VudGVyIGNvdW50c1tJT09CSkVDVF9OVU1fVFlQRVNd W0lPQ09OVEVYVF9OVU1fVFlQRVNdW0lPT1BfTlVNX1RZUEVTXTsKIAlpbnN0cl90aW1lCXBlbmRp bmdfdGltZXNbSU9PQkpFQ1RfTlVNX1RZUEVTXVtJT0NPTlRFWFRfTlVNX1RZUEVTXVtJT09QX05V TV9UWVBFU107CisJdWludDY0CQlwZW5kaW5nX2hpc3RfdGltZV9idWNrZXRzW0lPT0JKRUNUX05V TV9UWVBFU11bSU9DT05URVhUX05VTV9UWVBFU11bSU9PUF9OVU1fVFlQRVNdW1BHU1RBVF9JT19I SVNUX0JVQ0tFVFNdOwogfSBQZ1N0YXRfUGVuZGluZ0lPOwogCiB0eXBlZGVmIHN0cnVjdCBQZ1N0 YXRfSU8KQEAgLTYwNiw2ICs2MTksNyBAQCBleHRlcm4gdm9pZCBwZ3N0YXRfY291bnRfaW9fb3Bf dGltZShJT09iamVjdCBpb19vYmplY3QsIElPQ29udGV4dCBpb19jb250ZXh0LAogZXh0ZXJuIFBn U3RhdF9JTyAqcGdzdGF0X2ZldGNoX3N0YXRfaW8odm9pZCk7CiBleHRlcm4gY29uc3QgY2hhciAq cGdzdGF0X2dldF9pb19jb250ZXh0X25hbWUoSU9Db250ZXh0IGlvX2NvbnRleHQpOwogZXh0ZXJu IGNvbnN0IGNoYXIgKnBnc3RhdF9nZXRfaW9fb2JqZWN0X25hbWUoSU9PYmplY3QgaW9fb2JqZWN0 KTsKK2V4dGVybiBjb25zdCBjaGFyICpwZ3N0YXRfZ2V0X2lvX29wX25hbWUoSU9PcCBpb19vcCk7 CiAKIGV4dGVybiBib29sIHBnc3RhdF90cmFja3NfaW9fYmt0eXBlKEJhY2tlbmRUeXBlIGJrdHlw ZSk7CiBleHRlcm4gYm9vbCBwZ3N0YXRfdHJhY2tzX2lvX29iamVjdChCYWNrZW5kVHlwZSBia3R5 cGUsCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9wb3J0L3BnX2JpdHV0aWxzLmggYi9zcmMvaW5j bHVkZS9wb3J0L3BnX2JpdHV0aWxzLmgKaW5kZXggMzU3NjFmNTA5ZWMuLmY0NTZiY2VmMWJkIDEw MDY0NAotLS0gYS9zcmMvaW5jbHVkZS9wb3J0L3BnX2JpdHV0aWxzLmgKKysrIGIvc3JjL2luY2x1 ZGUvcG9ydC9wZ19iaXR1dGlscy5oCkBAIC0zMiw2ICszMiwzMyBAQCBleHRlcm4gUEdETExJTVBP UlQgY29uc3QgdWludDggcGdfbGVmdG1vc3Rfb25lX3Bvc1syNTZdOwogZXh0ZXJuIFBHRExMSU1Q T1JUIGNvbnN0IHVpbnQ4IHBnX3JpZ2h0bW9zdF9vbmVfcG9zWzI1Nl07CiBleHRlcm4gUEdETExJ TVBPUlQgY29uc3QgdWludDggcGdfbnVtYmVyX29mX29uZXNbMjU2XTsKIAorCisvKgorICogcGdf bGVhZGluZ196ZXJvX2JpdHMzMgorICoJCVJldHVybnMgdGhlIG51bWJlciBvZiBsZWFkaW5nIDAt Yml0cyBpbiB4LCBzdGFydGluZyBhdCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgcG9zaXRpb24u CisgKgkJV29yZCBtdXN0IG5vdCBiZSAwIChhcyBpdCBpcyB1bmRlZmluZWQgYmVoYXZpb3IpLgor ICovCitzdGF0aWMgaW5saW5lIGludAorcGdfbGVhZGluZ196ZXJvX2JpdHMzMih1aW50MzIgd29y ZCkKK3sKKyNpZmRlZiBIQVZFX19CVUlMVElOX0NMWgorCUFzc2VydCh3b3JkICE9IDApOworCisJ cmV0dXJuIF9fYnVpbHRpbl9jbHood29yZCk7CisjZWxzZQorCWludCBuID0gMzI7CisJdWludDMy IHk7CisJaWYgKHdvcmQgPT0gMCkKKwkJcmV0dXJuIDMyOworCisJeSA9IHdvcmQgPj4gMTY7IGlm ICh5ICE9IDApIHsgbiAtPSAxNjsgd29yZCA9IHk7IH0KKwl5ID0gd29yZCA+PiA4OyAgaWYgKHkg IT0gMCkgeyBuIC09IDg7ICB3b3JkID0geTsgfQorCXkgPSB3b3JkID4+IDQ7ICBpZiAoeSAhPSAw KSB7IG4gLT0gNDsgIHdvcmQgPSB5OyB9CisJeSA9IHdvcmQgPj4gMjsgIGlmICh5ICE9IDApIHsg biAtPSAyOyAgd29yZCA9IHk7IH0KKwl5ID0gd29yZCA+PiAxOyAgaWYgKHkgIT0gMCkgeyByZXR1 cm4gbiAtIDI7IH0KKyNlbmRpZgorfQorCiAvKgogICogcGdfbGVmdG1vc3Rfb25lX3BvczMyCiAg KgkJUmV0dXJucyB0aGUgcG9zaXRpb24gb2YgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgc2V0IGJpdCBp biAid29yZCIsCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3J1bGVzLm91 dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvcnVsZXMub3V0CmluZGV4IGY0ZWUyYmQ3NDU5 Li44OGRjNzAzYmJkZSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9ydWxl cy5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9ydWxlcy5vdXQKQEAgLTE5NTEs NiArMTk1MSwxNCBAQCBwZ19zdGF0X2lvfCBTRUxFQ1QgYmFja2VuZF90eXBlLAogICAgIGZzeW5j X3RpbWUsCiAgICAgc3RhdHNfcmVzZXQKICAgIEZST00gcGdfc3RhdF9nZXRfaW8oKSBiKGJhY2tl bmRfdHlwZSwgb2JqZWN0LCBjb250ZXh0LCByZWFkcywgcmVhZF9ieXRlcywgcmVhZF90aW1lLCB3 cml0ZXMsIHdyaXRlX2J5dGVzLCB3cml0ZV90aW1lLCB3cml0ZWJhY2tzLCB3cml0ZWJhY2tfdGlt ZSwgZXh0ZW5kcywgZXh0ZW5kX2J5dGVzLCBleHRlbmRfdGltZSwgaGl0cywgZXZpY3Rpb25zLCBy ZXVzZXMsIGZzeW5jcywgZnN5bmNfdGltZSwgc3RhdHNfcmVzZXQpOworcGdfc3RhdF9pb19oaXN0 b2dyYW18IFNFTEVDVCBiYWNrZW5kX3R5cGUsCisgICAgb2JqZWN0LAorICAgIGNvbnRleHQsCisg ICAgaW9fdHlwZSwKKyAgICBidWNrZXRfbGF0ZW5jeV91cywKKyAgICBidWNrZXRfY291bnQsCisg ICAgc3RhdHNfcmVzZXQKKyAgIEZST00gcGdfc3RhdF9nZXRfaW9faGlzdG9ncmFtKCkgYihiYWNr ZW5kX3R5cGUsIG9iamVjdCwgY29udGV4dCwgaW9fdHlwZSwgYnVja2V0X2xhdGVuY3lfdXMsIGJ1 Y2tldF9jb3VudCwgc3RhdHNfcmVzZXQpOwogcGdfc3RhdF9wcm9ncmVzc19hbmFseXplfCBTRUxF Q1Qgcy5waWQsCiAgICAgcy5kYXRpZCwKICAgICBkLmRhdG5hbWUsCmRpZmYgLS1naXQgYS9zcmMv dGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N0YXRzLm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0 ZWQvc3RhdHMub3V0CmluZGV4IGNkMDBmMzViZjdhLi40Yzk1ZjA5ZDY1MSAxMDA2NDQKLS0tIGEv c3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zdGF0cy5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVz cy9leHBlY3RlZC9zdGF0cy5vdXQKQEAgLTE3NjUsNiArMTc2NSwyOSBAQCBTRUxFQ1QgOm15X2lv X3N0YXRzX3ByZV9yZXNldCA+IDpteV9pb19zdGF0c19wb3N0X2JhY2tlbmRfcmVzZXQ7CiAgdAog KDEgcm93KQogCistLSBDaGVjayB0aGF0IHBnX3N0YXRfaW9faGlzdG9ncmFtcyBzZWVzIHNvbWUg Z3Jvd2luZyBjb3VudHMgaW4gYnVja2V0cworLS0gV2UgY291bGQgYWxzbyB0cnkgd2l0aCBjaGVj a3BvaW50ZXIsIGJ1dCBpdCBvZnRlbiBydW5zIHdpdGggZnN5bmM9b2ZmCistLSBkdXJpbmcgdGVz dC4KK1NFVCB0cmFja19pb190aW1pbmcgVE8gJ29uJzsKK1NFTEVDVCBzdW0oYnVja2V0X2NvdW50 KSBBUyBoaXN0X2J1Y2tldF9jb3VudF9zdW0gRlJPTSBwZ19zdGF0X2dldF9pb19oaXN0b2dyYW0o KQorV0hFUkUgYmFja2VuZF90eXBlPSdjbGllbnQgYmFja2VuZCcgQU5EIG9iamVjdD0ncmVsYXRp b24nIEFORCBjb250ZXh0PSdub3JtYWwnIFxnc2V0CitDUkVBVEUgVEFCTEUgdGVzdF9pb19oaXN0 KGlkIGJpZ2ludCk7CitJTlNFUlQgSU5UTyB0ZXN0X2lvX2hpc3QgU0VMRUNUIGdlbmVyYXRlX3Nl cmllcygxLCAxMDApIHM7CitTRUxFQ1QgcGdfc3RhdF9mb3JjZV9uZXh0X2ZsdXNoKCk7CisgcGdf c3RhdF9mb3JjZV9uZXh0X2ZsdXNoIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAKKygx IHJvdykKKworU0VMRUNUIHN1bShidWNrZXRfY291bnQpIEFTIGhpc3RfYnVja2V0X2NvdW50X3N1 bTIgRlJPTSBwZ19zdGF0X2dldF9pb19oaXN0b2dyYW0oKQorV0hFUkUgYmFja2VuZF90eXBlPSdj bGllbnQgYmFja2VuZCcgQU5EIG9iamVjdD0ncmVsYXRpb24nIEFORCBjb250ZXh0PSdub3JtYWwn IFxnc2V0CitTRUxFQ1QgOmhpc3RfYnVja2V0X2NvdW50X3N1bTIgPiA6aGlzdF9idWNrZXRfY291 bnRfc3VtOworID9jb2x1bW4/IAorLS0tLS0tLS0tLQorIHQKKygxIHJvdykKKworUkVTRVQgdHJh Y2tfaW9fdGltaW5nOwogLS0gQ2hlY2sgaW52YWxpZCBpbnB1dCBmb3IgcGdfc3RhdF9nZXRfYmFj a2VuZF9pbygpCiBTRUxFQ1QgcGdfc3RhdF9nZXRfYmFja2VuZF9pbyhOVUxMKTsKICBwZ19zdGF0 X2dldF9iYWNrZW5kX2lvIApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvc3RhdHMu c3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvc3RhdHMuc3FsCmluZGV4IDg3NjhlMGYyN2ZkLi4w NjNiMTAxMWQ3ZSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9zcWwvc3RhdHMuc3FsCisr KyBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3N0YXRzLnNxbApAQCAtODQxLDYgKzg0MSwyMSBAQCBT RUxFQ1Qgc3VtKGV2aWN0aW9ucykgKyBzdW0ocmV1c2VzKSArIHN1bShleHRlbmRzKSArIHN1bShm c3luY3MpICsgc3VtKHJlYWRzKSArCiAgIEZST00gcGdfc3RhdF9nZXRfYmFja2VuZF9pbyhwZ19i YWNrZW5kX3BpZCgpKSBcZ3NldAogU0VMRUNUIDpteV9pb19zdGF0c19wcmVfcmVzZXQgPiA6bXlf aW9fc3RhdHNfcG9zdF9iYWNrZW5kX3Jlc2V0OwogCisKKy0tIENoZWNrIHRoYXQgcGdfc3RhdF9p b19oaXN0b2dyYW1zIHNlZXMgc29tZSBncm93aW5nIGNvdW50cyBpbiBidWNrZXRzCistLSBXZSBj b3VsZCBhbHNvIHRyeSB3aXRoIGNoZWNrcG9pbnRlciwgYnV0IGl0IG9mdGVuIHJ1bnMgd2l0aCBm c3luYz1vZmYKKy0tIGR1cmluZyB0ZXN0LgorU0VUIHRyYWNrX2lvX3RpbWluZyBUTyAnb24nOwor U0VMRUNUIHN1bShidWNrZXRfY291bnQpIEFTIGhpc3RfYnVja2V0X2NvdW50X3N1bSBGUk9NIHBn X3N0YXRfZ2V0X2lvX2hpc3RvZ3JhbSgpCitXSEVSRSBiYWNrZW5kX3R5cGU9J2NsaWVudCBiYWNr ZW5kJyBBTkQgb2JqZWN0PSdyZWxhdGlvbicgQU5EIGNvbnRleHQ9J25vcm1hbCcgXGdzZXQKK0NS RUFURSBUQUJMRSB0ZXN0X2lvX2hpc3QoaWQgYmlnaW50KTsKK0lOU0VSVCBJTlRPIHRlc3RfaW9f aGlzdCBTRUxFQ1QgZ2VuZXJhdGVfc2VyaWVzKDEsIDEwMCkgczsKK1NFTEVDVCBwZ19zdGF0X2Zv cmNlX25leHRfZmx1c2goKTsKK1NFTEVDVCBzdW0oYnVja2V0X2NvdW50KSBBUyBoaXN0X2J1Y2tl dF9jb3VudF9zdW0yIEZST00gcGdfc3RhdF9nZXRfaW9faGlzdG9ncmFtKCkKK1dIRVJFIGJhY2tl bmRfdHlwZT0nY2xpZW50IGJhY2tlbmQnIEFORCBvYmplY3Q9J3JlbGF0aW9uJyBBTkQgY29udGV4 dD0nbm9ybWFsJyBcZ3NldAorU0VMRUNUIDpoaXN0X2J1Y2tldF9jb3VudF9zdW0yID4gOmhpc3Rf YnVja2V0X2NvdW50X3N1bTsKK1JFU0VUIHRyYWNrX2lvX3RpbWluZzsKKwogLS0gQ2hlY2sgaW52 YWxpZCBpbnB1dCBmb3IgcGdfc3RhdF9nZXRfYmFja2VuZF9pbygpCiBTRUxFQ1QgcGdfc3RhdF9n ZXRfYmFja2VuZF9pbyhOVUxMKTsKIFNFTEVDVCBwZ19zdGF0X2dldF9iYWNrZW5kX2lvKDApOwot LSAKMi40My4wCgo= --000000000000edccda06495d73b5 Content-Type: application/octet-stream; name="fdatasync_latency_kernel_vs_user.bt" Content-Disposition: attachment; filename="fdatasync_latency_kernel_vs_user.bt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mkwjtmlt1 IyEvdXNyL2Jpbi9icGZ0cmFjZSAKCnVwcm9iZTovbGliL3g4Nl82NC1saW51eC1nbnUvbGliYy5z by42OmZzeW5jIHsKICAgIEBzdGFydF9mc3luY191c2VyW3RpZF0gPSBuc2VjczsKfQoKdHJhY2Vw b2ludDpzeXNjYWxsczpzeXNfZW50ZXJfZnN5bmMgewogICAgQHN0YXJ0X2ZzeW5jX2tlcm5lbFt0 aWRdID0gbnNlY3M7Cn0KCnVwcm9iZTovbGliL3g4Nl82NC1saW51eC1nbnUvbGliYy5zby42OmZk YXRhc3luYyB7CiAgICBAc3RhcnRfZmRhdGFzeW5jX3VzZXJbdGlkXSA9IG5zZWNzOwp9Cgp0cmFj ZXBvaW50OnN5c2NhbGxzOnN5c19lbnRlcl9mZGF0YXN5bmMgewogICAgQHN0YXJ0X2ZkYXRhc3lu Y19rZXJuZWxbdGlkXSA9IG5zZWNzOwp9Cgp0cmFjZXBvaW50OnN5c2NhbGxzOnN5c19leGl0X2Zz eW5jIC9Ac3RhcnRfZnN5bmNfdXNlclt0aWRdLyB7CiAgICAkbm93ID0gbnNlY3M7CiAgICAka19k dXJhdGlvbiA9ICgkbm93IC0gQHN0YXJ0X2ZzeW5jX2tlcm5lbFt0aWRdKSAvIDEwMDA7CiAgICAk dV9kdXJhdGlvbiA9ICgkbm93IC0gQHN0YXJ0X2ZzeW5jX3VzZXJbdGlkXSkgLyAxMDAwOwogICAg CiAgICBwcmludGYoIlsgICAgZnN5bmNdIFBJRCAlLTZkIHwgS2VybmVsOiAlLTZkIHVzIHwgVXNl cjogJS02ZCB1cyB8IExhZzogJS02ZCB1c1xuIiwgCiAgICAgICAgdGlkLCAka19kdXJhdGlvbiwg JHVfZHVyYXRpb24sICR1X2R1cmF0aW9uIC0gJGtfZHVyYXRpb24pOwogICAgICAgIAogICAgZGVs ZXRlKEBzdGFydF9mc3luY191c2VyW3RpZF0pOwogICAgZGVsZXRlKEBzdGFydF9mc3luY19rZXJu ZWxbdGlkXSk7Cn0KCnRyYWNlcG9pbnQ6c3lzY2FsbHM6c3lzX2V4aXRfZmRhdGFzeW5jIC9Ac3Rh cnRfZmRhdGFzeW5jX3VzZXJbdGlkXS8gewogICAgJG5vdyA9IG5zZWNzOwogICAgJGtfZHVyYXRp b24gPSAoJG5vdyAtIEBzdGFydF9mZGF0YXN5bmNfa2VybmVsW3RpZF0pIC8gMTAwMDsKICAgICR1 X2R1cmF0aW9uID0gKCRub3cgLSBAc3RhcnRfZmRhdGFzeW5jX3VzZXJbdGlkXSkgLyAxMDAwOwog ICAgCiAgICBwcmludGYoIltmZGF0YXN5bmNdIFBJRCAlLTZkIHwgS2VybmVsOiAlLTZkIHVzIHwg VXNlcjogJS02ZCB1cyB8IExhZzogJS02ZCB1c1xuIiwgCiAgICAgICAgdGlkLCAka19kdXJhdGlv biwgJHVfZHVyYXRpb24sICR1X2R1cmF0aW9uIC0gJGtfZHVyYXRpb24pOwogICAgICAgIAogICAg ZGVsZXRlKEBzdGFydF9mZGF0YXN5bmNfdXNlclt0aWRdKTsKICAgIGRlbGV0ZShAc3RhcnRfZmRh dGFzeW5jX2tlcm5lbFt0aWRdKTsKfQo= --000000000000edccda06495d73b5--