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=-7.2 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, 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 534EDC43387 for ; Wed, 19 Dec 2018 09:25:07 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 0478E217D9 for ; Wed, 19 Dec 2018 09:25:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1545211507; bh=+FSmXq4MjmZsMXkNJNQSBBJGwXb4j8BARspOLKsY9g4=; h=References:In-Reply-To:From:Date:Subject:To:Cc:List-ID:From; b=G581Ho4DqmCqyZ9flMAB3TFEzdTdow9ON8kKaDizZGY6uqSlz58/JNeSuQA16MzBg HjFpP+G4wR2EpUHRKR1vPit1nsbX5tYsv9+sl0ZVtfTjM0te5QtT85VcDqeSC6ClQn d5yN+Nk+jZOQkjmlP1AaTj0bvucR2ehyiK8vFhOs= Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728712AbeLSJZF (ORCPT ); Wed, 19 Dec 2018 04:25:05 -0500 Received: from mail-oi1-f193.google.com ([209.85.167.193]:42836 "EHLO mail-oi1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728673AbeLSJZF (ORCPT ); Wed, 19 Dec 2018 04:25:05 -0500 Received: by mail-oi1-f193.google.com with SMTP id w13so1057804oiw.9 for ; Wed, 19 Dec 2018 01:25:03 -0800 (PST) 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; bh=N47we7KqLgi+8csmOsFadzBJYauwFE8TFrRsEhC8w04=; b=Jb0yWiaypXt/P0+YI4lTvLRV8eaVupAJ7y8MZ1DXTA/WFlspQAa5BtglJ0HDnpS9gA DFMonex87dw+8CS1/AIsyqEzEnNeo2Mr3HqNlHElHfzk2H2bcfW8T2/lJzX+wbady6T5 sI06JNB22ThcNk7Wbd8KrbQvd2lA7u/AJT80pslQHENUIdzg90zdgnboA5IWciXGscVd UgBYTPtp35vPE0zKCoPu/YFAo1OeHkbjC5I38rE4mt6fVGQ+SSyTsOp3a3Wtcu4zh4ZV /MKBQtSkOqsd6TSkrxV1zrA3pE2MwtjN5ltV1S/CJBmkDBS8IcAMdwRjMpDaGDY4+gxi E9LA== X-Gm-Message-State: AA+aEWas19MHuv7ckRm8qaSha2alU3zUInR9k1hZ6AW2GCsQKVOYA1w4 QEOiB/dVTOny5Hfd5d6vQhvh1gFf27arLfcU3Ck= X-Google-Smtp-Source: AFSGD/W0FBMfNETcuNnSzZyCEPnh4Q1jZlNjXxM448vph7XB+qPIFnScFDUq5Us32TJQCvyRYrDmWn3sRwAcn5KvX0k= X-Received: by 2002:aca:3d42:: with SMTP id k63mr679353oia.95.1545211503119; Wed, 19 Dec 2018 01:25:03 -0800 (PST) MIME-Version: 1.0 References: <20181218201443.4950-1-daniel.vetter@ffwll.ch> <20181219070110.GB21256@kroah.com> In-Reply-To: <20181219070110.GB21256@kroah.com> From: "Rafael J. Wysocki" Date: Wed, 19 Dec 2018 10:24:51 +0100 Message-ID: Subject: Re: [PATCH] sysfs: Disable lockdep for driver bind/unbind files To: Greg Kroah-Hartman Cc: Daniel Vetter , dri-devel , intel-gfx , Linux Kernel Mailing List , "Rafael J. Wysocki" , ramalingam.c@intel.com, aspriel@gmail.com, Andy Shevchenko , Geert Uytterhoeven , brgl@bgdev.pl, Heikki Krogerus , Vivek Gautam , Joe Perches , Daniel Vetter Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Dec 19, 2018 at 8:01 AM Greg Kroah-Hartman wrote: > > On Tue, Dec 18, 2018 at 09:14:43PM +0100, Daniel Vetter wrote: > > This is the much more correct fix for my earlier attempt at: > > > > https://lkml.org/lkml/2018/12/10/118 > > > > Short recap: > > > > - There's not actually a locking issue, it's just lockdep being a bit > > too eager to complain about a possible deadlock. > > > > - Contrary to what I claimed the real problem is recursion on > > kn->count. Greg pointed me at sysfs_break_active_protection(), used > > by the scsi subsystem to allow a sysfs file to unbind itself. That > > would be a real deadlock, which isn't what's happening here. Also, > > breaking the active protection means we'd need to manually handle > > all the lifetime fun. > > > > - With Rafael we discussed the task_work approach, which kinda works, > > but has two downsides: It's a functional change for a lockdep > > annotation issue, and it won't work for the bind file (which needs > > to get the errno from the driver load function back to userspace). > > > > - Greg also asked why this never showed up: To hit this you need to > > unregister a 2nd driver from the unload code of your first driver. I > > guess only gpus do that. The bug has always been there, but only > > with a recent patch series did we add more locks so that lockdep > > built a chain from unbinding the snd-hda driver to the > > acpi_video_unregister call. > > > > Full lockdep splat: > > > > [12301.898799] ============================================ > > [12301.898805] WARNING: possible recursive locking detected > > [12301.898811] 4.20.0-rc7+ #84 Not tainted > > [12301.898815] -------------------------------------------- > > [12301.898821] bash/5297 is trying to acquire lock: > > [12301.898826] 00000000f61c6093 (kn->count#39){++++}, at: kernfs_remove_by_name_ns+0x3b/0x80 > > [12301.898841] but task is already holding lock: > > [12301.898847] 000000005f634021 (kn->count#39){++++}, at: kernfs_fop_write+0xdc/0x190 > > [12301.898856] other info that might help us debug this: > > [12301.898862] Possible unsafe locking scenario: > > [12301.898867] CPU0 > > [12301.898870] ---- > > [12301.898874] lock(kn->count#39); > > [12301.898879] lock(kn->count#39); > > [12301.898883] *** DEADLOCK *** > > [12301.898891] May be due to missing lock nesting notation > > [12301.898899] 5 locks held by bash/5297: > > [12301.898903] #0: 00000000cd800e54 (sb_writers#4){.+.+}, at: vfs_write+0x17f/0x1b0 > > [12301.898915] #1: 000000000465e7c2 (&of->mutex){+.+.}, at: kernfs_fop_write+0xd3/0x190 > > [12301.898925] #2: 000000005f634021 (kn->count#39){++++}, at: kernfs_fop_write+0xdc/0x190 > > [12301.898936] #3: 00000000414ef7ac (&dev->mutex){....}, at: device_release_driver_internal+0x34/0x240 > > [12301.898950] #4: 000000003218fbdf (register_count_mutex){+.+.}, at: acpi_video_unregister+0xe/0x40 > > [12301.898960] stack backtrace: > > [12301.898968] CPU: 1 PID: 5297 Comm: bash Not tainted 4.20.0-rc7+ #84 > > [12301.898974] Hardware name: Hewlett-Packard HP EliteBook 8460p/161C, BIOS 68SCF Ver. F.01 03/11/2011 > > [12301.898982] Call Trace: > > [12301.898989] dump_stack+0x67/0x9b > > [12301.898997] __lock_acquire+0x6ad/0x1410 > > [12301.899003] ? kernfs_remove_by_name_ns+0x3b/0x80 > > [12301.899010] ? find_held_lock+0x2d/0x90 > > [12301.899017] ? mutex_spin_on_owner+0xe4/0x150 > > [12301.899023] ? find_held_lock+0x2d/0x90 > > [12301.899030] ? lock_acquire+0x90/0x180 > > [12301.899036] lock_acquire+0x90/0x180 > > [12301.899042] ? kernfs_remove_by_name_ns+0x3b/0x80 > > [12301.899049] __kernfs_remove+0x296/0x310 > > [12301.899055] ? kernfs_remove_by_name_ns+0x3b/0x80 > > [12301.899060] ? kernfs_name_hash+0xd/0x80 > > [12301.899066] ? kernfs_find_ns+0x6c/0x100 > > [12301.899073] kernfs_remove_by_name_ns+0x3b/0x80 > > [12301.899080] bus_remove_driver+0x92/0xa0 > > [12301.899085] acpi_video_unregister+0x24/0x40 > > [12301.899127] i915_driver_unload+0x42/0x130 [i915] > > [12301.899160] i915_pci_remove+0x19/0x30 [i915] > > [12301.899169] pci_device_remove+0x36/0xb0 > > [12301.899176] device_release_driver_internal+0x185/0x240 > > [12301.899183] unbind_store+0xaf/0x180 > > [12301.899189] kernfs_fop_write+0x104/0x190 > > [12301.899195] __vfs_write+0x31/0x180 > > [12301.899203] ? rcu_read_lock_sched_held+0x6f/0x80 > > [12301.899209] ? rcu_sync_lockdep_assert+0x29/0x50 > > [12301.899216] ? __sb_start_write+0x13c/0x1a0 > > [12301.899221] ? vfs_write+0x17f/0x1b0 > > [12301.899227] vfs_write+0xb9/0x1b0 > > [12301.899233] ksys_write+0x50/0xc0 > > [12301.899239] do_syscall_64+0x4b/0x180 > > [12301.899247] entry_SYSCALL_64_after_hwframe+0x49/0xbe > > [12301.899253] RIP: 0033:0x7f452ac7f7a4 > > [12301.899259] Code: 00 f7 d8 64 89 02 48 c7 c0 ff ff ff ff eb b7 0f 1f 80 00 00 00 00 8b 05 aa f0 2c 00 48 63 ff 85 c0 75 13 b8 01 00 00 00 0f 05 <48> 3d 00 f0 ff ff 77 54 f3 c3 66 90 55 53 48 89 d5 48 89 f3 48 83 > > [12301.899273] RSP: 002b:00007ffceafa6918 EFLAGS: 00000246 ORIG_RAX: 0000000000000001 > > [12301.899282] RAX: ffffffffffffffda RBX: 000000000000000d RCX: 00007f452ac7f7a4 > > [12301.899288] RDX: 000000000000000d RSI: 00005612a1abf7c0 RDI: 0000000000000001 > > [12301.899295] RBP: 00005612a1abf7c0 R08: 000000000000000a R09: 00005612a1c46730 > > [12301.899301] R10: 000000000000000a R11: 0000000000000246 R12: 000000000000000d > > [12301.899308] R13: 0000000000000001 R14: 00007f452af4a740 R15: 000000000000000d > > > > Locking around I've noticed that usb and i2c already handle similar > > recursion problems, where a sysfs file can unbind the same type of > > sysfs somewhere else in the hierarchy. Relevant commits are: > > > > commit 356c05d58af05d582e634b54b40050c73609617b > > Author: Alan Stern > > Date: Mon May 14 13:30:03 2012 -0400 > > > > sysfs: get rid of some lockdep false positives > > > > commit e9b526fe704812364bca07edd15eadeba163ebfb > > Author: Alexander Sverdlin > > Date: Fri May 17 14:56:35 2013 +0200 > > > > i2c: suppress lockdep warning on delete_device > > > > Implement the same trick for driver bind/unbind. > > > > Cc: "Rafael J. Wysocki" > > Cc: Greg Kroah-Hartman > > Cc: Ramalingam C > > Cc: Arend van Spriel > > Cc: Andy Shevchenko > > Cc: Geert Uytterhoeven > > Cc: Bartosz Golaszewski > > Cc: Heikki Krogerus > > Cc: Vivek Gautam > > Cc: Joe Perches > > Signed-off-by: Daniel Vetter > > --- > > drivers/base/bus.c | 4 ++-- > > include/linux/device.h | 4 ++++ > > 2 files changed, 6 insertions(+), 2 deletions(-) > > > > diff --git a/drivers/base/bus.c b/drivers/base/bus.c > > index 8bfd27ec73d6..5d2411b848cd 100644 > > --- a/drivers/base/bus.c > > +++ b/drivers/base/bus.c > > @@ -195,7 +195,7 @@ static ssize_t unbind_store(struct device_driver *drv, const char *buf, > > bus_put(bus); > > return err; > > } > > -static DRIVER_ATTR_WO(unbind); > > +static DRIVER_ATTR_IGNORE_LOCKDEP(unbind, S_IWUSR, NULL, unbind_store); > > > > /* > > * Manually attach a device to a driver. > > @@ -231,7 +231,7 @@ static ssize_t bind_store(struct device_driver *drv, const char *buf, > > bus_put(bus); > > return err; > > } > > -static DRIVER_ATTR_WO(bind); > > +static DRIVER_ATTR_IGNORE_LOCKDEP(bind, S_IWUSR, NULL, bind_store); > > > > static ssize_t show_drivers_autoprobe(struct bus_type *bus, char *buf) > > { > > diff --git a/include/linux/device.h b/include/linux/device.h > > index 1b25c7a43f4c..d2cb1a6c5d95 100644 > > --- a/include/linux/device.h > > +++ b/include/linux/device.h > > @@ -326,6 +326,10 @@ struct driver_attribute { > > struct driver_attribute driver_attr_##_name = __ATTR_RO(_name) > > #define DRIVER_ATTR_WO(_name) \ > > struct driver_attribute driver_attr_##_name = __ATTR_WO(_name) > > +#define DRIVER_ATTR_IGNORE_LOCKDEP(_name, _mode, _show, _store) \ > > + struct driver_attribute driver_attr_##_name = \ > > + __ATTR_IGNORE_LOCKDEP(_name, _mode, _show, _store) > > + > > I don't want to give driver writers the ability to shoot themselves in > the foot, can you just put this in the bus.c file itself so that no one > else will abuse this and "open code" the unbind/bind attributes instead > of using a #define for it? Good point, but any attribute starting a driver unbind via sysfs will need this, won't it? > Also I've been trying to get rid of the "specify the mode" macros, so > that everyone uses the RO, WO, and RW versions, so adding a generic one > here is not going to help with that effort :) But if that goes into bus.c directly, the mode arg doesn't hurt IMO and one macro would be sufficient to cover both attrs. From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Rafael J. Wysocki" Subject: Re: [PATCH] sysfs: Disable lockdep for driver bind/unbind files Date: Wed, 19 Dec 2018 10:24:51 +0100 Message-ID: References: <20181218201443.4950-1-daniel.vetter@ffwll.ch> <20181219070110.GB21256@kroah.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20181219070110.GB21256@kroah.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Greg Kroah-Hartman Cc: aspriel@gmail.com, Heikki Krogerus , Geert Uytterhoeven , "Rafael J. Wysocki" , intel-gfx , Linux Kernel Mailing List , dri-devel , Vivek Gautam , Daniel Vetter , Joe Perches , Daniel Vetter , Andy Shevchenko , brgl@bgdev.pl List-Id: dri-devel@lists.freedesktop.org T24gV2VkLCBEZWMgMTksIDIwMTggYXQgODowMSBBTSBHcmVnIEtyb2FoLUhhcnRtYW4KPGdyZWdr aEBsaW51eGZvdW5kYXRpb24ub3JnPiB3cm90ZToKPgo+IE9uIFR1ZSwgRGVjIDE4LCAyMDE4IGF0 IDA5OjE0OjQzUE0gKzAxMDAsIERhbmllbCBWZXR0ZXIgd3JvdGU6Cj4gPiBUaGlzIGlzIHRoZSBt dWNoIG1vcmUgY29ycmVjdCBmaXggZm9yIG15IGVhcmxpZXIgYXR0ZW1wdCBhdDoKPiA+Cj4gPiBo dHRwczovL2xrbWwub3JnL2xrbWwvMjAxOC8xMi8xMC8xMTgKPiA+Cj4gPiBTaG9ydCByZWNhcDoK PiA+Cj4gPiAtIFRoZXJlJ3Mgbm90IGFjdHVhbGx5IGEgbG9ja2luZyBpc3N1ZSwgaXQncyBqdXN0 IGxvY2tkZXAgYmVpbmcgYSBiaXQKPiA+ICAgdG9vIGVhZ2VyIHRvIGNvbXBsYWluIGFib3V0IGEg cG9zc2libGUgZGVhZGxvY2suCj4gPgo+ID4gLSBDb250cmFyeSB0byB3aGF0IEkgY2xhaW1lZCB0 aGUgcmVhbCBwcm9ibGVtIGlzIHJlY3Vyc2lvbiBvbgo+ID4gICBrbi0+Y291bnQuIEdyZWcgcG9p bnRlZCBtZSBhdCBzeXNmc19icmVha19hY3RpdmVfcHJvdGVjdGlvbigpLCB1c2VkCj4gPiAgIGJ5 IHRoZSBzY3NpIHN1YnN5c3RlbSB0byBhbGxvdyBhIHN5c2ZzIGZpbGUgdG8gdW5iaW5kIGl0c2Vs Zi4gVGhhdAo+ID4gICB3b3VsZCBiZSBhIHJlYWwgZGVhZGxvY2ssIHdoaWNoIGlzbid0IHdoYXQn cyBoYXBwZW5pbmcgaGVyZS4gQWxzbywKPiA+ICAgYnJlYWtpbmcgdGhlIGFjdGl2ZSBwcm90ZWN0 aW9uIG1lYW5zIHdlJ2QgbmVlZCB0byBtYW51YWxseSBoYW5kbGUKPiA+ICAgYWxsIHRoZSBsaWZl dGltZSBmdW4uCj4gPgo+ID4gLSBXaXRoIFJhZmFlbCB3ZSBkaXNjdXNzZWQgdGhlIHRhc2tfd29y ayBhcHByb2FjaCwgd2hpY2gga2luZGEgd29ya3MsCj4gPiAgIGJ1dCBoYXMgdHdvIGRvd25zaWRl czogSXQncyBhIGZ1bmN0aW9uYWwgY2hhbmdlIGZvciBhIGxvY2tkZXAKPiA+ICAgYW5ub3RhdGlv biBpc3N1ZSwgYW5kIGl0IHdvbid0IHdvcmsgZm9yIHRoZSBiaW5kIGZpbGUgKHdoaWNoIG5lZWRz Cj4gPiAgIHRvIGdldCB0aGUgZXJybm8gZnJvbSB0aGUgZHJpdmVyIGxvYWQgZnVuY3Rpb24gYmFj ayB0byB1c2Vyc3BhY2UpLgo+ID4KPiA+IC0gR3JlZyBhbHNvIGFza2VkIHdoeSB0aGlzIG5ldmVy IHNob3dlZCB1cDogVG8gaGl0IHRoaXMgeW91IG5lZWQgdG8KPiA+ICAgdW5yZWdpc3RlciBhIDJu ZCBkcml2ZXIgZnJvbSB0aGUgdW5sb2FkIGNvZGUgb2YgeW91ciBmaXJzdCBkcml2ZXIuIEkKPiA+ ICAgZ3Vlc3Mgb25seSBncHVzIGRvIHRoYXQuIFRoZSBidWcgaGFzIGFsd2F5cyBiZWVuIHRoZXJl LCBidXQgb25seQo+ID4gICB3aXRoIGEgcmVjZW50IHBhdGNoIHNlcmllcyBkaWQgd2UgYWRkIG1v cmUgbG9ja3Mgc28gdGhhdCBsb2NrZGVwCj4gPiAgIGJ1aWx0IGEgY2hhaW4gZnJvbSB1bmJpbmRp bmcgdGhlIHNuZC1oZGEgZHJpdmVyIHRvIHRoZQo+ID4gICBhY3BpX3ZpZGVvX3VucmVnaXN0ZXIg Y2FsbC4KPiA+Cj4gPiBGdWxsIGxvY2tkZXAgc3BsYXQ6Cj4gPgo+ID4gWzEyMzAxLjg5ODc5OV0g PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KPiA+IFsxMjMwMS44 OTg4MDVdIFdBUk5JTkc6IHBvc3NpYmxlIHJlY3Vyc2l2ZSBsb2NraW5nIGRldGVjdGVkCj4gPiBb MTIzMDEuODk4ODExXSA0LjIwLjAtcmM3KyAjODQgTm90IHRhaW50ZWQKPiA+IFsxMjMwMS44OTg4 MTVdIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gPiBbMTIz MDEuODk4ODIxXSBiYXNoLzUyOTcgaXMgdHJ5aW5nIHRvIGFjcXVpcmUgbG9jazoKPiA+IFsxMjMw MS44OTg4MjZdIDAwMDAwMDAwZjYxYzYwOTMgKGtuLT5jb3VudCMzOSl7KysrK30sIGF0OiBrZXJu ZnNfcmVtb3ZlX2J5X25hbWVfbnMrMHgzYi8weDgwCj4gPiBbMTIzMDEuODk4ODQxXSBidXQgdGFz ayBpcyBhbHJlYWR5IGhvbGRpbmcgbG9jazoKPiA+IFsxMjMwMS44OTg4NDddIDAwMDAwMDAwNWY2 MzQwMjEgKGtuLT5jb3VudCMzOSl7KysrK30sIGF0OiBrZXJuZnNfZm9wX3dyaXRlKzB4ZGMvMHgx OTAKPiA+IFsxMjMwMS44OTg4NTZdIG90aGVyIGluZm8gdGhhdCBtaWdodCBoZWxwIHVzIGRlYnVn IHRoaXM6Cj4gPiBbMTIzMDEuODk4ODYyXSAgUG9zc2libGUgdW5zYWZlIGxvY2tpbmcgc2NlbmFy aW86Cj4gPiBbMTIzMDEuODk4ODY3XSAgICAgICAgQ1BVMAo+ID4gWzEyMzAxLjg5ODg3MF0gICAg ICAgIC0tLS0KPiA+IFsxMjMwMS44OTg4NzRdICAgbG9jayhrbi0+Y291bnQjMzkpOwo+ID4gWzEy MzAxLjg5ODg3OV0gICBsb2NrKGtuLT5jb3VudCMzOSk7Cj4gPiBbMTIzMDEuODk4ODgzXSAqKiog REVBRExPQ0sgKioqCj4gPiBbMTIzMDEuODk4ODkxXSAgTWF5IGJlIGR1ZSB0byBtaXNzaW5nIGxv Y2sgbmVzdGluZyBub3RhdGlvbgo+ID4gWzEyMzAxLjg5ODg5OV0gNSBsb2NrcyBoZWxkIGJ5IGJh c2gvNTI5NzoKPiA+IFsxMjMwMS44OTg5MDNdICAjMDogMDAwMDAwMDBjZDgwMGU1NCAoc2Jfd3Jp dGVycyM0KXsuKy4rfSwgYXQ6IHZmc193cml0ZSsweDE3Zi8weDFiMAo+ID4gWzEyMzAxLjg5ODkx NV0gICMxOiAwMDAwMDAwMDA0NjVlN2MyICgmb2YtPm11dGV4KXsrLisufSwgYXQ6IGtlcm5mc19m b3Bfd3JpdGUrMHhkMy8weDE5MAo+ID4gWzEyMzAxLjg5ODkyNV0gICMyOiAwMDAwMDAwMDVmNjM0 MDIxIChrbi0+Y291bnQjMzkpeysrKyt9LCBhdDoga2VybmZzX2ZvcF93cml0ZSsweGRjLzB4MTkw Cj4gPiBbMTIzMDEuODk4OTM2XSAgIzM6IDAwMDAwMDAwNDE0ZWY3YWMgKCZkZXYtPm11dGV4KXsu Li4ufSwgYXQ6IGRldmljZV9yZWxlYXNlX2RyaXZlcl9pbnRlcm5hbCsweDM0LzB4MjQwCj4gPiBb MTIzMDEuODk4OTUwXSAgIzQ6IDAwMDAwMDAwMzIxOGZiZGYgKHJlZ2lzdGVyX2NvdW50X211dGV4 KXsrLisufSwgYXQ6IGFjcGlfdmlkZW9fdW5yZWdpc3RlcisweGUvMHg0MAo+ID4gWzEyMzAxLjg5 ODk2MF0gc3RhY2sgYmFja3RyYWNlOgo+ID4gWzEyMzAxLjg5ODk2OF0gQ1BVOiAxIFBJRDogNTI5 NyBDb21tOiBiYXNoIE5vdCB0YWludGVkIDQuMjAuMC1yYzcrICM4NAo+ID4gWzEyMzAxLjg5ODk3 NF0gSGFyZHdhcmUgbmFtZTogSGV3bGV0dC1QYWNrYXJkIEhQIEVsaXRlQm9vayA4NDYwcC8xNjFD LCBCSU9TIDY4U0NGIFZlci4gRi4wMSAwMy8xMS8yMDExCj4gPiBbMTIzMDEuODk4OTgyXSBDYWxs IFRyYWNlOgo+ID4gWzEyMzAxLjg5ODk4OV0gIGR1bXBfc3RhY2srMHg2Ny8weDliCj4gPiBbMTIz MDEuODk4OTk3XSAgX19sb2NrX2FjcXVpcmUrMHg2YWQvMHgxNDEwCj4gPiBbMTIzMDEuODk5MDAz XSAgPyBrZXJuZnNfcmVtb3ZlX2J5X25hbWVfbnMrMHgzYi8weDgwCj4gPiBbMTIzMDEuODk5MDEw XSAgPyBmaW5kX2hlbGRfbG9jaysweDJkLzB4OTAKPiA+IFsxMjMwMS44OTkwMTddICA/IG11dGV4 X3NwaW5fb25fb3duZXIrMHhlNC8weDE1MAo+ID4gWzEyMzAxLjg5OTAyM10gID8gZmluZF9oZWxk X2xvY2srMHgyZC8weDkwCj4gPiBbMTIzMDEuODk5MDMwXSAgPyBsb2NrX2FjcXVpcmUrMHg5MC8w eDE4MAo+ID4gWzEyMzAxLjg5OTAzNl0gIGxvY2tfYWNxdWlyZSsweDkwLzB4MTgwCj4gPiBbMTIz MDEuODk5MDQyXSAgPyBrZXJuZnNfcmVtb3ZlX2J5X25hbWVfbnMrMHgzYi8weDgwCj4gPiBbMTIz MDEuODk5MDQ5XSAgX19rZXJuZnNfcmVtb3ZlKzB4Mjk2LzB4MzEwCj4gPiBbMTIzMDEuODk5MDU1 XSAgPyBrZXJuZnNfcmVtb3ZlX2J5X25hbWVfbnMrMHgzYi8weDgwCj4gPiBbMTIzMDEuODk5MDYw XSAgPyBrZXJuZnNfbmFtZV9oYXNoKzB4ZC8weDgwCj4gPiBbMTIzMDEuODk5MDY2XSAgPyBrZXJu ZnNfZmluZF9ucysweDZjLzB4MTAwCj4gPiBbMTIzMDEuODk5MDczXSAga2VybmZzX3JlbW92ZV9i eV9uYW1lX25zKzB4M2IvMHg4MAo+ID4gWzEyMzAxLjg5OTA4MF0gIGJ1c19yZW1vdmVfZHJpdmVy KzB4OTIvMHhhMAo+ID4gWzEyMzAxLjg5OTA4NV0gIGFjcGlfdmlkZW9fdW5yZWdpc3RlcisweDI0 LzB4NDAKPiA+IFsxMjMwMS44OTkxMjddICBpOTE1X2RyaXZlcl91bmxvYWQrMHg0Mi8weDEzMCBb aTkxNV0KPiA+IFsxMjMwMS44OTkxNjBdICBpOTE1X3BjaV9yZW1vdmUrMHgxOS8weDMwIFtpOTE1 XQo+ID4gWzEyMzAxLjg5OTE2OV0gIHBjaV9kZXZpY2VfcmVtb3ZlKzB4MzYvMHhiMAo+ID4gWzEy MzAxLjg5OTE3Nl0gIGRldmljZV9yZWxlYXNlX2RyaXZlcl9pbnRlcm5hbCsweDE4NS8weDI0MAo+ ID4gWzEyMzAxLjg5OTE4M10gIHVuYmluZF9zdG9yZSsweGFmLzB4MTgwCj4gPiBbMTIzMDEuODk5 MTg5XSAga2VybmZzX2ZvcF93cml0ZSsweDEwNC8weDE5MAo+ID4gWzEyMzAxLjg5OTE5NV0gIF9f dmZzX3dyaXRlKzB4MzEvMHgxODAKPiA+IFsxMjMwMS44OTkyMDNdICA/IHJjdV9yZWFkX2xvY2tf c2NoZWRfaGVsZCsweDZmLzB4ODAKPiA+IFsxMjMwMS44OTkyMDldICA/IHJjdV9zeW5jX2xvY2tk ZXBfYXNzZXJ0KzB4MjkvMHg1MAo+ID4gWzEyMzAxLjg5OTIxNl0gID8gX19zYl9zdGFydF93cml0 ZSsweDEzYy8weDFhMAo+ID4gWzEyMzAxLjg5OTIyMV0gID8gdmZzX3dyaXRlKzB4MTdmLzB4MWIw Cj4gPiBbMTIzMDEuODk5MjI3XSAgdmZzX3dyaXRlKzB4YjkvMHgxYjAKPiA+IFsxMjMwMS44OTky MzNdICBrc3lzX3dyaXRlKzB4NTAvMHhjMAo+ID4gWzEyMzAxLjg5OTIzOV0gIGRvX3N5c2NhbGxf NjQrMHg0Yi8weDE4MAo+ID4gWzEyMzAxLjg5OTI0N10gIGVudHJ5X1NZU0NBTExfNjRfYWZ0ZXJf aHdmcmFtZSsweDQ5LzB4YmUKPiA+IFsxMjMwMS44OTkyNTNdIFJJUDogMDAzMzoweDdmNDUyYWM3 ZjdhNAo+ID4gWzEyMzAxLjg5OTI1OV0gQ29kZTogMDAgZjcgZDggNjQgODkgMDIgNDggYzcgYzAg ZmYgZmYgZmYgZmYgZWIgYjcgMGYgMWYgODAgMDAgMDAgMDAgMDAgOGIgMDUgYWEgZjAgMmMgMDAg NDggNjMgZmYgODUgYzAgNzUgMTMgYjggMDEgMDAgMDAgMDAgMGYgMDUgPDQ4PiAzZCAwMCBmMCBm ZiBmZiA3NyA1NCBmMyBjMyA2NiA5MCA1NSA1MyA0OCA4OSBkNSA0OCA4OSBmMyA0OCA4Mwo+ID4g WzEyMzAxLjg5OTI3M10gUlNQOiAwMDJiOjAwMDA3ZmZjZWFmYTY5MTggRUZMQUdTOiAwMDAwMDI0 NiBPUklHX1JBWDogMDAwMDAwMDAwMDAwMDAwMQo+ID4gWzEyMzAxLjg5OTI4Ml0gUkFYOiBmZmZm ZmZmZmZmZmZmZmRhIFJCWDogMDAwMDAwMDAwMDAwMDAwZCBSQ1g6IDAwMDA3ZjQ1MmFjN2Y3YTQK PiA+IFsxMjMwMS44OTkyODhdIFJEWDogMDAwMDAwMDAwMDAwMDAwZCBSU0k6IDAwMDA1NjEyYTFh YmY3YzAgUkRJOiAwMDAwMDAwMDAwMDAwMDAxCj4gPiBbMTIzMDEuODk5Mjk1XSBSQlA6IDAwMDA1 NjEyYTFhYmY3YzAgUjA4OiAwMDAwMDAwMDAwMDAwMDBhIFIwOTogMDAwMDU2MTJhMWM0NjczMAo+ ID4gWzEyMzAxLjg5OTMwMV0gUjEwOiAwMDAwMDAwMDAwMDAwMDBhIFIxMTogMDAwMDAwMDAwMDAw MDI0NiBSMTI6IDAwMDAwMDAwMDAwMDAwMGQKPiA+IFsxMjMwMS44OTkzMDhdIFIxMzogMDAwMDAw MDAwMDAwMDAwMSBSMTQ6IDAwMDA3ZjQ1MmFmNGE3NDAgUjE1OiAwMDAwMDAwMDAwMDAwMDBkCj4g Pgo+ID4gTG9ja2luZyBhcm91bmQgSSd2ZSBub3RpY2VkIHRoYXQgdXNiIGFuZCBpMmMgYWxyZWFk eSBoYW5kbGUgc2ltaWxhcgo+ID4gcmVjdXJzaW9uIHByb2JsZW1zLCB3aGVyZSBhIHN5c2ZzIGZp bGUgY2FuIHVuYmluZCB0aGUgc2FtZSB0eXBlIG9mCj4gPiBzeXNmcyBzb21ld2hlcmUgZWxzZSBp biB0aGUgaGllcmFyY2h5LiBSZWxldmFudCBjb21taXRzIGFyZToKPiA+Cj4gPiBjb21taXQgMzU2 YzA1ZDU4YWYwNWQ1ODJlNjM0YjU0YjQwMDUwYzczNjA5NjE3Ygo+ID4gQXV0aG9yOiBBbGFuIFN0 ZXJuIDxzdGVybkByb3dsYW5kLmhhcnZhcmQuZWR1Pgo+ID4gRGF0ZTogICBNb24gTWF5IDE0IDEz OjMwOjAzIDIwMTIgLTA0MDAKPiA+Cj4gPiAgICAgc3lzZnM6IGdldCByaWQgb2Ygc29tZSBsb2Nr ZGVwIGZhbHNlIHBvc2l0aXZlcwo+ID4KPiA+IGNvbW1pdCBlOWI1MjZmZTcwNDgxMjM2NGJjYTA3 ZWRkMTVlYWRlYmExNjNlYmZiCj4gPiBBdXRob3I6IEFsZXhhbmRlciBTdmVyZGxpbiA8YWxleGFu ZGVyLnN2ZXJkbGluQG5zbi5jb20+Cj4gPiBEYXRlOiAgIEZyaSBNYXkgMTcgMTQ6NTY6MzUgMjAx MyArMDIwMAo+ID4KPiA+ICAgICBpMmM6IHN1cHByZXNzIGxvY2tkZXAgd2FybmluZyBvbiBkZWxl dGVfZGV2aWNlCj4gPgo+ID4gSW1wbGVtZW50IHRoZSBzYW1lIHRyaWNrIGZvciBkcml2ZXIgYmlu ZC91bmJpbmQuCj4gPgo+ID4gQ2M6ICJSYWZhZWwgSi4gV3lzb2NraSIgPHJhZmFlbEBrZXJuZWwu b3JnPgo+ID4gQ2M6IEdyZWcgS3JvYWgtSGFydG1hbiA8Z3JlZ2toQGxpbnV4Zm91bmRhdGlvbi5v cmc+Cj4gPiBDYzogUmFtYWxpbmdhbSBDIDxyYW1hbGluZ2FtLmNAaW50ZWwuY29tPgo+ID4gQ2M6 IEFyZW5kIHZhbiBTcHJpZWwgPGFzcHJpZWxAZ21haWwuY29tPgo+ID4gQ2M6IEFuZHkgU2hldmNo ZW5rbyA8YW5kcml5LnNoZXZjaGVua29AbGludXguaW50ZWwuY29tPgo+ID4gQ2M6IEdlZXJ0IFV5 dHRlcmhvZXZlbiA8Z2VlcnQrcmVuZXNhc0BnbGlkZXIuYmU+Cj4gPiBDYzogQmFydG9zeiBHb2xh c3pld3NraSA8YnJnbEBiZ2Rldi5wbD4KPiA+IENjOiBIZWlra2kgS3JvZ2VydXMgPGhlaWtraS5r cm9nZXJ1c0BsaW51eC5pbnRlbC5jb20+Cj4gPiBDYzogVml2ZWsgR2F1dGFtIDx2aXZlay5nYXV0 YW1AY29kZWF1cm9yYS5vcmc+Cj4gPiBDYzogSm9lIFBlcmNoZXMgPGpvZUBwZXJjaGVzLmNvbT4K PiA+IFNpZ25lZC1vZmYtYnk6IERhbmllbCBWZXR0ZXIgPGRhbmllbC52ZXR0ZXJAaW50ZWwuY29t Pgo+ID4gLS0tCj4gPiAgZHJpdmVycy9iYXNlL2J1cy5jICAgICB8IDQgKystLQo+ID4gIGluY2x1 ZGUvbGludXgvZGV2aWNlLmggfCA0ICsrKysKPiA+ICAyIGZpbGVzIGNoYW5nZWQsIDYgaW5zZXJ0 aW9ucygrKSwgMiBkZWxldGlvbnMoLSkKPiA+Cj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9iYXNl L2J1cy5jIGIvZHJpdmVycy9iYXNlL2J1cy5jCj4gPiBpbmRleCA4YmZkMjdlYzczZDYuLjVkMjQx MWI4NDhjZCAxMDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvYmFzZS9idXMuYwo+ID4gKysrIGIvZHJp dmVycy9iYXNlL2J1cy5jCj4gPiBAQCAtMTk1LDcgKzE5NSw3IEBAIHN0YXRpYyBzc2l6ZV90IHVu YmluZF9zdG9yZShzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2LCBjb25zdCBjaGFyICpidWYsCj4g PiAgICAgICBidXNfcHV0KGJ1cyk7Cj4gPiAgICAgICByZXR1cm4gZXJyOwo+ID4gIH0KPiA+IC1z dGF0aWMgRFJJVkVSX0FUVFJfV08odW5iaW5kKTsKPiA+ICtzdGF0aWMgRFJJVkVSX0FUVFJfSUdO T1JFX0xPQ0tERVAodW5iaW5kLCBTX0lXVVNSLCBOVUxMLCB1bmJpbmRfc3RvcmUpOwo+ID4KPiA+ ICAvKgo+ID4gICAqIE1hbnVhbGx5IGF0dGFjaCBhIGRldmljZSB0byBhIGRyaXZlci4KPiA+IEBA IC0yMzEsNyArMjMxLDcgQEAgc3RhdGljIHNzaXplX3QgYmluZF9zdG9yZShzdHJ1Y3QgZGV2aWNl X2RyaXZlciAqZHJ2LCBjb25zdCBjaGFyICpidWYsCj4gPiAgICAgICBidXNfcHV0KGJ1cyk7Cj4g PiAgICAgICByZXR1cm4gZXJyOwo+ID4gIH0KPiA+IC1zdGF0aWMgRFJJVkVSX0FUVFJfV08oYmlu ZCk7Cj4gPiArc3RhdGljIERSSVZFUl9BVFRSX0lHTk9SRV9MT0NLREVQKGJpbmQsIFNfSVdVU1Is IE5VTEwsIGJpbmRfc3RvcmUpOwo+ID4KPiA+ICBzdGF0aWMgc3NpemVfdCBzaG93X2RyaXZlcnNf YXV0b3Byb2JlKHN0cnVjdCBidXNfdHlwZSAqYnVzLCBjaGFyICpidWYpCj4gPiAgewo+ID4gZGlm ZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZGV2aWNlLmggYi9pbmNsdWRlL2xpbnV4L2RldmljZS5o Cj4gPiBpbmRleCAxYjI1YzdhNDNmNGMuLmQyY2IxYTZjNWQ5NSAxMDA2NDQKPiA+IC0tLSBhL2lu Y2x1ZGUvbGludXgvZGV2aWNlLmgKPiA+ICsrKyBiL2luY2x1ZGUvbGludXgvZGV2aWNlLmgKPiA+ IEBAIC0zMjYsNiArMzI2LDEwIEBAIHN0cnVjdCBkcml2ZXJfYXR0cmlidXRlIHsKPiA+ICAgICAg IHN0cnVjdCBkcml2ZXJfYXR0cmlidXRlIGRyaXZlcl9hdHRyXyMjX25hbWUgPSBfX0FUVFJfUk8o X25hbWUpCj4gPiAgI2RlZmluZSBEUklWRVJfQVRUUl9XTyhfbmFtZSkgXAo+ID4gICAgICAgc3Ry dWN0IGRyaXZlcl9hdHRyaWJ1dGUgZHJpdmVyX2F0dHJfIyNfbmFtZSA9IF9fQVRUUl9XTyhfbmFt ZSkKPiA+ICsjZGVmaW5lIERSSVZFUl9BVFRSX0lHTk9SRV9MT0NLREVQKF9uYW1lLCBfbW9kZSwg X3Nob3csIF9zdG9yZSkgXAo+ID4gKyAgICAgc3RydWN0IGRyaXZlcl9hdHRyaWJ1dGUgZHJpdmVy X2F0dHJfIyNfbmFtZSA9ICAgICAgICAgICBcCj4gPiArICAgICAgICAgICAgIF9fQVRUUl9JR05P UkVfTE9DS0RFUChfbmFtZSwgX21vZGUsIF9zaG93LCBfc3RvcmUpCj4gPiArCj4KPiBJIGRvbid0 IHdhbnQgdG8gZ2l2ZSBkcml2ZXIgd3JpdGVycyB0aGUgYWJpbGl0eSB0byBzaG9vdCB0aGVtc2Vs dmVzIGluCj4gdGhlIGZvb3QsIGNhbiB5b3UganVzdCBwdXQgdGhpcyBpbiB0aGUgYnVzLmMgZmls ZSBpdHNlbGYgc28gdGhhdCBubyBvbmUKPiBlbHNlIHdpbGwgYWJ1c2UgdGhpcyBhbmQgIm9wZW4g Y29kZSIgdGhlIHVuYmluZC9iaW5kIGF0dHJpYnV0ZXMgaW5zdGVhZAo+IG9mIHVzaW5nIGEgI2Rl ZmluZSBmb3IgaXQ/CgpHb29kIHBvaW50LCBidXQgYW55IGF0dHJpYnV0ZSBzdGFydGluZyBhIGRy aXZlciB1bmJpbmQgdmlhIHN5c2ZzIHdpbGwKbmVlZCB0aGlzLCB3b24ndCBpdD8KCj4gQWxzbyBJ J3ZlIGJlZW4gdHJ5aW5nIHRvIGdldCByaWQgb2YgdGhlICJzcGVjaWZ5IHRoZSBtb2RlIiBtYWNy b3MsIHNvCj4gdGhhdCBldmVyeW9uZSB1c2VzIHRoZSBSTywgV08sIGFuZCBSVyB2ZXJzaW9ucywg c28gYWRkaW5nIGEgZ2VuZXJpYyBvbmUKPiBoZXJlIGlzIG5vdCBnb2luZyB0byBoZWxwIHdpdGgg dGhhdCBlZmZvcnQgOikKCkJ1dCBpZiB0aGF0IGdvZXMgaW50byBidXMuYyBkaXJlY3RseSwgdGhl IG1vZGUgYXJnIGRvZXNuJ3QgaHVydCBJTU8KYW5kIG9uZSBtYWNybyB3b3VsZCBiZSBzdWZmaWNp ZW50IHRvIGNvdmVyIGJvdGggYXR0cnMuCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZy ZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2ludGVsLWdmeAo=