From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from frasgout.his.huawei.com (frasgout.his.huawei.com [185.176.79.56]) (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 3FB705FF09; Tue, 13 Feb 2024 17:31:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.176.79.56 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707845476; cv=none; b=Ez+0qqOdO1rm2JCpn+ZRjf/WIXDVMzguSiX65aELnH8IIzATa/kMNAmtOekZaL8J7f+4pG0CBfeuCsv2hdqBwNm8B6ify2yF7Jk8NnKvkbzZHwcHSRmWlEk7g6WkVqrOFDGVjQTDoUWcN5lvmnLWRSbHlvxPyH9ufMwrYeR2tzY= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1707845476; c=relaxed/simple; bh=L/EIR3pZx0fo72yb2xtosrQJh7PostdYu/2WSXKrd9I=; h=Date:From:To:CC:Subject:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=EXrav2hOupugoiB2oUe1eXnXfBiZHHUM98yH8NlE1B0Tu8d6Joq4mMC2KplCNWX8/BGzZ49luyn15qWSs2crQKCmuaeM4M2bvdJyJh77JwUf6XbjPPfnGH6T4C+5UXlWo9ZRlupD/mp4igrFxEENfl6PZzMuUzub/JnyFK9EENM= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=Huawei.com; spf=pass smtp.mailfrom=huawei.com; arc=none smtp.client-ip=185.176.79.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=Huawei.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huawei.com Received: from mail.maildlp.com (unknown [172.18.186.231]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4TZ7YZ34sxz6JB0N; Wed, 14 Feb 2024 01:27:14 +0800 (CST) Received: from lhrpeml500005.china.huawei.com (unknown [7.191.163.240]) by mail.maildlp.com (Postfix) with ESMTPS id A7393140DD5; Wed, 14 Feb 2024 01:31:11 +0800 (CST) Received: from localhost (10.202.227.76) by lhrpeml500005.china.huawei.com (7.191.163.240) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Tue, 13 Feb 2024 17:31:11 +0000 Date: Tue, 13 Feb 2024 17:31:10 +0000 From: Jonathan Cameron To: Nuno =?ISO-8859-1?Q?S=E1?= CC: David Lechner , Mark Brown , Martin Sperl , David Jander , Jonathan Cameron , Michael Hennerich , Nuno =?ISO-8859-1?Q?S=E1?= , Alain Volmat , "Maxime Coquelin" , Alexandre Torgue , , , , , Subject: Re: [PATCH 5/5] iio: adc: ad7380: use spi_optimize_message() Message-ID: <20240213173110.00007855@Huawei.com> In-Reply-To: References: <20240212-mainline-spi-precook-message-v1-0-a2373cd72d36@baylibre.com> <20240212-mainline-spi-precook-message-v1-5-a2373cd72d36@baylibre.com> Organization: Huawei Technologies Research and Development (UK) Ltd. X-Mailer: Claws Mail 4.1.0 (GTK 3.24.33; x86_64-w64-mingw32) Precedence: bulk X-Mailing-List: linux-iio@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: lhrpeml500005.china.huawei.com (7.191.163.240) To lhrpeml500005.china.huawei.com (7.191.163.240) On Tue, 13 Feb 2024 17:08:19 +0100 Nuno S=C3=A1 wrote: > On Tue, 2024-02-13 at 09:27 -0600, David Lechner wrote: > > On Tue, Feb 13, 2024 at 3:47=E2=80=AFAM Nuno S=C3=A1 wrote: =20 > > >=20 > > > On Mon, 2024-02-12 at 17:26 -0600, David Lechner wrote: =20 > > > > This modifies the ad7380 ADC driver to use spi_optimize_message() to > > > > optimize the SPI message for the buffered read operation. Since buf= fered > > > > reads reuse the same SPI message for each read, this can improve > > > > performance by reducing the overhead of setting up some parts the S= PI > > > > message in each spi_sync() call. > > > >=20 > > > > Signed-off-by: David Lechner > > > > --- > > > > =C2=A0drivers/iio/adc/ad7380.c | 52 +++++++++++++++++++++++++++++++= ++++++++++-- > > > > ---- > > > > - > > > > =C2=A01 file changed, 45 insertions(+), 7 deletions(-) > > > >=20 > > > > diff --git a/drivers/iio/adc/ad7380.c b/drivers/iio/adc/ad7380.c > > > > index abd746aef868..5c5d2642a474 100644 > > > > --- a/drivers/iio/adc/ad7380.c > > > > +++ b/drivers/iio/adc/ad7380.c > > > > @@ -133,6 +133,7 @@ struct ad7380_state { > > > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 struct spi_device *spi; > > > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 struct regulator *vref; > > > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 struct regmap *regmap; > > > > +=C2=A0=C2=A0=C2=A0=C2=A0 struct spi_message *msg; > > > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 /* > > > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 * DMA (thus cache coherency ma= intenance) requires the > > > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 * transfer buffers to live in = their own cache lines. > > > > @@ -231,19 +232,55 @@ static int ad7380_debugfs_reg_access(struct i= io_dev > > > > *indio_dev, u32 reg, > > > > =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 return ret; > > > > =C2=A0} > > > >=20 > > > > +static int ad7380_buffer_preenable(struct iio_dev *indio_dev) > > > > +{ > > > > +=C2=A0=C2=A0=C2=A0=C2=A0 struct ad7380_state *st =3D iio_priv(indi= o_dev); > > > > +=C2=A0=C2=A0=C2=A0=C2=A0 struct spi_transfer *xfer; > > > > +=C2=A0=C2=A0=C2=A0=C2=A0 int ret; > > > > + > > > > +=C2=A0=C2=A0=C2=A0=C2=A0 st->msg =3D spi_message_alloc(1, GFP_KERN= EL); > > > > +=C2=A0=C2=A0=C2=A0=C2=A0 if (!st->msg) > > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 return -ENOMEM; > > > > + > > > > +=C2=A0=C2=A0=C2=A0=C2=A0 xfer =3D list_first_entry(&st->msg->trans= fers, struct spi_transfer, > > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2= =A0=C2=A0=C2=A0=C2=A0=C2=A0 transfer_list); > > > > + > > > > +=C2=A0=C2=A0=C2=A0=C2=A0 xfer->bits_per_word =3D st->chip_info->ch= annels[0].scan_type.realbits; > > > > +=C2=A0=C2=A0=C2=A0=C2=A0 xfer->len =3D 4; > > > > +=C2=A0=C2=A0=C2=A0=C2=A0 xfer->rx_buf =3D st->scan_data.raw; > > > > + > > > > +=C2=A0=C2=A0=C2=A0=C2=A0 ret =3D spi_optimize_message(st->spi, st-= >msg); > > > > +=C2=A0=C2=A0=C2=A0=C2=A0 if (ret) { > > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 spi_message_free(st->msg); > > > > +=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0= =C2=A0 return ret; > > > > +=C2=A0=C2=A0=C2=A0=C2=A0 } > > > > + > > > > +=C2=A0=C2=A0=C2=A0=C2=A0 return 0; > > > > +} > > > > + > > > > +static int ad7380_buffer_postdisable(struct iio_dev *indio_dev) > > > > +{ > > > > +=C2=A0=C2=A0=C2=A0=C2=A0 struct ad7380_state *st =3D iio_priv(indi= o_dev); > > > > + > > > > +=C2=A0=C2=A0=C2=A0=C2=A0 spi_unoptimize_message(st->msg); > > > > +=C2=A0=C2=A0=C2=A0=C2=A0 spi_message_free(st->msg); > > > > + > > > > +=C2=A0=C2=A0=C2=A0=C2=A0 return 0; > > > > +} > > > > + =20 > > >=20 > > > Not such a big deal but unless I'm missing something we could have the > > > spi_message (+ the transfer) statically allocated in struct ad7380_st= ate and > > > do > > > the optimize only once at probe (naturally with proper devm action for > > > unoptimize). Then we would not need to this for every buffer enable + > > > disable. I > > > know in terms of performance it won't matter but it would be less cod= e I > > > guess. > > >=20 > > > Am I missing something? =20 > >=20 > > No, your understanding is correct for the current state of everything > > in this series. So, we could do as you suggest, but I have a feeling > > that future additions to this driver might require that it gets > > changed back this way eventually. =20 >=20 > Hmm, not really sure about that as chip_info stuff is always our friend := ). And > I'm anyways of the opinion of keeping things simpler and start to evolve = when > really needed (because often we never really need to evolve). But bah, as= I > said... this is really not a big deal. >=20 Oops should have read Nuno's review before replying! I'd rather we embedded it for now and did the optimization at probe. Whilst it's a lot of work per transfer it's not enough to worry about delay= ing it until preenable(). Easy to make that move and take it dynamic when driver changes need it. In meantime, I don't want lots of other drivers picking up this pattern when they may never need the complexity of making things more dynamic. Jonathan > - Nuno S=C3=A1 >=20 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 bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 3F29EC48260 for ; Tue, 13 Feb 2024 17:31:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-ID:Subject:CC:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=9jTt7gf3iGJg2DNxCGA1yIWpb1pNGsCMbZJNgWXELn0=; b=MV8GYXbt5l6JyD P10Eot7GNqfLQeBVuTGEU03b9VBWGgM6sy2d/P/GXAQ3jYr8IgsKNFDVpAVqH1kXPOqV/+wT/MX02 Qiptu9bhe7iUU5KiS+EWsefjSK9IYI4ojDZyT6+np3ewDW8OS9+IVpVNoaqmnUVGxo6JAVCQ8bEp7 keDcXTYST71xTjt7v5MT7Wjeo4w98OpS3g5Ed0mVYCIW2ULLI7ou0fC6jTf72zRZ6XNJ/qkxTLFgm LVBdiUvIGU0wAuUWyih22dlecV8hiujAfLukzM8yN+cMQtHBbshaXyOti1roIV0ZsWIKDXyD4eUKP YkUuI2Y03dGW5zvgTwOg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rZwcq-0000000A9JU-3u3B; Tue, 13 Feb 2024 17:31:20 +0000 Received: from frasgout.his.huawei.com ([185.176.79.56]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1rZwcn-0000000A9J0-2g4M for linux-arm-kernel@lists.infradead.org; Tue, 13 Feb 2024 17:31:19 +0000 Received: from mail.maildlp.com (unknown [172.18.186.231]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4TZ7YZ34sxz6JB0N; Wed, 14 Feb 2024 01:27:14 +0800 (CST) Received: from lhrpeml500005.china.huawei.com (unknown [7.191.163.240]) by mail.maildlp.com (Postfix) with ESMTPS id A7393140DD5; Wed, 14 Feb 2024 01:31:11 +0800 (CST) Received: from localhost (10.202.227.76) by lhrpeml500005.china.huawei.com (7.191.163.240) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.35; Tue, 13 Feb 2024 17:31:11 +0000 Date: Tue, 13 Feb 2024 17:31:10 +0000 From: Jonathan Cameron To: Nuno =?ISO-8859-1?Q?S=E1?= CC: David Lechner , Mark Brown , Martin Sperl , David Jander , Jonathan Cameron , Michael Hennerich , Nuno =?ISO-8859-1?Q?S=E1?= , Alain Volmat , "Maxime Coquelin" , Alexandre Torgue , , , , , Subject: Re: [PATCH 5/5] iio: adc: ad7380: use spi_optimize_message() Message-ID: <20240213173110.00007855@Huawei.com> In-Reply-To: References: <20240212-mainline-spi-precook-message-v1-0-a2373cd72d36@baylibre.com> <20240212-mainline-spi-precook-message-v1-5-a2373cd72d36@baylibre.com> Organization: Huawei Technologies Research and Development (UK) Ltd. X-Mailer: Claws Mail 4.1.0 (GTK 3.24.33; x86_64-w64-mingw32) MIME-Version: 1.0 X-Originating-IP: [10.202.227.76] X-ClientProxiedBy: lhrpeml500005.china.huawei.com (7.191.163.240) To lhrpeml500005.china.huawei.com (7.191.163.240) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240213_093118_020871_5A165B5B X-CRM114-Status: GOOD ( 35.53 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gVHVlLCAxMyBGZWIgMjAyNCAxNzowODoxOSArMDEwMApOdW5vIFPDoSA8bm9uYW1lLm51bm9A Z21haWwuY29tPiB3cm90ZToKCj4gT24gVHVlLCAyMDI0LTAyLTEzIGF0IDA5OjI3IC0wNjAwLCBE YXZpZCBMZWNobmVyIHdyb3RlOgo+ID4gT24gVHVlLCBGZWIgMTMsIDIwMjQgYXQgMzo0N+KAr0FN IE51bm8gU8OhIDxub25hbWUubnVub0BnbWFpbC5jb20+IHdyb3RlOiAgCj4gPiA+IAo+ID4gPiBP biBNb24sIDIwMjQtMDItMTIgYXQgMTc6MjYgLTA2MDAsIERhdmlkIExlY2huZXIgd3JvdGU6ICAK PiA+ID4gPiBUaGlzIG1vZGlmaWVzIHRoZSBhZDczODAgQURDIGRyaXZlciB0byB1c2Ugc3BpX29w dGltaXplX21lc3NhZ2UoKSB0bwo+ID4gPiA+IG9wdGltaXplIHRoZSBTUEkgbWVzc2FnZSBmb3Ig dGhlIGJ1ZmZlcmVkIHJlYWQgb3BlcmF0aW9uLiBTaW5jZSBidWZmZXJlZAo+ID4gPiA+IHJlYWRz IHJldXNlIHRoZSBzYW1lIFNQSSBtZXNzYWdlIGZvciBlYWNoIHJlYWQsIHRoaXMgY2FuIGltcHJv dmUKPiA+ID4gPiBwZXJmb3JtYW5jZSBieSByZWR1Y2luZyB0aGUgb3ZlcmhlYWQgb2Ygc2V0dGlu ZyB1cCBzb21lIHBhcnRzIHRoZSBTUEkKPiA+ID4gPiBtZXNzYWdlIGluIGVhY2ggc3BpX3N5bmMo KSBjYWxsLgo+ID4gPiA+IAo+ID4gPiA+IFNpZ25lZC1vZmYtYnk6IERhdmlkIExlY2huZXIgPGRs ZWNobmVyQGJheWxpYnJlLmNvbT4KPiA+ID4gPiAtLS0KPiA+ID4gPiDCoGRyaXZlcnMvaWlvL2Fk Yy9hZDczODAuYyB8IDUyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr LS0KPiA+ID4gPiAtLS0tCj4gPiA+ID4gLQo+ID4gPiA+IMKgMSBmaWxlIGNoYW5nZWQsIDQ1IGlu c2VydGlvbnMoKyksIDcgZGVsZXRpb25zKC0pCj4gPiA+ID4gCj4gPiA+ID4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvaWlvL2FkYy9hZDczODAuYyBiL2RyaXZlcnMvaWlvL2FkYy9hZDczODAuYwo+ID4g PiA+IGluZGV4IGFiZDc0NmFlZjg2OC4uNWM1ZDI2NDJhNDc0IDEwMDY0NAo+ID4gPiA+IC0tLSBh L2RyaXZlcnMvaWlvL2FkYy9hZDczODAuYwo+ID4gPiA+ICsrKyBiL2RyaXZlcnMvaWlvL2FkYy9h ZDczODAuYwo+ID4gPiA+IEBAIC0xMzMsNiArMTMzLDcgQEAgc3RydWN0IGFkNzM4MF9zdGF0ZSB7 Cj4gPiA+ID4gwqDCoMKgwqDCoCBzdHJ1Y3Qgc3BpX2RldmljZSAqc3BpOwo+ID4gPiA+IMKgwqDC oMKgwqAgc3RydWN0IHJlZ3VsYXRvciAqdnJlZjsKPiA+ID4gPiDCoMKgwqDCoMKgIHN0cnVjdCBy ZWdtYXAgKnJlZ21hcDsKPiA+ID4gPiArwqDCoMKgwqAgc3RydWN0IHNwaV9tZXNzYWdlICptc2c7 Cj4gPiA+ID4gwqDCoMKgwqDCoCAvKgo+ID4gPiA+IMKgwqDCoMKgwqDCoCAqIERNQSAodGh1cyBj YWNoZSBjb2hlcmVuY3kgbWFpbnRlbmFuY2UpIHJlcXVpcmVzIHRoZQo+ID4gPiA+IMKgwqDCoMKg wqDCoCAqIHRyYW5zZmVyIGJ1ZmZlcnMgdG8gbGl2ZSBpbiB0aGVpciBvd24gY2FjaGUgbGluZXMu Cj4gPiA+ID4gQEAgLTIzMSwxOSArMjMyLDU1IEBAIHN0YXRpYyBpbnQgYWQ3MzgwX2RlYnVnZnNf cmVnX2FjY2VzcyhzdHJ1Y3QgaWlvX2Rldgo+ID4gPiA+ICppbmRpb19kZXYsIHUzMiByZWcsCj4g PiA+ID4gwqDCoMKgwqDCoCByZXR1cm4gcmV0Owo+ID4gPiA+IMKgfQo+ID4gPiA+IAo+ID4gPiA+ ICtzdGF0aWMgaW50IGFkNzM4MF9idWZmZXJfcHJlZW5hYmxlKHN0cnVjdCBpaW9fZGV2ICppbmRp b19kZXYpCj4gPiA+ID4gK3sKPiA+ID4gPiArwqDCoMKgwqAgc3RydWN0IGFkNzM4MF9zdGF0ZSAq c3QgPSBpaW9fcHJpdihpbmRpb19kZXYpOwo+ID4gPiA+ICvCoMKgwqDCoCBzdHJ1Y3Qgc3BpX3Ry YW5zZmVyICp4ZmVyOwo+ID4gPiA+ICvCoMKgwqDCoCBpbnQgcmV0Owo+ID4gPiA+ICsKPiA+ID4g PiArwqDCoMKgwqAgc3QtPm1zZyA9IHNwaV9tZXNzYWdlX2FsbG9jKDEsIEdGUF9LRVJORUwpOwo+ ID4gPiA+ICvCoMKgwqDCoCBpZiAoIXN0LT5tc2cpCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoCByZXR1cm4gLUVOT01FTTsKPiA+ID4gPiArCj4gPiA+ID4gK8KgwqDCoMKgIHhmZXIg PSBsaXN0X2ZpcnN0X2VudHJ5KCZzdC0+bXNnLT50cmFuc2ZlcnMsIHN0cnVjdCBzcGlfdHJhbnNm ZXIsCj4gPiA+ID4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgIHRyYW5zZmVyX2xpc3QpOwo+ID4gPiA+ICsKPiA+ID4gPiArwqDCoMKgwqAg eGZlci0+Yml0c19wZXJfd29yZCA9IHN0LT5jaGlwX2luZm8tPmNoYW5uZWxzWzBdLnNjYW5fdHlw ZS5yZWFsYml0czsKPiA+ID4gPiArwqDCoMKgwqAgeGZlci0+bGVuID0gNDsKPiA+ID4gPiArwqDC oMKgwqAgeGZlci0+cnhfYnVmID0gc3QtPnNjYW5fZGF0YS5yYXc7Cj4gPiA+ID4gKwo+ID4gPiA+ ICvCoMKgwqDCoCByZXQgPSBzcGlfb3B0aW1pemVfbWVzc2FnZShzdC0+c3BpLCBzdC0+bXNnKTsK PiA+ID4gPiArwqDCoMKgwqAgaWYgKHJldCkgewo+ID4gPiA+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgc3BpX21lc3NhZ2VfZnJlZShzdC0+bXNnKTsKPiA+ID4gPiArwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHJldHVybiByZXQ7Cj4gPiA+ID4gK8KgwqDCoMKgIH0KPiA+ID4gPiArCj4gPiA+ ID4gK8KgwqDCoMKgIHJldHVybiAwOwo+ID4gPiA+ICt9Cj4gPiA+ID4gKwo+ID4gPiA+ICtzdGF0 aWMgaW50IGFkNzM4MF9idWZmZXJfcG9zdGRpc2FibGUoc3RydWN0IGlpb19kZXYgKmluZGlvX2Rl dikKPiA+ID4gPiArewo+ID4gPiA+ICvCoMKgwqDCoCBzdHJ1Y3QgYWQ3MzgwX3N0YXRlICpzdCA9 IGlpb19wcml2KGluZGlvX2Rldik7Cj4gPiA+ID4gKwo+ID4gPiA+ICvCoMKgwqDCoCBzcGlfdW5v cHRpbWl6ZV9tZXNzYWdlKHN0LT5tc2cpOwo+ID4gPiA+ICvCoMKgwqDCoCBzcGlfbWVzc2FnZV9m cmVlKHN0LT5tc2cpOwo+ID4gPiA+ICsKPiA+ID4gPiArwqDCoMKgwqAgcmV0dXJuIDA7Cj4gPiA+ ID4gK30KPiA+ID4gPiArICAKPiA+ID4gCj4gPiA+IE5vdCBzdWNoIGEgYmlnIGRlYWwgYnV0IHVu bGVzcyBJJ20gbWlzc2luZyBzb21ldGhpbmcgd2UgY291bGQgaGF2ZSB0aGUKPiA+ID4gc3BpX21l c3NhZ2UgKCsgdGhlIHRyYW5zZmVyKSBzdGF0aWNhbGx5IGFsbG9jYXRlZCBpbiBzdHJ1Y3QgYWQ3 MzgwX3N0YXRlIGFuZAo+ID4gPiBkbwo+ID4gPiB0aGUgb3B0aW1pemUgb25seSBvbmNlIGF0IHBy b2JlIChuYXR1cmFsbHkgd2l0aCBwcm9wZXIgZGV2bSBhY3Rpb24gZm9yCj4gPiA+IHVub3B0aW1p emUpLiBUaGVuIHdlIHdvdWxkIG5vdCBuZWVkIHRvIHRoaXMgZm9yIGV2ZXJ5IGJ1ZmZlciBlbmFi bGUgKwo+ID4gPiBkaXNhYmxlLiBJCj4gPiA+IGtub3cgaW4gdGVybXMgb2YgcGVyZm9ybWFuY2Ug aXQgd29uJ3QgbWF0dGVyIGJ1dCBpdCB3b3VsZCBiZSBsZXNzIGNvZGUgSQo+ID4gPiBndWVzcy4K PiA+ID4gCj4gPiA+IEFtIEkgbWlzc2luZyBzb21ldGhpbmc/ICAKPiA+IAo+ID4gTm8sIHlvdXIg dW5kZXJzdGFuZGluZyBpcyBjb3JyZWN0IGZvciB0aGUgY3VycmVudCBzdGF0ZSBvZiBldmVyeXRo aW5nCj4gPiBpbiB0aGlzIHNlcmllcy4gU28sIHdlIGNvdWxkIGRvIGFzIHlvdSBzdWdnZXN0LCBi dXQgSSBoYXZlIGEgZmVlbGluZwo+ID4gdGhhdCBmdXR1cmUgYWRkaXRpb25zIHRvIHRoaXMgZHJp dmVyIG1pZ2h0IHJlcXVpcmUgdGhhdCBpdCBnZXRzCj4gPiBjaGFuZ2VkIGJhY2sgdGhpcyB3YXkg ZXZlbnR1YWxseS4gIAo+IAo+IEhtbSwgbm90IHJlYWxseSBzdXJlIGFib3V0IHRoYXQgYXMgY2hp cF9pbmZvIHN0dWZmIGlzIGFsd2F5cyBvdXIgZnJpZW5kIDopLiBBbmQKPiBJJ20gYW55d2F5cyBv ZiB0aGUgb3BpbmlvbiBvZiBrZWVwaW5nIHRoaW5ncyBzaW1wbGVyIGFuZCBzdGFydCB0byBldm9s dmUgd2hlbgo+IHJlYWxseSBuZWVkZWQgKGJlY2F1c2Ugb2Z0ZW4gd2UgbmV2ZXIgcmVhbGx5IG5l ZWQgdG8gZXZvbHZlKS4gQnV0IGJhaCwgYXMgSQo+IHNhaWQuLi4gdGhpcyBpcyByZWFsbHkgbm90 IGEgYmlnIGRlYWwuCj4gCk9vcHMgc2hvdWxkIGhhdmUgcmVhZCBOdW5vJ3MgcmV2aWV3IGJlZm9y ZSByZXBseWluZyEKCkknZCByYXRoZXIgd2UgZW1iZWRkZWQgaXQgZm9yIG5vdyBhbmQgZGlkIHRo ZSBvcHRpbWl6YXRpb24gYXQgcHJvYmUuCldoaWxzdCBpdCdzIGEgbG90IG9mIHdvcmsgcGVyIHRy YW5zZmVyIGl0J3Mgbm90IGVub3VnaCB0byB3b3JyeSBhYm91dCBkZWxheWluZwppdCB1bnRpbCBw cmVlbmFibGUoKS4gIEVhc3kgdG8gbWFrZSB0aGF0IG1vdmUgYW5kIHRha2UgaXQgZHluYW1pYyB3 aGVuCmRyaXZlciBjaGFuZ2VzIG5lZWQgaXQuICBJbiBtZWFudGltZSwgSSBkb24ndCB3YW50IGxv dHMgb2Ygb3RoZXIgZHJpdmVycwpwaWNraW5nIHVwIHRoaXMgcGF0dGVybiB3aGVuIHRoZXkgbWF5 IG5ldmVyIG5lZWQgdGhlIGNvbXBsZXhpdHkgb2YKbWFraW5nIHRoaW5ncyBtb3JlIGR5bmFtaWMu CgpKb25hdGhhbgoKPiAtIE51bm8gU8OhCj4gCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgt YXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3Jn L21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=