From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753214AbbLSC2u (ORCPT ); Fri, 18 Dec 2015 21:28:50 -0500 Received: from mail-bn1bon0117.outbound.protection.outlook.com ([157.56.111.117]:14848 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752626AbbLSC2s (ORCPT ); Fri, 18 Dec 2015 21:28:48 -0500 From: KY Srinivasan To: James Bottomley , Hannes Reinecke , "gregkh@linuxfoundation.org" , "linux-kernel@vger.kernel.org" , "devel@linuxdriverproject.org" , "ohering@suse.com" , "jbottomley@parallels.com" , "hch@infradead.org" , "linux-scsi@vger.kernel.org" , "apw@canonical.com" , "vkuznets@redhat.com" , "jasowang@redhat.com" , "martin.petersen@oracle.com" Subject: RE: [PATCH V3 4/4] scsi: storvsc: Tighten up the interrupt path Thread-Topic: [PATCH V3 4/4] scsi: storvsc: Tighten up the interrupt path Thread-Index: AQHRNdfGO631L0PR7EqVHtKoienZCZ7QdwGAgAB9ApCAAAgMAIAABxkg Date: Sat, 19 Dec 2015 02:28:43 +0000 Message-ID: References: <1450038486-19211-1-git-send-email-kys@microsoft.com> <1450038512-19252-1-git-send-email-kys@microsoft.com> <1450038512-19252-4-git-send-email-kys@microsoft.com> <5673C92B.5070602@suse.de> <1450457288.2439.7.camel@HansenPartnership.com> In-Reply-To: <1450457288.2439.7.camel@HansenPartnership.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: spf=none (sender IP is ) smtp.mailfrom=kys@microsoft.com; x-originating-ip: [2601:600:8c01:121d:78e3:3bf:5771:988c] x-microsoft-exchange-diagnostics: 1;BY2PR0301MB1655;5:DEWIAzLXcRjRq4K1+EXApkFQDJcSzPRbhvtOLvLC9vzFUTS8h4Ou8NmlhY62TjacSYNcHNuNSjH1eeGG8Y3WUV4ZMP1g6+V3gnz/kDem2PJyagahI0d+XWxBq6E9GNNjfVCtXVsS4DMkL0W8N2ZuOA==;24:B3Ha/cIpenOEtEjJ2SVI419oAU8Rhn4+Pzjv/ZamkxzLrtc77KXt0OkI2Me51E3PqSLE6unX2xyxz5MNmS6Ql9Bk3U9BjbibVMqv4itShVM= x-microsoft-antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY2PR0301MB1655; x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:; x-exchange-antispam-report-cfa-test: BCL:0;PCL:0;RULEID:(61425038)(601004)(2401047)(520078)(5005006)(8121501046)(3002001)(10201501046)(61426038)(61427038);SRVR:BY2PR0301MB1655;BCL:0;PCL:0;RULEID:;SRVR:BY2PR0301MB1655; x-forefront-prvs: 07954CC105 x-forefront-antispam-report: SFV:NSPM;SFS:(10019020)(6009001)(377424004)(479174004)(377454003)(13464003)(24454002)(189002)(199003)(19580395003)(76176999)(19580405001)(40100003)(74316001)(33656002)(86362001)(189998001)(10090500001)(50986999)(77096005)(5005710100001)(87936001)(10290500002)(101416001)(86612001)(5008740100001)(2900100001)(54356999)(10400500002)(2950100001)(5003600100002)(5001960100002)(97736004)(76576001)(6116002)(2201001)(2501003)(122556002)(102836003)(107886002)(8990500004)(4001150100001)(99286002)(92566002)(5002640100001)(81156007)(93886004)(11100500001)(1096002)(106116001)(586003)(5001770100001)(5004730100002)(1220700001)(105586002)(106356001)(921003)(3826002)(1121003);DIR:OUT;SFP:1102;SCL:1;SRVR:BY2PR0301MB1655;H:BY2PR0301MB1654.namprd03.prod.outlook.com;FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; spamdiagnosticoutput: 1:23 spamdiagnosticmetadata: NSPM Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 X-OriginatorOrg: microsoft.com X-MS-Exchange-CrossTenant-originalarrivaltime: 19 Dec 2015 02:28:44.1539 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 72f988bf-86f1-41af-91ab-2d7cd011db47 X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY2PR0301MB1655 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from base64 to 8bit by mail.home.local id tBJ2StdL028394 > -----Original Message----- > From: James Bottomley [mailto:James.Bottomley@HansenPartnership.com] > Sent: Friday, December 18, 2015 8:48 AM > To: KY Srinivasan ; Hannes Reinecke ; > gregkh@linuxfoundation.org; linux-kernel@vger.kernel.org; > devel@linuxdriverproject.org; ohering@suse.com; > jbottomley@parallels.com; hch@infradead.org; linux-scsi@vger.kernel.org; > apw@canonical.com; vkuznets@redhat.com; jasowang@redhat.com; > martin.petersen@oracle.com > Subject: Re: [PATCH V3 4/4] scsi: storvsc: Tighten up the interrupt path > > On Fri, 2015-12-18 at 16:20 +0000, KY Srinivasan wrote: > > > > > -----Original Message----- > > > From: Hannes Reinecke [mailto:hare@suse.de] > > > Sent: Friday, December 18, 2015 12:52 AM > > > To: KY Srinivasan ; gregkh@linuxfoundation.org; > > > linux- > > > kernel@vger.kernel.org; devel@linuxdriverproject.org; > > > ohering@suse.com; > > > jbottomley@parallels.com; hch@infradead.org; > > > linux-scsi@vger.kernel.org; > > > apw@canonical.com; vkuznets@redhat.com; jasowang@redhat.com; > > > martin.petersen@oracle.com > > > Subject: Re: [PATCH V3 4/4] scsi: storvsc: Tighten up the interrupt > > > path > > > > > > On 12/13/2015 09:28 PM, K. Y. Srinivasan wrote: > > > > On the interrupt path, we repeatedly establish the pointer to the > > > > storvsc_device. Fix this. > > > > > > > > Signed-off-by: K. Y. Srinivasan > > > > Reviewed-by: Long Li > > > > Reviewed-by: Johannes Thumshirn > > > > Tested-by: Alex Ng > > > > --- > > > > drivers/scsi/storvsc_drv.c | 23 ++++++++--------------- > > > > 1 files changed, 8 insertions(+), 15 deletions(-) > > > > > > > > diff --git a/drivers/scsi/storvsc_drv.c > > > > b/drivers/scsi/storvsc_drv.c > > > > index d6ca4f2..b68aebe 100644 > > > > --- a/drivers/scsi/storvsc_drv.c > > > > +++ b/drivers/scsi/storvsc_drv.c > > > > @@ -945,19 +945,16 @@ static void storvsc_handle_error(struct > > > vmscsi_request *vm_srb, > > > > } > > > > > > > > > > > > -static void storvsc_command_completion(struct > > > > storvsc_cmd_request > > > *cmd_request) > > > > +static void storvsc_command_completion(struct > > > > storvsc_cmd_request > > > *cmd_request, > > > > + struct storvsc_device > > > > *stor_dev) > > > > { > > > > struct scsi_cmnd *scmnd = cmd_request->cmd; > > > > - struct hv_host_device *host_dev = shost_priv(scmnd > > > > ->device- > > > > host); > > > > struct scsi_sense_hdr sense_hdr; > > > > struct vmscsi_request *vm_srb; > > > > struct Scsi_Host *host; > > > > - struct storvsc_device *stor_dev; > > > > - struct hv_device *dev = host_dev->dev; > > > > u32 payload_sz = cmd_request->payload_sz; > > > > void *payload = cmd_request->payload; > > > > > > > > - stor_dev = get_in_stor_device(dev); > > > > host = stor_dev->host; > > > > > > > > vm_srb = &cmd_request->vstor_packet.vm_srb; > > > > @@ -987,14 +984,13 @@ static void > > > > storvsc_command_completion(struct > > > storvsc_cmd_request *cmd_request) > > > > kfree(payload); > > > > } > > > > > > > > -static void storvsc_on_io_completion(struct hv_device *device, > > > > +static void storvsc_on_io_completion(struct storvsc_device > > > > *stor_device, > > > > struct vstor_packet > > > > *vstor_packet, > > > > struct storvsc_cmd_request > > > > *request) > > > > { > > > > - struct storvsc_device *stor_device; > > > > struct vstor_packet *stor_pkt; > > > > + struct hv_device *device = stor_device->device; > > > > > > > > - stor_device = hv_get_drvdata(device); > > > > stor_pkt = &request->vstor_packet; > > > > > > > > /* > > > > @@ -1049,7 +1045,7 @@ static void storvsc_on_io_completion(struct > > > hv_device *device, > > > > stor_pkt->vm_srb.data_transfer_length = > > > > vstor_packet->vm_srb.data_transfer_length; > > > > > > > > - storvsc_command_completion(request); > > > > + storvsc_command_completion(request, stor_device); > > > > > > > > if (atomic_dec_and_test(&stor_device > > > > ->num_outstanding_req) && > > > > stor_device->drain_notify) > > > > @@ -1058,21 +1054,19 @@ static void > > > > storvsc_on_io_completion(struct > > > hv_device *device, > > > > > > > > } > > > > > > > > -static void storvsc_on_receive(struct hv_device *device, > > > > +static void storvsc_on_receive(struct storvsc_device > > > > *stor_device, > > > > struct vstor_packet *vstor_packet, > > > > struct storvsc_cmd_request > > > > *request) > > > > { > > > > struct storvsc_scan_work *work; > > > > - struct storvsc_device *stor_device; > > > > > > > > switch (vstor_packet->operation) { > > > > case VSTOR_OPERATION_COMPLETE_IO: > > > > - storvsc_on_io_completion(device, vstor_packet, > > > > request); > > > > + storvsc_on_io_completion(stor_device, > > > > vstor_packet, > > > request); > > > > break; > > > > > > > > case VSTOR_OPERATION_REMOVE_DEVICE: > > > > case VSTOR_OPERATION_ENUMERATE_BUS: > > > > - stor_device = get_in_stor_device(device); > > > > work = kmalloc(sizeof(struct > > > > storvsc_scan_work), > > > GFP_ATOMIC); > > > > if (!work) > > > > return; > > > > @@ -1083,7 +1077,6 @@ static void storvsc_on_receive(struct > > > > hv_device > > > *device, > > > > break; > > > > > > > > case VSTOR_OPERATION_FCHBA_DATA: > > > > - stor_device = get_in_stor_device(device); > > > > cache_wwn(stor_device, vstor_packet); > > > > #ifdef CONFIG_SCSI_FC_ATTRS > > > > fc_host_node_name(stor_device->host) = > > > > stor_device- > > > > node_name; > > > > @@ -1133,7 +1126,7 @@ static void > > > > storvsc_on_channel_callback(void > > > *context) > > > > vmscsi_size_delta)); > > > > complete(&request->wait_event); > > > > } else { > > > > - storvsc_on_receive(device, > > > > + storvsc_on_receive(stor_device, > > > > (struct > > > > vstor_packet > > > *)packet, > > > > request); > > > > } > > > > > > > Hmm. I would've thought the compiler optimizes this away. Have you > > > checked whether it actually makes a difference in the assembler > > > output? > > > > I have not checked the assembler output. It was easy enough to fix > > the source. > > Could you? You're making what you describe as an optimisation but > there are two reasons why this might not be so. The first is that the > compiler is entitled to inline static functions. If it did, likely it > picked up the optmisation anyway as Hannes suggested. However, the > other reason this might not be an optimisation (assuming the compiler > doesn't inline the function) is you're passing an argument which can be > offset computed. On all architectures, you have a fixed number of > registers for passing function arguments, then we have to use the > stack. Using the stack comes in far more expensive than computing an > offset to an existing pointer. Even if you're still in registers, the > offset now has to be computed and stored and the compiler loses track > of the relation. > > The bottom line is that adding an extra argument for a value which can > be offset computed is rarely a win. James, When I did this, I was mostly concerned about the cost of reestablishing state that was already known. So, even with the function being in-lined, I felt the cost of reestablishing state that was already known is unnecessary. In this particular case, I did not change the number of arguments that were being passed; I just changed the type of one of them - instead of passing struct hv_device *, I am now passing struct storvsc_device *. In the current code, we are using struct hv_device * to establish a pointer to struct storvsc_device * via the function get_in_stor_device(). This pattern currently exists in the call chain from the interrupt handler - storvsc_on_channel_callback(). While the compiler is smart enough to inline both get_in_stor_device() as well as many of the static functions in the call chain from storvsc_on_channel_callback(), looking at the assembled code, the compiler is repeatedly inlining the call to get_in_stor_device() and this clearly is less than optimal. Regards, K. Y {.n++%ݶw{.n+{G{ayʇڙ,jfhz_(階ݢj"mG?&~iOzv^m ?I From mboxrd@z Thu Jan 1 00:00:00 1970 From: KY Srinivasan Subject: RE: [PATCH V3 4/4] scsi: storvsc: Tighten up the interrupt path Date: Sat, 19 Dec 2015 02:28:43 +0000 Message-ID: References: <1450038486-19211-1-git-send-email-kys@microsoft.com> <1450038512-19252-1-git-send-email-kys@microsoft.com> <1450038512-19252-4-git-send-email-kys@microsoft.com> <5673C92B.5070602@suse.de> <1450457288.2439.7.camel@HansenPartnership.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1450457288.2439.7.camel@HansenPartnership.com> Content-Language: en-US Sender: linux-kernel-owner@vger.kernel.org To: James Bottomley , Hannes Reinecke , "gregkh@linuxfoundation.org" , "linux-kernel@vger.kernel.org" , "devel@linuxdriverproject.org" , "ohering@suse.com" , "jbottomley@parallels.com" , "hch@infradead.org" , "linux-scsi@vger.kernel.org" , "apw@canonical.com" , "vkuznets@redhat.com" , "jasowang@redhat.com" , "martin.petersen@oracle.com" List-Id: linux-scsi@vger.kernel.org DQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogSmFtZXMgQm90dG9tbGV5 IFttYWlsdG86SmFtZXMuQm90dG9tbGV5QEhhbnNlblBhcnRuZXJzaGlwLmNvbV0NCj4gU2VudDog RnJpZGF5LCBEZWNlbWJlciAxOCwgMjAxNSA4OjQ4IEFNDQo+IFRvOiBLWSBTcmluaXZhc2FuIDxr eXNAbWljcm9zb2Z0LmNvbT47IEhhbm5lcyBSZWluZWNrZSA8aGFyZUBzdXNlLmRlPjsNCj4gZ3Jl Z2toQGxpbnV4Zm91bmRhdGlvbi5vcmc7IGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmc7DQo+ IGRldmVsQGxpbnV4ZHJpdmVycHJvamVjdC5vcmc7IG9oZXJpbmdAc3VzZS5jb207DQo+IGpib3R0 b21sZXlAcGFyYWxsZWxzLmNvbTsgaGNoQGluZnJhZGVhZC5vcmc7IGxpbnV4LXNjc2lAdmdlci5r ZXJuZWwub3JnOw0KPiBhcHdAY2Fub25pY2FsLmNvbTsgdmt1em5ldHNAcmVkaGF0LmNvbTsgamFz b3dhbmdAcmVkaGF0LmNvbTsNCj4gbWFydGluLnBldGVyc2VuQG9yYWNsZS5jb20NCj4gU3ViamVj dDogUmU6IFtQQVRDSCBWMyA0LzRdIHNjc2k6IHN0b3J2c2M6IFRpZ2h0ZW4gdXAgdGhlIGludGVy cnVwdCBwYXRoDQo+IA0KPiBPbiBGcmksIDIwMTUtMTItMTggYXQgMTY6MjAgKzAwMDAsIEtZIFNy aW5pdmFzYW4gd3JvdGU6DQo+ID4NCj4gPiA+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQo+ ID4gPiBGcm9tOiBIYW5uZXMgUmVpbmVja2UgW21haWx0bzpoYXJlQHN1c2UuZGVdDQo+ID4gPiBT ZW50OiBGcmlkYXksIERlY2VtYmVyIDE4LCAyMDE1IDEyOjUyIEFNDQo+ID4gPiBUbzogS1kgU3Jp bml2YXNhbiA8a3lzQG1pY3Jvc29mdC5jb20+OyBncmVna2hAbGludXhmb3VuZGF0aW9uLm9yZzsN Cj4gPiA+IGxpbnV4LQ0KPiA+ID4ga2VybmVsQHZnZXIua2VybmVsLm9yZzsgZGV2ZWxAbGludXhk cml2ZXJwcm9qZWN0Lm9yZzsNCj4gPiA+IG9oZXJpbmdAc3VzZS5jb207DQo+ID4gPiBqYm90dG9t bGV5QHBhcmFsbGVscy5jb207IGhjaEBpbmZyYWRlYWQub3JnOw0KPiA+ID4gbGludXgtc2NzaUB2 Z2VyLmtlcm5lbC5vcmc7DQo+ID4gPiBhcHdAY2Fub25pY2FsLmNvbTsgdmt1em5ldHNAcmVkaGF0 LmNvbTsgamFzb3dhbmdAcmVkaGF0LmNvbTsNCj4gPiA+IG1hcnRpbi5wZXRlcnNlbkBvcmFjbGUu Y29tDQo+ID4gPiBTdWJqZWN0OiBSZTogW1BBVENIIFYzIDQvNF0gc2NzaTogc3RvcnZzYzogVGln aHRlbiB1cCB0aGUgaW50ZXJydXB0DQo+ID4gPiBwYXRoDQo+ID4gPg0KPiA+ID4gT24gMTIvMTMv MjAxNSAwOToyOCBQTSwgSy4gWS4gU3Jpbml2YXNhbiB3cm90ZToNCj4gPiA+ID4gT24gdGhlIGlu dGVycnVwdCBwYXRoLCB3ZSByZXBlYXRlZGx5IGVzdGFibGlzaCB0aGUgcG9pbnRlciB0byB0aGUN Cj4gPiA+ID4gc3RvcnZzY19kZXZpY2UuIEZpeCB0aGlzLg0KPiA+ID4gPg0KPiA+ID4gPiBTaWdu ZWQtb2ZmLWJ5OiBLLiBZLiBTcmluaXZhc2FuIDxreXNAbWljcm9zb2Z0LmNvbT4NCj4gPiA+ID4g UmV2aWV3ZWQtYnk6IExvbmcgTGkgPGxvbmdsaUBtaWNyb3NvZnQuY29tPg0KPiA+ID4gPiBSZXZp ZXdlZC1ieTogSm9oYW5uZXMgVGh1bXNoaXJuIDxqdGh1bXNoaXJuQHN1c2UuZGU+DQo+ID4gPiA+ IFRlc3RlZC1ieTogQWxleCBOZyA8YWxleG5nQG1pY3Jvc29mdC5jb20+DQo+ID4gPiA+IC0tLQ0K PiA+ID4gPiAgIGRyaXZlcnMvc2NzaS9zdG9ydnNjX2Rydi5jIHwgICAyMyArKysrKysrKy0tLS0t LS0tLS0tLS0tLQ0KPiA+ID4gPiAgIDEgZmlsZXMgY2hhbmdlZCwgOCBpbnNlcnRpb25zKCspLCAx NSBkZWxldGlvbnMoLSkNCj4gPiA+ID4NCj4gPiA+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvc2Nz aS9zdG9ydnNjX2Rydi5jDQo+ID4gPiA+IGIvZHJpdmVycy9zY3NpL3N0b3J2c2NfZHJ2LmMNCj4g PiA+ID4gaW5kZXggZDZjYTRmMi4uYjY4YWViZSAxMDA2NDQNCj4gPiA+ID4gLS0tIGEvZHJpdmVy cy9zY3NpL3N0b3J2c2NfZHJ2LmMNCj4gPiA+ID4gKysrIGIvZHJpdmVycy9zY3NpL3N0b3J2c2Nf ZHJ2LmMNCj4gPiA+ID4gQEAgLTk0NSwxOSArOTQ1LDE2IEBAIHN0YXRpYyB2b2lkIHN0b3J2c2Nf aGFuZGxlX2Vycm9yKHN0cnVjdA0KPiA+ID4gdm1zY3NpX3JlcXVlc3QgKnZtX3NyYiwNCj4gPiA+ ID4gICB9DQo+ID4gPiA+DQo+ID4gPiA+DQo+ID4gPiA+IC1zdGF0aWMgdm9pZCBzdG9ydnNjX2Nv bW1hbmRfY29tcGxldGlvbihzdHJ1Y3QNCj4gPiA+ID4gc3RvcnZzY19jbWRfcmVxdWVzdA0KPiA+ ID4gKmNtZF9yZXF1ZXN0KQ0KPiA+ID4gPiArc3RhdGljIHZvaWQgc3RvcnZzY19jb21tYW5kX2Nv bXBsZXRpb24oc3RydWN0DQo+ID4gPiA+IHN0b3J2c2NfY21kX3JlcXVlc3QNCj4gPiA+ICpjbWRf cmVxdWVzdCwNCj4gPiA+ID4gKwkJCQkgICAgICAgc3RydWN0IHN0b3J2c2NfZGV2aWNlDQo+ID4g PiA+ICpzdG9yX2RldikNCj4gPiA+ID4gICB7DQo+ID4gPiA+ICAgCXN0cnVjdCBzY3NpX2NtbmQg KnNjbW5kID0gY21kX3JlcXVlc3QtPmNtZDsNCj4gPiA+ID4gLQlzdHJ1Y3QgaHZfaG9zdF9kZXZp Y2UgKmhvc3RfZGV2ID0gc2hvc3RfcHJpdihzY21uZA0KPiA+ID4gPiAtPmRldmljZS0NCj4gPiA+ ID4gaG9zdCk7DQo+ID4gPiA+ICAgCXN0cnVjdCBzY3NpX3NlbnNlX2hkciBzZW5zZV9oZHI7DQo+ ID4gPiA+ICAgCXN0cnVjdCB2bXNjc2lfcmVxdWVzdCAqdm1fc3JiOw0KPiA+ID4gPiAgIAlzdHJ1 Y3QgU2NzaV9Ib3N0ICpob3N0Ow0KPiA+ID4gPiAtCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3Rv cl9kZXY7DQo+ID4gPiA+IC0Jc3RydWN0IGh2X2RldmljZSAqZGV2ID0gaG9zdF9kZXYtPmRldjsN Cj4gPiA+ID4gICAJdTMyIHBheWxvYWRfc3ogPSBjbWRfcmVxdWVzdC0+cGF5bG9hZF9zejsNCj4g PiA+ID4gICAJdm9pZCAqcGF5bG9hZCA9IGNtZF9yZXF1ZXN0LT5wYXlsb2FkOw0KPiA+ID4gPg0K PiA+ID4gPiAtCXN0b3JfZGV2ID0gZ2V0X2luX3N0b3JfZGV2aWNlKGRldik7DQo+ID4gPiA+ICAg CWhvc3QgPSBzdG9yX2Rldi0+aG9zdDsNCj4gPiA+ID4NCj4gPiA+ID4gICAJdm1fc3JiID0gJmNt ZF9yZXF1ZXN0LT52c3Rvcl9wYWNrZXQudm1fc3JiOw0KPiA+ID4gPiBAQCAtOTg3LDE0ICs5ODQs MTMgQEAgc3RhdGljIHZvaWQNCj4gPiA+ID4gc3RvcnZzY19jb21tYW5kX2NvbXBsZXRpb24oc3Ry dWN0DQo+ID4gPiBzdG9ydnNjX2NtZF9yZXF1ZXN0ICpjbWRfcmVxdWVzdCkNCj4gPiA+ID4gICAJ CWtmcmVlKHBheWxvYWQpOw0KPiA+ID4gPiAgIH0NCj4gPiA+ID4NCj4gPiA+ID4gLXN0YXRpYyB2 b2lkIHN0b3J2c2Nfb25faW9fY29tcGxldGlvbihzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsDQo+ ID4gPiA+ICtzdGF0aWMgdm9pZCBzdG9ydnNjX29uX2lvX2NvbXBsZXRpb24oc3RydWN0IHN0b3J2 c2NfZGV2aWNlDQo+ID4gPiA+ICpzdG9yX2RldmljZSwNCj4gPiA+ID4gICAJCQkJICBzdHJ1Y3Qg dnN0b3JfcGFja2V0DQo+ID4gPiA+ICp2c3Rvcl9wYWNrZXQsDQo+ID4gPiA+ICAgCQkJCSAgc3Ry dWN0IHN0b3J2c2NfY21kX3JlcXVlc3QNCj4gPiA+ID4gKnJlcXVlc3QpDQo+ID4gPiA+ICAgew0K PiA+ID4gPiAtCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3Rvcl9kZXZpY2U7DQo+ID4gPiA+ICAg CXN0cnVjdCB2c3Rvcl9wYWNrZXQgKnN0b3JfcGt0Ow0KPiA+ID4gPiArCXN0cnVjdCBodl9kZXZp Y2UgKmRldmljZSA9IHN0b3JfZGV2aWNlLT5kZXZpY2U7DQo+ID4gPiA+DQo+ID4gPiA+IC0Jc3Rv cl9kZXZpY2UgPSBodl9nZXRfZHJ2ZGF0YShkZXZpY2UpOw0KPiA+ID4gPiAgIAlzdG9yX3BrdCA9 ICZyZXF1ZXN0LT52c3Rvcl9wYWNrZXQ7DQo+ID4gPiA+DQo+ID4gPiA+ICAgCS8qDQo+ID4gPiA+ IEBAIC0xMDQ5LDcgKzEwNDUsNyBAQCBzdGF0aWMgdm9pZCBzdG9ydnNjX29uX2lvX2NvbXBsZXRp b24oc3RydWN0DQo+ID4gPiBodl9kZXZpY2UgKmRldmljZSwNCj4gPiA+ID4gICAJc3Rvcl9wa3Qt PnZtX3NyYi5kYXRhX3RyYW5zZmVyX2xlbmd0aCA9DQo+ID4gPiA+ICAgCXZzdG9yX3BhY2tldC0+ dm1fc3JiLmRhdGFfdHJhbnNmZXJfbGVuZ3RoOw0KPiA+ID4gPg0KPiA+ID4gPiAtCXN0b3J2c2Nf Y29tbWFuZF9jb21wbGV0aW9uKHJlcXVlc3QpOw0KPiA+ID4gPiArCXN0b3J2c2NfY29tbWFuZF9j b21wbGV0aW9uKHJlcXVlc3QsIHN0b3JfZGV2aWNlKTsNCj4gPiA+ID4NCj4gPiA+ID4gICAJaWYg KGF0b21pY19kZWNfYW5kX3Rlc3QoJnN0b3JfZGV2aWNlDQo+ID4gPiA+IC0+bnVtX291dHN0YW5k aW5nX3JlcSkgJiYNCj4gPiA+ID4gICAJCXN0b3JfZGV2aWNlLT5kcmFpbl9ub3RpZnkpDQo+ID4g PiA+IEBAIC0xMDU4LDIxICsxMDU0LDE5IEBAIHN0YXRpYyB2b2lkDQo+ID4gPiA+IHN0b3J2c2Nf b25faW9fY29tcGxldGlvbihzdHJ1Y3QNCj4gPiA+IGh2X2RldmljZSAqZGV2aWNlLA0KPiA+ID4g Pg0KPiA+ID4gPiAgIH0NCj4gPiA+ID4NCj4gPiA+ID4gLXN0YXRpYyB2b2lkIHN0b3J2c2Nfb25f cmVjZWl2ZShzdHJ1Y3QgaHZfZGV2aWNlICpkZXZpY2UsDQo+ID4gPiA+ICtzdGF0aWMgdm9pZCBz dG9ydnNjX29uX3JlY2VpdmUoc3RydWN0IHN0b3J2c2NfZGV2aWNlDQo+ID4gPiA+ICpzdG9yX2Rl dmljZSwNCj4gPiA+ID4gICAJCQkgICAgIHN0cnVjdCB2c3Rvcl9wYWNrZXQgKnZzdG9yX3BhY2tl dCwNCj4gPiA+ID4gICAJCQkgICAgIHN0cnVjdCBzdG9ydnNjX2NtZF9yZXF1ZXN0DQo+ID4gPiA+ ICpyZXF1ZXN0KQ0KPiA+ID4gPiAgIHsNCj4gPiA+ID4gICAJc3RydWN0IHN0b3J2c2Nfc2Nhbl93 b3JrICp3b3JrOw0KPiA+ID4gPiAtCXN0cnVjdCBzdG9ydnNjX2RldmljZSAqc3Rvcl9kZXZpY2U7 DQo+ID4gPiA+DQo+ID4gPiA+ICAgCXN3aXRjaCAodnN0b3JfcGFja2V0LT5vcGVyYXRpb24pIHsN Cj4gPiA+ID4gICAJY2FzZSBWU1RPUl9PUEVSQVRJT05fQ09NUExFVEVfSU86DQo+ID4gPiA+IC0J CXN0b3J2c2Nfb25faW9fY29tcGxldGlvbihkZXZpY2UsIHZzdG9yX3BhY2tldCwNCj4gPiA+ID4g cmVxdWVzdCk7DQo+ID4gPiA+ICsJCXN0b3J2c2Nfb25faW9fY29tcGxldGlvbihzdG9yX2Rldmlj ZSwNCj4gPiA+ID4gdnN0b3JfcGFja2V0LA0KPiA+ID4gcmVxdWVzdCk7DQo+ID4gPiA+ICAgCQli cmVhazsNCj4gPiA+ID4NCj4gPiA+ID4gICAJY2FzZSBWU1RPUl9PUEVSQVRJT05fUkVNT1ZFX0RF VklDRToNCj4gPiA+ID4gICAJY2FzZSBWU1RPUl9PUEVSQVRJT05fRU5VTUVSQVRFX0JVUzoNCj4g PiA+ID4gLQkJc3Rvcl9kZXZpY2UgPSBnZXRfaW5fc3Rvcl9kZXZpY2UoZGV2aWNlKTsNCj4gPiA+ ID4gICAJCXdvcmsgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QNCj4gPiA+ID4gc3RvcnZzY19zY2Fu X3dvcmspLA0KPiA+ID4gR0ZQX0FUT01JQyk7DQo+ID4gPiA+ICAgCQlpZiAoIXdvcmspDQo+ID4g PiA+ICAgCQkJcmV0dXJuOw0KPiA+ID4gPiBAQCAtMTA4Myw3ICsxMDc3LDYgQEAgc3RhdGljIHZv aWQgc3RvcnZzY19vbl9yZWNlaXZlKHN0cnVjdA0KPiA+ID4gPiBodl9kZXZpY2UNCj4gPiA+ICpk ZXZpY2UsDQo+ID4gPiA+ICAgCQlicmVhazsNCj4gPiA+ID4NCj4gPiA+ID4gICAJY2FzZSBWU1RP Ul9PUEVSQVRJT05fRkNIQkFfREFUQToNCj4gPiA+ID4gLQkJc3Rvcl9kZXZpY2UgPSBnZXRfaW5f c3Rvcl9kZXZpY2UoZGV2aWNlKTsNCj4gPiA+ID4gICAJCWNhY2hlX3d3bihzdG9yX2RldmljZSwg dnN0b3JfcGFja2V0KTsNCj4gPiA+ID4gICAjaWZkZWYgQ09ORklHX1NDU0lfRkNfQVRUUlMNCj4g PiA+ID4gICAJCWZjX2hvc3Rfbm9kZV9uYW1lKHN0b3JfZGV2aWNlLT5ob3N0KSA9DQo+ID4gPiA+ IHN0b3JfZGV2aWNlLQ0KPiA+ID4gPiBub2RlX25hbWU7DQo+ID4gPiA+IEBAIC0xMTMzLDcgKzEx MjYsNyBAQCBzdGF0aWMgdm9pZA0KPiA+ID4gPiBzdG9ydnNjX29uX2NoYW5uZWxfY2FsbGJhY2so dm9pZA0KPiA+ID4gKmNvbnRleHQpDQo+ID4gPiA+ICAgCQkJCQl2bXNjc2lfc2l6ZV9kZWx0YSkp Ow0KPiA+ID4gPiAgIAkJCQljb21wbGV0ZSgmcmVxdWVzdC0+d2FpdF9ldmVudCk7DQo+ID4gPiA+ ICAgCQkJfSBlbHNlIHsNCj4gPiA+ID4gLQkJCQlzdG9ydnNjX29uX3JlY2VpdmUoZGV2aWNlLA0K PiA+ID4gPiArCQkJCXN0b3J2c2Nfb25fcmVjZWl2ZShzdG9yX2RldmljZSwNCj4gPiA+ID4gICAJ CQkJCQkoc3RydWN0DQo+ID4gPiA+IHZzdG9yX3BhY2tldA0KPiA+ID4gKilwYWNrZXQsDQo+ID4g PiA+ICAgCQkJCQkJcmVxdWVzdCk7DQo+ID4gPiA+ICAgCQkJfQ0KPiA+ID4gPg0KPiA+ID4gSG1t LiBJIHdvdWxkJ3ZlIHRob3VnaHQgdGhlIGNvbXBpbGVyIG9wdGltaXplcyB0aGlzIGF3YXkuIEhh dmUgeW91DQo+ID4gPiBjaGVja2VkIHdoZXRoZXIgaXQgYWN0dWFsbHkgbWFrZXMgYSBkaWZmZXJl bmNlIGluIHRoZSBhc3NlbWJsZXINCj4gPiA+IG91dHB1dD8NCj4gPg0KPiA+IEkgaGF2ZSBub3Qg Y2hlY2tlZCB0aGUgYXNzZW1ibGVyIG91dHB1dC4gSXQgd2FzIGVhc3kgZW5vdWdoIHRvIGZpeA0K PiA+IHRoZSBzb3VyY2UuDQo+IA0KPiBDb3VsZCB5b3U/ICBZb3UncmUgbWFraW5nIHdoYXQgeW91 IGRlc2NyaWJlIGFzIGFuIG9wdGltaXNhdGlvbiBidXQNCj4gdGhlcmUgYXJlIHR3byByZWFzb25z IHdoeSB0aGlzIG1pZ2h0IG5vdCBiZSBzby4gIFRoZSBmaXJzdCBpcyB0aGF0IHRoZQ0KPiBjb21w aWxlciBpcyBlbnRpdGxlZCB0byBpbmxpbmUgc3RhdGljIGZ1bmN0aW9ucy4gIElmIGl0IGRpZCwg bGlrZWx5IGl0DQo+IHBpY2tlZCB1cCB0aGUgb3B0bWlzYXRpb24gYW55d2F5IGFzIEhhbm5lcyBz dWdnZXN0ZWQuICBIb3dldmVyLCB0aGUNCj4gb3RoZXIgcmVhc29uIHRoaXMgbWlnaHQgbm90IGJl IGFuIG9wdGltaXNhdGlvbiAoYXNzdW1pbmcgdGhlIGNvbXBpbGVyDQo+IGRvZXNuJ3QgaW5saW5l IHRoZSBmdW5jdGlvbikgaXMgeW91J3JlIHBhc3NpbmcgYW4gYXJndW1lbnQgd2hpY2ggY2FuIGJl DQo+IG9mZnNldCBjb21wdXRlZC4gIE9uIGFsbCBhcmNoaXRlY3R1cmVzLCB5b3UgaGF2ZSBhIGZp eGVkIG51bWJlciBvZg0KPiByZWdpc3RlcnMgZm9yIHBhc3NpbmcgZnVuY3Rpb24gYXJndW1lbnRz LCB0aGVuIHdlIGhhdmUgdG8gdXNlIHRoZQ0KPiBzdGFjay4gIFVzaW5nIHRoZSBzdGFjayBjb21l cyBpbiBmYXIgbW9yZSBleHBlbnNpdmUgdGhhbiBjb21wdXRpbmcgYW4NCj4gb2Zmc2V0IHRvIGFu IGV4aXN0aW5nIHBvaW50ZXIuICBFdmVuIGlmIHlvdSdyZSBzdGlsbCBpbiByZWdpc3RlcnMsIHRo ZQ0KPiBvZmZzZXQgbm93IGhhcyB0byBiZSBjb21wdXRlZCBhbmQgc3RvcmVkIGFuZCB0aGUgY29t cGlsZXIgbG9zZXMgdHJhY2sNCj4gb2YgdGhlIHJlbGF0aW9uLg0KPiANCj4gVGhlIGJvdHRvbSBs aW5lIGlzIHRoYXQgYWRkaW5nIGFuIGV4dHJhIGFyZ3VtZW50IGZvciBhIHZhbHVlIHdoaWNoIGNh bg0KPiBiZSBvZmZzZXQgY29tcHV0ZWQgaXMgcmFyZWx5IGEgd2luLg0KDQpKYW1lcywNCldoZW4g SSBkaWQgdGhpcywgSSB3YXMgbW9zdGx5IGNvbmNlcm5lZCBhYm91dCB0aGUgY29zdCBvZiByZWVz dGFibGlzaGluZyBzdGF0ZSB0aGF0IHdhcw0KYWxyZWFkeSBrbm93bi4gU28sIGV2ZW4gd2l0aCB0 aGUgZnVuY3Rpb24gYmVpbmcgaW4tbGluZWQsIEkgZmVsdCB0aGUgY29zdCBvZiByZWVzdGFibGlz aGluZw0Kc3RhdGUgdGhhdCB3YXMgYWxyZWFkeSBrbm93biBpcyB1bm5lY2Vzc2FyeS4gSW4gdGhp cyBwYXJ0aWN1bGFyIGNhc2UsIEkgZGlkIG5vdCBjaGFuZ2UgdGhlDQpudW1iZXIgb2YgYXJndW1l bnRzIHRoYXQgd2VyZSBiZWluZyBwYXNzZWQ7IEkganVzdCBjaGFuZ2VkIHRoZSB0eXBlIG9mIG9u ZSBvZiB0aGVtIC0NCmluc3RlYWQgb2YgcGFzc2luZyBzdHJ1Y3QgaHZfZGV2aWNlICosIEkgYW0g bm93IHBhc3Npbmcgc3RydWN0IHN0b3J2c2NfZGV2aWNlICouIEluIHRoZQ0KY3VycmVudCBjb2Rl LCB3ZSBhcmUgdXNpbmcgc3RydWN0IGh2X2RldmljZSAqIHRvIGVzdGFibGlzaCBhIHBvaW50ZXIg dG8gc3RydWN0IHN0b3J2c2NfZGV2aWNlICoNCnZpYSB0aGUgZnVuY3Rpb24gZ2V0X2luX3N0b3Jf ZGV2aWNlKCkuIFRoaXMgcGF0dGVybiBjdXJyZW50bHkgZXhpc3RzIGluIHRoZSBjYWxsIGNoYWlu IGZyb20gdGhlDQppbnRlcnJ1cHQgaGFuZGxlciAtIHN0b3J2c2Nfb25fY2hhbm5lbF9jYWxsYmFj aygpLg0KDQpXaGlsZSB0aGUgY29tcGlsZXIgaXMgc21hcnQgZW5vdWdoIHRvIGlubGluZSBib3Ro IGdldF9pbl9zdG9yX2RldmljZSgpIGFzIHdlbGwgYXMgbWFueSBvZiB0aGUgc3RhdGljDQpmdW5j dGlvbnMgaW4gdGhlIGNhbGwgY2hhaW4gZnJvbSBzdG9ydnNjX29uX2NoYW5uZWxfY2FsbGJhY2so KSwgbG9va2luZyBhdCB0aGUgYXNzZW1ibGVkIGNvZGUsDQp0aGUgY29tcGlsZXIgaXMgcmVwZWF0 ZWRseSBpbmxpbmluZyB0aGUgY2FsbCB0byBnZXRfaW5fc3Rvcl9kZXZpY2UoKSBhbmQgdGhpcyBj bGVhcmx5IGlzIGxlc3MgdGhhbiBvcHRpbWFsLg0KDQpSZWdhcmRzLA0KDQpLLiBZDQoNCg0KDQo=