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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id D34AFC004D4 for ; Sat, 21 Jan 2023 18:04:31 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229750AbjAUSEb (ORCPT ); Sat, 21 Jan 2023 13:04:31 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:36414 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229673AbjAUSEa (ORCPT ); Sat, 21 Jan 2023 13:04:30 -0500 Received: from mail-ej1-x62d.google.com (mail-ej1-x62d.google.com [IPv6:2a00:1450:4864:20::62d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 473B71E9C9 for ; Sat, 21 Jan 2023 10:04:29 -0800 (PST) Received: by mail-ej1-x62d.google.com with SMTP id kt14so21409222ejc.3 for ; Sat, 21 Jan 2023 10:04:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:user-agent:message-id:date :references:subject:cc:to:from:from:to:cc:subject:date:message-id :reply-to; bh=1gUlDI6v8VKTtaMxxZBnCUHzXRHq2WNi9uyLdu5nGAY=; b=GGDo6doU7wzIcOBqhbO7K0p5p6Aygeh0vlu/HrtwiOV0PCao7kpHWcwNWzfxu+iIAF qU7tj2e9v9B2FRPcF5VIoeFK1x09qja63eRS6TLg+SoVwG8huSykA3IBqrucNyBhN+5i EbuUWtAPE1nUpunFHOJ3eeBTrQEMbhU4jcOxnT2XedpNDBOkIW2/03S38nUifG4Ef9C9 WcPEb60QS5i250lCauKdh54JUf6mBInH/6U9THc2D4HjoZnywEuRkF4IYVZneKzqeRAb Y52t2RSu5rbVr418Wa6A8tvX3TXQkXaIjme1Kavz9ha57aY9q+7T2BlQat/04JnVh/25 21wg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:user-agent:message-id:date :references:subject:cc:to:from:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=1gUlDI6v8VKTtaMxxZBnCUHzXRHq2WNi9uyLdu5nGAY=; b=wYxEgYx5BDQ1ZIdty21060TywZPQR+50sZrtmbTALY93uckGe4R2kXqQZDV4MVhNp+ 1qxfzBEcE7xldz9otG+SRRrfIuJ1lpX5afL4UJO+r0GfigUDzpnh9eFMOtiP505LgvuN CZBr+mYugX1QuxUJleT5txc/DrGKUbKrZoFDSe2G2vaKW+n2QXq1hp+jwjIyMJdTttt7 PJWaNtfiHlBcs490Hm/OkNqkJI48KHDS7Y279M0og3rUvc6RLo2LTvNv4facasttX10A rC5Q+7ZgcaQlOiIgMpEGE2mnr2qROhxUTv8wbmOwufZE5mn7eUhKWU5Uy1k+hMH8VQaw kOdg== X-Gm-Message-State: AFqh2kqBJx0upbNfpVZ1xFRrG76+gCYBCv7Q0xzzNHPyPWxh+9eCkSNb /89//WvXgzjmZnoH4dMMWGU= X-Google-Smtp-Source: AMrXdXsyo7NAgz0UE5nMv1yReeP76ZOEOrdOk4E6pbjKafS+QNxSvabQa5BgrB8Sb4Jbl9Re/Dcq4Q== X-Received: by 2002:a17:906:1c51:b0:864:8ffe:135b with SMTP id l17-20020a1709061c5100b008648ffe135bmr18366470ejg.22.1674324267627; Sat, 21 Jan 2023 10:04:27 -0800 (PST) Received: from osv.localdomain ([89.175.180.246]) by smtp.gmail.com with ESMTPSA id d7-20020a50fb07000000b0049cbd334b13sm11156896edq.29.2023.01.21.10.04.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 21 Jan 2023 10:04:27 -0800 (PST) From: Sergey Organov To: Uwe =?utf-8?Q?Kleine-K=C3=B6nig?= Cc: Fabio Estevam , Pengutronix Kernel Team , Richard Genoud , Greg Kroah-Hartman , Sascha Hauer , NXP Linux Team , linux-serial@vger.kernel.org, Shawn Guo , Tim Harvey , Jiri Slaby , Tomasz =?utf-8?Q?Mo=C5=84?= , linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH 7/8] serial: imx: use readl() to optimize FIFO reading loop References: <87bko4e65y.fsf@osv.gnss.ru> <20230113184334.287130-1-sorganov@gmail.com> <20230113184334.287130-8-sorganov@gmail.com> <20230117113205.l5byaz3srzpagzhz@pengutronix.de> <87bkmx47o4.fsf@osv.gnss.ru> <20230117212702.vvwe3rqjedivqbhn@pengutronix.de> <87ilh3zw9q.fsf@osv.gnss.ru> <20230119070114.e62pqb6ibousxgx7@pengutronix.de> Date: Sat, 21 Jan 2023 21:04:25 +0300 Message-ID: <87k01fwyqe.fsf@osv.gnss.ru> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-serial@vger.kernel.org Hello Uwe, Uwe Kleine-König writes: > Hello Sergey, > > On Wed, Jan 18, 2023 at 06:40:17PM +0300, Sergey Organov wrote: >> Uwe Kleine-König writes: >> > On Tue, Jan 17, 2023 at 04:22:51PM +0300, Sergey Organov wrote: >> >> Uwe Kleine-König writes: >> >> > On Fri, Jan 13, 2023 at 09:43:33PM +0300, Sergey Organov wrote: >> >> >> Use readl() instead of heavier imx_uart_readl() in the Rx ISR, as we know >> >> >> we read registers that must not be cached. >> >> >> >> >> >> Signed-off-by: Sergey Organov >> >> >> --- >> >> >> drivers/tty/serial/imx.c | 5 +++-- >> >> >> 1 file changed, 3 insertions(+), 2 deletions(-) >> >> >> >> >> >> diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c >> >> >> index be00362b8b67..f4236e8995fa 100644 >> >> >> --- a/drivers/tty/serial/imx.c >> >> >> +++ b/drivers/tty/serial/imx.c >> >> >> @@ -890,14 +890,15 @@ static irqreturn_t __imx_uart_rxint(int irq, void *dev_id) >> >> >> struct imx_port *sport = dev_id; >> >> >> unsigned int rx, flg; >> >> >> struct tty_port *port = &sport->port.state->port; >> >> >> + typeof(sport->port.membase) membase = sport->port.membase; >> >> >> u32 usr2; >> >> >> >> >> >> /* If we received something, check for 0xff flood */ >> >> >> - usr2 = imx_uart_readl(sport, USR2); >> >> >> + usr2 = readl(membase + USR2); >> >> >> if (usr2 & USR2_RDR) >> >> >> imx_uart_check_flood(sport, usr2); >> >> >> >> >> >> - while ((rx = imx_uart_readl(sport, URXD0)) & URXD_CHARRDY) { >> >> >> + while ((rx = readl(membase + URXD0)) & URXD_CHARRDY) { >> >> >> flg = TTY_NORMAL; >> >> >> sport->port.icount.rx++; >> >> > >> >> > One of the motivations to introduce imx_uart_readl was to have a single >> >> > place to add a debug output to be able to inspect what the driver is >> >> > doing. >> >> > >> >> > I wonder where your need for higher speed comes from and if the compiler >> >> > really generates more effective code with your change. >> >> >> >> Mostly it's because I'm obviously slowing things down a bit with the >> >> patch to fight the flood, so I feel obliged to get things back on par >> >> with the origin. Then, higher speed, let alone the time spent with >> >> interrupts disabled and/or spinlocks taken, is always one of generic >> >> goals for me. >> >> >> >> As for the generated code, with this patch I don't aim to affect code >> >> generation, I rather avoid execution of part of existing code while >> >> being on the most critical path. It should be quite obvious that not >> >> executing some code is at least not slower than executing it. >> > >> > That's true, but I think it doesn't apply here. >> >> Well, "at least not slower" still applies ;-) >> >> > >> > I would expect that the compiler "sees" for the call >> > >> > imx_uart_readl(sport, USR2) >> > >> > that the 2nd argument is constant and that for that value of offset the >> > call is equivalent to readl(sport->port.membase + offset); >> > >> > So I doubt you're making anything quicker here. >> >> Yep, it's nice compiler is clever enough to optimize-out the switch for >> constant argument, though I still typically prefer to avoid over-relying >> on optimizations. That said, I now tend to agree with your POV in this >> particular case. >> >> > >> > I tried the following patch on mainline (that is without the preceding >> > patches in this series): >> > >> > diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c >> > index 757825edb0cd..cfc2f7057345 100644 >> > --- a/drivers/tty/serial/imx.c >> > +++ b/drivers/tty/serial/imx.c >> > @@ -807,7 +807,7 @@ static irqreturn_t __imx_uart_rxint(int irq, void *dev_id) >> > unsigned int rx, flg, ignored = 0; >> > struct tty_port *port = &sport->port.state->port; >> > >> > - while (imx_uart_readl(sport, USR2) & USR2_RDR) { >> > + while (readl(sport->port.membase + USR2) & USR2_RDR) { >> > u32 usr2; >> > >> > flg = TTY_NORMAL; >> > >> > and the resulting code didn't change at all. For a bigger change (i.e. >> > adding a variable for sport->port.membase and replacing two >> > imx_uart_readl) the code changed quite a bit (it got 28 bytes bigger for >> > imx_v6_v7_defconfig) and in the short time I tried I couldn't judge if >> > the resulting code is better or not. >> > >> > So a change that explicitly doesn't execute the code that the compiler >> > optimizes away anyhow isn't a win. Together with the fact that your >> > patch makes register access use different idioms and so makes it harder >> > to understand for a human I'd say the net benefit of your patch is >> > negative. >> >> OK, you convinced me to drop it. >> >> > >> >> > Please either drop the patch from your series or provide the differences >> >> > the compiler produces and a benchmark. >> >> >> >> If your only objection against this patch is the desire to keep a single >> >> place to add debug output, I'll be happy to tune the resulting code to >> >> still have one. >> > >> > I don't see the need to optimize it. >> > >> >> That said, before we make a decision, could you please tell why register >> >> shadows that the imx_uart_readl/writel are dealing with are needed in >> >> the first place? It looks like all the registers that are shadowed are >> >> readable as well. What's going on here, and if it happens to be a >> >> speed-up, do we have any benchmarks? >> > >> > Not sure I did benchmarks back then, probably not. The main motivation >> > was really to have that single access function. So I admit being guilty >> > to have implemented an optimization without hard numbers just assuming >> > that access to (cached) RAM is quicker than the register space. >> >> Well, even if it is quicker, we still spend time writing to both RAM and >> register, and then there is no gain for the data Tx/Rx registers that >> aren't cached, yet are on most critical paths. > > Well, assuming we're saving some time for the ctrl registers, it's worth > keeping it even though there is no gain for RX/TX, right? There is no > overhead for RX/TX. > >> So, if this is just caching and doesn't change behavior, I'd suggest to >> get rid of the shadowing altogether, making code simpler to follow. > > Knowing it's subjective I don't think the shadowing is complicated. > Functions are using the driver specific readl and writel functions and > shadowing is limited to these two functions. It's not complicated indeed, but it's still code, and the less code, -- the better. > > in sum today I wouldn't change if the code does shadow the registers >or not if there isn't at least a strong hint that the one or the other >variant is better. So if you still want to work on that you're welcome, >but I invite you to do some benchmarks first and not only assume one or >the other variant is better. No code is better hands down, unless proved otherwise. I dunno if a code that somehow sneaked into the kernel gets any specific significance from the maintenance POV though. If so, for me it'd be the only sound argument in favor of keeping the code intact. > > My (unproved) assumption is that for console usage there is hardly a > difference and with a workflow that needs more changing of control > settings (like half duplex rs485) shadowing is slightly better. Well, also unproved, I tend to disagree here. I'm afraid you'd rather have hard time finding a case where it is noticeably better, especially as on the write path the shadowing is pure overhead, and so you'd have hard time getting this code into the kernel in the first place, provided somebody would care to object. For what it's worth, I've removed the shadowing in my kernel version, and it gave me no troubles yet. For reference, I use RS232 only with DMA turned off. Overall, my feeling about the issue: the shadowing code is confusing and should not have been put there in the first place. Essentially it looks like pure code bloat, so removing it would be an improvement. Thus I figure I'll send a separate patch for this, and you guys decide if the patch goes in (and the code in question goes out) or not. Thanks, -- Sergey Organov 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 A6F78C004D4 for ; Sat, 21 Jan 2023 18:05:39 +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:Message-ID:Date:References :Subject:Cc:To:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To: List-Owner; bh=t5ap6c+qnqR+penuoviSMEF/3mtl2FMhLL1YNoXZCDg=; b=etlcR8ByxQziBe KC7FgQ66mAXzxicKmVMk6JeidTzTiJVdWpyBp2KHkdgrEzVVeLqKg0+w0G/vzAFT+VvLnoSD2eUZI IceH1JR5hBeQL4XMdzga3KP/KoK9V4pKzVZOPin+/Sg4MeA0iVV66HcTv+KOFlA3fMo0iXN/USY2N 7R2b6z7CN0JADnVcUNual1GTs9DXT7iGqRydsmnNduysZDAGqxS7xCGpbB11bWZvPdDFQtlGgbHo5 MkR6Jilo8KfL/YUSFF8RyyGjNvSQyQpUjGZAIr3CIlgY6rgM5pS2DteMpe88qu42WaJ2EPMHSM2p4 83SWLvjBPs0vRN7L2KDw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1pJIED-00EFrS-Ow; Sat, 21 Jan 2023 18:04:33 +0000 Received: from mail-ej1-x62d.google.com ([2a00:1450:4864:20::62d]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1pJIEA-00EFq2-Ju for linux-arm-kernel@lists.infradead.org; Sat, 21 Jan 2023 18:04:32 +0000 Received: by mail-ej1-x62d.google.com with SMTP id u19so21336020ejm.8 for ; Sat, 21 Jan 2023 10:04:29 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:user-agent:message-id:date :references:subject:cc:to:from:from:to:cc:subject:date:message-id :reply-to; bh=1gUlDI6v8VKTtaMxxZBnCUHzXRHq2WNi9uyLdu5nGAY=; b=GGDo6doU7wzIcOBqhbO7K0p5p6Aygeh0vlu/HrtwiOV0PCao7kpHWcwNWzfxu+iIAF qU7tj2e9v9B2FRPcF5VIoeFK1x09qja63eRS6TLg+SoVwG8huSykA3IBqrucNyBhN+5i EbuUWtAPE1nUpunFHOJ3eeBTrQEMbhU4jcOxnT2XedpNDBOkIW2/03S38nUifG4Ef9C9 WcPEb60QS5i250lCauKdh54JUf6mBInH/6U9THc2D4HjoZnywEuRkF4IYVZneKzqeRAb Y52t2RSu5rbVr418Wa6A8tvX3TXQkXaIjme1Kavz9ha57aY9q+7T2BlQat/04JnVh/25 21wg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:user-agent:message-id:date :references:subject:cc:to:from:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=1gUlDI6v8VKTtaMxxZBnCUHzXRHq2WNi9uyLdu5nGAY=; b=wz0W9GbF/73AAze5a+VLtU70nA1BrK9ModnKQYc5Cq9JpyVZOZkaVEmn86F58zuXT8 j54rPxMcSafMLzI4Vy8Cjusy4apm0xiWBRRirCBzIDyNjvmL9RGuKZ+/jWWQCs9UUwYH 7feMERYLVnn0wbGrvqRdDtbMJJM6/NZmF9E5yH20GMCan/yCoBPonJ3quZKhYd424gfh B4s3f6I/1HZ87/T07xhyvqUZv5nswckcthcjP/MJbR6pEs4XGwThRANZ30kjQOWlTiZ7 tuVUEDoLYIS0C0ttGsKNFWR0+eU7NhXwY4kAik1c25RwSp+NAAPWKRmLBAelMcxoj629 qZng== X-Gm-Message-State: AFqh2kqfzQT/gL3knsYWMQCZalVrmHBQJoGWBHKoSK0X/Zo0WiabJTz1 UOKWhkjd64Ey4jZLT1txuCIKNiUGbJs= X-Google-Smtp-Source: AMrXdXsyo7NAgz0UE5nMv1yReeP76ZOEOrdOk4E6pbjKafS+QNxSvabQa5BgrB8Sb4Jbl9Re/Dcq4Q== X-Received: by 2002:a17:906:1c51:b0:864:8ffe:135b with SMTP id l17-20020a1709061c5100b008648ffe135bmr18366470ejg.22.1674324267627; Sat, 21 Jan 2023 10:04:27 -0800 (PST) Received: from osv.localdomain ([89.175.180.246]) by smtp.gmail.com with ESMTPSA id d7-20020a50fb07000000b0049cbd334b13sm11156896edq.29.2023.01.21.10.04.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 21 Jan 2023 10:04:27 -0800 (PST) From: Sergey Organov To: Uwe =?utf-8?Q?Kleine-K=C3=B6nig?= Cc: Fabio Estevam , Pengutronix Kernel Team , Richard Genoud , Greg Kroah-Hartman , Sascha Hauer , NXP Linux Team , linux-serial@vger.kernel.org, Shawn Guo , Tim Harvey , Jiri Slaby , Tomasz =?utf-8?Q?Mo=C5=84?= , linux-arm-kernel@lists.infradead.org Subject: Re: [PATCH 7/8] serial: imx: use readl() to optimize FIFO reading loop References: <87bko4e65y.fsf@osv.gnss.ru> <20230113184334.287130-1-sorganov@gmail.com> <20230113184334.287130-8-sorganov@gmail.com> <20230117113205.l5byaz3srzpagzhz@pengutronix.de> <87bkmx47o4.fsf@osv.gnss.ru> <20230117212702.vvwe3rqjedivqbhn@pengutronix.de> <87ilh3zw9q.fsf@osv.gnss.ru> <20230119070114.e62pqb6ibousxgx7@pengutronix.de> Date: Sat, 21 Jan 2023 21:04:25 +0300 Message-ID: <87k01fwyqe.fsf@osv.gnss.ru> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.1 (gnu/linux) MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230121_100430_698133_A9E97534 X-CRM114-Status: GOOD ( 61.47 ) 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 SGVsbG8gVXdlLAoKVXdlIEtsZWluZS1Lw7ZuaWcgPHUua2xlaW5lLWtvZW5pZ0BwZW5ndXRyb25p eC5kZT4gd3JpdGVzOgoKPiBIZWxsbyBTZXJnZXksCj4KPiBPbiBXZWQsIEphbiAxOCwgMjAyMyBh dCAwNjo0MDoxN1BNICswMzAwLCBTZXJnZXkgT3JnYW5vdiB3cm90ZToKPj4gVXdlIEtsZWluZS1L w7ZuaWcgPHUua2xlaW5lLWtvZW5pZ0BwZW5ndXRyb25peC5kZT4gd3JpdGVzOgo+PiA+IE9uIFR1 ZSwgSmFuIDE3LCAyMDIzIGF0IDA0OjIyOjUxUE0gKzAzMDAsIFNlcmdleSBPcmdhbm92IHdyb3Rl Ogo+PiA+PiBVd2UgS2xlaW5lLUvDtm5pZyA8dS5rbGVpbmUta29lbmlnQHBlbmd1dHJvbml4LmRl PiB3cml0ZXM6Cj4+ID4+ID4gT24gRnJpLCBKYW4gMTMsIDIwMjMgYXQgMDk6NDM6MzNQTSArMDMw MCwgU2VyZ2V5IE9yZ2Fub3Ygd3JvdGU6Cj4+ID4+ID4+IFVzZSByZWFkbCgpIGluc3RlYWQgb2Yg aGVhdmllciBpbXhfdWFydF9yZWFkbCgpIGluIHRoZSBSeCBJU1IsIGFzIHdlIGtub3cKPj4gPj4g Pj4gd2UgcmVhZCByZWdpc3RlcnMgdGhhdCBtdXN0IG5vdCBiZSBjYWNoZWQuCj4+ID4+ID4+IAo+ PiA+PiA+PiBTaWduZWQtb2ZmLWJ5OiBTZXJnZXkgT3JnYW5vdiA8c29yZ2Fub3ZAZ21haWwuY29t Pgo+PiA+PiA+PiAtLS0KPj4gPj4gPj4gIGRyaXZlcnMvdHR5L3NlcmlhbC9pbXguYyB8IDUgKysr LS0KPj4gPj4gPj4gIDEgZmlsZSBjaGFuZ2VkLCAzIGluc2VydGlvbnMoKyksIDIgZGVsZXRpb25z KC0pCj4+ID4+ID4+IAo+PiA+PiA+PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2lt eC5jIGIvZHJpdmVycy90dHkvc2VyaWFsL2lteC5jCj4+ID4+ID4+IGluZGV4IGJlMDAzNjJiOGI2 Ny4uZjQyMzZlODk5NWZhIDEwMDY0NAo+PiA+PiA+PiAtLS0gYS9kcml2ZXJzL3R0eS9zZXJpYWwv aW14LmMKPj4gPj4gPj4gKysrIGIvZHJpdmVycy90dHkvc2VyaWFsL2lteC5jCj4+ID4+ID4+IEBA IC04OTAsMTQgKzg5MCwxNSBAQCBzdGF0aWMgaXJxcmV0dXJuX3QgX19pbXhfdWFydF9yeGludChp bnQgaXJxLCB2b2lkICpkZXZfaWQpCj4+ID4+ID4+ICAJc3RydWN0IGlteF9wb3J0ICpzcG9ydCA9 IGRldl9pZDsKPj4gPj4gPj4gIAl1bnNpZ25lZCBpbnQgcngsIGZsZzsKPj4gPj4gPj4gIAlzdHJ1 Y3QgdHR5X3BvcnQgKnBvcnQgPSAmc3BvcnQtPnBvcnQuc3RhdGUtPnBvcnQ7Cj4+ID4+ID4+ICsJ dHlwZW9mKHNwb3J0LT5wb3J0Lm1lbWJhc2UpIG1lbWJhc2UgPSBzcG9ydC0+cG9ydC5tZW1iYXNl Owo+PiA+PiA+PiAgCXUzMiB1c3IyOwo+PiA+PiA+PiAgCj4+ID4+ID4+ICAJLyogSWYgd2UgcmVj ZWl2ZWQgc29tZXRoaW5nLCBjaGVjayBmb3IgMHhmZiBmbG9vZCAqLwo+PiA+PiA+PiAtCXVzcjIg PSBpbXhfdWFydF9yZWFkbChzcG9ydCwgVVNSMik7Cj4+ID4+ID4+ICsJdXNyMiA9IHJlYWRsKG1l bWJhc2UgKyBVU1IyKTsKPj4gPj4gPj4gIAlpZiAodXNyMiAmIFVTUjJfUkRSKQo+PiA+PiA+PiAg CQlpbXhfdWFydF9jaGVja19mbG9vZChzcG9ydCwgdXNyMik7Cj4+ID4+ID4+ICAKPj4gPj4gPj4g LQl3aGlsZSAoKHJ4ID0gaW14X3VhcnRfcmVhZGwoc3BvcnQsIFVSWEQwKSkgJiBVUlhEX0NIQVJS RFkpIHsKPj4gPj4gPj4gKwl3aGlsZSAoKHJ4ID0gcmVhZGwobWVtYmFzZSArIFVSWEQwKSkgJiBV UlhEX0NIQVJSRFkpIHsKPj4gPj4gPj4gIAkJZmxnID0gVFRZX05PUk1BTDsKPj4gPj4gPj4gIAkJ c3BvcnQtPnBvcnQuaWNvdW50LnJ4Kys7Cj4+ID4+ID4KPj4gPj4gPiBPbmUgb2YgdGhlIG1vdGl2 YXRpb25zIHRvIGludHJvZHVjZSBpbXhfdWFydF9yZWFkbCB3YXMgdG8gaGF2ZSBhIHNpbmdsZQo+ PiA+PiA+IHBsYWNlIHRvIGFkZCBhIGRlYnVnIG91dHB1dCB0byBiZSBhYmxlIHRvIGluc3BlY3Qg d2hhdCB0aGUgZHJpdmVyIGlzCj4+ID4+ID4gZG9pbmcuCj4+ID4+ID4KPj4gPj4gPiBJIHdvbmRl ciB3aGVyZSB5b3VyIG5lZWQgZm9yIGhpZ2hlciBzcGVlZCBjb21lcyBmcm9tIGFuZCBpZiB0aGUg Y29tcGlsZXIKPj4gPj4gPiByZWFsbHkgZ2VuZXJhdGVzIG1vcmUgZWZmZWN0aXZlIGNvZGUgd2l0 aCB5b3VyIGNoYW5nZS4KPj4gPj4gCj4+ID4+IE1vc3RseSBpdCdzIGJlY2F1c2UgSSdtIG9idmlv dXNseSBzbG93aW5nIHRoaW5ncyBkb3duIGEgYml0IHdpdGggdGhlCj4+ID4+IHBhdGNoIHRvIGZp Z2h0IHRoZSBmbG9vZCwgc28gSSBmZWVsIG9ibGlnZWQgdG8gZ2V0IHRoaW5ncyBiYWNrIG9uIHBh cgo+PiA+PiB3aXRoIHRoZSBvcmlnaW4uIFRoZW4sIGhpZ2hlciBzcGVlZCwgbGV0IGFsb25lIHRo ZSB0aW1lIHNwZW50IHdpdGgKPj4gPj4gaW50ZXJydXB0cyBkaXNhYmxlZCBhbmQvb3Igc3Bpbmxv Y2tzIHRha2VuLCBpcyBhbHdheXMgb25lIG9mIGdlbmVyaWMKPj4gPj4gZ29hbHMgZm9yIG1lLgo+ PiA+PiAKPj4gPj4gQXMgZm9yIHRoZSBnZW5lcmF0ZWQgY29kZSwgd2l0aCB0aGlzIHBhdGNoIEkg ZG9uJ3QgYWltIHRvIGFmZmVjdCBjb2RlCj4+ID4+IGdlbmVyYXRpb24sIEkgcmF0aGVyIGF2b2lk IGV4ZWN1dGlvbiBvZiBwYXJ0IG9mIGV4aXN0aW5nIGNvZGUgd2hpbGUKPj4gPj4gYmVpbmcgb24g dGhlIG1vc3QgY3JpdGljYWwgcGF0aC4gSXQgc2hvdWxkIGJlIHF1aXRlIG9idmlvdXMgdGhhdCBu b3QKPj4gPj4gZXhlY3V0aW5nIHNvbWUgY29kZSBpcyBhdCBsZWFzdCBub3Qgc2xvd2VyIHRoYW4g ZXhlY3V0aW5nIGl0Lgo+PiA+Cj4+ID4gVGhhdCdzIHRydWUsIGJ1dCBJIHRoaW5rIGl0IGRvZXNu J3QgYXBwbHkgaGVyZS4KPj4gCj4+IFdlbGwsICJhdCBsZWFzdCBub3Qgc2xvd2VyIiBzdGlsbCBh cHBsaWVzIDstKQo+PiAKPj4gPgo+PiA+IEkgd291bGQgZXhwZWN0IHRoYXQgdGhlIGNvbXBpbGVy ICJzZWVzIiBmb3IgdGhlIGNhbGwKPj4gPgo+PiA+IAlpbXhfdWFydF9yZWFkbChzcG9ydCwgVVNS MikKPj4gPgo+PiA+IHRoYXQgdGhlIDJuZCBhcmd1bWVudCBpcyBjb25zdGFudCBhbmQgdGhhdCBm b3IgdGhhdCB2YWx1ZSBvZiBvZmZzZXQgdGhlCj4+ID4gY2FsbCBpcyBlcXVpdmFsZW50IHRvIHJl YWRsKHNwb3J0LT5wb3J0Lm1lbWJhc2UgKyBvZmZzZXQpOwo+PiA+Cj4+ID4gU28gSSBkb3VidCB5 b3UncmUgbWFraW5nIGFueXRoaW5nIHF1aWNrZXIgaGVyZS4KPj4gCj4+IFllcCwgaXQncyBuaWNl IGNvbXBpbGVyIGlzIGNsZXZlciBlbm91Z2ggdG8gb3B0aW1pemUtb3V0IHRoZSBzd2l0Y2ggZm9y Cj4+IGNvbnN0YW50IGFyZ3VtZW50LCB0aG91Z2ggSSBzdGlsbCB0eXBpY2FsbHkgcHJlZmVyIHRv IGF2b2lkIG92ZXItcmVseWluZwo+PiBvbiBvcHRpbWl6YXRpb25zLiBUaGF0IHNhaWQsIEkgbm93 IHRlbmQgdG8gYWdyZWUgd2l0aCB5b3VyIFBPViBpbiB0aGlzCj4+IHBhcnRpY3VsYXIgY2FzZS4K Pj4gCj4+ID4KPj4gPiBJIHRyaWVkIHRoZSBmb2xsb3dpbmcgcGF0Y2ggb24gbWFpbmxpbmUgKHRo YXQgaXMgd2l0aG91dCB0aGUgcHJlY2VkaW5nCj4+ID4gcGF0Y2hlcyBpbiB0aGlzIHNlcmllcyk6 Cj4+ID4KPj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy90dHkvc2VyaWFsL2lteC5jIGIvZHJpdmVy cy90dHkvc2VyaWFsL2lteC5jCj4+ID4gaW5kZXggNzU3ODI1ZWRiMGNkLi5jZmMyZjcwNTczNDUg MTAwNjQ0Cj4+ID4gLS0tIGEvZHJpdmVycy90dHkvc2VyaWFsL2lteC5jCj4+ID4gKysrIGIvZHJp dmVycy90dHkvc2VyaWFsL2lteC5jCj4+ID4gQEAgLTgwNyw3ICs4MDcsNyBAQCBzdGF0aWMgaXJx cmV0dXJuX3QgX19pbXhfdWFydF9yeGludChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCj4+ID4gIAl1 bnNpZ25lZCBpbnQgcngsIGZsZywgaWdub3JlZCA9IDA7Cj4+ID4gIAlzdHJ1Y3QgdHR5X3BvcnQg KnBvcnQgPSAmc3BvcnQtPnBvcnQuc3RhdGUtPnBvcnQ7Cj4+ID4gIAo+PiA+IC0Jd2hpbGUgKGlt eF91YXJ0X3JlYWRsKHNwb3J0LCBVU1IyKSAmIFVTUjJfUkRSKSB7Cj4+ID4gKwl3aGlsZSAocmVh ZGwoc3BvcnQtPnBvcnQubWVtYmFzZSArIFVTUjIpICYgVVNSMl9SRFIpIHsKPj4gPiAgCQl1MzIg dXNyMjsKPj4gPiAgCj4+ID4gIAkJZmxnID0gVFRZX05PUk1BTDsKPj4gPgo+PiA+IGFuZCB0aGUg cmVzdWx0aW5nIGNvZGUgZGlkbid0IGNoYW5nZSBhdCBhbGwuIEZvciBhIGJpZ2dlciBjaGFuZ2Ug KGkuZS4KPj4gPiBhZGRpbmcgYSB2YXJpYWJsZSBmb3Igc3BvcnQtPnBvcnQubWVtYmFzZSBhbmQg cmVwbGFjaW5nIHR3bwo+PiA+IGlteF91YXJ0X3JlYWRsKSB0aGUgY29kZSBjaGFuZ2VkIHF1aXRl IGEgYml0IChpdCBnb3QgMjggYnl0ZXMgYmlnZ2VyIGZvcgo+PiA+IGlteF92Nl92N19kZWZjb25m aWcpIGFuZCBpbiB0aGUgc2hvcnQgdGltZSBJIHRyaWVkIEkgY291bGRuJ3QganVkZ2UgaWYKPj4g PiB0aGUgcmVzdWx0aW5nIGNvZGUgaXMgYmV0dGVyIG9yIG5vdC4KPj4gPgo+PiA+IFNvIGEgY2hh bmdlIHRoYXQgZXhwbGljaXRseSBkb2Vzbid0IGV4ZWN1dGUgdGhlIGNvZGUgdGhhdCB0aGUgY29t cGlsZXIKPj4gPiBvcHRpbWl6ZXMgYXdheSBhbnlob3cgaXNuJ3QgYSB3aW4uIFRvZ2V0aGVyIHdp dGggdGhlIGZhY3QgdGhhdCB5b3VyCj4+ID4gcGF0Y2ggbWFrZXMgcmVnaXN0ZXIgYWNjZXNzIHVz ZSBkaWZmZXJlbnQgaWRpb21zIGFuZCBzbyBtYWtlcyBpdCBoYXJkZXIKPj4gPiB0byB1bmRlcnN0 YW5kIGZvciBhIGh1bWFuIEknZCBzYXkgdGhlIG5ldCBiZW5lZml0IG9mIHlvdXIgcGF0Y2ggaXMK Pj4gPiBuZWdhdGl2ZS4KPj4gCj4+IE9LLCB5b3UgY29udmluY2VkIG1lIHRvIGRyb3AgaXQuCj4+ IAo+PiA+Cj4+ID4+ID4gUGxlYXNlIGVpdGhlciBkcm9wIHRoZSBwYXRjaCBmcm9tIHlvdXIgc2Vy aWVzIG9yIHByb3ZpZGUgdGhlIGRpZmZlcmVuY2VzCj4+ID4+ID4gdGhlIGNvbXBpbGVyIHByb2R1 Y2VzIGFuZCBhIGJlbmNobWFyay4KPj4gPj4gCj4+ID4+IElmIHlvdXIgb25seSBvYmplY3Rpb24g YWdhaW5zdCB0aGlzIHBhdGNoIGlzIHRoZSBkZXNpcmUgdG8ga2VlcCBhIHNpbmdsZQo+PiA+PiBw bGFjZSB0byBhZGQgZGVidWcgb3V0cHV0LCBJJ2xsIGJlIGhhcHB5IHRvIHR1bmUgdGhlIHJlc3Vs dGluZyBjb2RlIHRvCj4+ID4+IHN0aWxsIGhhdmUgb25lLgo+PiA+Cj4+ID4gSSBkb24ndCBzZWUg dGhlIG5lZWQgdG8gb3B0aW1pemUgaXQuCj4+ID4KPj4gPj4gVGhhdCBzYWlkLCBiZWZvcmUgd2Ug bWFrZSBhIGRlY2lzaW9uLCBjb3VsZCB5b3UgcGxlYXNlIHRlbGwgd2h5IHJlZ2lzdGVyCj4+ID4+ IHNoYWRvd3MgdGhhdCB0aGUgaW14X3VhcnRfcmVhZGwvd3JpdGVsIGFyZSBkZWFsaW5nIHdpdGgg YXJlIG5lZWRlZCBpbgo+PiA+PiB0aGUgZmlyc3QgcGxhY2U/IEl0IGxvb2tzIGxpa2UgYWxsIHRo ZSByZWdpc3RlcnMgdGhhdCBhcmUgc2hhZG93ZWQgYXJlCj4+ID4+IHJlYWRhYmxlIGFzIHdlbGwu IFdoYXQncyBnb2luZyBvbiBoZXJlLCBhbmQgaWYgaXQgaGFwcGVucyB0byBiZSBhCj4+ID4+IHNw ZWVkLXVwLCBkbyB3ZSBoYXZlIGFueSBiZW5jaG1hcmtzPwo+PiA+Cj4+ID4gTm90IHN1cmUgSSBk aWQgYmVuY2htYXJrcyBiYWNrIHRoZW4sIHByb2JhYmx5IG5vdC4gVGhlIG1haW4gbW90aXZhdGlv bgo+PiA+IHdhcyByZWFsbHkgdG8gaGF2ZSB0aGF0IHNpbmdsZSBhY2Nlc3MgZnVuY3Rpb24uIFNv IEkgYWRtaXQgYmVpbmcgZ3VpbHR5Cj4+ID4gdG8gaGF2ZSBpbXBsZW1lbnRlZCBhbiBvcHRpbWl6 YXRpb24gd2l0aG91dCBoYXJkIG51bWJlcnMganVzdCBhc3N1bWluZwo+PiA+IHRoYXQgYWNjZXNz IHRvIChjYWNoZWQpIFJBTSBpcyBxdWlja2VyIHRoYW4gdGhlIHJlZ2lzdGVyIHNwYWNlLgo+PiAK Pj4gV2VsbCwgZXZlbiBpZiBpdCBpcyBxdWlja2VyLCB3ZSBzdGlsbCBzcGVuZCB0aW1lIHdyaXRp bmcgdG8gYm90aCBSQU0gYW5kCj4+IHJlZ2lzdGVyLCBhbmQgdGhlbiB0aGVyZSBpcyBubyBnYWlu IGZvciB0aGUgZGF0YSBUeC9SeCByZWdpc3RlcnMgdGhhdAo+PiBhcmVuJ3QgY2FjaGVkLCB5ZXQg YXJlIG9uIG1vc3QgY3JpdGljYWwgcGF0aHMuCj4KPiBXZWxsLCBhc3N1bWluZyB3ZSdyZSBzYXZp bmcgc29tZSB0aW1lIGZvciB0aGUgY3RybCByZWdpc3RlcnMsIGl0J3Mgd29ydGgKPiBrZWVwaW5n IGl0IGV2ZW4gdGhvdWdoIHRoZXJlIGlzIG5vIGdhaW4gZm9yIFJYL1RYLCByaWdodD8gVGhlcmUg aXMgbm8KPiBvdmVyaGVhZCBmb3IgUlgvVFguCj4KPj4gU28sIGlmIHRoaXMgaXMganVzdCBjYWNo aW5nIGFuZCBkb2Vzbid0IGNoYW5nZSBiZWhhdmlvciwgSSdkIHN1Z2dlc3QgdG8KPj4gZ2V0IHJp ZCBvZiB0aGUgc2hhZG93aW5nIGFsdG9nZXRoZXIsIG1ha2luZyBjb2RlIHNpbXBsZXIgdG8gZm9s bG93Lgo+Cj4gS25vd2luZyBpdCdzIHN1YmplY3RpdmUgSSBkb24ndCB0aGluayB0aGUgc2hhZG93 aW5nIGlzIGNvbXBsaWNhdGVkLgo+IEZ1bmN0aW9ucyBhcmUgdXNpbmcgdGhlIGRyaXZlciBzcGVj aWZpYyByZWFkbCBhbmQgd3JpdGVsIGZ1bmN0aW9ucyBhbmQKPiBzaGFkb3dpbmcgaXMgbGltaXRl ZCB0byB0aGVzZSB0d28gZnVuY3Rpb25zLgoKSXQncyBub3QgY29tcGxpY2F0ZWQgaW5kZWVkLCBi dXQgaXQncyBzdGlsbCBjb2RlLCBhbmQgdGhlIGxlc3MgY29kZSwgLS0KdGhlIGJldHRlci4KCj4K PiBpbiBzdW0gdG9kYXkgSSB3b3VsZG4ndCBjaGFuZ2UgaWYgdGhlIGNvZGUgZG9lcyBzaGFkb3cg dGhlIHJlZ2lzdGVycwo+b3Igbm90IGlmIHRoZXJlIGlzbid0IGF0IGxlYXN0IGEgc3Ryb25nIGhp bnQgdGhhdCB0aGUgb25lIG9yIHRoZSBvdGhlcgo+dmFyaWFudCBpcyBiZXR0ZXIuIFNvIGlmIHlv dSBzdGlsbCB3YW50IHRvIHdvcmsgb24gdGhhdCB5b3UncmUgd2VsY29tZSwKPmJ1dCBJIGludml0 ZSB5b3UgdG8gZG8gc29tZSBiZW5jaG1hcmtzIGZpcnN0IGFuZCBub3Qgb25seSBhc3N1bWUgb25l IG9yCj50aGUgb3RoZXIgdmFyaWFudCBpcyBiZXR0ZXIuCgpObyBjb2RlIGlzIGJldHRlciBoYW5k cyBkb3duLCB1bmxlc3MgcHJvdmVkIG90aGVyd2lzZS4gSSBkdW5ubyBpZiBhIGNvZGUKdGhhdCBz b21laG93IHNuZWFrZWQgaW50byB0aGUga2VybmVsIGdldHMgYW55IHNwZWNpZmljIHNpZ25pZmlj YW5jZSBmcm9tCnRoZSBtYWludGVuYW5jZSBQT1YgdGhvdWdoLiBJZiBzbywgZm9yIG1lIGl0J2Qg YmUgdGhlIG9ubHkgc291bmQKYXJndW1lbnQgaW4gZmF2b3Igb2Yga2VlcGluZyB0aGUgY29kZSBp bnRhY3QuCgo+Cj4gTXkgKHVucHJvdmVkKSBhc3N1bXB0aW9uIGlzIHRoYXQgZm9yIGNvbnNvbGUg dXNhZ2UgdGhlcmUgaXMgaGFyZGx5IGEKPiBkaWZmZXJlbmNlIGFuZCB3aXRoIGEgd29ya2Zsb3cg dGhhdCBuZWVkcyBtb3JlIGNoYW5naW5nIG9mIGNvbnRyb2wKPiBzZXR0aW5ncyAobGlrZSBoYWxm IGR1cGxleCByczQ4NSkgc2hhZG93aW5nIGlzIHNsaWdodGx5IGJldHRlci4KCldlbGwsIGFsc28g dW5wcm92ZWQsIEkgdGVuZCB0byBkaXNhZ3JlZSBoZXJlLiBJJ20gYWZyYWlkIHlvdSdkIHJhdGhl cgpoYXZlIGhhcmQgdGltZSBmaW5kaW5nIGEgY2FzZSB3aGVyZSBpdCBpcyBub3RpY2VhYmx5IGJl dHRlciwgZXNwZWNpYWxseQphcyBvbiB0aGUgd3JpdGUgcGF0aCB0aGUgc2hhZG93aW5nIGlzIHB1 cmUgb3ZlcmhlYWQsIGFuZCBzbyB5b3UnZCBoYXZlCmhhcmQgdGltZSBnZXR0aW5nIHRoaXMgY29k ZSBpbnRvIHRoZSBrZXJuZWwgaW4gdGhlIGZpcnN0IHBsYWNlLCBwcm92aWRlZApzb21lYm9keSB3 b3VsZCBjYXJlIHRvIG9iamVjdC4KCkZvciB3aGF0IGl0J3Mgd29ydGgsIEkndmUgcmVtb3ZlZCB0 aGUgc2hhZG93aW5nIGluIG15IGtlcm5lbCB2ZXJzaW9uLAphbmQgaXQgZ2F2ZSBtZSBubyB0cm91 YmxlcyB5ZXQuIEZvciByZWZlcmVuY2UsIEkgdXNlIFJTMjMyIG9ubHkgd2l0aCBETUEKdHVybmVk IG9mZi4KCk92ZXJhbGwsIG15IGZlZWxpbmcgYWJvdXQgdGhlIGlzc3VlOiB0aGUgc2hhZG93aW5n IGNvZGUgaXMgY29uZnVzaW5nIGFuZApzaG91bGQgbm90IGhhdmUgYmVlbiBwdXQgdGhlcmUgaW4g dGhlIGZpcnN0IHBsYWNlLiBFc3NlbnRpYWxseSBpdCBsb29rcwpsaWtlIHB1cmUgY29kZSBibG9h dCwgc28gcmVtb3ZpbmcgaXQgd291bGQgYmUgYW4gaW1wcm92ZW1lbnQuIFRodXMgSQpmaWd1cmUg SSdsbCBzZW5kIGEgc2VwYXJhdGUgcGF0Y2ggZm9yIHRoaXMsIGFuZCB5b3UgZ3V5cyBkZWNpZGUg aWYgdGhlCnBhdGNoIGdvZXMgaW4gKGFuZCB0aGUgY29kZSBpbiBxdWVzdGlvbiBnb2VzIG91dCkg b3Igbm90LgoKVGhhbmtzLAotLSBTZXJnZXkgT3JnYW5vdgoKX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxpc3QK bGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRl YWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=