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=-12.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 52C04C433DB for ; Fri, 15 Jan 2021 14:01:59 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 12E172336F for ; Fri, 15 Jan 2021 14:01:59 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732798AbhAOOBm (ORCPT ); Fri, 15 Jan 2021 09:01:42 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58184 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729512AbhAOOBm (ORCPT ); Fri, 15 Jan 2021 09:01:42 -0500 Received: from mail-lf1-x136.google.com (mail-lf1-x136.google.com [IPv6:2a00:1450:4864:20::136]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 43FD4C0613C1 for ; Fri, 15 Jan 2021 06:01:01 -0800 (PST) Received: by mail-lf1-x136.google.com with SMTP id v67so13282405lfa.0 for ; Fri, 15 Jan 2021 06:01:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=kn4bp9WOO8q4fA3RA3luW7//1Gz9pPNI9gjAjIbJcs0=; b=PMXFza14HseFb6g9sEsPtrVH1U9uDJ3Ze7mT/SlZ9lBMmebcbM5jfCwYN/Z+pnt3Sg TyFNWgt5lQDNXI1DxuZzsKQwhdO9aR75r9wWn71TQQKhhXjzMw9iCDF7jzRUTKPCvYeB UWFO55F18l1Mo/iM7IGSCWALIxCJsUBl8S0Zb29Rcne8bJVtt7CaMNCOQU9o290+2gmE LhmjYd2SURgRDbPEsmLgmQz4LVJxOFF3ZIW+mh3lQ3N5wuQzVcUD6VAWLLt2FS7KfFZy 7hUlUIj5ZUCeAamlO0vczwDOySyk4fl4j1VQpO4puue7+BG4wVtOQ2+ibzCW2T/9v37R yAaw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=kn4bp9WOO8q4fA3RA3luW7//1Gz9pPNI9gjAjIbJcs0=; b=g1rZc4Cf92BSBORltUddvGSnKLs4V0in9S0NDLzZQEUNCH25yBW37lWQZ63yT7/40z Vv0O2f5ITiOF86lZPrKNzn7GMwaNQdU5m5BQFfYjk7nAzkAnRWF6H/UnfJ2AXzMj87Vq AFa5SORGPujNe9+u1Du41TGM4BvdKkjndmF0WoJh5hAH7mNdVBvG7FptuzkAbsznUqrk wRVc4mFhG/yvN82C0WT9UtRPGYbx5b24+SUVc7fnnAQ7kEtwhY7YKKsA6OAUFj/NxKmy 9Fe+zgrg9KGxtxKn7FfFYZSafS6EQ+bWIVi/O9+GtjZuUZZLwjit7TXT7l5kxB7MdNvy ZAmg== X-Gm-Message-State: AOAM533wG5WtzscJ9rKT+ZFa+dhQdyYvKpaEcY8hWnhe0ygPUf3aiXD0 XRIZNiM1KaLH4jSEjiWOgd6+acfPxV83awveujpmUvs2Yc8= X-Google-Smtp-Source: ABdhPJx3Gdk9zBjigibql+/r0peNegF8KCgI+DwfLAlePO0jy61N8whS3I/8HJBTL8+s55ceeqcbA0XmpyTRRDoDYG4= X-Received: by 2002:a19:848f:: with SMTP id g137mr5467722lfd.622.1610719259631; Fri, 15 Jan 2021 06:00:59 -0800 (PST) MIME-Version: 1.0 References: <20210114062302.3809664-1-daeho43@gmail.com> <965dc435-c0a0-36ca-7e97-c3aaa3831bff@huawei.com> In-Reply-To: <965dc435-c0a0-36ca-7e97-c3aaa3831bff@huawei.com> From: Daeho Jeong Date: Fri, 15 Jan 2021 23:00:48 +0900 Message-ID: Subject: Re: [f2fs-dev] [PATCH v2 1/2] f2fs: introduce checkpoint=merge mount option To: Chao Yu Cc: linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, kernel-team@android.com, Sungjong Seo , Daeho Jeong Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 2021=EB=85=84 1=EC=9B=94 15=EC=9D=BC (=EA=B8=88) =EC=98=A4=ED=9B=84 6:22, C= hao Yu =EB=8B=98=EC=9D=B4 =EC=9E=91=EC=84=B1: > > On 2021/1/14 14:23, Daeho Jeong wrote: > > From: Daeho Jeong > > > > We've added a new mount option "checkpoint=3Dmerge", which creates a > > kernel daemon and makes it to merge concurrent checkpoint requests as > > much as possible to eliminate redundant checkpoint issues. Plus, we > > can eliminate the sluggish issue caused by slow checkpoint operation > > when the checkpoint is done in a process context in a cgroup having > > low i/o budget and cpu shares, and The below verification result > > explains this. > > The basic idea has come from https://opensource.samsung.com. > > > > [Verification] > > Android Pixel Device(ARM64, 7GB RAM, 256GB UFS) > > Create two I/O cgroups (fg w/ weight 100, bg w/ wight 20) > > Set "strict_guarantees" to "1" in BFQ tunables > > > > In "fg" cgroup, > > - thread A =3D> trigger 1000 checkpoint operations > > "for i in `seq 1 1000`; do touch test_dir1/file; fsync test_dir1; > > done" > > - thread B =3D> gererating async. I/O > > "fio --rw=3Dwrite --numjobs=3D1 --bs=3D128k --runtime=3D3600 --time_= based=3D1 > > --filename=3Dtest_img --name=3Dtest" > > > > In "bg" cgroup, > > - thread C =3D> trigger repeated checkpoint operations > > "echo $$ > /dev/blkio/bg/tasks; while true; do touch test_dir2/file; > > fsync test_dir2; done" > > > > We've measured thread A's execution time. > > > > [ w/o patch ] > > Elapsed Time: Avg. 68 seconds > > [ w/ patch ] > > Elapsed Time: Avg. 48 seconds > > > > Signed-off-by: Daeho Jeong > > Signed-off-by: Sungjong Seo > > --- > > v2: > > - inlined ckpt_req_control into f2fs_sb_info and collected stastics > > of checkpoint merge operations > > --- > > Documentation/filesystems/f2fs.rst | 6 ++ > > fs/f2fs/checkpoint.c | 163 ++++++++++++++++++++++++++++= + > > fs/f2fs/debug.c | 12 +++ > > fs/f2fs/f2fs.h | 27 +++++ > > fs/f2fs/super.c | 56 +++++++++- > > 5 files changed, 260 insertions(+), 4 deletions(-) > > > > diff --git a/Documentation/filesystems/f2fs.rst b/Documentation/filesys= tems/f2fs.rst > > index dae15c96e659..bccc021bf31a 100644 > > --- a/Documentation/filesystems/f2fs.rst > > +++ b/Documentation/filesystems/f2fs.rst > > @@ -247,6 +247,12 @@ checkpoint=3D%s[:%u[%]] Set to "disable" to tu= rn off checkpointing. Set to "enabl > > hide up to all remaining free space. The actual = space that > > would be unusable can be viewed at /sys/fs/f2fs/= /unusable > > This space is reclaimed once checkpoint=3Denable= . > > + Here is another option "merge", which creates a = kernel daemon > > + and makes it to merge concurrent checkpoint requ= ests as much > > + as possible to eliminate redundant checkpoint is= sues. Plus, > > + we can eliminate the sluggish issue caused by sl= ow checkpoint > > + operation when the checkpoint is done in a proce= ss context in > > + a cgroup having low i/o budget and cpu shares. > > compress_algorithm=3D%s Control compress algorithm, currently = f2fs supports "lzo", > > "lz4", "zstd" and "lzo-rle" algorithm. > > compress_log_size=3D%u Support configuring compress cluster s= ize, the size will > > diff --git a/fs/f2fs/checkpoint.c b/fs/f2fs/checkpoint.c > > index 897edb7c951a..e0668cec3b80 100644 > > --- a/fs/f2fs/checkpoint.c > > +++ b/fs/f2fs/checkpoint.c > > @@ -13,6 +13,7 @@ > > #include > > #include > > #include > > +#include > > > > #include "f2fs.h" > > #include "node.h" > > @@ -20,6 +21,8 @@ > > #include "trace.h" > > #include > > > > +#define DEFAULT_CHECKPOINT_IOPRIO (IOPRIO_PRIO_VALUE(IOPRIO_CLASS_BE, = 3)) > > + > > static struct kmem_cache *ino_entry_slab; > > struct kmem_cache *f2fs_inode_entry_slab; > > > > @@ -1707,3 +1710,163 @@ void f2fs_destroy_checkpoint_caches(void) > > kmem_cache_destroy(ino_entry_slab); > > kmem_cache_destroy(f2fs_inode_entry_slab); > > } > > + > > +static int __write_checkpoint_sync(struct f2fs_sb_info *sbi) > > +{ > > + struct cp_control cpc =3D { .reason =3D CP_SYNC, }; > > + int err; > > + > > + down_write(&sbi->gc_lock); > > + err =3D f2fs_write_checkpoint(sbi, &cpc); > > + up_write(&sbi->gc_lock); > > + > > + return err; > > +} > > + > > +static void __checkpoint_and_complete_reqs(struct f2fs_sb_info *sbi) > > +{ > > + struct ckpt_req_control *cprc =3D &sbi->cprc_info; > > + struct ckpt_req *req, *next; > > + struct llist_node *dispatch_list; > > + u64 sum_diff =3D 0, diff, count =3D 0; > > + int ret; > > + > > + dispatch_list =3D llist_del_all(&cprc->issue_list); > > + if (!dispatch_list) > > + return; > > + dispatch_list =3D llist_reverse_order(dispatch_list); > > + > > + ret =3D __write_checkpoint_sync(sbi); > > + atomic_inc(&cprc->issued_ckpt); > > + > > + llist_for_each_entry_safe(req, next, dispatch_list, llnode) { > > + atomic_dec(&cprc->queued_ckpt); > > + atomic_inc(&cprc->total_ckpt); > > + diff =3D (u64)ktime_ms_delta(ktime_get(), req->queue_time= ); > > + req->ret =3D ret; > > + complete(&req->wait); > > + > > + sum_diff +=3D diff; > > + count++; > > + } > > How about updating queued_ckpt and total_ckpt in batch, update atomic > variable one by one is low efficient. > You mean like using spin_lock()? > > + > > + spin_lock(&cprc->stat_lock); > > + cprc->cur_time =3D (unsigned int)div64_u64(sum_diff, count); > > ktime_get() returns time based ns unit, in extreme scenario, average > time cp cost will overflow 32-bit variable, I doubt. > sum_diff is already turned into msec using ktime_ms_delta() above. > > + if (cprc->peak_time < cprc->cur_time) > > + cprc->peak_time =3D cprc->cur_time; > > + spin_unlock(&cprc->stat_lock); > > +} > > + > > +static int issue_checkpoint_thread(void *data) > > +{ > > + struct f2fs_sb_info *sbi =3D data; > > + struct ckpt_req_control *cprc =3D &sbi->cprc_info; > > + wait_queue_head_t *q =3D &cprc->ckpt_wait_queue; > > +repeat: > > + if (kthread_should_stop()) > > + return 0; > > + > > + sb_start_intwrite(sbi->sb); > > + > > + if (!llist_empty(&cprc->issue_list)) > > + __checkpoint_and_complete_reqs(sbi); > > + > > + sb_end_intwrite(sbi->sb); > > + > > + wait_event_interruptible(*q, > > + kthread_should_stop() || !llist_empty(&cprc->issue_list))= ; > > + goto repeat; > > +} > > + > > +static void flush_remained_ckpt_reqs(struct f2fs_sb_info *sbi, > > + struct ckpt_req *wait_req) > > +{ > > + struct ckpt_req_control *cprc =3D &sbi->cprc_info; > > + > > + if (!llist_empty(&cprc->issue_list)) { > > + __checkpoint_and_complete_reqs(sbi); > > + } else { > > + /* already dispatched by issue_checkpoint_thread */ > > + if (wait_req) > > + wait_for_completion(&wait_req->wait); > > + } > > +} > > + > > +static void init_ckpt_req(struct ckpt_req *req) > > +{ > > + memset(req, 0, sizeof(struct ckpt_req)); > > + > > + init_completion(&req->wait); > > + req->queue_time =3D ktime_get(); > > +} > > + > > +int f2fs_issue_checkpoint(struct f2fs_sb_info *sbi) > > +{ > > + struct ckpt_req_control *cprc =3D &sbi->cprc_info; > > + struct ckpt_req req; > > + > > + if (!cprc || !cprc->f2fs_issue_ckpt) > > !cprc check is unneeded now. > Got it~ > > + return __write_checkpoint_sync(sbi); > > + > > + init_ckpt_req(&req); > > + > > + llist_add(&req.llnode, &cprc->issue_list); > > + atomic_inc(&cprc->queued_ckpt); > > + > > + /* update issue_list before we wake up issue_checkpoint thread */ > > + smp_mb(); > > + > > + if (waitqueue_active(&cprc->ckpt_wait_queue)) > > + wake_up(&cprc->ckpt_wait_queue); > > + > > + if (cprc->f2fs_issue_ckpt) > > + wait_for_completion(&req.wait); > > + else > > + flush_remained_ckpt_reqs(sbi, &req); > > + > > + return req.ret; > > +} > > + > > +int f2fs_start_ckpt_thread(struct f2fs_sb_info *sbi) > > +{ > > + dev_t dev =3D sbi->sb->s_bdev->bd_dev; > > + struct ckpt_req_control *cprc =3D &sbi->cprc_info; > > + > > + if (cprc->f2fs_issue_ckpt) > > + return 0; > > ^^^^^ here > ditto > > + > > + cprc->f2fs_issue_ckpt =3D kthread_run(issue_checkpoint_thread, sb= i, > > + "f2fs_ckpt-%u:%u", MAJOR(dev), MINOR(dev)); > > + if (IS_ERR(cprc->f2fs_issue_ckpt)) > > we should assign cprc->f2fs_issue_ckpt to NULL, this will more safer than > keeping old error value left in this variable, to avoid checking the wron= g > value as in above position. > ditto > > + return PTR_ERR(cprc->f2fs_issue_ckpt); > > + > > + set_task_ioprio(cprc->f2fs_issue_ckpt, DEFAULT_CHECKPOINT_IOPRIO)= ; > > + > > + return 0; > > +} > > + > > +void f2fs_stop_ckpt_thread(struct f2fs_sb_info *sbi) > > +{ > > + struct ckpt_req_control *cprc =3D &sbi->cprc_info; > > + > > + if (cprc->f2fs_issue_ckpt) { > > + struct task_struct *ckpt_task =3D cprc->f2fs_issue_ckpt; > > + > > + cprc->f2fs_issue_ckpt =3D NULL; > > + kthread_stop(ckpt_task); > > + > > + flush_remained_ckpt_reqs(sbi, NULL); > > + } > > +} > > + > > +void f2fs_init_ckpt_req_control(struct f2fs_sb_info *sbi) > > +{ > > + struct ckpt_req_control *cprc =3D &sbi->cprc_info; > > + > > + atomic_set(&cprc->issued_ckpt, 0); > > + atomic_set(&cprc->total_ckpt, 0); > > + atomic_set(&cprc->queued_ckpt, 0); > > + init_waitqueue_head(&cprc->ckpt_wait_queue); > > + init_llist_head(&cprc->issue_list); > > + spin_lock_init(&cprc->stat_lock); > > +} > > diff --git a/fs/f2fs/debug.c b/fs/f2fs/debug.c > > index 197c914119da..91855d5721cd 100644 > > --- a/fs/f2fs/debug.c > > +++ b/fs/f2fs/debug.c > > @@ -120,6 +120,13 @@ static void update_general_status(struct f2fs_sb_i= nfo *sbi) > > atomic_read(&SM_I(sbi)->dcc_info->discard_cmd_cnt= ); > > si->undiscard_blks =3D SM_I(sbi)->dcc_info->undiscard_blk= s; > > } > > + si->nr_issued_ckpt =3D atomic_read(&sbi->cprc_info.issued_ckpt); > > + si->nr_total_ckpt =3D atomic_read(&sbi->cprc_info.total_ckpt); > > + si->nr_queued_ckpt =3D atomic_read(&sbi->cprc_info.queued_ckpt); > > + spin_lock(&sbi->cprc_info.stat_lock); > > + si->cur_ckpt_time =3D sbi->cprc_info.cur_time; > > + si->peak_ckpt_time =3D sbi->cprc_info.peak_time; > > + spin_unlock(&sbi->cprc_info.stat_lock); > > si->total_count =3D (int)sbi->user_block_count / sbi->blocks_per_= seg; > > si->rsvd_segs =3D reserved_segments(sbi); > > si->overp_segs =3D overprovision_segments(sbi); > > @@ -417,6 +424,11 @@ static int stat_show(struct seq_file *s, void *v) > > si->meta_count[META_NAT]); > > seq_printf(s, " - ssa blocks : %u\n", > > si->meta_count[META_SSA]); > > + seq_printf(s, "CP merge (Queued: %4d, Issued: %4d, Total:= %4d, " > > + "Cur time: %4d(ms), Peak time: %4d(ms))\n= ", > > + si->nr_queued_ckpt, si->nr_issued_ckpt, > > + si->nr_total_ckpt, si->cur_ckpt_time, > > + si->peak_ckpt_time); > > seq_printf(s, "GC calls: %d (BG: %d)\n", > > si->call_count, si->bg_gc); > > seq_printf(s, " - data segments : %d (%d)\n", > > diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h > > index bb11759191dc..f2ae075aa723 100644 > > --- a/fs/f2fs/f2fs.h > > +++ b/fs/f2fs/f2fs.h > > @@ -97,6 +97,7 @@ extern const char *f2fs_fault_name[FAULT_MAX]; > > #define F2FS_MOUNT_DISABLE_CHECKPOINT 0x02000000 > > #define F2FS_MOUNT_NORECOVERY 0x04000000 > > #define F2FS_MOUNT_ATGC 0x08000000 > > +#define F2FS_MOUNT_MERGE_CHECKPOINT 0x10000000 > > > > #define F2FS_OPTION(sbi) ((sbi)->mount_opt) > > #define clear_opt(sbi, option) (F2FS_OPTION(sbi).opt &=3D ~F2FS_= MOUNT_##option) > > @@ -266,6 +267,25 @@ struct fsync_node_entry { > > unsigned int seq_id; /* sequence id */ > > }; > > > > +struct ckpt_req { > > + struct completion wait; /* completion for checkpoint done= */ > > + struct llist_node llnode; /* llist_node to be linked in wai= t queue */ > > + int ret; /* return code of checkpoint */ > > + ktime_t queue_time; /* request queued time */ > > +}; > > + > > +struct ckpt_req_control { > > + struct task_struct *f2fs_issue_ckpt; /* checkpoint task */ > > + wait_queue_head_t ckpt_wait_queue; /* waiting queue for wake= -up */ > > + atomic_t issued_ckpt; /* # of actually issued ckpts */ > > + atomic_t total_ckpt; /* # of total ckpts */ > > + atomic_t queued_ckpt; /* # of queued ckpts */ > > + struct llist_head issue_list; /* list for command issue */ > > + spinlock_t stat_lock; /* lock for below checkpoint time= stats */ > > + unsigned int cur_time; /* cur wait time in msec for curr= ently issued checkpoint */ > > + unsigned int peak_time; /* peak wait time in msec until n= ow */ > > +}; > > + > > /* for the bitmap indicate blocks to be discarded */ > > struct discard_entry { > > struct list_head list; /* list head */ > > @@ -1404,6 +1424,7 @@ struct f2fs_sb_info { > > wait_queue_head_t cp_wait; > > unsigned long last_time[MAX_TIME]; /* to store time in jiffi= es */ > > long interval_time[MAX_TIME]; /* to store thresholds */ > > + struct ckpt_req_control cprc_info; /* for checkpoint request= control */ > > > > struct inode_management im[MAX_INO_ENTRY]; /* manage inode c= ache */ > > > > @@ -3418,6 +3439,10 @@ int f2fs_write_checkpoint(struct f2fs_sb_info *s= bi, struct cp_control *cpc); > > void f2fs_init_ino_entry_info(struct f2fs_sb_info *sbi); > > int __init f2fs_create_checkpoint_caches(void); > > void f2fs_destroy_checkpoint_caches(void); > > +int f2fs_issue_checkpoint(struct f2fs_sb_info *sbi); > > +int f2fs_start_ckpt_thread(struct f2fs_sb_info *sbi); > > +void f2fs_stop_ckpt_thread(struct f2fs_sb_info *sbi); > > +void f2fs_init_ckpt_req_control(struct f2fs_sb_info *sbi); > > > > /* > > * data.c > > @@ -3530,6 +3555,8 @@ struct f2fs_stat_info { > > int nr_discarding, nr_discarded; > > int nr_discard_cmd; > > unsigned int undiscard_blks; > > + int nr_issued_ckpt, nr_total_ckpt, nr_queued_ckpt; > > + unsigned int cur_ckpt_time, peak_ckpt_time; > > int inline_xattr, inline_inode, inline_dir, append, update, orpha= ns; > > int compr_inode; > > unsigned long long compr_blocks; > > diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c > > index b4a07fe62d1a..1c1771be8a16 100644 > > --- a/fs/f2fs/super.c > > +++ b/fs/f2fs/super.c > > @@ -143,6 +143,7 @@ enum { > > Opt_checkpoint_disable_cap, > > Opt_checkpoint_disable_cap_perc, > > Opt_checkpoint_enable, > > + Opt_checkpoint_merge, > > Opt_compress_algorithm, > > Opt_compress_log_size, > > Opt_compress_extension, > > @@ -213,6 +214,7 @@ static match_table_t f2fs_tokens =3D { > > {Opt_checkpoint_disable_cap, "checkpoint=3Ddisable:%u"}, > > {Opt_checkpoint_disable_cap_perc, "checkpoint=3Ddisable:%u%%"}, > > {Opt_checkpoint_enable, "checkpoint=3Denable"}, > > + {Opt_checkpoint_merge, "checkpoint=3Dmerge"}, > > {Opt_compress_algorithm, "compress_algorithm=3D%s"}, > > {Opt_compress_log_size, "compress_log_size=3D%u"}, > > {Opt_compress_extension, "compress_extension=3D%s"}, > > @@ -872,6 +874,9 @@ static int parse_options(struct super_block *sb, ch= ar *options, bool is_remount) > > case Opt_checkpoint_enable: > > clear_opt(sbi, DISABLE_CHECKPOINT); > > break; > > + case Opt_checkpoint_merge: > > + set_opt(sbi, MERGE_CHECKPOINT); > > + break; > > #ifdef CONFIG_F2FS_FS_COMPRESSION > > case Opt_compress_algorithm: > > if (!f2fs_sb_has_compression(sbi)) { > > @@ -1040,6 +1045,12 @@ static int parse_options(struct super_block *sb,= char *options, bool is_remount) > > return -EINVAL; > > } > > > > + if (test_opt(sbi, DISABLE_CHECKPOINT) && > > + test_opt(sbi, MERGE_CHECKPOINT)) { > > + f2fs_err(sbi, "checkpoint=3Dmerge cannot be used with che= ckpoint=3Ddisable\n"); > > + return -EINVAL; > > + } > > + > > /* Not pass down write hints if the number of active logs is less= er > > * than NR_CURSEG_PERSIST_TYPE. > > */ > > @@ -1245,6 +1256,12 @@ static void f2fs_put_super(struct super_block *s= b) > > /* prevent remaining shrinker jobs */ > > mutex_lock(&sbi->umount_mutex); > > > > + /* > > + * flush all issued checkpoints and stop checkpoint issue thread. > > + * after then, all checkpoints should be done by each process con= text. > > + */ > > + f2fs_stop_ckpt_thread(sbi); > > + > > /* > > * We don't need to do checkpoint when superblock is clean. > > * But, the previous checkpoint was not done by umount, it needs = to do > > @@ -1347,10 +1364,13 @@ int f2fs_sync_fs(struct super_block *sb, int sy= nc) > > struct cp_control cpc; > > > > cpc.reason =3D __get_cp_reason(sbi); > > - > > - down_write(&sbi->gc_lock); > > - err =3D f2fs_write_checkpoint(sbi, &cpc); > > - up_write(&sbi->gc_lock); > > + if (test_opt(sbi, MERGE_CHECKPOINT) && cpc.reason =3D=3D = CP_SYNC) { > > + err =3D f2fs_issue_checkpoint(sbi); > > + } else { > > + down_write(&sbi->gc_lock); > > + err =3D f2fs_write_checkpoint(sbi, &cpc); > > + up_write(&sbi->gc_lock); > > + } > > Why not merging above logic into f2fs_issue_checkpoint(), so here, we can= just > call f2fs_issue_checkpoint(), then the code would be more clean here. > > Thanks, > Sure~ > > } > > f2fs_trace_ios(NULL, 1); > > > > @@ -1674,6 +1694,8 @@ static int f2fs_show_options(struct seq_file *seq= , struct dentry *root) > > if (test_opt(sbi, DISABLE_CHECKPOINT)) > > seq_printf(seq, ",checkpoint=3Ddisable:%u", > > F2FS_OPTION(sbi).unusable_cap); > > + if (test_opt(sbi, MERGE_CHECKPOINT)) > > + seq_puts(seq, ",checkpoint=3Dmerge"); > > if (F2FS_OPTION(sbi).fsync_mode =3D=3D FSYNC_MODE_POSIX) > > seq_printf(seq, ",fsync_mode=3D%s", "posix"); > > else if (F2FS_OPTION(sbi).fsync_mode =3D=3D FSYNC_MODE_STRICT) > > @@ -1954,6 +1976,18 @@ static int f2fs_remount(struct super_block *sb, = int *flags, char *data) > > } > > } > > > > + if (!test_opt(sbi, MERGE_CHECKPOINT)) { > > + f2fs_stop_ckpt_thread(sbi); > > + } else { > > + err =3D f2fs_start_ckpt_thread(sbi); > > + if (err) { > > + f2fs_err(sbi, > > + "Failed to start F2FS issue_checkpoint_thread= (%d)", > > + err); > > + goto restore_gc; > > + } > > + } > > + > > /* > > * We stop issue flush thread if FS is mounted as RO > > * or if flush_merge is not passed in mount option. > > @@ -3701,6 +3735,18 @@ static int f2fs_fill_super(struct super_block *s= b, void *data, int silent) > > > > f2fs_init_fsync_node_info(sbi); > > > > + /* setup checkpoint request control and start checkpoint issue th= read */ > > + f2fs_init_ckpt_req_control(sbi); > > + if (test_opt(sbi, MERGE_CHECKPOINT)) { > > + err =3D f2fs_start_ckpt_thread(sbi); > > + if (err) { > > + f2fs_err(sbi, > > + "Failed to start F2FS issue_checkpoint_thread= (%d)", > > + err); > > + goto stop_ckpt_thread; > > + } > > + } > > + > > /* setup f2fs internal modules */ > > err =3D f2fs_build_segment_manager(sbi); > > if (err) { > > @@ -3910,6 +3956,8 @@ static int f2fs_fill_super(struct super_block *sb= , void *data, int silent) > > free_sm: > > f2fs_destroy_segment_manager(sbi); > > f2fs_destroy_post_read_wq(sbi); > > +stop_ckpt_thread: > > + f2fs_stop_ckpt_thread(sbi); > > free_devices: > > destroy_device_list(sbi); > > kvfree(sbi->ckpt); > > 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=-10.5 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9A30EC433DB for ; Fri, 15 Jan 2021 14:01:16 +0000 (UTC) Received: from lists.sourceforge.net (lists.sourceforge.net [216.105.38.7]) (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 455262336F; Fri, 15 Jan 2021 14:01:16 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 455262336F Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=linux-f2fs-devel-bounces@lists.sourceforge.net Received: from [127.0.0.1] (helo=sfs-ml-1.v29.lw.sourceforge.com) by sfs-ml-1.v29.lw.sourceforge.com with esmtp (Exim 4.90_1) (envelope-from ) id 1l0Pf8-0006m4-04; Fri, 15 Jan 2021 14:01:14 +0000 Received: from [172.30.20.202] (helo=mx.sourceforge.net) by sfs-ml-1.v29.lw.sourceforge.com with esmtps (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l0Pf6-0006ln-Ug for linux-f2fs-devel@lists.sourceforge.net; Fri, 15 Jan 2021 14:01:12 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sourceforge.net; s=x; h=Content-Transfer-Encoding:Content-Type:Cc:To: Subject:Message-ID:Date:From:In-Reply-To:References:MIME-Version:Sender: Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender :Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=kn4bp9WOO8q4fA3RA3luW7//1Gz9pPNI9gjAjIbJcs0=; b=ZmRMhKn+Yl/L2lCNWEJwH4VoG5 cgkT3+ZJdz3RHQrXCIJdADeRFrxl+I1RFyPGj7g+4FZ9G+IuHuCMYjjnh3Vpcca/KtcLwjjuNjS56 JVgoUrlXnocSuwtawg5dZwPHXm/62W0DJKCAAXMcE6N1p5cKNTwLUP2ZFsz6qd/poICs=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=Content-Transfer-Encoding:Content-Type:Cc:To:Subject:Message-ID:Date:From :In-Reply-To:References:MIME-Version:Sender:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=kn4bp9WOO8q4fA3RA3luW7//1Gz9pPNI9gjAjIbJcs0=; b=Xj8XslEx6Ohm9Sueaa0s6+7CaD NwrMy3Wzs5Aandl03jgNRrIbTB+eXRc2tyd0ZQ9wp9eDen49rspxSaZ1oVepYG9DRNIz+PUv/VKe+ lE4nr+bwZmcn1EMnr9/8WQmK5eZk4cgqZeTi4rw8XP5miwdBiE+Gk6i/MJSQrSLlIeq4=; Received: from mail-lf1-f43.google.com ([209.85.167.43]) by sfi-mx-1.v28.lw.sourceforge.com with esmtps (TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128) (Exim 4.92.2) id 1l0Pf0-00FuNX-DI for linux-f2fs-devel@lists.sourceforge.net; Fri, 15 Jan 2021 14:01:12 +0000 Received: by mail-lf1-f43.google.com with SMTP id o19so13284367lfo.1 for ; Fri, 15 Jan 2021 06:01:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=kn4bp9WOO8q4fA3RA3luW7//1Gz9pPNI9gjAjIbJcs0=; b=PMXFza14HseFb6g9sEsPtrVH1U9uDJ3Ze7mT/SlZ9lBMmebcbM5jfCwYN/Z+pnt3Sg TyFNWgt5lQDNXI1DxuZzsKQwhdO9aR75r9wWn71TQQKhhXjzMw9iCDF7jzRUTKPCvYeB UWFO55F18l1Mo/iM7IGSCWALIxCJsUBl8S0Zb29Rcne8bJVtt7CaMNCOQU9o290+2gmE LhmjYd2SURgRDbPEsmLgmQz4LVJxOFF3ZIW+mh3lQ3N5wuQzVcUD6VAWLLt2FS7KfFZy 7hUlUIj5ZUCeAamlO0vczwDOySyk4fl4j1VQpO4puue7+BG4wVtOQ2+ibzCW2T/9v37R yAaw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=kn4bp9WOO8q4fA3RA3luW7//1Gz9pPNI9gjAjIbJcs0=; b=fAZn/uqJKx0Ipx8tv0h3C1XWLQ4Ry0rOd3ZSdJhlc/gZhwGua7q3Ao3rE2Md83/bOC f10Fv3PonRj7HI/0YpNqxvyG/1hrSR06Uvaa7PuuNiRmxsZDbQwjZ9UsqbQxMOdw82na jSbtDLi+v7o4w1D6r9aeFWY/8gKzSFbNoZhm1jh14cEn1dkKcRAIr6w7JjHThR5aJzDJ 4WHM7/VIgGj7RhvtgqZQoEuSCoVhPSgmC7G1QyHScMv+3oaGk93MYjbdCjQdbCEyiTOm KgItbq1clFgpc+wXE+Iijap3ze2mqmCh+VILXv09k2otn6fM3vjb4d+0Hm43rRCz6rmV sbGA== X-Gm-Message-State: AOAM531W/u2g8XACINAZONmVINEKqcjn1OnMx7R6dlp0eNvcHn13lR/v Qc4SJur3yga9mbwaKNeYXYkvgET0xVoBouv3npc= X-Google-Smtp-Source: ABdhPJx3Gdk9zBjigibql+/r0peNegF8KCgI+DwfLAlePO0jy61N8whS3I/8HJBTL8+s55ceeqcbA0XmpyTRRDoDYG4= X-Received: by 2002:a19:848f:: with SMTP id g137mr5467722lfd.622.1610719259631; Fri, 15 Jan 2021 06:00:59 -0800 (PST) MIME-Version: 1.0 References: <20210114062302.3809664-1-daeho43@gmail.com> <965dc435-c0a0-36ca-7e97-c3aaa3831bff@huawei.com> In-Reply-To: <965dc435-c0a0-36ca-7e97-c3aaa3831bff@huawei.com> From: Daeho Jeong Date: Fri, 15 Jan 2021 23:00:48 +0900 Message-ID: To: Chao Yu X-Headers-End: 1l0Pf0-00FuNX-DI Subject: Re: [f2fs-dev] [PATCH v2 1/2] f2fs: introduce checkpoint=merge mount option X-BeenThere: linux-f2fs-devel@lists.sourceforge.net X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Daeho Jeong , Sungjong Seo , kernel-team@android.com, linux-kernel@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: linux-f2fs-devel-bounces@lists.sourceforge.net MjAyMeuFhCAx7JuUIDE17J28ICjquIgpIOyYpO2bhCA2OjIyLCBDaGFvIFl1IDx5dWNoYW8wQGh1 YXdlaS5jb20+64uY7J20IOyekeyEsToKPgo+IE9uIDIwMjEvMS8xNCAxNDoyMywgRGFlaG8gSmVv bmcgd3JvdGU6Cj4gPiBGcm9tOiBEYWVobyBKZW9uZyA8ZGFlaG9qZW9uZ0Bnb29nbGUuY29tPgo+ ID4KPiA+IFdlJ3ZlIGFkZGVkIGEgbmV3IG1vdW50IG9wdGlvbiAiY2hlY2twb2ludD1tZXJnZSIs IHdoaWNoIGNyZWF0ZXMgYQo+ID4ga2VybmVsIGRhZW1vbiBhbmQgbWFrZXMgaXQgdG8gbWVyZ2Ug Y29uY3VycmVudCBjaGVja3BvaW50IHJlcXVlc3RzIGFzCj4gPiBtdWNoIGFzIHBvc3NpYmxlIHRv IGVsaW1pbmF0ZSByZWR1bmRhbnQgY2hlY2twb2ludCBpc3N1ZXMuIFBsdXMsIHdlCj4gPiBjYW4g ZWxpbWluYXRlIHRoZSBzbHVnZ2lzaCBpc3N1ZSBjYXVzZWQgYnkgc2xvdyBjaGVja3BvaW50IG9w ZXJhdGlvbgo+ID4gd2hlbiB0aGUgY2hlY2twb2ludCBpcyBkb25lIGluIGEgcHJvY2VzcyBjb250 ZXh0IGluIGEgY2dyb3VwIGhhdmluZwo+ID4gbG93IGkvbyBidWRnZXQgYW5kIGNwdSBzaGFyZXMs IGFuZCBUaGUgYmVsb3cgdmVyaWZpY2F0aW9uIHJlc3VsdAo+ID4gZXhwbGFpbnMgdGhpcy4KPiA+ IFRoZSBiYXNpYyBpZGVhIGhhcyBjb21lIGZyb20gaHR0cHM6Ly9vcGVuc291cmNlLnNhbXN1bmcu Y29tLgo+ID4KPiA+IFtWZXJpZmljYXRpb25dCj4gPiBBbmRyb2lkIFBpeGVsIERldmljZShBUk02 NCwgN0dCIFJBTSwgMjU2R0IgVUZTKQo+ID4gQ3JlYXRlIHR3byBJL08gY2dyb3VwcyAoZmcgdy8g d2VpZ2h0IDEwMCwgYmcgdy8gd2lnaHQgMjApCj4gPiBTZXQgInN0cmljdF9ndWFyYW50ZWVzIiB0 byAiMSIgaW4gQkZRIHR1bmFibGVzCj4gPgo+ID4gSW4gImZnIiBjZ3JvdXAsCj4gPiAtIHRocmVh ZCBBID0+IHRyaWdnZXIgMTAwMCBjaGVja3BvaW50IG9wZXJhdGlvbnMKPiA+ICAgICJmb3IgaSBp biBgc2VxIDEgMTAwMGA7IGRvIHRvdWNoIHRlc3RfZGlyMS9maWxlOyBmc3luYyB0ZXN0X2RpcjE7 Cj4gPiAgICAgZG9uZSIKPiA+IC0gdGhyZWFkIEIgPT4gZ2VyZXJhdGluZyBhc3luYy4gSS9PCj4g PiAgICAiZmlvIC0tcnc9d3JpdGUgLS1udW1qb2JzPTEgLS1icz0xMjhrIC0tcnVudGltZT0zNjAw IC0tdGltZV9iYXNlZD0xCj4gPiAgICAgICAgIC0tZmlsZW5hbWU9dGVzdF9pbWcgLS1uYW1lPXRl c3QiCj4gPgo+ID4gSW4gImJnIiBjZ3JvdXAsCj4gPiAtIHRocmVhZCBDID0+IHRyaWdnZXIgcmVw ZWF0ZWQgY2hlY2twb2ludCBvcGVyYXRpb25zCj4gPiAgICAiZWNobyAkJCA+IC9kZXYvYmxraW8v YmcvdGFza3M7IHdoaWxlIHRydWU7IGRvIHRvdWNoIHRlc3RfZGlyMi9maWxlOwo+ID4gICAgIGZz eW5jIHRlc3RfZGlyMjsgZG9uZSIKPiA+Cj4gPiBXZSd2ZSBtZWFzdXJlZCB0aHJlYWQgQSdzIGV4 ZWN1dGlvbiB0aW1lLgo+ID4KPiA+IFsgdy9vIHBhdGNoIF0KPiA+IEVsYXBzZWQgVGltZTogQXZn LiA2OCBzZWNvbmRzCj4gPiBbIHcvICBwYXRjaCBdCj4gPiBFbGFwc2VkIFRpbWU6IEF2Zy4gNDgg c2Vjb25kcwo+ID4KPiA+IFNpZ25lZC1vZmYtYnk6IERhZWhvIEplb25nIDxkYWVob2plb25nQGdv b2dsZS5jb20+Cj4gPiBTaWduZWQtb2ZmLWJ5OiBTdW5nam9uZyBTZW8gPHNqMTU1Ny5zZW9Ac2Ft c3VuZy5jb20+Cj4gPiAtLS0KPiA+IHYyOgo+ID4gLSBpbmxpbmVkIGNrcHRfcmVxX2NvbnRyb2wg aW50byBmMmZzX3NiX2luZm8gYW5kIGNvbGxlY3RlZCBzdGFzdGljcwo+ID4gICAgb2YgY2hlY2tw b2ludCBtZXJnZSBvcGVyYXRpb25zCj4gPiAtLS0KPiA+ICAgRG9jdW1lbnRhdGlvbi9maWxlc3lz dGVtcy9mMmZzLnJzdCB8ICAgNiArKwo+ID4gICBmcy9mMmZzL2NoZWNrcG9pbnQuYyAgICAgICAg ICAgICAgIHwgMTYzICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4gPiAgIGZzL2YyZnMv ZGVidWcuYyAgICAgICAgICAgICAgICAgICAgfCAgMTIgKysrCj4gPiAgIGZzL2YyZnMvZjJmcy5o ICAgICAgICAgICAgICAgICAgICAgfCAgMjcgKysrKysKPiA+ICAgZnMvZjJmcy9zdXBlci5jICAg ICAgICAgICAgICAgICAgICB8ICA1NiArKysrKysrKystCj4gPiAgIDUgZmlsZXMgY2hhbmdlZCwg MjYwIGluc2VydGlvbnMoKyksIDQgZGVsZXRpb25zKC0pCj4gPgo+ID4gZGlmZiAtLWdpdCBhL0Rv Y3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZjJmcy5yc3QgYi9Eb2N1bWVudGF0aW9uL2ZpbGVzeXN0 ZW1zL2YyZnMucnN0Cj4gPiBpbmRleCBkYWUxNWM5NmU2NTkuLmJjY2MwMjFiZjMxYSAxMDA2NDQK PiA+IC0tLSBhL0RvY3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZjJmcy5yc3QKPiA+ICsrKyBiL0Rv Y3VtZW50YXRpb24vZmlsZXN5c3RlbXMvZjJmcy5yc3QKPiA+IEBAIC0yNDcsNiArMjQ3LDEyIEBA IGNoZWNrcG9pbnQ9JXNbOiV1WyVdXSAgICAgU2V0IHRvICJkaXNhYmxlIiB0byB0dXJuIG9mZiBj aGVja3BvaW50aW5nLiBTZXQgdG8gImVuYWJsCj4gPiAgICAgICAgICAgICAgICAgICAgICAgIGhp ZGUgdXAgdG8gYWxsIHJlbWFpbmluZyBmcmVlIHNwYWNlLiBUaGUgYWN0dWFsIHNwYWNlIHRoYXQK PiA+ICAgICAgICAgICAgICAgICAgICAgICAgd291bGQgYmUgdW51c2FibGUgY2FuIGJlIHZpZXdl ZCBhdCAvc3lzL2ZzL2YyZnMvPGRpc2s+L3VudXNhYmxlCj4gPiAgICAgICAgICAgICAgICAgICAg ICAgIFRoaXMgc3BhY2UgaXMgcmVjbGFpbWVkIG9uY2UgY2hlY2twb2ludD1lbmFibGUuCj4gPiAr ICAgICAgICAgICAgICAgICAgICAgIEhlcmUgaXMgYW5vdGhlciBvcHRpb24gIm1lcmdlIiwgd2hp Y2ggY3JlYXRlcyBhIGtlcm5lbCBkYWVtb24KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgYW5k IG1ha2VzIGl0IHRvIG1lcmdlIGNvbmN1cnJlbnQgY2hlY2twb2ludCByZXF1ZXN0cyBhcyBtdWNo Cj4gPiArICAgICAgICAgICAgICAgICAgICAgIGFzIHBvc3NpYmxlIHRvIGVsaW1pbmF0ZSByZWR1 bmRhbnQgY2hlY2twb2ludCBpc3N1ZXMuIFBsdXMsCj4gPiArICAgICAgICAgICAgICAgICAgICAg IHdlIGNhbiBlbGltaW5hdGUgdGhlIHNsdWdnaXNoIGlzc3VlIGNhdXNlZCBieSBzbG93IGNoZWNr cG9pbnQKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0aW9uIHdoZW4gdGhlIGNoZWNr cG9pbnQgaXMgZG9uZSBpbiBhIHByb2Nlc3MgY29udGV4dCBpbgo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICBhIGNncm91cCBoYXZpbmcgbG93IGkvbyBidWRnZXQgYW5kIGNwdSBzaGFyZXMuCj4g PiAgIGNvbXByZXNzX2FsZ29yaXRobT0lcyAgICAgICAgQ29udHJvbCBjb21wcmVzcyBhbGdvcml0 aG0sIGN1cnJlbnRseSBmMmZzIHN1cHBvcnRzICJsem8iLAo+ID4gICAgICAgICAgICAgICAgICAg ICAgICAibHo0IiwgInpzdGQiIGFuZCAibHpvLXJsZSIgYWxnb3JpdGhtLgo+ID4gICBjb21wcmVz c19sb2dfc2l6ZT0ldSAgICAgICAgIFN1cHBvcnQgY29uZmlndXJpbmcgY29tcHJlc3MgY2x1c3Rl ciBzaXplLCB0aGUgc2l6ZSB3aWxsCj4gPiBkaWZmIC0tZ2l0IGEvZnMvZjJmcy9jaGVja3BvaW50 LmMgYi9mcy9mMmZzL2NoZWNrcG9pbnQuYwo+ID4gaW5kZXggODk3ZWRiN2M5NTFhLi5lMDY2OGNl YzNiODAgMTAwNjQ0Cj4gPiAtLS0gYS9mcy9mMmZzL2NoZWNrcG9pbnQuYwo+ID4gKysrIGIvZnMv ZjJmcy9jaGVja3BvaW50LmMKPiA+IEBAIC0xMyw2ICsxMyw3IEBACj4gPiAgICNpbmNsdWRlIDxs aW51eC9mMmZzX2ZzLmg+Cj4gPiAgICNpbmNsdWRlIDxsaW51eC9wYWdldmVjLmg+Cj4gPiAgICNp bmNsdWRlIDxsaW51eC9zd2FwLmg+Cj4gPiArI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KPiA+ Cj4gPiAgICNpbmNsdWRlICJmMmZzLmgiCj4gPiAgICNpbmNsdWRlICJub2RlLmgiCj4gPiBAQCAt MjAsNiArMjEsOCBAQAo+ID4gICAjaW5jbHVkZSAidHJhY2UuaCIKPiA+ICAgI2luY2x1ZGUgPHRy YWNlL2V2ZW50cy9mMmZzLmg+Cj4gPgo+ID4gKyNkZWZpbmUgREVGQVVMVF9DSEVDS1BPSU5UX0lP UFJJTyAoSU9QUklPX1BSSU9fVkFMVUUoSU9QUklPX0NMQVNTX0JFLCAzKSkKPiA+ICsKPiA+ICAg c3RhdGljIHN0cnVjdCBrbWVtX2NhY2hlICppbm9fZW50cnlfc2xhYjsKPiA+ICAgc3RydWN0IGtt ZW1fY2FjaGUgKmYyZnNfaW5vZGVfZW50cnlfc2xhYjsKPiA+Cj4gPiBAQCAtMTcwNywzICsxNzEw LDE2MyBAQCB2b2lkIGYyZnNfZGVzdHJveV9jaGVja3BvaW50X2NhY2hlcyh2b2lkKQo+ID4gICAg ICAga21lbV9jYWNoZV9kZXN0cm95KGlub19lbnRyeV9zbGFiKTsKPiA+ICAgICAgIGttZW1fY2Fj aGVfZGVzdHJveShmMmZzX2lub2RlX2VudHJ5X3NsYWIpOwo+ID4gICB9Cj4gPiArCj4gPiArc3Rh dGljIGludCBfX3dyaXRlX2NoZWNrcG9pbnRfc3luYyhzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmkp Cj4gPiArewo+ID4gKyAgICAgc3RydWN0IGNwX2NvbnRyb2wgY3BjID0geyAucmVhc29uID0gQ1Bf U1lOQywgfTsKPiA+ICsgICAgIGludCBlcnI7Cj4gPiArCj4gPiArICAgICBkb3duX3dyaXRlKCZz YmktPmdjX2xvY2spOwo+ID4gKyAgICAgZXJyID0gZjJmc193cml0ZV9jaGVja3BvaW50KHNiaSwg JmNwYyk7Cj4gPiArICAgICB1cF93cml0ZSgmc2JpLT5nY19sb2NrKTsKPiA+ICsKPiA+ICsgICAg IHJldHVybiBlcnI7Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyB2b2lkIF9fY2hlY2twb2ludF9h bmRfY29tcGxldGVfcmVxcyhzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmkpCj4gPiArewo+ID4gKyAg ICAgc3RydWN0IGNrcHRfcmVxX2NvbnRyb2wgKmNwcmMgPSAmc2JpLT5jcHJjX2luZm87Cj4gPiAr ICAgICBzdHJ1Y3QgY2twdF9yZXEgKnJlcSwgKm5leHQ7Cj4gPiArICAgICBzdHJ1Y3QgbGxpc3Rf bm9kZSAqZGlzcGF0Y2hfbGlzdDsKPiA+ICsgICAgIHU2NCBzdW1fZGlmZiA9IDAsIGRpZmYsIGNv dW50ID0gMDsKPiA+ICsgICAgIGludCByZXQ7Cj4gPiArCj4gPiArICAgICBkaXNwYXRjaF9saXN0 ID0gbGxpc3RfZGVsX2FsbCgmY3ByYy0+aXNzdWVfbGlzdCk7Cj4gPiArICAgICBpZiAoIWRpc3Bh dGNoX2xpc3QpCj4gPiArICAgICAgICAgICAgIHJldHVybjsKPiA+ICsgICAgIGRpc3BhdGNoX2xp c3QgPSBsbGlzdF9yZXZlcnNlX29yZGVyKGRpc3BhdGNoX2xpc3QpOwo+ID4gKwo+ID4gKyAgICAg cmV0ID0gX193cml0ZV9jaGVja3BvaW50X3N5bmMoc2JpKTsKPiA+ICsgICAgIGF0b21pY19pbmMo JmNwcmMtPmlzc3VlZF9ja3B0KTsKPiA+ICsKPiA+ICsgICAgIGxsaXN0X2Zvcl9lYWNoX2VudHJ5 X3NhZmUocmVxLCBuZXh0LCBkaXNwYXRjaF9saXN0LCBsbG5vZGUpIHsKPiA+ICsgICAgICAgICAg ICAgYXRvbWljX2RlYygmY3ByYy0+cXVldWVkX2NrcHQpOwo+ID4gKyAgICAgICAgICAgICBhdG9t aWNfaW5jKCZjcHJjLT50b3RhbF9ja3B0KTsKPiA+ICsgICAgICAgICAgICAgZGlmZiA9ICh1NjQp a3RpbWVfbXNfZGVsdGEoa3RpbWVfZ2V0KCksIHJlcS0+cXVldWVfdGltZSk7Cj4gPiArICAgICAg ICAgICAgIHJlcS0+cmV0ID0gcmV0Owo+ID4gKyAgICAgICAgICAgICBjb21wbGV0ZSgmcmVxLT53 YWl0KTsKPiA+ICsKPiA+ICsgICAgICAgICAgICAgc3VtX2RpZmYgKz0gZGlmZjsKPiA+ICsgICAg ICAgICAgICAgY291bnQrKzsKPiA+ICsgICAgIH0KPgo+IEhvdyBhYm91dCB1cGRhdGluZyBxdWV1 ZWRfY2twdCBhbmQgdG90YWxfY2twdCBpbiBiYXRjaCwgdXBkYXRlIGF0b21pYwo+IHZhcmlhYmxl IG9uZSBieSBvbmUgaXMgbG93IGVmZmljaWVudC4KPgoKWW91IG1lYW4gbGlrZSB1c2luZyBzcGlu X2xvY2soKT8KCj4gPiArCj4gPiArICAgICBzcGluX2xvY2soJmNwcmMtPnN0YXRfbG9jayk7Cj4g PiArICAgICBjcHJjLT5jdXJfdGltZSA9ICh1bnNpZ25lZCBpbnQpZGl2NjRfdTY0KHN1bV9kaWZm LCBjb3VudCk7Cj4KPiBrdGltZV9nZXQoKSByZXR1cm5zIHRpbWUgYmFzZWQgbnMgdW5pdCwgaW4g ZXh0cmVtZSBzY2VuYXJpbywgYXZlcmFnZQo+IHRpbWUgY3AgY29zdCB3aWxsIG92ZXJmbG93IDMy LWJpdCB2YXJpYWJsZSwgSSBkb3VidC4KPgoKc3VtX2RpZmYgaXMgYWxyZWFkeSB0dXJuZWQgaW50 byBtc2VjIHVzaW5nIGt0aW1lX21zX2RlbHRhKCkgYWJvdmUuCgo+ID4gKyAgICAgaWYgKGNwcmMt PnBlYWtfdGltZSA8IGNwcmMtPmN1cl90aW1lKQo+ID4gKyAgICAgICAgICAgICBjcHJjLT5wZWFr X3RpbWUgPSBjcHJjLT5jdXJfdGltZTsKPiA+ICsgICAgIHNwaW5fdW5sb2NrKCZjcHJjLT5zdGF0 X2xvY2spOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgaW50IGlzc3VlX2NoZWNrcG9pbnRfdGhy ZWFkKHZvaWQgKmRhdGEpCj4gPiArewo+ID4gKyAgICAgc3RydWN0IGYyZnNfc2JfaW5mbyAqc2Jp ID0gZGF0YTsKPiA+ICsgICAgIHN0cnVjdCBja3B0X3JlcV9jb250cm9sICpjcHJjID0gJnNiaS0+ Y3ByY19pbmZvOwo+ID4gKyAgICAgd2FpdF9xdWV1ZV9oZWFkX3QgKnEgPSAmY3ByYy0+Y2twdF93 YWl0X3F1ZXVlOwo+ID4gK3JlcGVhdDoKPiA+ICsgICAgIGlmIChrdGhyZWFkX3Nob3VsZF9zdG9w KCkpCj4gPiArICAgICAgICAgICAgIHJldHVybiAwOwo+ID4gKwo+ID4gKyAgICAgc2Jfc3RhcnRf aW50d3JpdGUoc2JpLT5zYik7Cj4gPiArCj4gPiArICAgICBpZiAoIWxsaXN0X2VtcHR5KCZjcHJj LT5pc3N1ZV9saXN0KSkKPiA+ICsgICAgICAgICAgICAgX19jaGVja3BvaW50X2FuZF9jb21wbGV0 ZV9yZXFzKHNiaSk7Cj4gPiArCj4gPiArICAgICBzYl9lbmRfaW50d3JpdGUoc2JpLT5zYik7Cj4g PiArCj4gPiArICAgICB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoKnEsCj4gPiArICAgICAgICAg ICAgIGt0aHJlYWRfc2hvdWxkX3N0b3AoKSB8fCAhbGxpc3RfZW1wdHkoJmNwcmMtPmlzc3VlX2xp c3QpKTsKPiA+ICsgICAgIGdvdG8gcmVwZWF0Owo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9p ZCBmbHVzaF9yZW1haW5lZF9ja3B0X3JlcXMoc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpLAo+ID4g KyAgICAgICAgICAgICBzdHJ1Y3QgY2twdF9yZXEgKndhaXRfcmVxKQo+ID4gK3sKPiA+ICsgICAg IHN0cnVjdCBja3B0X3JlcV9jb250cm9sICpjcHJjID0gJnNiaS0+Y3ByY19pbmZvOwo+ID4gKwo+ ID4gKyAgICAgaWYgKCFsbGlzdF9lbXB0eSgmY3ByYy0+aXNzdWVfbGlzdCkpIHsKPiA+ICsgICAg ICAgICAgICAgX19jaGVja3BvaW50X2FuZF9jb21wbGV0ZV9yZXFzKHNiaSk7Cj4gPiArICAgICB9 IGVsc2Ugewo+ID4gKyAgICAgICAgICAgICAvKiBhbHJlYWR5IGRpc3BhdGNoZWQgYnkgaXNzdWVf Y2hlY2twb2ludF90aHJlYWQgKi8KPiA+ICsgICAgICAgICAgICAgaWYgKHdhaXRfcmVxKQo+ID4g KyAgICAgICAgICAgICAgICAgICAgIHdhaXRfZm9yX2NvbXBsZXRpb24oJndhaXRfcmVxLT53YWl0 KTsKPiA+ICsgICAgIH0KPiA+ICt9Cj4gPiArCj4gPiArc3RhdGljIHZvaWQgaW5pdF9ja3B0X3Jl cShzdHJ1Y3QgY2twdF9yZXEgKnJlcSkKPiA+ICt7Cj4gPiArICAgICBtZW1zZXQocmVxLCAwLCBz aXplb2Yoc3RydWN0IGNrcHRfcmVxKSk7Cj4gPiArCj4gPiArICAgICBpbml0X2NvbXBsZXRpb24o JnJlcS0+d2FpdCk7Cj4gPiArICAgICByZXEtPnF1ZXVlX3RpbWUgPSBrdGltZV9nZXQoKTsKPiA+ ICt9Cj4gPiArCj4gPiAraW50IGYyZnNfaXNzdWVfY2hlY2twb2ludChzdHJ1Y3QgZjJmc19zYl9p bmZvICpzYmkpCj4gPiArewo+ID4gKyAgICAgc3RydWN0IGNrcHRfcmVxX2NvbnRyb2wgKmNwcmMg PSAmc2JpLT5jcHJjX2luZm87Cj4gPiArICAgICBzdHJ1Y3QgY2twdF9yZXEgcmVxOwo+ID4gKwo+ ID4gKyAgICAgaWYgKCFjcHJjIHx8ICFjcHJjLT5mMmZzX2lzc3VlX2NrcHQpCj4KPiAhY3ByYyBj aGVjayBpcyB1bm5lZWRlZCBub3cuCj4KCkdvdCBpdH4KCj4gPiArICAgICAgICAgICAgIHJldHVy biBfX3dyaXRlX2NoZWNrcG9pbnRfc3luYyhzYmkpOwo+ID4gKwo+ID4gKyAgICAgaW5pdF9ja3B0 X3JlcSgmcmVxKTsKPiA+ICsKPiA+ICsgICAgIGxsaXN0X2FkZCgmcmVxLmxsbm9kZSwgJmNwcmMt Pmlzc3VlX2xpc3QpOwo+ID4gKyAgICAgYXRvbWljX2luYygmY3ByYy0+cXVldWVkX2NrcHQpOwo+ ID4gKwo+ID4gKyAgICAgLyogdXBkYXRlIGlzc3VlX2xpc3QgYmVmb3JlIHdlIHdha2UgdXAgaXNz dWVfY2hlY2twb2ludCB0aHJlYWQgKi8KPiA+ICsgICAgIHNtcF9tYigpOwo+ID4gKwo+ID4gKyAg ICAgaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmNwcmMtPmNrcHRfd2FpdF9xdWV1ZSkpCj4gPiArICAg ICAgICAgICAgIHdha2VfdXAoJmNwcmMtPmNrcHRfd2FpdF9xdWV1ZSk7Cj4gPiArCj4gPiArICAg ICBpZiAoY3ByYy0+ZjJmc19pc3N1ZV9ja3B0KQo+ID4gKyAgICAgICAgICAgICB3YWl0X2Zvcl9j b21wbGV0aW9uKCZyZXEud2FpdCk7Cj4gPiArICAgICBlbHNlCj4gPiArICAgICAgICAgICAgIGZs dXNoX3JlbWFpbmVkX2NrcHRfcmVxcyhzYmksICZyZXEpOwo+ID4gKwo+ID4gKyAgICAgcmV0dXJu IHJlcS5yZXQ7Cj4gPiArfQo+ID4gKwo+ID4gK2ludCBmMmZzX3N0YXJ0X2NrcHRfdGhyZWFkKHN0 cnVjdCBmMmZzX3NiX2luZm8gKnNiaSkKPiA+ICt7Cj4gPiArICAgICBkZXZfdCBkZXYgPSBzYmkt PnNiLT5zX2JkZXYtPmJkX2RldjsKPiA+ICsgICAgIHN0cnVjdCBja3B0X3JlcV9jb250cm9sICpj cHJjID0gJnNiaS0+Y3ByY19pbmZvOwo+ID4gKwo+ID4gKyAgICAgaWYgKGNwcmMtPmYyZnNfaXNz dWVfY2twdCkKPiA+ICsgICAgICAgICAgICAgcmV0dXJuIDA7Cj4KPiAgICAgICAgICBeXl5eXiBo ZXJlCj4KCmRpdHRvCgo+ID4gKwo+ID4gKyAgICAgY3ByYy0+ZjJmc19pc3N1ZV9ja3B0ID0ga3Ro cmVhZF9ydW4oaXNzdWVfY2hlY2twb2ludF90aHJlYWQsIHNiaSwKPiA+ICsgICAgICAgICAgICAg ICAgICAgICAiZjJmc19ja3B0LSV1OiV1IiwgTUFKT1IoZGV2KSwgTUlOT1IoZGV2KSk7Cj4gPiAr ICAgICBpZiAoSVNfRVJSKGNwcmMtPmYyZnNfaXNzdWVfY2twdCkpCj4KPiB3ZSBzaG91bGQgYXNz aWduIGNwcmMtPmYyZnNfaXNzdWVfY2twdCB0byBOVUxMLCB0aGlzIHdpbGwgbW9yZSBzYWZlciB0 aGFuCj4ga2VlcGluZyBvbGQgZXJyb3IgdmFsdWUgbGVmdCBpbiB0aGlzIHZhcmlhYmxlLCB0byBh dm9pZCBjaGVja2luZyB0aGUgd3JvbmcKPiB2YWx1ZSBhcyBpbiBhYm92ZSBwb3NpdGlvbi4KPgoK ZGl0dG8KCj4gPiArICAgICAgICAgICAgIHJldHVybiBQVFJfRVJSKGNwcmMtPmYyZnNfaXNzdWVf Y2twdCk7Cj4gPiArCj4gPiArICAgICBzZXRfdGFza19pb3ByaW8oY3ByYy0+ZjJmc19pc3N1ZV9j a3B0LCBERUZBVUxUX0NIRUNLUE9JTlRfSU9QUklPKTsKPiA+ICsKPiA+ICsgICAgIHJldHVybiAw Owo+ID4gK30KPiA+ICsKPiA+ICt2b2lkIGYyZnNfc3RvcF9ja3B0X3RocmVhZChzdHJ1Y3QgZjJm c19zYl9pbmZvICpzYmkpCj4gPiArewo+ID4gKyAgICAgc3RydWN0IGNrcHRfcmVxX2NvbnRyb2wg KmNwcmMgPSAmc2JpLT5jcHJjX2luZm87Cj4gPiArCj4gPiArICAgICBpZiAoY3ByYy0+ZjJmc19p c3N1ZV9ja3B0KSB7Cj4gPiArICAgICAgICAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqY2twdF90 YXNrID0gY3ByYy0+ZjJmc19pc3N1ZV9ja3B0Owo+ID4gKwo+ID4gKyAgICAgICAgICAgICBjcHJj LT5mMmZzX2lzc3VlX2NrcHQgPSBOVUxMOwo+ID4gKyAgICAgICAgICAgICBrdGhyZWFkX3N0b3Ao Y2twdF90YXNrKTsKPiA+ICsKPiA+ICsgICAgICAgICAgICAgZmx1c2hfcmVtYWluZWRfY2twdF9y ZXFzKHNiaSwgTlVMTCk7Cj4gPiArICAgICB9Cj4gPiArfQo+ID4gKwo+ID4gK3ZvaWQgZjJmc19p bml0X2NrcHRfcmVxX2NvbnRyb2woc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpKQo+ID4gK3sKPiA+ ICsgICAgIHN0cnVjdCBja3B0X3JlcV9jb250cm9sICpjcHJjID0gJnNiaS0+Y3ByY19pbmZvOwo+ ID4gKwo+ID4gKyAgICAgYXRvbWljX3NldCgmY3ByYy0+aXNzdWVkX2NrcHQsIDApOwo+ID4gKyAg ICAgYXRvbWljX3NldCgmY3ByYy0+dG90YWxfY2twdCwgMCk7Cj4gPiArICAgICBhdG9taWNfc2V0 KCZjcHJjLT5xdWV1ZWRfY2twdCwgMCk7Cj4gPiArICAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZj cHJjLT5ja3B0X3dhaXRfcXVldWUpOwo+ID4gKyAgICAgaW5pdF9sbGlzdF9oZWFkKCZjcHJjLT5p c3N1ZV9saXN0KTsKPiA+ICsgICAgIHNwaW5fbG9ja19pbml0KCZjcHJjLT5zdGF0X2xvY2spOwo+ ID4gK30KPiA+IGRpZmYgLS1naXQgYS9mcy9mMmZzL2RlYnVnLmMgYi9mcy9mMmZzL2RlYnVnLmMK PiA+IGluZGV4IDE5N2M5MTQxMTlkYS4uOTE4NTVkNTcyMWNkIDEwMDY0NAo+ID4gLS0tIGEvZnMv ZjJmcy9kZWJ1Zy5jCj4gPiArKysgYi9mcy9mMmZzL2RlYnVnLmMKPiA+IEBAIC0xMjAsNiArMTIw LDEzIEBAIHN0YXRpYyB2b2lkIHVwZGF0ZV9nZW5lcmFsX3N0YXR1cyhzdHJ1Y3QgZjJmc19zYl9p bmZvICpzYmkpCj4gPiAgICAgICAgICAgICAgICAgICAgICAgYXRvbWljX3JlYWQoJlNNX0koc2Jp KS0+ZGNjX2luZm8tPmRpc2NhcmRfY21kX2NudCk7Cj4gPiAgICAgICAgICAgICAgIHNpLT51bmRp c2NhcmRfYmxrcyA9IFNNX0koc2JpKS0+ZGNjX2luZm8tPnVuZGlzY2FyZF9ibGtzOwo+ID4gICAg ICAgfQo+ID4gKyAgICAgc2ktPm5yX2lzc3VlZF9ja3B0ID0gYXRvbWljX3JlYWQoJnNiaS0+Y3By Y19pbmZvLmlzc3VlZF9ja3B0KTsKPiA+ICsgICAgIHNpLT5ucl90b3RhbF9ja3B0ID0gYXRvbWlj X3JlYWQoJnNiaS0+Y3ByY19pbmZvLnRvdGFsX2NrcHQpOwo+ID4gKyAgICAgc2ktPm5yX3F1ZXVl ZF9ja3B0ID0gYXRvbWljX3JlYWQoJnNiaS0+Y3ByY19pbmZvLnF1ZXVlZF9ja3B0KTsKPiA+ICsg ICAgIHNwaW5fbG9jaygmc2JpLT5jcHJjX2luZm8uc3RhdF9sb2NrKTsKPiA+ICsgICAgIHNpLT5j dXJfY2twdF90aW1lID0gc2JpLT5jcHJjX2luZm8uY3VyX3RpbWU7Cj4gPiArICAgICBzaS0+cGVh a19ja3B0X3RpbWUgPSBzYmktPmNwcmNfaW5mby5wZWFrX3RpbWU7Cj4gPiArICAgICBzcGluX3Vu bG9jaygmc2JpLT5jcHJjX2luZm8uc3RhdF9sb2NrKTsKPiA+ICAgICAgIHNpLT50b3RhbF9jb3Vu dCA9IChpbnQpc2JpLT51c2VyX2Jsb2NrX2NvdW50IC8gc2JpLT5ibG9ja3NfcGVyX3NlZzsKPiA+ ICAgICAgIHNpLT5yc3ZkX3NlZ3MgPSByZXNlcnZlZF9zZWdtZW50cyhzYmkpOwo+ID4gICAgICAg c2ktPm92ZXJwX3NlZ3MgPSBvdmVycHJvdmlzaW9uX3NlZ21lbnRzKHNiaSk7Cj4gPiBAQCAtNDE3 LDYgKzQyNCwxMSBAQCBzdGF0aWMgaW50IHN0YXRfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZv aWQgKnYpCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaS0+bWV0YV9jb3VudFtN RVRBX05BVF0pOwo+ID4gICAgICAgICAgICAgICBzZXFfcHJpbnRmKHMsICIgIC0gc3NhIGJsb2Nr cyA6ICV1XG4iLAo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ktPm1ldGFfY291 bnRbTUVUQV9TU0FdKTsKPiA+ICsgICAgICAgICAgICAgc2VxX3ByaW50ZihzLCAiQ1AgbWVyZ2Ug KFF1ZXVlZDogJTRkLCBJc3N1ZWQ6ICU0ZCwgVG90YWw6ICU0ZCwgIgo+ID4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIkN1ciB0aW1lOiAlNGQobXMpLCBQZWFrIHRpbWU6ICU0ZChtcykp XG4iLAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2ktPm5yX3F1ZXVlZF9ja3B0 LCBzaS0+bnJfaXNzdWVkX2NrcHQsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICBz aS0+bnJfdG90YWxfY2twdCwgc2ktPmN1cl9ja3B0X3RpbWUsCj4gPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBzaS0+cGVha19ja3B0X3RpbWUpOwo+ID4gICAgICAgICAgICAgICBzZXFf cHJpbnRmKHMsICJHQyBjYWxsczogJWQgKEJHOiAlZClcbiIsCj4gPiAgICAgICAgICAgICAgICAg ICAgICAgICAgc2ktPmNhbGxfY291bnQsIHNpLT5iZ19nYyk7Cj4gPiAgICAgICAgICAgICAgIHNl cV9wcmludGYocywgIiAgLSBkYXRhIHNlZ21lbnRzIDogJWQgKCVkKVxuIiwKPiA+IGRpZmYgLS1n aXQgYS9mcy9mMmZzL2YyZnMuaCBiL2ZzL2YyZnMvZjJmcy5oCj4gPiBpbmRleCBiYjExNzU5MTkx ZGMuLmYyYWUwNzVhYTcyMyAxMDA2NDQKPiA+IC0tLSBhL2ZzL2YyZnMvZjJmcy5oCj4gPiArKysg Yi9mcy9mMmZzL2YyZnMuaAo+ID4gQEAgLTk3LDYgKzk3LDcgQEAgZXh0ZXJuIGNvbnN0IGNoYXIg KmYyZnNfZmF1bHRfbmFtZVtGQVVMVF9NQVhdOwo+ID4gICAjZGVmaW5lIEYyRlNfTU9VTlRfRElT QUJMRV9DSEVDS1BPSU5UICAgICAgIDB4MDIwMDAwMDAKPiA+ICAgI2RlZmluZSBGMkZTX01PVU5U X05PUkVDT1ZFUlkgICAgICAgICAgICAgICAweDA0MDAwMDAwCj4gPiAgICNkZWZpbmUgRjJGU19N T1VOVF9BVEdDICAgICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMAo+ID4gKyNkZWZpbmUgRjJG U19NT1VOVF9NRVJHRV9DSEVDS1BPSU5UICAweDEwMDAwMDAwCj4gPgo+ID4gICAjZGVmaW5lIEYy RlNfT1BUSU9OKHNiaSkgICAgKChzYmkpLT5tb3VudF9vcHQpCj4gPiAgICNkZWZpbmUgY2xlYXJf b3B0KHNiaSwgb3B0aW9uKSAgICAgIChGMkZTX09QVElPTihzYmkpLm9wdCAmPSB+RjJGU19NT1VO VF8jI29wdGlvbikKPiA+IEBAIC0yNjYsNiArMjY3LDI1IEBAIHN0cnVjdCBmc3luY19ub2RlX2Vu dHJ5IHsKPiA+ICAgICAgIHVuc2lnbmVkIGludCBzZXFfaWQ7ICAgIC8qIHNlcXVlbmNlIGlkICov Cj4gPiAgIH07Cj4gPgo+ID4gK3N0cnVjdCBja3B0X3JlcSB7Cj4gPiArICAgICBzdHJ1Y3QgY29t cGxldGlvbiB3YWl0OyAgICAgICAgIC8qIGNvbXBsZXRpb24gZm9yIGNoZWNrcG9pbnQgZG9uZSAq Lwo+ID4gKyAgICAgc3RydWN0IGxsaXN0X25vZGUgbGxub2RlOyAgICAgICAvKiBsbGlzdF9ub2Rl IHRvIGJlIGxpbmtlZCBpbiB3YWl0IHF1ZXVlICovCj4gPiArICAgICBpbnQgcmV0OyAgICAgICAg ICAgICAgICAgICAgICAgIC8qIHJldHVybiBjb2RlIG9mIGNoZWNrcG9pbnQgKi8KPiA+ICsgICAg IGt0aW1lX3QgcXVldWVfdGltZTsgICAgICAgICAgICAgLyogcmVxdWVzdCBxdWV1ZWQgdGltZSAq Lwo+ID4gK307Cj4gPiArCj4gPiArc3RydWN0IGNrcHRfcmVxX2NvbnRyb2wgewo+ID4gKyAgICAg c3RydWN0IHRhc2tfc3RydWN0ICpmMmZzX2lzc3VlX2NrcHQ7ICAgIC8qIGNoZWNrcG9pbnQgdGFz ayAqLwo+ID4gKyAgICAgd2FpdF9xdWV1ZV9oZWFkX3QgY2twdF93YWl0X3F1ZXVlOyAgICAgIC8q IHdhaXRpbmcgcXVldWUgZm9yIHdha2UtdXAgKi8KPiA+ICsgICAgIGF0b21pY190IGlzc3VlZF9j a3B0OyAgICAgICAgICAgLyogIyBvZiBhY3R1YWxseSBpc3N1ZWQgY2twdHMgKi8KPiA+ICsgICAg IGF0b21pY190IHRvdGFsX2NrcHQ7ICAgICAgICAgICAgLyogIyBvZiB0b3RhbCBja3B0cyAqLwo+ ID4gKyAgICAgYXRvbWljX3QgcXVldWVkX2NrcHQ7ICAgICAgICAgICAvKiAjIG9mIHF1ZXVlZCBj a3B0cyAqLwo+ID4gKyAgICAgc3RydWN0IGxsaXN0X2hlYWQgaXNzdWVfbGlzdDsgICAvKiBsaXN0 IGZvciBjb21tYW5kIGlzc3VlICovCj4gPiArICAgICBzcGlubG9ja190IHN0YXRfbG9jazsgICAg ICAgICAgIC8qIGxvY2sgZm9yIGJlbG93IGNoZWNrcG9pbnQgdGltZSBzdGF0cyAqLwo+ID4gKyAg ICAgdW5zaWduZWQgaW50IGN1cl90aW1lOyAgICAgICAgICAvKiBjdXIgd2FpdCB0aW1lIGluIG1z ZWMgZm9yIGN1cnJlbnRseSBpc3N1ZWQgY2hlY2twb2ludCAqLwo+ID4gKyAgICAgdW5zaWduZWQg aW50IHBlYWtfdGltZTsgICAgICAgICAvKiBwZWFrIHdhaXQgdGltZSBpbiBtc2VjIHVudGlsIG5v dyAqLwo+ID4gK307Cj4gPiArCj4gPiAgIC8qIGZvciB0aGUgYml0bWFwIGluZGljYXRlIGJsb2Nr cyB0byBiZSBkaXNjYXJkZWQgKi8KPiA+ICAgc3RydWN0IGRpc2NhcmRfZW50cnkgewo+ID4gICAg ICAgc3RydWN0IGxpc3RfaGVhZCBsaXN0OyAgLyogbGlzdCBoZWFkICovCj4gPiBAQCAtMTQwNCw2 ICsxNDI0LDcgQEAgc3RydWN0IGYyZnNfc2JfaW5mbyB7Cj4gPiAgICAgICB3YWl0X3F1ZXVlX2hl YWRfdCBjcF93YWl0Owo+ID4gICAgICAgdW5zaWduZWQgbG9uZyBsYXN0X3RpbWVbTUFYX1RJTUVd OyAgICAgIC8qIHRvIHN0b3JlIHRpbWUgaW4gamlmZmllcyAqLwo+ID4gICAgICAgbG9uZyBpbnRl cnZhbF90aW1lW01BWF9USU1FXTsgICAgICAgICAgIC8qIHRvIHN0b3JlIHRocmVzaG9sZHMgKi8K PiA+ICsgICAgIHN0cnVjdCBja3B0X3JlcV9jb250cm9sIGNwcmNfaW5mbzsgICAgICAvKiBmb3Ig Y2hlY2twb2ludCByZXF1ZXN0IGNvbnRyb2wgKi8KPiA+Cj4gPiAgICAgICBzdHJ1Y3QgaW5vZGVf bWFuYWdlbWVudCBpbVtNQVhfSU5PX0VOVFJZXTsgICAgICAvKiBtYW5hZ2UgaW5vZGUgY2FjaGUg Ki8KPiA+Cj4gPiBAQCAtMzQxOCw2ICszNDM5LDEwIEBAIGludCBmMmZzX3dyaXRlX2NoZWNrcG9p bnQoc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpLCBzdHJ1Y3QgY3BfY29udHJvbCAqY3BjKTsKPiA+ ICAgdm9pZCBmMmZzX2luaXRfaW5vX2VudHJ5X2luZm8oc3RydWN0IGYyZnNfc2JfaW5mbyAqc2Jp KTsKPiA+ICAgaW50IF9faW5pdCBmMmZzX2NyZWF0ZV9jaGVja3BvaW50X2NhY2hlcyh2b2lkKTsK PiA+ICAgdm9pZCBmMmZzX2Rlc3Ryb3lfY2hlY2twb2ludF9jYWNoZXModm9pZCk7Cj4gPiAraW50 IGYyZnNfaXNzdWVfY2hlY2twb2ludChzdHJ1Y3QgZjJmc19zYl9pbmZvICpzYmkpOwo+ID4gK2lu dCBmMmZzX3N0YXJ0X2NrcHRfdGhyZWFkKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNiaSk7Cj4gPiAr dm9pZCBmMmZzX3N0b3BfY2twdF90aHJlYWQoc3RydWN0IGYyZnNfc2JfaW5mbyAqc2JpKTsKPiA+ ICt2b2lkIGYyZnNfaW5pdF9ja3B0X3JlcV9jb250cm9sKHN0cnVjdCBmMmZzX3NiX2luZm8gKnNi aSk7Cj4gPgo+ID4gICAvKgo+ID4gICAgKiBkYXRhLmMKPiA+IEBAIC0zNTMwLDYgKzM1NTUsOCBA QCBzdHJ1Y3QgZjJmc19zdGF0X2luZm8gewo+ID4gICAgICAgaW50IG5yX2Rpc2NhcmRpbmcsIG5y X2Rpc2NhcmRlZDsKPiA+ICAgICAgIGludCBucl9kaXNjYXJkX2NtZDsKPiA+ICAgICAgIHVuc2ln bmVkIGludCB1bmRpc2NhcmRfYmxrczsKPiA+ICsgICAgIGludCBucl9pc3N1ZWRfY2twdCwgbnJf dG90YWxfY2twdCwgbnJfcXVldWVkX2NrcHQ7Cj4gPiArICAgICB1bnNpZ25lZCBpbnQgY3VyX2Nr cHRfdGltZSwgcGVha19ja3B0X3RpbWU7Cj4gPiAgICAgICBpbnQgaW5saW5lX3hhdHRyLCBpbmxp bmVfaW5vZGUsIGlubGluZV9kaXIsIGFwcGVuZCwgdXBkYXRlLCBvcnBoYW5zOwo+ID4gICAgICAg aW50IGNvbXByX2lub2RlOwo+ID4gICAgICAgdW5zaWduZWQgbG9uZyBsb25nIGNvbXByX2Jsb2Nr czsKPiA+IGRpZmYgLS1naXQgYS9mcy9mMmZzL3N1cGVyLmMgYi9mcy9mMmZzL3N1cGVyLmMKPiA+ IGluZGV4IGI0YTA3ZmU2MmQxYS4uMWMxNzcxYmU4YTE2IDEwMDY0NAo+ID4gLS0tIGEvZnMvZjJm cy9zdXBlci5jCj4gPiArKysgYi9mcy9mMmZzL3N1cGVyLmMKPiA+IEBAIC0xNDMsNiArMTQzLDcg QEAgZW51bSB7Cj4gPiAgICAgICBPcHRfY2hlY2twb2ludF9kaXNhYmxlX2NhcCwKPiA+ICAgICAg IE9wdF9jaGVja3BvaW50X2Rpc2FibGVfY2FwX3BlcmMsCj4gPiAgICAgICBPcHRfY2hlY2twb2lu dF9lbmFibGUsCj4gPiArICAgICBPcHRfY2hlY2twb2ludF9tZXJnZSwKPiA+ICAgICAgIE9wdF9j b21wcmVzc19hbGdvcml0aG0sCj4gPiAgICAgICBPcHRfY29tcHJlc3NfbG9nX3NpemUsCj4gPiAg ICAgICBPcHRfY29tcHJlc3NfZXh0ZW5zaW9uLAo+ID4gQEAgLTIxMyw2ICsyMTQsNyBAQCBzdGF0 aWMgbWF0Y2hfdGFibGVfdCBmMmZzX3Rva2VucyA9IHsKPiA+ICAgICAgIHtPcHRfY2hlY2twb2lu dF9kaXNhYmxlX2NhcCwgImNoZWNrcG9pbnQ9ZGlzYWJsZToldSJ9LAo+ID4gICAgICAge09wdF9j aGVja3BvaW50X2Rpc2FibGVfY2FwX3BlcmMsICJjaGVja3BvaW50PWRpc2FibGU6JXUlJSJ9LAo+ ID4gICAgICAge09wdF9jaGVja3BvaW50X2VuYWJsZSwgImNoZWNrcG9pbnQ9ZW5hYmxlIn0sCj4g PiArICAgICB7T3B0X2NoZWNrcG9pbnRfbWVyZ2UsICJjaGVja3BvaW50PW1lcmdlIn0sCj4gPiAg ICAgICB7T3B0X2NvbXByZXNzX2FsZ29yaXRobSwgImNvbXByZXNzX2FsZ29yaXRobT0lcyJ9LAo+ ID4gICAgICAge09wdF9jb21wcmVzc19sb2dfc2l6ZSwgImNvbXByZXNzX2xvZ19zaXplPSV1In0s Cj4gPiAgICAgICB7T3B0X2NvbXByZXNzX2V4dGVuc2lvbiwgImNvbXByZXNzX2V4dGVuc2lvbj0l cyJ9LAo+ID4gQEAgLTg3Miw2ICs4NzQsOSBAQCBzdGF0aWMgaW50IHBhcnNlX29wdGlvbnMoc3Ry dWN0IHN1cGVyX2Jsb2NrICpzYiwgY2hhciAqb3B0aW9ucywgYm9vbCBpc19yZW1vdW50KQo+ID4g ICAgICAgICAgICAgICBjYXNlIE9wdF9jaGVja3BvaW50X2VuYWJsZToKPiA+ICAgICAgICAgICAg ICAgICAgICAgICBjbGVhcl9vcHQoc2JpLCBESVNBQkxFX0NIRUNLUE9JTlQpOwo+ID4gICAgICAg ICAgICAgICAgICAgICAgIGJyZWFrOwo+ID4gKyAgICAgICAgICAgICBjYXNlIE9wdF9jaGVja3Bv aW50X21lcmdlOgo+ID4gKyAgICAgICAgICAgICAgICAgICAgIHNldF9vcHQoc2JpLCBNRVJHRV9D SEVDS1BPSU5UKTsKPiA+ICsgICAgICAgICAgICAgICAgICAgICBicmVhazsKPiA+ICAgI2lmZGVm IENPTkZJR19GMkZTX0ZTX0NPTVBSRVNTSU9OCj4gPiAgICAgICAgICAgICAgIGNhc2UgT3B0X2Nv bXByZXNzX2FsZ29yaXRobToKPiA+ICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWYyZnNfc2Jf aGFzX2NvbXByZXNzaW9uKHNiaSkpIHsKPiA+IEBAIC0xMDQwLDYgKzEwNDUsMTIgQEAgc3RhdGlj IGludCBwYXJzZV9vcHRpb25zKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGNoYXIgKm9wdGlvbnMs IGJvb2wgaXNfcmVtb3VudCkKPiA+ICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4gPiAg ICAgICB9Cj4gPgo+ID4gKyAgICAgaWYgKHRlc3Rfb3B0KHNiaSwgRElTQUJMRV9DSEVDS1BPSU5U KSAmJgo+ID4gKyAgICAgICAgICAgICAgICAgICAgIHRlc3Rfb3B0KHNiaSwgTUVSR0VfQ0hFQ0tQ T0lOVCkpIHsKPiA+ICsgICAgICAgICAgICAgZjJmc19lcnIoc2JpLCAiY2hlY2twb2ludD1tZXJn ZSBjYW5ub3QgYmUgdXNlZCB3aXRoIGNoZWNrcG9pbnQ9ZGlzYWJsZVxuIik7Cj4gPiArICAgICAg ICAgICAgIHJldHVybiAtRUlOVkFMOwo+ID4gKyAgICAgfQo+ID4gKwo+ID4gICAgICAgLyogTm90 IHBhc3MgZG93biB3cml0ZSBoaW50cyBpZiB0aGUgbnVtYmVyIG9mIGFjdGl2ZSBsb2dzIGlzIGxl c3Nlcgo+ID4gICAgICAgICogdGhhbiBOUl9DVVJTRUdfUEVSU0lTVF9UWVBFLgo+ID4gICAgICAg ICovCj4gPiBAQCAtMTI0NSw2ICsxMjU2LDEyIEBAIHN0YXRpYyB2b2lkIGYyZnNfcHV0X3N1cGVy KHN0cnVjdCBzdXBlcl9ibG9jayAqc2IpCj4gPiAgICAgICAvKiBwcmV2ZW50IHJlbWFpbmluZyBz aHJpbmtlciBqb2JzICovCj4gPiAgICAgICBtdXRleF9sb2NrKCZzYmktPnVtb3VudF9tdXRleCk7 Cj4gPgo+ID4gKyAgICAgLyoKPiA+ICsgICAgICAqIGZsdXNoIGFsbCBpc3N1ZWQgY2hlY2twb2lu dHMgYW5kIHN0b3AgY2hlY2twb2ludCBpc3N1ZSB0aHJlYWQuCj4gPiArICAgICAgKiBhZnRlciB0 aGVuLCBhbGwgY2hlY2twb2ludHMgc2hvdWxkIGJlIGRvbmUgYnkgZWFjaCBwcm9jZXNzIGNvbnRl eHQuCj4gPiArICAgICAgKi8KPiA+ICsgICAgIGYyZnNfc3RvcF9ja3B0X3RocmVhZChzYmkpOwo+ ID4gKwo+ID4gICAgICAgLyoKPiA+ICAgICAgICAqIFdlIGRvbid0IG5lZWQgdG8gZG8gY2hlY2tw b2ludCB3aGVuIHN1cGVyYmxvY2sgaXMgY2xlYW4uCj4gPiAgICAgICAgKiBCdXQsIHRoZSBwcmV2 aW91cyBjaGVja3BvaW50IHdhcyBub3QgZG9uZSBieSB1bW91bnQsIGl0IG5lZWRzIHRvIGRvCj4g PiBAQCAtMTM0NywxMCArMTM2NCwxMyBAQCBpbnQgZjJmc19zeW5jX2ZzKHN0cnVjdCBzdXBlcl9i bG9jayAqc2IsIGludCBzeW5jKQo+ID4gICAgICAgICAgICAgICBzdHJ1Y3QgY3BfY29udHJvbCBj cGM7Cj4gPgo+ID4gICAgICAgICAgICAgICBjcGMucmVhc29uID0gX19nZXRfY3BfcmVhc29uKHNi aSk7Cj4gPiAtCj4gPiAtICAgICAgICAgICAgIGRvd25fd3JpdGUoJnNiaS0+Z2NfbG9jayk7Cj4g PiAtICAgICAgICAgICAgIGVyciA9IGYyZnNfd3JpdGVfY2hlY2twb2ludChzYmksICZjcGMpOwo+ ID4gLSAgICAgICAgICAgICB1cF93cml0ZSgmc2JpLT5nY19sb2NrKTsKPiA+ICsgICAgICAgICAg ICAgaWYgKHRlc3Rfb3B0KHNiaSwgTUVSR0VfQ0hFQ0tQT0lOVCkgJiYgY3BjLnJlYXNvbiA9PSBD UF9TWU5DKSB7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgZXJyID0gZjJmc19pc3N1ZV9jaGVj a3BvaW50KHNiaSk7Cj4gPiArICAgICAgICAgICAgIH0gZWxzZSB7Cj4gPiArICAgICAgICAgICAg ICAgICAgICAgZG93bl93cml0ZSgmc2JpLT5nY19sb2NrKTsKPiA+ICsgICAgICAgICAgICAgICAg ICAgICBlcnIgPSBmMmZzX3dyaXRlX2NoZWNrcG9pbnQoc2JpLCAmY3BjKTsKPiA+ICsgICAgICAg ICAgICAgICAgICAgICB1cF93cml0ZSgmc2JpLT5nY19sb2NrKTsKPiA+ICsgICAgICAgICAgICAg fQo+Cj4gV2h5IG5vdCBtZXJnaW5nIGFib3ZlIGxvZ2ljIGludG8gZjJmc19pc3N1ZV9jaGVja3Bv aW50KCksIHNvIGhlcmUsIHdlIGNhbiBqdXN0Cj4gY2FsbCBmMmZzX2lzc3VlX2NoZWNrcG9pbnQo KSwgdGhlbiB0aGUgY29kZSB3b3VsZCBiZSBtb3JlIGNsZWFuIGhlcmUuCj4KPiBUaGFua3MsCj4K ClN1cmV+Cgo+ID4gICAgICAgfQo+ID4gICAgICAgZjJmc190cmFjZV9pb3MoTlVMTCwgMSk7Cj4g Pgo+ID4gQEAgLTE2NzQsNiArMTY5NCw4IEBAIHN0YXRpYyBpbnQgZjJmc19zaG93X29wdGlvbnMo c3RydWN0IHNlcV9maWxlICpzZXEsIHN0cnVjdCBkZW50cnkgKnJvb3QpCj4gPiAgICAgICBpZiAo dGVzdF9vcHQoc2JpLCBESVNBQkxFX0NIRUNLUE9JTlQpKQo+ID4gICAgICAgICAgICAgICBzZXFf cHJpbnRmKHNlcSwgIixjaGVja3BvaW50PWRpc2FibGU6JXUiLAo+ID4gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgRjJGU19PUFRJT04oc2JpKS51bnVzYWJsZV9jYXApOwo+ID4gKyAgICAg aWYgKHRlc3Rfb3B0KHNiaSwgTUVSR0VfQ0hFQ0tQT0lOVCkpCj4gPiArICAgICAgICAgICAgIHNl cV9wdXRzKHNlcSwgIixjaGVja3BvaW50PW1lcmdlIik7Cj4gPiAgICAgICBpZiAoRjJGU19PUFRJ T04oc2JpKS5mc3luY19tb2RlID09IEZTWU5DX01PREVfUE9TSVgpCj4gPiAgICAgICAgICAgICAg IHNlcV9wcmludGYoc2VxLCAiLGZzeW5jX21vZGU9JXMiLCAicG9zaXgiKTsKPiA+ICAgICAgIGVs c2UgaWYgKEYyRlNfT1BUSU9OKHNiaSkuZnN5bmNfbW9kZSA9PSBGU1lOQ19NT0RFX1NUUklDVCkK PiA+IEBAIC0xOTU0LDYgKzE5NzYsMTggQEAgc3RhdGljIGludCBmMmZzX3JlbW91bnQoc3RydWN0 IHN1cGVyX2Jsb2NrICpzYiwgaW50ICpmbGFncywgY2hhciAqZGF0YSkKPiA+ICAgICAgICAgICAg ICAgfQo+ID4gICAgICAgfQo+ID4KPiA+ICsgICAgIGlmICghdGVzdF9vcHQoc2JpLCBNRVJHRV9D SEVDS1BPSU5UKSkgewo+ID4gKyAgICAgICAgICAgICBmMmZzX3N0b3BfY2twdF90aHJlYWQoc2Jp KTsKPiA+ICsgICAgIH0gZWxzZSB7Cj4gPiArICAgICAgICAgICAgIGVyciA9IGYyZnNfc3RhcnRf Y2twdF90aHJlYWQoc2JpKTsKPiA+ICsgICAgICAgICAgICAgaWYgKGVycikgewo+ID4gKyAgICAg ICAgICAgICAgICAgICAgIGYyZnNfZXJyKHNiaSwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgIkZhaWxlZCB0byBzdGFydCBGMkZTIGlzc3VlX2NoZWNrcG9pbnRfdGhyZWFkICglZCkiLAo+ ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwo+ID4gKyAgICAgICAgICAgICAgICAg ICAgIGdvdG8gcmVzdG9yZV9nYzsKPiA+ICsgICAgICAgICAgICAgfQo+ID4gKyAgICAgfQo+ID4g Kwo+ID4gICAgICAgLyoKPiA+ICAgICAgICAqIFdlIHN0b3AgaXNzdWUgZmx1c2ggdGhyZWFkIGlm IEZTIGlzIG1vdW50ZWQgYXMgUk8KPiA+ICAgICAgICAqIG9yIGlmIGZsdXNoX21lcmdlIGlzIG5v dCBwYXNzZWQgaW4gbW91bnQgb3B0aW9uLgo+ID4gQEAgLTM3MDEsNiArMzczNSwxOCBAQCBzdGF0 aWMgaW50IGYyZnNfZmlsbF9zdXBlcihzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRh LCBpbnQgc2lsZW50KQo+ID4KPiA+ICAgICAgIGYyZnNfaW5pdF9mc3luY19ub2RlX2luZm8oc2Jp KTsKPiA+Cj4gPiArICAgICAvKiBzZXR1cCBjaGVja3BvaW50IHJlcXVlc3QgY29udHJvbCBhbmQg c3RhcnQgY2hlY2twb2ludCBpc3N1ZSB0aHJlYWQgKi8KPiA+ICsgICAgIGYyZnNfaW5pdF9ja3B0 X3JlcV9jb250cm9sKHNiaSk7Cj4gPiArICAgICBpZiAodGVzdF9vcHQoc2JpLCBNRVJHRV9DSEVD S1BPSU5UKSkgewo+ID4gKyAgICAgICAgICAgICBlcnIgPSBmMmZzX3N0YXJ0X2NrcHRfdGhyZWFk KHNiaSk7Cj4gPiArICAgICAgICAgICAgIGlmIChlcnIpIHsKPiA+ICsgICAgICAgICAgICAgICAg ICAgICBmMmZzX2VycihzYmksCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQg dG8gc3RhcnQgRjJGUyBpc3N1ZV9jaGVja3BvaW50X3RocmVhZCAoJWQpIiwKPiA+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgZXJyKTsKPiA+ICsgICAgICAgICAgICAgICAgICAgICBnb3RvIHN0 b3BfY2twdF90aHJlYWQ7Cj4gPiArICAgICAgICAgICAgIH0KPiA+ICsgICAgIH0KPiA+ICsKPiA+ ICAgICAgIC8qIHNldHVwIGYyZnMgaW50ZXJuYWwgbW9kdWxlcyAqLwo+ID4gICAgICAgZXJyID0g ZjJmc19idWlsZF9zZWdtZW50X21hbmFnZXIoc2JpKTsKPiA+ICAgICAgIGlmIChlcnIpIHsKPiA+ IEBAIC0zOTEwLDYgKzM5NTYsOCBAQCBzdGF0aWMgaW50IGYyZnNfZmlsbF9zdXBlcihzdHJ1Y3Qg c3VwZXJfYmxvY2sgKnNiLCB2b2lkICpkYXRhLCBpbnQgc2lsZW50KQo+ID4gICBmcmVlX3NtOgo+ ID4gICAgICAgZjJmc19kZXN0cm95X3NlZ21lbnRfbWFuYWdlcihzYmkpOwo+ID4gICAgICAgZjJm c19kZXN0cm95X3Bvc3RfcmVhZF93cShzYmkpOwo+ID4gK3N0b3BfY2twdF90aHJlYWQ6Cj4gPiAr ICAgICBmMmZzX3N0b3BfY2twdF90aHJlYWQoc2JpKTsKPiA+ICAgZnJlZV9kZXZpY2VzOgo+ID4g ICAgICAgZGVzdHJveV9kZXZpY2VfbGlzdChzYmkpOwo+ID4gICAgICAga3ZmcmVlKHNiaS0+Y2tw dCk7Cj4gPgoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f CkxpbnV4LWYyZnMtZGV2ZWwgbWFpbGluZyBsaXN0CkxpbnV4LWYyZnMtZGV2ZWxAbGlzdHMuc291 cmNlZm9yZ2UubmV0Cmh0dHBzOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZv L2xpbnV4LWYyZnMtZGV2ZWwK