From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from out-173.mta0.migadu.com (out-173.mta0.migadu.com [91.218.175.173]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7E86236D for ; Fri, 26 Jul 2024 08:55:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.173 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1721984131; cv=none; b=dQ4CJI4Ku8ntizN5zfdcpeeQSJCTuwQAWHM7L09JuXivI+DNzgTNxfK0jkH+IEk6sdeGNrS6Ma0pd036pnbzTvoiPBeNGiny1CvFRmpcn18gqb0YHIuLpZwrkSseiAcZVl6+7vESdKSffkze0rdNuVfPew3ooqlpJYjP7YTCDYQ= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1721984131; c=relaxed/simple; bh=fP3d69/vHcTaORHzZFRTQ6Zyh+2ELxk8iATuXlkTVEE=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=qAXFAWaqEGF5aOu0sq0tM8dqdeFzlYZOdtIWtexfSxO3ueniepjP+/pkyqoB/RrFIgef4niED2dwT3Cqtrrg2hb/Ll3TU+nhZKBfy3a8QBl+18CFbtbmcg/Ie68h8zjzw5l9/vZlEeuDhrZ+7JlS0g1DQ7S79LDH4W4rfaRN9E8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=LoFQJ86K; arc=none smtp.client-ip=91.218.175.173 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="LoFQJ86K" Message-ID: <91bfea9b-ad7e-4f35-a2c1-8cd41499b0c0@linux.dev> DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1721984126; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ZlVwEHdSTyrlIDdQzITPVaoCS4YDBm7tqpKVUXKTPXI=; b=LoFQJ86KnzbWOA0BZypsF3EXyxQw6jJ1mLub2Aw3bnaIhhHbtybJLq3MBCNJVLGnp+fGnN 7IQ0iO81RyOEVAGOiGXSDF/lFCoqjQmMIwLCd5pPs1oJTClopB4+foHPtsop6GGzbgUOdM bDGV+Zaw15OJHrB0CHU4ktOtXRHWWak= Date: Fri, 26 Jul 2024 16:54:59 +0800 Precedence: bulk X-Mailing-List: linux-arch@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Subject: Re: [PATCH 1/4] module: Add module_subinit{_noexit} and module_subeixt helper macros To: Christoph Hellwig , kreijack@inwind.it Cc: Arnd Bergmann , Luis Chamberlain , Chris Mason , Josef Bacik , David Sterba , Theodore Ts'o , Andreas Dilger , Jaegeuk Kim , Chao Yu , Linux-Arch , linux-kernel@vger.kernel.org, linux-modules@vger.kernel.org, linux-btrfs@vger.kernel.org, linux-ext4@vger.kernel.org, linux-f2fs-devel@lists.sourceforge.net, Youling Tang References: <20240723083239.41533-1-youling.tang@linux.dev> <20240723083239.41533-2-youling.tang@linux.dev> <0a63dfd1-ead3-4db3-a38c-2bc1db65f354@linux.dev> <895360e3-97bb-4188-a91d-eaca3302bd43@linux.dev> <61beb54b-399b-442d-bfdb-bad23cefa586@app.fastmail.com> <68584887-3dec-4ce5-8892-86af50651c41@libero.it> Content-Language: en-US, en-AU X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. From: Youling Tang In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Migadu-Flow: FLOW_OUT On 26/07/2024 03:46, Christoph Hellwig wrote: > On Thu, Jul 25, 2024 at 07:14:14PM +0200, Goffredo Baroncelli wrote: >> Instead of relying to the "expected" order of the compiler/linker, >> why doesn't manage the chain explicitly ? Something like: > Because that doesn't actually solve anything over simple direct calls > as you still need the symbols to be global? > > As an example here is a very hacky patch that just compiles with unused > variable warnings and doesn't work at all to show how the distributed > module_subinit would improve ext4, the file system with the least > subinit calls of the three converted in the series, and without any > extra cleanups like removing now unneded includes or moving more stuff > into subinits if they can remain entirely static that way: > > 11 files changed, 61 insertions(+), 114 deletions(-) > > diff --git a/fs/ext4/block_validity.c b/fs/ext4/block_validity.c > index 87ee3a17bd29c9..87f0ccd06fc069 100644 > --- a/fs/ext4/block_validity.c > +++ b/fs/ext4/block_validity.c > @@ -29,7 +29,7 @@ struct ext4_system_zone { > > static struct kmem_cache *ext4_system_zone_cachep; > > -int __init ext4_init_system_zone(void) > +static int __init ext4_init_system_zone(void) > { > ext4_system_zone_cachep = KMEM_CACHE(ext4_system_zone, 0); > if (ext4_system_zone_cachep == NULL) > @@ -37,11 +37,12 @@ int __init ext4_init_system_zone(void) > return 0; > } > > -void ext4_exit_system_zone(void) > +static void ext4_exit_system_zone(void) > { > rcu_barrier(); > kmem_cache_destroy(ext4_system_zone_cachep); > } > +module_subinit(ext4_init_system_zone, ext4_exit_system_zone); > > static inline int can_merge(struct ext4_system_zone *entry1, > struct ext4_system_zone *entry2) > diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h > index 08acd152261ed8..db81f18cdc3266 100644 > --- a/fs/ext4/ext4.h > +++ b/fs/ext4/ext4.h > @@ -2915,8 +2915,6 @@ void ext4_fc_del(struct inode *inode); > bool ext4_fc_replay_check_excluded(struct super_block *sb, ext4_fsblk_t block); > void ext4_fc_replay_cleanup(struct super_block *sb); > int ext4_fc_commit(journal_t *journal, tid_t commit_tid); > -int __init ext4_fc_init_dentry_cache(void); > -void ext4_fc_destroy_dentry_cache(void); > int ext4_fc_record_regions(struct super_block *sb, int ino, > ext4_lblk_t lblk, ext4_fsblk_t pblk, > int len, int replay); > @@ -2930,8 +2928,6 @@ extern void ext4_mb_release(struct super_block *); > extern ext4_fsblk_t ext4_mb_new_blocks(handle_t *, > struct ext4_allocation_request *, int *); > extern void ext4_discard_preallocations(struct inode *); > -extern int __init ext4_init_mballoc(void); > -extern void ext4_exit_mballoc(void); > extern ext4_group_t ext4_mb_prefetch(struct super_block *sb, > ext4_group_t group, > unsigned int nr, int *cnt); > @@ -3651,8 +3647,6 @@ static inline void ext4_set_de_type(struct super_block *sb, > /* readpages.c */ > extern int ext4_mpage_readpages(struct inode *inode, > struct readahead_control *rac, struct folio *folio); > -extern int __init ext4_init_post_read_processing(void); > -extern void ext4_exit_post_read_processing(void); > > /* symlink.c */ > extern const struct inode_operations ext4_encrypted_symlink_inode_operations; > @@ -3663,14 +3657,10 @@ extern const struct inode_operations ext4_fast_symlink_inode_operations; > extern void ext4_notify_error_sysfs(struct ext4_sb_info *sbi); > extern int ext4_register_sysfs(struct super_block *sb); > extern void ext4_unregister_sysfs(struct super_block *sb); > -extern int __init ext4_init_sysfs(void); > -extern void ext4_exit_sysfs(void); > > /* block_validity */ > extern void ext4_release_system_zone(struct super_block *sb); > extern int ext4_setup_system_zone(struct super_block *sb); > -extern int __init ext4_init_system_zone(void); > -extern void ext4_exit_system_zone(void); > extern int ext4_inode_block_valid(struct inode *inode, > ext4_fsblk_t start_blk, > unsigned int count); > @@ -3750,8 +3740,6 @@ extern int ext4_move_extents(struct file *o_filp, struct file *d_filp, > __u64 len, __u64 *moved_len); > > /* page-io.c */ > -extern int __init ext4_init_pageio(void); > -extern void ext4_exit_pageio(void); > extern ext4_io_end_t *ext4_init_io_end(struct inode *inode, gfp_t flags); > extern ext4_io_end_t *ext4_get_io_end(ext4_io_end_t *io_end); > extern int ext4_put_io_end(ext4_io_end_t *io_end); > diff --git a/fs/ext4/extents_status.c b/fs/ext4/extents_status.c > index 17dcf13adde275..d381ec88441ffd 100644 > --- a/fs/ext4/extents_status.c > +++ b/fs/ext4/extents_status.c > @@ -156,19 +156,6 @@ static int __revise_pending(struct inode *inode, ext4_lblk_t lblk, > ext4_lblk_t len, > struct pending_reservation **prealloc); > > -int __init ext4_init_es(void) > -{ > - ext4_es_cachep = KMEM_CACHE(extent_status, SLAB_RECLAIM_ACCOUNT); > - if (ext4_es_cachep == NULL) > - return -ENOMEM; > - return 0; > -} > - > -void ext4_exit_es(void) > -{ > - kmem_cache_destroy(ext4_es_cachep); > -} > - > void ext4_es_init_tree(struct ext4_es_tree *tree) > { > tree->root = RB_ROOT; > @@ -1883,18 +1870,25 @@ static void ext4_print_pending_tree(struct inode *inode) > #define ext4_print_pending_tree(inode) > #endif > > -int __init ext4_init_pending(void) > +static int __init ext4_init_es(void) > { > ext4_pending_cachep = KMEM_CACHE(pending_reservation, SLAB_RECLAIM_ACCOUNT); > if (ext4_pending_cachep == NULL) > return -ENOMEM; > + ext4_es_cachep = KMEM_CACHE(extent_status, SLAB_RECLAIM_ACCOUNT); > + if (ext4_es_cachep == NULL) { > + kmem_cache_destroy(ext4_pending_cachep); > + return -ENOMEM; > + } > return 0; > } > > -void ext4_exit_pending(void) > +static void ext4_exit_es(void) > { > + kmem_cache_destroy(ext4_es_cachep); > kmem_cache_destroy(ext4_pending_cachep); > } > +module_subinit(ext4_init_es, ext4_exit_es); > > void ext4_init_pending_tree(struct ext4_pending_tree *tree) > { > diff --git a/fs/ext4/extents_status.h b/fs/ext4/extents_status.h > index 3c8e2edee5d5d1..1cdb25c3d2dae5 100644 > --- a/fs/ext4/extents_status.h > +++ b/fs/ext4/extents_status.h > @@ -123,8 +123,6 @@ struct ext4_pending_tree { > struct rb_root root; > }; > > -extern int __init ext4_init_es(void); > -extern void ext4_exit_es(void); > extern void ext4_es_init_tree(struct ext4_es_tree *tree); > > extern void ext4_es_insert_extent(struct inode *inode, ext4_lblk_t lblk, > @@ -244,8 +242,6 @@ extern void ext4_es_unregister_shrinker(struct ext4_sb_info *sbi); > > extern int ext4_seq_es_shrinker_info_show(struct seq_file *seq, void *v); > > -extern int __init ext4_init_pending(void); > -extern void ext4_exit_pending(void); > extern void ext4_init_pending_tree(struct ext4_pending_tree *tree); > extern void ext4_remove_pending(struct inode *inode, ext4_lblk_t lblk); > extern bool ext4_is_pending(struct inode *inode, ext4_lblk_t lblk); > diff --git a/fs/ext4/fast_commit.c b/fs/ext4/fast_commit.c > index 3926a05eceeed1..b28930c4175cca 100644 > --- a/fs/ext4/fast_commit.c > +++ b/fs/ext4/fast_commit.c > @@ -2293,7 +2293,7 @@ int ext4_fc_info_show(struct seq_file *seq, void *v) > return 0; > } > > -int __init ext4_fc_init_dentry_cache(void) > +static int __init ext4_fc_init_dentry_cache(void) > { > ext4_fc_dentry_cachep = KMEM_CACHE(ext4_fc_dentry_update, > SLAB_RECLAIM_ACCOUNT); > @@ -2304,7 +2304,8 @@ int __init ext4_fc_init_dentry_cache(void) > return 0; > } > > -void ext4_fc_destroy_dentry_cache(void) > +static void ext4_fc_destroy_dentry_cache(void) > { > kmem_cache_destroy(ext4_fc_dentry_cachep); > } > +module_subinit(ext4_fc_init_dentry_cache, ext4_fc_destroy_dentry_cache); > diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c > index 9dda9cd68ab2f5..a564882432b8ff 100644 > --- a/fs/ext4/mballoc.c > +++ b/fs/ext4/mballoc.c > @@ -3936,7 +3936,7 @@ void ext4_process_freed_data(struct super_block *sb, tid_t commit_tid) > } > } > > -int __init ext4_init_mballoc(void) > +static int __init ext4_init_mballoc(void) > { > ext4_pspace_cachep = KMEM_CACHE(ext4_prealloc_space, > SLAB_RECLAIM_ACCOUNT); > @@ -3963,7 +3963,7 @@ int __init ext4_init_mballoc(void) > return -ENOMEM; > } > > -void ext4_exit_mballoc(void) > +static void ext4_exit_mballoc(void) > { > /* > * Wait for completion of call_rcu()'s on ext4_pspace_cachep > @@ -3975,6 +3975,7 @@ void ext4_exit_mballoc(void) > kmem_cache_destroy(ext4_free_data_cachep); > ext4_groupinfo_destroy_slabs(); > } > +module_subinit(ext4_init_mballoc, ext4_exit_mballoc); > > #define EXT4_MB_BITMAP_MARKED_CHECK 0x0001 > #define EXT4_MB_SYNC_UPDATE 0x0002 > diff --git a/fs/ext4/page-io.c b/fs/ext4/page-io.c > index ad5543866d2152..68639d5553080a 100644 > --- a/fs/ext4/page-io.c > +++ b/fs/ext4/page-io.c > @@ -33,7 +33,7 @@ > static struct kmem_cache *io_end_cachep; > static struct kmem_cache *io_end_vec_cachep; > > -int __init ext4_init_pageio(void) > +static int __init ext4_init_pageio(void) > { > io_end_cachep = KMEM_CACHE(ext4_io_end, SLAB_RECLAIM_ACCOUNT); > if (io_end_cachep == NULL) > @@ -47,11 +47,12 @@ int __init ext4_init_pageio(void) > return 0; > } > > -void ext4_exit_pageio(void) > +static void ext4_exit_pageio(void) > { > kmem_cache_destroy(io_end_cachep); > kmem_cache_destroy(io_end_vec_cachep); > } > +module_subinit(ext4_init_pageio, ext4_exit_pageio); > > struct ext4_io_end_vec *ext4_alloc_io_end_vec(ext4_io_end_t *io_end) > { > diff --git a/fs/ext4/readpage.c b/fs/ext4/readpage.c > index 8494492582abea..5fa7329c571b42 100644 > --- a/fs/ext4/readpage.c > +++ b/fs/ext4/readpage.c > @@ -390,7 +390,7 @@ int ext4_mpage_readpages(struct inode *inode, > return 0; > } > > -int __init ext4_init_post_read_processing(void) > +static int __init ext4_init_post_read_processing(void) > { > bio_post_read_ctx_cache = KMEM_CACHE(bio_post_read_ctx, SLAB_RECLAIM_ACCOUNT); > > @@ -409,8 +409,9 @@ int __init ext4_init_post_read_processing(void) > return -ENOMEM; > } > > -void ext4_exit_post_read_processing(void) > +static void ext4_exit_post_read_processing(void) > { > mempool_destroy(bio_post_read_ctx_pool); > kmem_cache_destroy(bio_post_read_ctx_cache); > } > +module_subinit(ext4_init_post_read_processing, ext4_exit_post_read_processing); > diff --git a/fs/ext4/super.c b/fs/ext4/super.c > index 207076e7e7f055..bb6a87da00ea8c 100644 > --- a/fs/ext4/super.c > +++ b/fs/ext4/super.c > @@ -1484,29 +1484,6 @@ static void init_once(void *foo) > ext4_fc_init_inode(&ei->vfs_inode); > } > > -static int __init init_inodecache(void) > -{ > - ext4_inode_cachep = kmem_cache_create_usercopy("ext4_inode_cache", > - sizeof(struct ext4_inode_info), 0, > - SLAB_RECLAIM_ACCOUNT | SLAB_ACCOUNT, > - offsetof(struct ext4_inode_info, i_data), > - sizeof_field(struct ext4_inode_info, i_data), > - init_once); > - if (ext4_inode_cachep == NULL) > - return -ENOMEM; > - return 0; > -} > - > -static void destroy_inodecache(void) > -{ > - /* > - * Make sure all delayed rcu free inodes are flushed before we > - * destroy cache. > - */ > - rcu_barrier(); > - kmem_cache_destroy(ext4_inode_cachep); > -} > - > void ext4_clear_inode(struct inode *inode) > { > ext4_fc_del(inode); > @@ -7302,33 +7279,13 @@ static struct file_system_type ext4_fs_type = { > }; > MODULE_ALIAS_FS("ext4"); > > -static int register_ext(void) > -{ > - register_as_ext3(); > - register_as_ext2(); > - return register_filesystem(&ext4_fs_type); > -} > - > -static void unregister_ext(void) > -{ > - unregister_as_ext2(); > - unregister_as_ext3(); > - unregister_filesystem(&ext4_fs_type); > -} > - > -static struct subexitcall_rollback rollback; > - > -static void __exit ext4_exit_fs(void) > -{ > - ext4_destroy_lazyinit_thread(); > - module_subexit(&rollback); > -} > - > /* Shared across all ext4 file systems */ > wait_queue_head_t ext4__ioend_wq[EXT4_WQ_HASH_SZ]; > > static int __init ext4_init_fs(void) > { > + int error; > + > ratelimit_state_init(&ext4_mount_msg_ratelimit, 30 * HZ, 64); > ext4_li_info = NULL; > > @@ -7338,23 +7295,40 @@ static int __init ext4_init_fs(void) > for (int i = 0; i < EXT4_WQ_HASH_SZ; i++) > init_waitqueue_head(&ext4__ioend_wq[i]); > > - module_subinit(ext4_init_es, ext4_exit_es, &rollback); > - module_subinit(ext4_init_pending, ext4_exit_pending, &rollback); > - module_subinit(ext4_init_post_read_processing, ext4_exit_post_read_processing, &rollback); > - module_subinit(ext4_init_pageio, ext4_exit_pageio, &rollback); > - module_subinit(ext4_init_system_zone, ext4_exit_system_zone, &rollback); > - module_subinit(ext4_init_sysfs, ext4_exit_sysfs, &rollback); > - module_subinit(ext4_init_mballoc, ext4_exit_mballoc, &rollback); > - module_subinit(init_inodecache, destroy_inodecache, &rollback); > - module_subinit(ext4_fc_init_dentry_cache, ext4_fc_destroy_dentry_cache, &rollback); > - module_subinit(register_ext, unregister_ext, &rollback); > + ext4_inode_cachep = kmem_cache_create_usercopy("ext4_inode_cache", > + sizeof(struct ext4_inode_info), 0, > + SLAB_RECLAIM_ACCOUNT | SLAB_ACCOUNT, > + offsetof(struct ext4_inode_info, i_data), > + sizeof_field(struct ext4_inode_info, i_data), > + init_once); > + if (ext4_inode_cachep == NULL) > + return -ENOMEM; > > - return 0; > + register_as_ext3(); > + register_as_ext2(); > + error = register_filesystem(&ext4_fs_type); > + if (error) > + kmem_cache_destroy(ext4_inode_cachep); > + return error; > +} > + > +static void __exit ext4_exit_fs(void) > +{ > + ext4_destroy_lazyinit_thread(); > + unregister_as_ext2(); > + unregister_as_ext3(); > + unregister_filesystem(&ext4_fs_type); > + > + /* > + * Make sure all delayed rcu free inodes are flushed before we > + * destroy cache. > + */ > + rcu_barrier(); > + kmem_cache_destroy(ext4_inode_cachep); > } > +module_subinit(ext4_init_fs, ext4_exit_fs); > > MODULE_AUTHOR("Remy Card, Stephen Tweedie, Andrew Morton, Andreas Dilger, Theodore Ts'o and others"); > MODULE_DESCRIPTION("Fourth Extended Filesystem"); > MODULE_LICENSE("GPL"); > MODULE_SOFTDEP("pre: crc32c"); > -module_init(ext4_init_fs) > -module_exit(ext4_exit_fs) > diff --git a/fs/ext4/sysfs.c b/fs/ext4/sysfs.c > index ddb54608ca2ef6..df3096a9e6e39a 100644 > --- a/fs/ext4/sysfs.c > +++ b/fs/ext4/sysfs.c > @@ -601,7 +601,7 @@ void ext4_unregister_sysfs(struct super_block *sb) > kobject_del(&sbi->s_kobj); > } > > -int __init ext4_init_sysfs(void) > +static int __init ext4_init_sysfs(void) > { > int ret; > > @@ -632,7 +632,7 @@ int __init ext4_init_sysfs(void) > return ret; > } > > -void ext4_exit_sysfs(void) > +static void ext4_exit_sysfs(void) > { > kobject_put(ext4_feat); > ext4_feat = NULL; > @@ -641,4 +641,4 @@ void ext4_exit_sysfs(void) > remove_proc_entry(proc_dirname, NULL); > ext4_proc_root = NULL; > } > - > +module_subinit(ext4_init_sysfs, ext4_exit_sysfs); > diff --git a/include/linux/module.h b/include/linux/module.h > index 95f7c60dede9a4..3099fb2c3d813b 100644 > --- a/include/linux/module.h > +++ b/include/linux/module.h > @@ -80,23 +80,13 @@ extern void cleanup_module(void); > * module_subinit() - Called when the driver is subinitialized > * @initfn: The subinitialization function that is called > * @exitfn: Corresponding exit function > - * @rollback: Record information when the subinitialization failed > - * or the driver was removed > * > * Use module_subinit_noexit() when there is only an subinitialization > * function but no corresponding exit function. > */ > -#define module_subinit(initfn, exitfn, rollback) \ > - __subinitcall(initfn, exitfn, rollback); > +#define module_subinit(initfn, exitfn) > > -#define module_subinit_noexit(initfn, rollback) \ > - __subinitcall_noexit(initfn, rollback); > - > -/* > - * module_subexit() - Called when the driver exits > - */ > -#define module_subexit(rollback) \ > - __subexitcall_rollback(rollback); > +#define module_subinit_noexit(initfn) > > #ifndef MODULE > /** Based on this patch, we may need to do these things with this implementation, 1. Change the order of *.o in the Makefile (the same order as before the change) ``` --- a/fs/ext4/Makefile +++ b/fs/ext4/Makefile @@ -5,12 +5,16 @@  obj-$(CONFIG_EXT4_FS) += ext4.o -ext4-y := balloc.o bitmap.o block_validity.o dir.o ext4_jbd2.o extents.o \ -               extents_status.o file.o fsmap.o fsync.o hash.o ialloc.o \ -               indirect.o inline.o inode.o ioctl.o mballoc.o migrate.o \ -               mmp.o move_extent.o namei.o page-io.o readpage.o resize.o \ -               super.o symlink.o sysfs.o xattr.o xattr_hurd.o xattr_trusted.o \ -               xattr_user.o fast_commit.o orphan.o +ext4-y := balloc.o bitmap.o dir.o ext4_jbd2.o extents.o \ +               file.o fsmap.o fsync.o hash.o ialloc.o \ +               indirect.o inline.o inode.o ioctl.o migrate.o \ +               mmp.o move_extent.o namei.o resize.o \ +               symlink.o xattr.o xattr_hurd.o xattr_trusted.o \ +               xattr_user.o orphan.o + +# Ensure the linking order for module_subinit +ext4-y += extents_status.o readpage.o page-io.o block_validity.o sysfs.o \ +               mballoc.o fast_commit.o super.o ``` 2. We need to define module_subinit through the ifdef MODULE distinction, - build-in mode: Need to be defined as: define module_subinit(initfn, exitfn)                                         \        static subinitcall_t __subinitcall_##initfn __subinit_call = initfn;   \        static subexitcall_t __subexitcall_##exitfn __subexit_call = exitfn; Cannot be defined as: define module_subinit(initfn, exitfn)                                         \        static subinitcall_t __subinitcall_##initfn __subinit_call = initfn;   \        static subexitcall_t __subexitcall_##exitfn __subexit_call = exitfn;   \        initfn(); module_subinit defines only __subinitcall_{initfn, exitfn} symbols to store initfn/exitfn addresses.initfn cannot be run directly (functions cannot be run directly in non-code blocks), the initfn of all build-in modules needs to be executed together somewhere. When one of the subinit runs in a module fails, it is difficult to rollback execution of subexit. module_init does not have to do these things (each module has only one module_init), module_init executes fn through the following path, and even if fn fails, it only needs to return ret. do_initcalls   do_initcall_level     do_one_initcall       fn - .ko mode: Each module has multiple subinit and initfn cannot be run like module_init. That is, we cannot simply add a subinit member to a struct module and execute it via do_one_initcall(mod->subinit). 3. Another way to record the location of the failure is still needed to assist in rollback exitfn. 4. The order in which subinit is called is not intuitively known (although it can be found in the Makefile). Thanks, Youling. 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 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 smtp.lore.kernel.org (Postfix) with ESMTPS id A1BD9C3DA7F for ; Fri, 26 Jul 2024 08:55:45 +0000 (UTC) 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.95) (envelope-from ) id 1sXGjm-0007WI-P8; Fri, 26 Jul 2024 08:55:43 +0000 Received: from [172.30.29.67] (helo=mx.sourceforge.net) by sfs-ml-1.v29.lw.sourceforge.com with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.95) (envelope-from ) id 1sXGjj-0007Vc-Pe for linux-f2fs-devel@lists.sourceforge.net; Fri, 26 Jul 2024 08:55:40 +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:In-Reply-To: From:References:Cc:To:Subject:MIME-Version:Date:Message-ID: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=ZlVwEHdSTyrlIDdQzITPVaoCS4YDBm7tqpKVUXKTPXI=; b=XsnmzUV2VkLhOZ4J/Puc83N74F u30pQSQ8tYkcHd3rxnuutxZuzYkTkr7D/x/3t0HhRNOg/U0ASX3HeOcwCZLrCt3CbfJsl/wdTcy3T LZft7PT8o/DQ+d+M7Oonm903BueAAw2ZwNvspDkVNtNLUI2U8vIAXJlUPa7uo1o2Et6A=; DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=sf.net; s=x ; h=Content-Transfer-Encoding:Content-Type:In-Reply-To:From:References:Cc:To: Subject:MIME-Version:Date:Message-ID: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=ZlVwEHdSTyrlIDdQzITPVaoCS4YDBm7tqpKVUXKTPXI=; b=HR6jN/DASVDMiHJ74bMEPYwrY3 dlwYAs22TrpONuni5McBCW+32Dt13iTRroEKZGecabcoXkD05AiWrr5v6Y3NA/oszdhmdf0On9Wp+ DbxSwfTSqpaAB3V1epEQUOlMtwYd7xCo0XbkLze7W98s2ZC+wVZvRTudUbzf+5izRZTA=; Received: from out-172.mta0.migadu.com ([91.218.175.172]) by sfi-mx-2.v28.lw.sourceforge.com with esmtps (TLS1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.95) id 1sXGji-0004V7-0u for linux-f2fs-devel@lists.sourceforge.net; Fri, 26 Jul 2024 08:55:40 +0000 Message-ID: <91bfea9b-ad7e-4f35-a2c1-8cd41499b0c0@linux.dev> DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1721984126; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ZlVwEHdSTyrlIDdQzITPVaoCS4YDBm7tqpKVUXKTPXI=; b=LoFQJ86KnzbWOA0BZypsF3EXyxQw6jJ1mLub2Aw3bnaIhhHbtybJLq3MBCNJVLGnp+fGnN 7IQ0iO81RyOEVAGOiGXSDF/lFCoqjQmMIwLCd5pPs1oJTClopB4+foHPtsop6GGzbgUOdM bDGV+Zaw15OJHrB0CHU4ktOtXRHWWak= Date: Fri, 26 Jul 2024 16:54:59 +0800 MIME-Version: 1.0 To: Christoph Hellwig , kreijack@inwind.it References: <20240723083239.41533-1-youling.tang@linux.dev> <20240723083239.41533-2-youling.tang@linux.dev> <0a63dfd1-ead3-4db3-a38c-2bc1db65f354@linux.dev> <895360e3-97bb-4188-a91d-eaca3302bd43@linux.dev> <61beb54b-399b-442d-bfdb-bad23cefa586@app.fastmail.com> <68584887-3dec-4ce5-8892-86af50651c41@libero.it> Content-Language: en-US, en-AU X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. From: Youling Tang In-Reply-To: X-Migadu-Flow: FLOW_OUT X-Headers-End: 1sXGji-0004V7-0u Subject: Re: [f2fs-dev] [PATCH 1/4] module: Add module_subinit{_noexit} and module_subeixt helper macros 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: Linux-Arch , Youling Tang , linux-f2fs-devel@lists.sourceforge.net, Theodore Ts'o , Arnd Bergmann , Josef Bacik , linux-kernel@vger.kernel.org, Chris Mason , Luis Chamberlain , Andreas Dilger , linux-btrfs@vger.kernel.org, David Sterba , Jaegeuk Kim , linux-ext4@vger.kernel.org, linux-modules@vger.kernel.org Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: linux-f2fs-devel-bounces@lists.sourceforge.net T24gMjYvMDcvMjAyNCAwMzo0NiwgQ2hyaXN0b3BoIEhlbGx3aWcgd3JvdGU6Cj4gT24gVGh1LCBK dWwgMjUsIDIwMjQgYXQgMDc6MTQ6MTRQTSArMDIwMCwgR29mZnJlZG8gQmFyb25jZWxsaSB3cm90 ZToKPj4gSW5zdGVhZCBvZiByZWx5aW5nIHRvIHRoZSAiZXhwZWN0ZWQiIG9yZGVyIG9mIHRoZSBj b21waWxlci9saW5rZXIsCj4+IHdoeSBkb2Vzbid0IG1hbmFnZSB0aGUgY2hhaW4gZXhwbGljaXRs eSA/IFNvbWV0aGluZyBsaWtlOgo+IEJlY2F1c2UgdGhhdCBkb2Vzbid0IGFjdHVhbGx5IHNvbHZl IGFueXRoaW5nIG92ZXIgc2ltcGxlIGRpcmVjdCBjYWxscwo+IGFzIHlvdSBzdGlsbCBuZWVkIHRo ZSBzeW1ib2xzIHRvIGJlIGdsb2JhbD8KPgo+IEFzIGFuIGV4YW1wbGUgaGVyZSBpcyBhIHZlcnkg aGFja3kgcGF0Y2ggdGhhdCBqdXN0IGNvbXBpbGVzIHdpdGggdW51c2VkCj4gdmFyaWFibGUgd2Fy bmluZ3MgYW5kIGRvZXNuJ3Qgd29yayBhdCBhbGwgdG8gc2hvdyBob3cgdGhlIGRpc3RyaWJ1dGVk Cj4gbW9kdWxlX3N1YmluaXQgd291bGQgaW1wcm92ZSBleHQ0LCB0aGUgZmlsZSBzeXN0ZW0gd2l0 aCB0aGUgbGVhc3QKPiBzdWJpbml0IGNhbGxzIG9mIHRoZSB0aHJlZSBjb252ZXJ0ZWQgaW4gdGhl IHNlcmllcywgYW5kIHdpdGhvdXQgYW55Cj4gZXh0cmEgY2xlYW51cHMgbGlrZSByZW1vdmluZyBu b3cgdW5uZWRlZCBpbmNsdWRlcyBvciBtb3ZpbmcgbW9yZSBzdHVmZgo+IGludG8gc3ViaW5pdHMg aWYgdGhleSBjYW4gcmVtYWluIGVudGlyZWx5IHN0YXRpYyB0aGF0IHdheToKPgo+ICAgMTEgZmls ZXMgY2hhbmdlZCwgNjEgaW5zZXJ0aW9ucygrKSwgMTE0IGRlbGV0aW9ucygtKQo+Cj4gZGlmZiAt LWdpdCBhL2ZzL2V4dDQvYmxvY2tfdmFsaWRpdHkuYyBiL2ZzL2V4dDQvYmxvY2tfdmFsaWRpdHku Ywo+IGluZGV4IDg3ZWUzYTE3YmQyOWM5Li44N2YwY2NkMDZmYzA2OSAxMDA2NDQKPiAtLS0gYS9m cy9leHQ0L2Jsb2NrX3ZhbGlkaXR5LmMKPiArKysgYi9mcy9leHQ0L2Jsb2NrX3ZhbGlkaXR5LmMK PiBAQCAtMjksNyArMjksNyBAQCBzdHJ1Y3QgZXh0NF9zeXN0ZW1fem9uZSB7Cj4gICAKPiAgIHN0 YXRpYyBzdHJ1Y3Qga21lbV9jYWNoZSAqZXh0NF9zeXN0ZW1fem9uZV9jYWNoZXA7Cj4gICAKPiAt aW50IF9faW5pdCBleHQ0X2luaXRfc3lzdGVtX3pvbmUodm9pZCkKPiArc3RhdGljIGludCBfX2lu aXQgZXh0NF9pbml0X3N5c3RlbV96b25lKHZvaWQpCj4gICB7Cj4gICAJZXh0NF9zeXN0ZW1fem9u ZV9jYWNoZXAgPSBLTUVNX0NBQ0hFKGV4dDRfc3lzdGVtX3pvbmUsIDApOwo+ICAgCWlmIChleHQ0 X3N5c3RlbV96b25lX2NhY2hlcCA9PSBOVUxMKQo+IEBAIC0zNywxMSArMzcsMTIgQEAgaW50IF9f aW5pdCBleHQ0X2luaXRfc3lzdGVtX3pvbmUodm9pZCkKPiAgIAlyZXR1cm4gMDsKPiAgIH0KPiAg IAo+IC12b2lkIGV4dDRfZXhpdF9zeXN0ZW1fem9uZSh2b2lkKQo+ICtzdGF0aWMgdm9pZCBleHQ0 X2V4aXRfc3lzdGVtX3pvbmUodm9pZCkKPiAgIHsKPiAgIAlyY3VfYmFycmllcigpOwo+ICAgCWtt ZW1fY2FjaGVfZGVzdHJveShleHQ0X3N5c3RlbV96b25lX2NhY2hlcCk7Cj4gICB9Cj4gK21vZHVs ZV9zdWJpbml0KGV4dDRfaW5pdF9zeXN0ZW1fem9uZSwgZXh0NF9leGl0X3N5c3RlbV96b25lKTsK PiAgIAo+ICAgc3RhdGljIGlubGluZSBpbnQgY2FuX21lcmdlKHN0cnVjdCBleHQ0X3N5c3RlbV96 b25lICplbnRyeTEsCj4gICAJCSAgICAgc3RydWN0IGV4dDRfc3lzdGVtX3pvbmUgKmVudHJ5MikK PiBkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHQ0LmggYi9mcy9leHQ0L2V4dDQuaAo+IGluZGV4IDA4 YWNkMTUyMjYxZWQ4Li5kYjgxZjE4Y2RjMzI2NiAxMDA2NDQKPiAtLS0gYS9mcy9leHQ0L2V4dDQu aAo+ICsrKyBiL2ZzL2V4dDQvZXh0NC5oCj4gQEAgLTI5MTUsOCArMjkxNSw2IEBAIHZvaWQgZXh0 NF9mY19kZWwoc3RydWN0IGlub2RlICppbm9kZSk7Cj4gICBib29sIGV4dDRfZmNfcmVwbGF5X2No ZWNrX2V4Y2x1ZGVkKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsIGV4dDRfZnNibGtfdCBibG9jayk7 Cj4gICB2b2lkIGV4dDRfZmNfcmVwbGF5X2NsZWFudXAoc3RydWN0IHN1cGVyX2Jsb2NrICpzYik7 Cj4gICBpbnQgZXh0NF9mY19jb21taXQoam91cm5hbF90ICpqb3VybmFsLCB0aWRfdCBjb21taXRf dGlkKTsKPiAtaW50IF9faW5pdCBleHQ0X2ZjX2luaXRfZGVudHJ5X2NhY2hlKHZvaWQpOwo+IC12 b2lkIGV4dDRfZmNfZGVzdHJveV9kZW50cnlfY2FjaGUodm9pZCk7Cj4gICBpbnQgZXh0NF9mY19y ZWNvcmRfcmVnaW9ucyhzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCBpbnQgaW5vLAo+ICAgCQkJICAg ZXh0NF9sYmxrX3QgbGJsaywgZXh0NF9mc2Jsa190IHBibGssCj4gICAJCQkgICBpbnQgbGVuLCBp bnQgcmVwbGF5KTsKPiBAQCAtMjkzMCw4ICsyOTI4LDYgQEAgZXh0ZXJuIHZvaWQgZXh0NF9tYl9y ZWxlYXNlKHN0cnVjdCBzdXBlcl9ibG9jayAqKTsKPiAgIGV4dGVybiBleHQ0X2ZzYmxrX3QgZXh0 NF9tYl9uZXdfYmxvY2tzKGhhbmRsZV90ICosCj4gICAJCQkJc3RydWN0IGV4dDRfYWxsb2NhdGlv bl9yZXF1ZXN0ICosIGludCAqKTsKPiAgIGV4dGVybiB2b2lkIGV4dDRfZGlzY2FyZF9wcmVhbGxv Y2F0aW9ucyhzdHJ1Y3QgaW5vZGUgKik7Cj4gLWV4dGVybiBpbnQgX19pbml0IGV4dDRfaW5pdF9t YmFsbG9jKHZvaWQpOwo+IC1leHRlcm4gdm9pZCBleHQ0X2V4aXRfbWJhbGxvYyh2b2lkKTsKPiAg IGV4dGVybiBleHQ0X2dyb3VwX3QgZXh0NF9tYl9wcmVmZXRjaChzdHJ1Y3Qgc3VwZXJfYmxvY2sg KnNiLAo+ICAgCQkJCSAgICAgZXh0NF9ncm91cF90IGdyb3VwLAo+ICAgCQkJCSAgICAgdW5zaWdu ZWQgaW50IG5yLCBpbnQgKmNudCk7Cj4gQEAgLTM2NTEsOCArMzY0Nyw2IEBAIHN0YXRpYyBpbmxp bmUgdm9pZCBleHQ0X3NldF9kZV90eXBlKHN0cnVjdCBzdXBlcl9ibG9jayAqc2IsCj4gICAvKiBy ZWFkcGFnZXMuYyAqLwo+ICAgZXh0ZXJuIGludCBleHQ0X21wYWdlX3JlYWRwYWdlcyhzdHJ1Y3Qg aW5vZGUgKmlub2RlLAo+ICAgCQlzdHJ1Y3QgcmVhZGFoZWFkX2NvbnRyb2wgKnJhYywgc3RydWN0 IGZvbGlvICpmb2xpbyk7Cj4gLWV4dGVybiBpbnQgX19pbml0IGV4dDRfaW5pdF9wb3N0X3JlYWRf cHJvY2Vzc2luZyh2b2lkKTsKPiAtZXh0ZXJuIHZvaWQgZXh0NF9leGl0X3Bvc3RfcmVhZF9wcm9j ZXNzaW5nKHZvaWQpOwo+ICAgCj4gICAvKiBzeW1saW5rLmMgKi8KPiAgIGV4dGVybiBjb25zdCBz dHJ1Y3QgaW5vZGVfb3BlcmF0aW9ucyBleHQ0X2VuY3J5cHRlZF9zeW1saW5rX2lub2RlX29wZXJh dGlvbnM7Cj4gQEAgLTM2NjMsMTQgKzM2NTcsMTAgQEAgZXh0ZXJuIGNvbnN0IHN0cnVjdCBpbm9k ZV9vcGVyYXRpb25zIGV4dDRfZmFzdF9zeW1saW5rX2lub2RlX29wZXJhdGlvbnM7Cj4gICBleHRl cm4gdm9pZCBleHQ0X25vdGlmeV9lcnJvcl9zeXNmcyhzdHJ1Y3QgZXh0NF9zYl9pbmZvICpzYmkp Owo+ICAgZXh0ZXJuIGludCBleHQ0X3JlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBzdXBlcl9ibG9jayAq c2IpOwo+ICAgZXh0ZXJuIHZvaWQgZXh0NF91bnJlZ2lzdGVyX3N5c2ZzKHN0cnVjdCBzdXBlcl9i bG9jayAqc2IpOwo+IC1leHRlcm4gaW50IF9faW5pdCBleHQ0X2luaXRfc3lzZnModm9pZCk7Cj4g LWV4dGVybiB2b2lkIGV4dDRfZXhpdF9zeXNmcyh2b2lkKTsKPiAgIAo+ICAgLyogYmxvY2tfdmFs aWRpdHkgKi8KPiAgIGV4dGVybiB2b2lkIGV4dDRfcmVsZWFzZV9zeXN0ZW1fem9uZShzdHJ1Y3Qg c3VwZXJfYmxvY2sgKnNiKTsKPiAgIGV4dGVybiBpbnQgZXh0NF9zZXR1cF9zeXN0ZW1fem9uZShz dHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiKTsKPiAtZXh0ZXJuIGludCBfX2luaXQgZXh0NF9pbml0X3N5 c3RlbV96b25lKHZvaWQpOwo+IC1leHRlcm4gdm9pZCBleHQ0X2V4aXRfc3lzdGVtX3pvbmUodm9p ZCk7Cj4gICBleHRlcm4gaW50IGV4dDRfaW5vZGVfYmxvY2tfdmFsaWQoc3RydWN0IGlub2RlICpp bm9kZSwKPiAgIAkJCQkgIGV4dDRfZnNibGtfdCBzdGFydF9ibGssCj4gICAJCQkJICB1bnNpZ25l ZCBpbnQgY291bnQpOwo+IEBAIC0zNzUwLDggKzM3NDAsNiBAQCBleHRlcm4gaW50IGV4dDRfbW92 ZV9leHRlbnRzKHN0cnVjdCBmaWxlICpvX2ZpbHAsIHN0cnVjdCBmaWxlICpkX2ZpbHAsCj4gICAJ CQkgICAgIF9fdTY0IGxlbiwgX191NjQgKm1vdmVkX2xlbik7Cj4gICAKPiAgIC8qIHBhZ2UtaW8u YyAqLwo+IC1leHRlcm4gaW50IF9faW5pdCBleHQ0X2luaXRfcGFnZWlvKHZvaWQpOwo+IC1leHRl cm4gdm9pZCBleHQ0X2V4aXRfcGFnZWlvKHZvaWQpOwo+ICAgZXh0ZXJuIGV4dDRfaW9fZW5kX3Qg KmV4dDRfaW5pdF9pb19lbmQoc3RydWN0IGlub2RlICppbm9kZSwgZ2ZwX3QgZmxhZ3MpOwo+ICAg ZXh0ZXJuIGV4dDRfaW9fZW5kX3QgKmV4dDRfZ2V0X2lvX2VuZChleHQ0X2lvX2VuZF90ICppb19l bmQpOwo+ICAgZXh0ZXJuIGludCBleHQ0X3B1dF9pb19lbmQoZXh0NF9pb19lbmRfdCAqaW9fZW5k KTsKPiBkaWZmIC0tZ2l0IGEvZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5jIGIvZnMvZXh0NC9leHRl bnRzX3N0YXR1cy5jCj4gaW5kZXggMTdkY2YxM2FkZGUyNzUuLmQzODFlYzg4NDQxZmZkIDEwMDY0 NAo+IC0tLSBhL2ZzL2V4dDQvZXh0ZW50c19zdGF0dXMuYwo+ICsrKyBiL2ZzL2V4dDQvZXh0ZW50 c19zdGF0dXMuYwo+IEBAIC0xNTYsMTkgKzE1Niw2IEBAIHN0YXRpYyBpbnQgX19yZXZpc2VfcGVu ZGluZyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBsYmxrLAo+ICAgCQkJICAgIGV4 dDRfbGJsa190IGxlbiwKPiAgIAkJCSAgICBzdHJ1Y3QgcGVuZGluZ19yZXNlcnZhdGlvbiAqKnBy ZWFsbG9jKTsKPiAgIAo+IC1pbnQgX19pbml0IGV4dDRfaW5pdF9lcyh2b2lkKQo+IC17Cj4gLQll eHQ0X2VzX2NhY2hlcCA9IEtNRU1fQ0FDSEUoZXh0ZW50X3N0YXR1cywgU0xBQl9SRUNMQUlNX0FD Q09VTlQpOwo+IC0JaWYgKGV4dDRfZXNfY2FjaGVwID09IE5VTEwpCj4gLQkJcmV0dXJuIC1FTk9N RU07Cj4gLQlyZXR1cm4gMDsKPiAtfQo+IC0KPiAtdm9pZCBleHQ0X2V4aXRfZXModm9pZCkKPiAt ewo+IC0Ja21lbV9jYWNoZV9kZXN0cm95KGV4dDRfZXNfY2FjaGVwKTsKPiAtfQo+IC0KPiAgIHZv aWQgZXh0NF9lc19pbml0X3RyZWUoc3RydWN0IGV4dDRfZXNfdHJlZSAqdHJlZSkKPiAgIHsKPiAg IAl0cmVlLT5yb290ID0gUkJfUk9PVDsKPiBAQCAtMTg4MywxOCArMTg3MCwyNSBAQCBzdGF0aWMg dm9pZCBleHQ0X3ByaW50X3BlbmRpbmdfdHJlZShzdHJ1Y3QgaW5vZGUgKmlub2RlKQo+ICAgI2Rl ZmluZSBleHQ0X3ByaW50X3BlbmRpbmdfdHJlZShpbm9kZSkKPiAgICNlbmRpZgo+ICAgCj4gLWlu dCBfX2luaXQgZXh0NF9pbml0X3BlbmRpbmcodm9pZCkKPiArc3RhdGljIGludCBfX2luaXQgZXh0 NF9pbml0X2VzKHZvaWQpCj4gICB7Cj4gICAJZXh0NF9wZW5kaW5nX2NhY2hlcCA9IEtNRU1fQ0FD SEUocGVuZGluZ19yZXNlcnZhdGlvbiwgU0xBQl9SRUNMQUlNX0FDQ09VTlQpOwo+ICAgCWlmIChl eHQ0X3BlbmRpbmdfY2FjaGVwID09IE5VTEwpCj4gICAJCXJldHVybiAtRU5PTUVNOwo+ICsJZXh0 NF9lc19jYWNoZXAgPSBLTUVNX0NBQ0hFKGV4dGVudF9zdGF0dXMsIFNMQUJfUkVDTEFJTV9BQ0NP VU5UKTsKPiArCWlmIChleHQ0X2VzX2NhY2hlcCA9PSBOVUxMKSB7Cj4gKwkJa21lbV9jYWNoZV9k ZXN0cm95KGV4dDRfcGVuZGluZ19jYWNoZXApOwo+ICsJCXJldHVybiAtRU5PTUVNOwo+ICsJfQo+ ICAgCXJldHVybiAwOwo+ICAgfQo+ICAgCj4gLXZvaWQgZXh0NF9leGl0X3BlbmRpbmcodm9pZCkK PiArc3RhdGljIHZvaWQgZXh0NF9leGl0X2VzKHZvaWQpCj4gICB7Cj4gKwlrbWVtX2NhY2hlX2Rl c3Ryb3koZXh0NF9lc19jYWNoZXApOwo+ICAgCWttZW1fY2FjaGVfZGVzdHJveShleHQ0X3BlbmRp bmdfY2FjaGVwKTsKPiAgIH0KPiArbW9kdWxlX3N1YmluaXQoZXh0NF9pbml0X2VzLCBleHQ0X2V4 aXRfZXMpOwo+ICAgCj4gICB2b2lkIGV4dDRfaW5pdF9wZW5kaW5nX3RyZWUoc3RydWN0IGV4dDRf cGVuZGluZ190cmVlICp0cmVlKQo+ICAgewo+IGRpZmYgLS1naXQgYS9mcy9leHQ0L2V4dGVudHNf c3RhdHVzLmggYi9mcy9leHQ0L2V4dGVudHNfc3RhdHVzLmgKPiBpbmRleCAzYzhlMmVkZWU1ZDVk MS4uMWNkYjI1YzNkMmRhZTUgMTAwNjQ0Cj4gLS0tIGEvZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5o Cj4gKysrIGIvZnMvZXh0NC9leHRlbnRzX3N0YXR1cy5oCj4gQEAgLTEyMyw4ICsxMjMsNiBAQCBz dHJ1Y3QgZXh0NF9wZW5kaW5nX3RyZWUgewo+ICAgCXN0cnVjdCByYl9yb290IHJvb3Q7Cj4gICB9 Owo+ICAgCj4gLWV4dGVybiBpbnQgX19pbml0IGV4dDRfaW5pdF9lcyh2b2lkKTsKPiAtZXh0ZXJu IHZvaWQgZXh0NF9leGl0X2VzKHZvaWQpOwo+ICAgZXh0ZXJuIHZvaWQgZXh0NF9lc19pbml0X3Ry ZWUoc3RydWN0IGV4dDRfZXNfdHJlZSAqdHJlZSk7Cj4gICAKPiAgIGV4dGVybiB2b2lkIGV4dDRf ZXNfaW5zZXJ0X2V4dGVudChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBleHQ0X2xibGtfdCBsYmxrLAo+ IEBAIC0yNDQsOCArMjQyLDYgQEAgZXh0ZXJuIHZvaWQgZXh0NF9lc191bnJlZ2lzdGVyX3Nocmlu a2VyKHN0cnVjdCBleHQ0X3NiX2luZm8gKnNiaSk7Cj4gICAKPiAgIGV4dGVybiBpbnQgZXh0NF9z ZXFfZXNfc2hyaW5rZXJfaW5mb19zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICp2KTsK PiAgIAo+IC1leHRlcm4gaW50IF9faW5pdCBleHQ0X2luaXRfcGVuZGluZyh2b2lkKTsKPiAtZXh0 ZXJuIHZvaWQgZXh0NF9leGl0X3BlbmRpbmcodm9pZCk7Cj4gICBleHRlcm4gdm9pZCBleHQ0X2lu aXRfcGVuZGluZ190cmVlKHN0cnVjdCBleHQ0X3BlbmRpbmdfdHJlZSAqdHJlZSk7Cj4gICBleHRl cm4gdm9pZCBleHQ0X3JlbW92ZV9wZW5kaW5nKHN0cnVjdCBpbm9kZSAqaW5vZGUsIGV4dDRfbGJs a190IGxibGspOwo+ICAgZXh0ZXJuIGJvb2wgZXh0NF9pc19wZW5kaW5nKHN0cnVjdCBpbm9kZSAq aW5vZGUsIGV4dDRfbGJsa190IGxibGspOwo+IGRpZmYgLS1naXQgYS9mcy9leHQ0L2Zhc3RfY29t bWl0LmMgYi9mcy9leHQ0L2Zhc3RfY29tbWl0LmMKPiBpbmRleCAzOTI2YTA1ZWNlZWVkMS4uYjI4 OTMwYzQxNzVjY2EgMTAwNjQ0Cj4gLS0tIGEvZnMvZXh0NC9mYXN0X2NvbW1pdC5jCj4gKysrIGIv ZnMvZXh0NC9mYXN0X2NvbW1pdC5jCj4gQEAgLTIyOTMsNyArMjI5Myw3IEBAIGludCBleHQ0X2Zj X2luZm9fc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqdikKPiAgIAlyZXR1cm4gMDsK PiAgIH0KPiAgIAo+IC1pbnQgX19pbml0IGV4dDRfZmNfaW5pdF9kZW50cnlfY2FjaGUodm9pZCkK PiArc3RhdGljIGludCBfX2luaXQgZXh0NF9mY19pbml0X2RlbnRyeV9jYWNoZSh2b2lkKQo+ICAg ewo+ICAgCWV4dDRfZmNfZGVudHJ5X2NhY2hlcCA9IEtNRU1fQ0FDSEUoZXh0NF9mY19kZW50cnlf dXBkYXRlLAo+ICAgCQkJCQkgICBTTEFCX1JFQ0xBSU1fQUNDT1VOVCk7Cj4gQEAgLTIzMDQsNyAr MjMwNCw4IEBAIGludCBfX2luaXQgZXh0NF9mY19pbml0X2RlbnRyeV9jYWNoZSh2b2lkKQo+ICAg CXJldHVybiAwOwo+ICAgfQo+ICAgCj4gLXZvaWQgZXh0NF9mY19kZXN0cm95X2RlbnRyeV9jYWNo ZSh2b2lkKQo+ICtzdGF0aWMgdm9pZCBleHQ0X2ZjX2Rlc3Ryb3lfZGVudHJ5X2NhY2hlKHZvaWQp Cj4gICB7Cj4gICAJa21lbV9jYWNoZV9kZXN0cm95KGV4dDRfZmNfZGVudHJ5X2NhY2hlcCk7Cj4g ICB9Cj4gK21vZHVsZV9zdWJpbml0KGV4dDRfZmNfaW5pdF9kZW50cnlfY2FjaGUsIGV4dDRfZmNf ZGVzdHJveV9kZW50cnlfY2FjaGUpOwo+IGRpZmYgLS1naXQgYS9mcy9leHQ0L21iYWxsb2MuYyBi L2ZzL2V4dDQvbWJhbGxvYy5jCj4gaW5kZXggOWRkYTljZDY4YWIyZjUuLmE1NjQ4ODI0MzJiOGZm IDEwMDY0NAo+IC0tLSBhL2ZzL2V4dDQvbWJhbGxvYy5jCj4gKysrIGIvZnMvZXh0NC9tYmFsbG9j LmMKPiBAQCAtMzkzNiw3ICszOTM2LDcgQEAgdm9pZCBleHQ0X3Byb2Nlc3NfZnJlZWRfZGF0YShz dHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLCB0aWRfdCBjb21taXRfdGlkKQo+ICAgCX0KPiAgIH0KPiAg IAo+IC1pbnQgX19pbml0IGV4dDRfaW5pdF9tYmFsbG9jKHZvaWQpCj4gK3N0YXRpYyBpbnQgX19p bml0IGV4dDRfaW5pdF9tYmFsbG9jKHZvaWQpCj4gICB7Cj4gICAJZXh0NF9wc3BhY2VfY2FjaGVw ID0gS01FTV9DQUNIRShleHQ0X3ByZWFsbG9jX3NwYWNlLAo+ICAgCQkJCQlTTEFCX1JFQ0xBSU1f QUNDT1VOVCk7Cj4gQEAgLTM5NjMsNyArMzk2Myw3IEBAIGludCBfX2luaXQgZXh0NF9pbml0X21i YWxsb2Modm9pZCkKPiAgIAlyZXR1cm4gLUVOT01FTTsKPiAgIH0KPiAgIAo+IC12b2lkIGV4dDRf ZXhpdF9tYmFsbG9jKHZvaWQpCj4gK3N0YXRpYyB2b2lkIGV4dDRfZXhpdF9tYmFsbG9jKHZvaWQp Cj4gICB7Cj4gICAJLyoKPiAgIAkgKiBXYWl0IGZvciBjb21wbGV0aW9uIG9mIGNhbGxfcmN1KCkn cyBvbiBleHQ0X3BzcGFjZV9jYWNoZXAKPiBAQCAtMzk3NSw2ICszOTc1LDcgQEAgdm9pZCBleHQ0 X2V4aXRfbWJhbGxvYyh2b2lkKQo+ICAgCWttZW1fY2FjaGVfZGVzdHJveShleHQ0X2ZyZWVfZGF0 YV9jYWNoZXApOwo+ICAgCWV4dDRfZ3JvdXBpbmZvX2Rlc3Ryb3lfc2xhYnMoKTsKPiAgIH0KPiAr bW9kdWxlX3N1YmluaXQoZXh0NF9pbml0X21iYWxsb2MsIGV4dDRfZXhpdF9tYmFsbG9jKTsKPiAg IAo+ICAgI2RlZmluZSBFWFQ0X01CX0JJVE1BUF9NQVJLRURfQ0hFQ0sgMHgwMDAxCj4gICAjZGVm aW5lIEVYVDRfTUJfU1lOQ19VUERBVEUgMHgwMDAyCj4gZGlmZiAtLWdpdCBhL2ZzL2V4dDQvcGFn ZS1pby5jIGIvZnMvZXh0NC9wYWdlLWlvLmMKPiBpbmRleCBhZDU1NDM4NjZkMjE1Mi4uNjg2Mzlk NTU1MzA4MGEgMTAwNjQ0Cj4gLS0tIGEvZnMvZXh0NC9wYWdlLWlvLmMKPiArKysgYi9mcy9leHQ0 L3BhZ2UtaW8uYwo+IEBAIC0zMyw3ICszMyw3IEBACj4gICBzdGF0aWMgc3RydWN0IGttZW1fY2Fj aGUgKmlvX2VuZF9jYWNoZXA7Cj4gICBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKmlvX2VuZF92 ZWNfY2FjaGVwOwo+ICAgCj4gLWludCBfX2luaXQgZXh0NF9pbml0X3BhZ2Vpbyh2b2lkKQo+ICtz dGF0aWMgaW50IF9faW5pdCBleHQ0X2luaXRfcGFnZWlvKHZvaWQpCj4gICB7Cj4gICAJaW9fZW5k X2NhY2hlcCA9IEtNRU1fQ0FDSEUoZXh0NF9pb19lbmQsIFNMQUJfUkVDTEFJTV9BQ0NPVU5UKTsK PiAgIAlpZiAoaW9fZW5kX2NhY2hlcCA9PSBOVUxMKQo+IEBAIC00NywxMSArNDcsMTIgQEAgaW50 IF9faW5pdCBleHQ0X2luaXRfcGFnZWlvKHZvaWQpCj4gICAJcmV0dXJuIDA7Cj4gICB9Cj4gICAK PiAtdm9pZCBleHQ0X2V4aXRfcGFnZWlvKHZvaWQpCj4gK3N0YXRpYyB2b2lkIGV4dDRfZXhpdF9w YWdlaW8odm9pZCkKPiAgIHsKPiAgIAlrbWVtX2NhY2hlX2Rlc3Ryb3koaW9fZW5kX2NhY2hlcCk7 Cj4gICAJa21lbV9jYWNoZV9kZXN0cm95KGlvX2VuZF92ZWNfY2FjaGVwKTsKPiAgIH0KPiArbW9k dWxlX3N1YmluaXQoZXh0NF9pbml0X3BhZ2VpbywgZXh0NF9leGl0X3BhZ2Vpbyk7Cj4gICAKPiAg IHN0cnVjdCBleHQ0X2lvX2VuZF92ZWMgKmV4dDRfYWxsb2NfaW9fZW5kX3ZlYyhleHQ0X2lvX2Vu ZF90ICppb19lbmQpCj4gICB7Cj4gZGlmZiAtLWdpdCBhL2ZzL2V4dDQvcmVhZHBhZ2UuYyBiL2Zz L2V4dDQvcmVhZHBhZ2UuYwo+IGluZGV4IDg0OTQ0OTI1ODJhYmVhLi41ZmE3MzI5YzU3MWI0MiAx MDA2NDQKPiAtLS0gYS9mcy9leHQ0L3JlYWRwYWdlLmMKPiArKysgYi9mcy9leHQ0L3JlYWRwYWdl LmMKPiBAQCAtMzkwLDcgKzM5MCw3IEBAIGludCBleHQ0X21wYWdlX3JlYWRwYWdlcyhzdHJ1Y3Qg aW5vZGUgKmlub2RlLAo+ICAgCXJldHVybiAwOwo+ICAgfQo+ICAgCj4gLWludCBfX2luaXQgZXh0 NF9pbml0X3Bvc3RfcmVhZF9wcm9jZXNzaW5nKHZvaWQpCj4gK3N0YXRpYyBpbnQgX19pbml0IGV4 dDRfaW5pdF9wb3N0X3JlYWRfcHJvY2Vzc2luZyh2b2lkKQo+ICAgewo+ICAgCWJpb19wb3N0X3Jl YWRfY3R4X2NhY2hlID0gS01FTV9DQUNIRShiaW9fcG9zdF9yZWFkX2N0eCwgU0xBQl9SRUNMQUlN X0FDQ09VTlQpOwo+ICAgCj4gQEAgLTQwOSw4ICs0MDksOSBAQCBpbnQgX19pbml0IGV4dDRfaW5p dF9wb3N0X3JlYWRfcHJvY2Vzc2luZyh2b2lkKQo+ICAgCXJldHVybiAtRU5PTUVNOwo+ICAgfQo+ ICAgCj4gLXZvaWQgZXh0NF9leGl0X3Bvc3RfcmVhZF9wcm9jZXNzaW5nKHZvaWQpCj4gK3N0YXRp YyB2b2lkIGV4dDRfZXhpdF9wb3N0X3JlYWRfcHJvY2Vzc2luZyh2b2lkKQo+ICAgewo+ICAgCW1l bXBvb2xfZGVzdHJveShiaW9fcG9zdF9yZWFkX2N0eF9wb29sKTsKPiAgIAlrbWVtX2NhY2hlX2Rl c3Ryb3koYmlvX3Bvc3RfcmVhZF9jdHhfY2FjaGUpOwo+ICAgfQo+ICttb2R1bGVfc3ViaW5pdChl eHQ0X2luaXRfcG9zdF9yZWFkX3Byb2Nlc3NpbmcsIGV4dDRfZXhpdF9wb3N0X3JlYWRfcHJvY2Vz c2luZyk7Cj4gZGlmZiAtLWdpdCBhL2ZzL2V4dDQvc3VwZXIuYyBiL2ZzL2V4dDQvc3VwZXIuYwo+ IGluZGV4IDIwNzA3NmU3ZTdmMDU1Li5iYjZhODdkYTAwZWE4YyAxMDA2NDQKPiAtLS0gYS9mcy9l eHQ0L3N1cGVyLmMKPiArKysgYi9mcy9leHQ0L3N1cGVyLmMKPiBAQCAtMTQ4NCwyOSArMTQ4NCw2 IEBAIHN0YXRpYyB2b2lkIGluaXRfb25jZSh2b2lkICpmb28pCj4gICAJZXh0NF9mY19pbml0X2lu b2RlKCZlaS0+dmZzX2lub2RlKTsKPiAgIH0KPiAgIAo+IC1zdGF0aWMgaW50IF9faW5pdCBpbml0 X2lub2RlY2FjaGUodm9pZCkKPiAtewo+IC0JZXh0NF9pbm9kZV9jYWNoZXAgPSBrbWVtX2NhY2hl X2NyZWF0ZV91c2VyY29weSgiZXh0NF9pbm9kZV9jYWNoZSIsCj4gLQkJCQlzaXplb2Yoc3RydWN0 IGV4dDRfaW5vZGVfaW5mbyksIDAsCj4gLQkJCQlTTEFCX1JFQ0xBSU1fQUNDT1VOVCB8IFNMQUJf QUNDT1VOVCwKPiAtCQkJCW9mZnNldG9mKHN0cnVjdCBleHQ0X2lub2RlX2luZm8sIGlfZGF0YSks Cj4gLQkJCQlzaXplb2ZfZmllbGQoc3RydWN0IGV4dDRfaW5vZGVfaW5mbywgaV9kYXRhKSwKPiAt CQkJCWluaXRfb25jZSk7Cj4gLQlpZiAoZXh0NF9pbm9kZV9jYWNoZXAgPT0gTlVMTCkKPiAtCQly ZXR1cm4gLUVOT01FTTsKPiAtCXJldHVybiAwOwo+IC19Cj4gLQo+IC1zdGF0aWMgdm9pZCBkZXN0 cm95X2lub2RlY2FjaGUodm9pZCkKPiAtewo+IC0JLyoKPiAtCSAqIE1ha2Ugc3VyZSBhbGwgZGVs YXllZCByY3UgZnJlZSBpbm9kZXMgYXJlIGZsdXNoZWQgYmVmb3JlIHdlCj4gLQkgKiBkZXN0cm95 IGNhY2hlLgo+IC0JICovCj4gLQlyY3VfYmFycmllcigpOwo+IC0Ja21lbV9jYWNoZV9kZXN0cm95 KGV4dDRfaW5vZGVfY2FjaGVwKTsKPiAtfQo+IC0KPiAgIHZvaWQgZXh0NF9jbGVhcl9pbm9kZShz dHJ1Y3QgaW5vZGUgKmlub2RlKQo+ICAgewo+ICAgCWV4dDRfZmNfZGVsKGlub2RlKTsKPiBAQCAt NzMwMiwzMyArNzI3OSwxMyBAQCBzdGF0aWMgc3RydWN0IGZpbGVfc3lzdGVtX3R5cGUgZXh0NF9m c190eXBlID0gewo+ICAgfTsKPiAgIE1PRFVMRV9BTElBU19GUygiZXh0NCIpOwo+ICAgCj4gLXN0 YXRpYyBpbnQgcmVnaXN0ZXJfZXh0KHZvaWQpCj4gLXsKPiAtCXJlZ2lzdGVyX2FzX2V4dDMoKTsK PiAtCXJlZ2lzdGVyX2FzX2V4dDIoKTsKPiAtCXJldHVybiByZWdpc3Rlcl9maWxlc3lzdGVtKCZl eHQ0X2ZzX3R5cGUpOwo+IC19Cj4gLQo+IC1zdGF0aWMgdm9pZCB1bnJlZ2lzdGVyX2V4dCh2b2lk KQo+IC17Cj4gLQl1bnJlZ2lzdGVyX2FzX2V4dDIoKTsKPiAtCXVucmVnaXN0ZXJfYXNfZXh0Mygp Owo+IC0JdW5yZWdpc3Rlcl9maWxlc3lzdGVtKCZleHQ0X2ZzX3R5cGUpOwo+IC19Cj4gLQo+IC1z dGF0aWMgc3RydWN0IHN1YmV4aXRjYWxsX3JvbGxiYWNrIHJvbGxiYWNrOwo+IC0KPiAtc3RhdGlj IHZvaWQgX19leGl0IGV4dDRfZXhpdF9mcyh2b2lkKQo+IC17Cj4gLQlleHQ0X2Rlc3Ryb3lfbGF6 eWluaXRfdGhyZWFkKCk7Cj4gLQltb2R1bGVfc3ViZXhpdCgmcm9sbGJhY2spOwo+IC19Cj4gLQo+ ICAgLyogU2hhcmVkIGFjcm9zcyBhbGwgZXh0NCBmaWxlIHN5c3RlbXMgKi8KPiAgIHdhaXRfcXVl dWVfaGVhZF90IGV4dDRfX2lvZW5kX3dxW0VYVDRfV1FfSEFTSF9TWl07Cj4gICAKPiAgIHN0YXRp YyBpbnQgX19pbml0IGV4dDRfaW5pdF9mcyh2b2lkKQo+ICAgewo+ICsJaW50IGVycm9yOwo+ICsK PiAgIAlyYXRlbGltaXRfc3RhdGVfaW5pdCgmZXh0NF9tb3VudF9tc2dfcmF0ZWxpbWl0LCAzMCAq IEhaLCA2NCk7Cj4gICAJZXh0NF9saV9pbmZvID0gTlVMTDsKPiAgIAo+IEBAIC03MzM4LDIzICs3 Mjk1LDQwIEBAIHN0YXRpYyBpbnQgX19pbml0IGV4dDRfaW5pdF9mcyh2b2lkKQo+ICAgCWZvciAo aW50IGkgPSAwOyBpIDwgRVhUNF9XUV9IQVNIX1NaOyBpKyspCj4gICAJCWluaXRfd2FpdHF1ZXVl X2hlYWQoJmV4dDRfX2lvZW5kX3dxW2ldKTsKPiAgIAo+IC0JbW9kdWxlX3N1YmluaXQoZXh0NF9p bml0X2VzLCBleHQ0X2V4aXRfZXMsICZyb2xsYmFjayk7Cj4gLQltb2R1bGVfc3ViaW5pdChleHQ0 X2luaXRfcGVuZGluZywgZXh0NF9leGl0X3BlbmRpbmcsICZyb2xsYmFjayk7Cj4gLQltb2R1bGVf c3ViaW5pdChleHQ0X2luaXRfcG9zdF9yZWFkX3Byb2Nlc3NpbmcsIGV4dDRfZXhpdF9wb3N0X3Jl YWRfcHJvY2Vzc2luZywgJnJvbGxiYWNrKTsKPiAtCW1vZHVsZV9zdWJpbml0KGV4dDRfaW5pdF9w YWdlaW8sIGV4dDRfZXhpdF9wYWdlaW8sICZyb2xsYmFjayk7Cj4gLQltb2R1bGVfc3ViaW5pdChl eHQ0X2luaXRfc3lzdGVtX3pvbmUsIGV4dDRfZXhpdF9zeXN0ZW1fem9uZSwgJnJvbGxiYWNrKTsK PiAtCW1vZHVsZV9zdWJpbml0KGV4dDRfaW5pdF9zeXNmcywgZXh0NF9leGl0X3N5c2ZzLCAmcm9s bGJhY2spOwo+IC0JbW9kdWxlX3N1YmluaXQoZXh0NF9pbml0X21iYWxsb2MsIGV4dDRfZXhpdF9t YmFsbG9jLCAmcm9sbGJhY2spOwo+IC0JbW9kdWxlX3N1YmluaXQoaW5pdF9pbm9kZWNhY2hlLCBk ZXN0cm95X2lub2RlY2FjaGUsICZyb2xsYmFjayk7Cj4gLQltb2R1bGVfc3ViaW5pdChleHQ0X2Zj X2luaXRfZGVudHJ5X2NhY2hlLCBleHQ0X2ZjX2Rlc3Ryb3lfZGVudHJ5X2NhY2hlLCAmcm9sbGJh Y2spOwo+IC0JbW9kdWxlX3N1YmluaXQocmVnaXN0ZXJfZXh0LCB1bnJlZ2lzdGVyX2V4dCwgJnJv bGxiYWNrKTsKPiArCWV4dDRfaW5vZGVfY2FjaGVwID0ga21lbV9jYWNoZV9jcmVhdGVfdXNlcmNv cHkoImV4dDRfaW5vZGVfY2FjaGUiLAo+ICsJCQkJc2l6ZW9mKHN0cnVjdCBleHQ0X2lub2RlX2lu Zm8pLCAwLAo+ICsJCQkJU0xBQl9SRUNMQUlNX0FDQ09VTlQgfCBTTEFCX0FDQ09VTlQsCj4gKwkJ CQlvZmZzZXRvZihzdHJ1Y3QgZXh0NF9pbm9kZV9pbmZvLCBpX2RhdGEpLAo+ICsJCQkJc2l6ZW9m X2ZpZWxkKHN0cnVjdCBleHQ0X2lub2RlX2luZm8sIGlfZGF0YSksCj4gKwkJCQlpbml0X29uY2Up Owo+ICsJaWYgKGV4dDRfaW5vZGVfY2FjaGVwID09IE5VTEwpCj4gKwkJcmV0dXJuIC1FTk9NRU07 Cj4gICAKPiAtCXJldHVybiAwOwo+ICsJcmVnaXN0ZXJfYXNfZXh0MygpOwo+ICsJcmVnaXN0ZXJf YXNfZXh0MigpOwo+ICsJZXJyb3IgPSByZWdpc3Rlcl9maWxlc3lzdGVtKCZleHQ0X2ZzX3R5cGUp Owo+ICsJaWYgKGVycm9yKQo+ICsJCWttZW1fY2FjaGVfZGVzdHJveShleHQ0X2lub2RlX2NhY2hl cCk7Cj4gKwlyZXR1cm4gZXJyb3I7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIF9fZXhpdCBleHQ0 X2V4aXRfZnModm9pZCkKPiArewo+ICsJZXh0NF9kZXN0cm95X2xhenlpbml0X3RocmVhZCgpOwo+ ICsJdW5yZWdpc3Rlcl9hc19leHQyKCk7Cj4gKwl1bnJlZ2lzdGVyX2FzX2V4dDMoKTsKPiArCXVu cmVnaXN0ZXJfZmlsZXN5c3RlbSgmZXh0NF9mc190eXBlKTsKPiArCj4gKwkvKgo+ICsJICogTWFr ZSBzdXJlIGFsbCBkZWxheWVkIHJjdSBmcmVlIGlub2RlcyBhcmUgZmx1c2hlZCBiZWZvcmUgd2UK PiArCSAqIGRlc3Ryb3kgY2FjaGUuCj4gKwkgKi8KPiArCXJjdV9iYXJyaWVyKCk7Cj4gKwlrbWVt X2NhY2hlX2Rlc3Ryb3koZXh0NF9pbm9kZV9jYWNoZXApOwo+ICAgfQo+ICttb2R1bGVfc3ViaW5p dChleHQ0X2luaXRfZnMsIGV4dDRfZXhpdF9mcyk7Cj4gICAKPiAgIE1PRFVMRV9BVVRIT1IoIlJl bXkgQ2FyZCwgU3RlcGhlbiBUd2VlZGllLCBBbmRyZXcgTW9ydG9uLCBBbmRyZWFzIERpbGdlciwg VGhlb2RvcmUgVHMnbyBhbmQgb3RoZXJzIik7Cj4gICBNT0RVTEVfREVTQ1JJUFRJT04oIkZvdXJ0 aCBFeHRlbmRlZCBGaWxlc3lzdGVtIik7Cj4gICBNT0RVTEVfTElDRU5TRSgiR1BMIik7Cj4gICBN T0RVTEVfU09GVERFUCgicHJlOiBjcmMzMmMiKTsKPiAtbW9kdWxlX2luaXQoZXh0NF9pbml0X2Zz KQo+IC1tb2R1bGVfZXhpdChleHQ0X2V4aXRfZnMpCj4gZGlmZiAtLWdpdCBhL2ZzL2V4dDQvc3lz ZnMuYyBiL2ZzL2V4dDQvc3lzZnMuYwo+IGluZGV4IGRkYjU0NjA4Y2EyZWY2Li5kZjMwOTZhOWU2 ZTM5YSAxMDA2NDQKPiAtLS0gYS9mcy9leHQ0L3N5c2ZzLmMKPiArKysgYi9mcy9leHQ0L3N5c2Zz LmMKPiBAQCAtNjAxLDcgKzYwMSw3IEBAIHZvaWQgZXh0NF91bnJlZ2lzdGVyX3N5c2ZzKHN0cnVj dCBzdXBlcl9ibG9jayAqc2IpCj4gICAJa29iamVjdF9kZWwoJnNiaS0+c19rb2JqKTsKPiAgIH0K PiAgIAo+IC1pbnQgX19pbml0IGV4dDRfaW5pdF9zeXNmcyh2b2lkKQo+ICtzdGF0aWMgaW50IF9f aW5pdCBleHQ0X2luaXRfc3lzZnModm9pZCkKPiAgIHsKPiAgIAlpbnQgcmV0Owo+ICAgCj4gQEAg LTYzMiw3ICs2MzIsNyBAQCBpbnQgX19pbml0IGV4dDRfaW5pdF9zeXNmcyh2b2lkKQo+ICAgCXJl dHVybiByZXQ7Cj4gICB9Cj4gICAKPiAtdm9pZCBleHQ0X2V4aXRfc3lzZnModm9pZCkKPiArc3Rh dGljIHZvaWQgZXh0NF9leGl0X3N5c2ZzKHZvaWQpCj4gICB7Cj4gICAJa29iamVjdF9wdXQoZXh0 NF9mZWF0KTsKPiAgIAlleHQ0X2ZlYXQgPSBOVUxMOwo+IEBAIC02NDEsNCArNjQxLDQgQEAgdm9p ZCBleHQ0X2V4aXRfc3lzZnModm9pZCkKPiAgIAlyZW1vdmVfcHJvY19lbnRyeShwcm9jX2Rpcm5h bWUsIE5VTEwpOwo+ICAgCWV4dDRfcHJvY19yb290ID0gTlVMTDsKPiAgIH0KPiAtCj4gK21vZHVs ZV9zdWJpbml0KGV4dDRfaW5pdF9zeXNmcywgZXh0NF9leGl0X3N5c2ZzKTsKPiBkaWZmIC0tZ2l0 IGEvaW5jbHVkZS9saW51eC9tb2R1bGUuaCBiL2luY2x1ZGUvbGludXgvbW9kdWxlLmgKPiBpbmRl eCA5NWY3YzYwZGVkZTlhNC4uMzA5OWZiMmMzZDgxM2IgMTAwNjQ0Cj4gLS0tIGEvaW5jbHVkZS9s aW51eC9tb2R1bGUuaAo+ICsrKyBiL2luY2x1ZGUvbGludXgvbW9kdWxlLmgKPiBAQCAtODAsMjMg KzgwLDEzIEBAIGV4dGVybiB2b2lkIGNsZWFudXBfbW9kdWxlKHZvaWQpOwo+ICAgICogbW9kdWxl X3N1YmluaXQoKSAtIENhbGxlZCB3aGVuIHRoZSBkcml2ZXIgaXMgc3ViaW5pdGlhbGl6ZWQKPiAg ICAqIEBpbml0Zm46IFRoZSBzdWJpbml0aWFsaXphdGlvbiBmdW5jdGlvbiB0aGF0IGlzIGNhbGxl ZAo+ICAgICogQGV4aXRmbjogQ29ycmVzcG9uZGluZyBleGl0IGZ1bmN0aW9uCj4gLSAqIEByb2xs YmFjazogUmVjb3JkIGluZm9ybWF0aW9uIHdoZW4gdGhlIHN1YmluaXRpYWxpemF0aW9uIGZhaWxl ZAo+IC0gKiAgICAgICAgICAgIG9yIHRoZSBkcml2ZXIgd2FzIHJlbW92ZWQKPiAgICAqCj4gICAg KiBVc2UgbW9kdWxlX3N1YmluaXRfbm9leGl0KCkgd2hlbiB0aGVyZSBpcyBvbmx5IGFuIHN1Ymlu aXRpYWxpemF0aW9uCj4gICAgKiBmdW5jdGlvbiBidXQgbm8gY29ycmVzcG9uZGluZyBleGl0IGZ1 bmN0aW9uLgo+ICAgICovCj4gLSNkZWZpbmUgbW9kdWxlX3N1YmluaXQoaW5pdGZuLCBleGl0Zm4s IHJvbGxiYWNrKQlcCj4gLQlfX3N1YmluaXRjYWxsKGluaXRmbiwgZXhpdGZuLCByb2xsYmFjayk7 Cj4gKyNkZWZpbmUgbW9kdWxlX3N1YmluaXQoaW5pdGZuLCBleGl0Zm4pCj4gICAKPiAtI2RlZmlu ZSBtb2R1bGVfc3ViaW5pdF9ub2V4aXQoaW5pdGZuLCByb2xsYmFjaykJCVwKPiAtCV9fc3ViaW5p dGNhbGxfbm9leGl0KGluaXRmbiwgcm9sbGJhY2spOwo+IC0KPiAtLyoKPiAtICogbW9kdWxlX3N1 YmV4aXQoKSAtIENhbGxlZCB3aGVuIHRoZSBkcml2ZXIgZXhpdHMKPiAtICovCj4gLSNkZWZpbmUg bW9kdWxlX3N1YmV4aXQocm9sbGJhY2spCQkJXAo+IC0JX19zdWJleGl0Y2FsbF9yb2xsYmFjayhy b2xsYmFjayk7Cj4gKyNkZWZpbmUgbW9kdWxlX3N1YmluaXRfbm9leGl0KGluaXRmbikKPiAgIAo+ ICAgI2lmbmRlZiBNT0RVTEUKPiAgIC8qKgpCYXNlZCBvbiB0aGlzIHBhdGNoLCB3ZSBtYXkgbmVl ZCB0byBkbyB0aGVzZSB0aGluZ3Mgd2l0aCB0aGlzCmltcGxlbWVudGF0aW9uLAoKMS4gQ2hhbmdl IHRoZSBvcmRlciBvZiAqLm8gaW4gdGhlIE1ha2VmaWxlICh0aGUgc2FtZSBvcmRlciBhcyBiZWZv cmUgdGhlIApjaGFuZ2UpCmBgYAotLS0gYS9mcy9leHQ0L01ha2VmaWxlCisrKyBiL2ZzL2V4dDQv TWFrZWZpbGUKQEAgLTUsMTIgKzUsMTYgQEAKCiDCoG9iai0kKENPTkZJR19FWFQ0X0ZTKSArPSBl eHQ0Lm8KCi1leHQ0LXkgOj0gYmFsbG9jLm8gYml0bWFwLm8gYmxvY2tfdmFsaWRpdHkubyBkaXIu byBleHQ0X2piZDIubyBleHRlbnRzLm8gXAotwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBl eHRlbnRzX3N0YXR1cy5vIGZpbGUubyBmc21hcC5vIGZzeW5jLm8gaGFzaC5vIGlhbGxvYy5vIFwK LcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaW5kaXJlY3QubyBpbmxpbmUubyBpbm9kZS5v IGlvY3RsLm8gbWJhbGxvYy5vIG1pZ3JhdGUubyBcCi3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIG1tcC5vIG1vdmVfZXh0ZW50Lm8gbmFtZWkubyBwYWdlLWlvLm8gcmVhZHBhZ2UubyByZXNp emUubyBcCi3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN1cGVyLm8gc3ltbGluay5vIHN5 c2ZzLm8geGF0dHIubyB4YXR0cl9odXJkLm8gCnhhdHRyX3RydXN0ZWQubyBcCi3CoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgIHhhdHRyX3VzZXIubyBmYXN0X2NvbW1pdC5vIG9ycGhhbi5vCitl eHQ0LXkgOj0gYmFsbG9jLm8gYml0bWFwLm8gZGlyLm8gZXh0NF9qYmQyLm8gZXh0ZW50cy5vIFwK K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgZmlsZS5vIGZzbWFwLm8gZnN5bmMubyBoYXNo Lm8gaWFsbG9jLm8gXAorwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBpbmRpcmVjdC5vIGlu bGluZS5vIGlub2RlLm8gaW9jdGwubyBtaWdyYXRlLm8gXAorwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCBtbXAubyBtb3ZlX2V4dGVudC5vIG5hbWVpLm8gcmVzaXplLm8gXAorwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCBzeW1saW5rLm8geGF0dHIubyB4YXR0cl9odXJkLm8geGF0dHJf dHJ1c3RlZC5vIFwKK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgeGF0dHJfdXNlci5vIG9y cGhhbi5vCisKKyMgRW5zdXJlIHRoZSBsaW5raW5nIG9yZGVyIGZvciBtb2R1bGVfc3ViaW5pdAor ZXh0NC15ICs9IGV4dGVudHNfc3RhdHVzLm8gcmVhZHBhZ2UubyBwYWdlLWlvLm8gYmxvY2tfdmFs aWRpdHkubyBzeXNmcy5vIFwKK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbWJhbGxvYy5v IGZhc3RfY29tbWl0Lm8gc3VwZXIubwpgYGAKCjIuIFdlIG5lZWQgdG8gZGVmaW5lIG1vZHVsZV9z dWJpbml0IHRocm91Z2ggdGhlIGlmZGVmIE1PRFVMRQpkaXN0aW5jdGlvbiwKCi0gYnVpbGQtaW4g bW9kZToKTmVlZCB0byBiZSBkZWZpbmVkIGFzOgpkZWZpbmUgbW9kdWxlX3N1YmluaXQoaW5pdGZu LCAKZXhpdGZuKcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFwKIMKgwqDCoMKgwqDCoCBzdGF0aWMg c3ViaW5pdGNhbGxfdCBfX3N1YmluaXRjYWxsXyMjaW5pdGZuIF9fc3ViaW5pdF9jYWxsID0gCmlu aXRmbjvCoMKgIFwKIMKgwqDCoMKgwqDCoCBzdGF0aWMgc3ViZXhpdGNhbGxfdCBfX3N1YmV4aXRj YWxsXyMjZXhpdGZuIF9fc3ViZXhpdF9jYWxsID0gZXhpdGZuOwoKQ2Fubm90IGJlIGRlZmluZWQg YXM6CmRlZmluZSBtb2R1bGVfc3ViaW5pdChpbml0Zm4sIApleGl0Zm4pwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgXAogwqDCoMKgwqDCoMKgIHN0YXRpYyBzdWJpbml0Y2FsbF90IF9fc3ViaW5pdGNh bGxfIyNpbml0Zm4gX19zdWJpbml0X2NhbGwgPSAKaW5pdGZuO8KgwqAgXAogwqDCoMKgwqDCoMKg IHN0YXRpYyBzdWJleGl0Y2FsbF90IF9fc3ViZXhpdGNhbGxfIyNleGl0Zm4gX19zdWJleGl0X2Nh bGwgPSAKZXhpdGZuO8KgwqAgXAogwqDCoMKgwqDCoMKgIGluaXRmbigpOwoKbW9kdWxlX3N1Ymlu aXQgZGVmaW5lcyBvbmx5IF9fc3ViaW5pdGNhbGxfe2luaXRmbiwgZXhpdGZufSBzeW1ib2xzCnRv IHN0b3JlIGluaXRmbi9leGl0Zm4gYWRkcmVzc2VzLmluaXRmbiBjYW5ub3QgYmUgcnVuIGRpcmVj dGx5CihmdW5jdGlvbnMgY2Fubm90IGJlIHJ1biBkaXJlY3RseSBpbiBub24tY29kZSBibG9ja3Mp LCB0aGUgaW5pdGZuCm9mIGFsbCBidWlsZC1pbiBtb2R1bGVzIG5lZWRzIHRvIGJlIGV4ZWN1dGVk IHRvZ2V0aGVyIHNvbWV3aGVyZS4KCldoZW4gb25lIG9mIHRoZSBzdWJpbml0IHJ1bnMgaW4gYSBt b2R1bGUgZmFpbHMsIGl0IGlzIGRpZmZpY3VsdAp0byByb2xsYmFjayBleGVjdXRpb24gb2Ygc3Vi ZXhpdC4KCm1vZHVsZV9pbml0IGRvZXMgbm90IGhhdmUgdG8gZG8gdGhlc2UgdGhpbmdzIChlYWNo IG1vZHVsZSBoYXMgb25seQpvbmUgbW9kdWxlX2luaXQpLCBtb2R1bGVfaW5pdCBleGVjdXRlcyBm biB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgcGF0aCwKYW5kIGV2ZW4gaWYgZm4gZmFpbHMsIGl0IG9u bHkgbmVlZHMgdG8gcmV0dXJuIHJldC4KZG9faW5pdGNhbGxzCiDCoCBkb19pbml0Y2FsbF9sZXZl bAogwqDCoMKgIGRvX29uZV9pbml0Y2FsbAogwqDCoMKgwqDCoCBmbgoKLSAua28gbW9kZToKRWFj aCBtb2R1bGUgaGFzIG11bHRpcGxlIHN1YmluaXQgYW5kIGluaXRmbiBjYW5ub3QgYmUgcnVuIGxp a2UKbW9kdWxlX2luaXQuIFRoYXQgaXMsIHdlIGNhbm5vdCBzaW1wbHkgYWRkIGEgc3ViaW5pdCBt ZW1iZXIgdG8gYQpzdHJ1Y3QgbW9kdWxlIGFuZCBleGVjdXRlIGl0IHZpYSBkb19vbmVfaW5pdGNh bGwobW9kLT5zdWJpbml0KS4KCjMuIEFub3RoZXIgd2F5IHRvIHJlY29yZCB0aGUgbG9jYXRpb24g b2YgdGhlIGZhaWx1cmUgaXMgc3RpbGwgbmVlZGVkCnRvIGFzc2lzdCBpbiByb2xsYmFjayBleGl0 Zm4uCgo0LiBUaGUgb3JkZXIgaW4gd2hpY2ggc3ViaW5pdCBpcyBjYWxsZWQgaXMgbm90IGludHVp dGl2ZWx5IGtub3duCihhbHRob3VnaCBpdCBjYW4gYmUgZm91bmQgaW4gdGhlIE1ha2VmaWxlKS4K ClRoYW5rcywKWW91bGluZy4KCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fXwpMaW51eC1mMmZzLWRldmVsIG1haWxpbmcgbGlzdApMaW51eC1mMmZzLWRldmVs QGxpc3RzLnNvdXJjZWZvcmdlLm5ldApodHRwczovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0 cy9saXN0aW5mby9saW51eC1mMmZzLWRldmVsCg==