From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f42.google.com (mail-wm1-f42.google.com [209.85.128.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 78DBE12D75B for ; Tue, 9 Apr 2024 11:32:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.42 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712662324; cv=none; b=dVFYFt2MrMeCiiCBShyyYAYrI3zbO5bxEwoRbOpnBL4atLRF9vKM6NEB0sZtbbH+unU6i9JwXpTYIvkGQn6NObmGdgyfnxOLW55qK/3Rqtc+2m3k2ro1EF+w9AerRumnH7x8+m9Tqj2IeEulk5wSkwTlha1va8eVVXxV1wQH++Y= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712662324; c=relaxed/simple; bh=e7xh7zUpQO/f7HZi7UU4sg3MF2Z15fxZPQmiWM4x8uM=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=quTFOMCHLdJRazajqirv1cdcGpTtT063u7mPSzzgyxiyclyeQ5DtS3stUPPLgXHtSQZe4tARqIBqvU4iZl19IeY7FvmdiEYLfKirFbRl4p7zQVPyolIWJ4JwkJ/hvW4NDF6wCEOHCHiJ2wLah5EU6Pilv8ECdGamGj5G21e3yOw= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=iZjk1iEn; arc=none smtp.client-ip=209.85.128.42 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="iZjk1iEn" Received: by mail-wm1-f42.google.com with SMTP id 5b1f17b1804b1-4154d38ce9dso72345e9.0 for ; Tue, 09 Apr 2024 04:32:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1712662320; x=1713267120; darn=lists.linux.dev; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=E4DFnz/WvqbVMqJ3REDURlQMNEnJzpbcoDSyqNDWBm4=; b=iZjk1iEnMA2KZNGqDd+B5k/AzV4cJptsb3RsqsSiqrVonPriFkaakTHYkguTX7IeAY Kwe9zfL/HCJyucLdMNwBKeXMv1qtQFtykK3qsKBOjKO7tIfZ/dJ+aQnOx2gIV1dQr3P+ h+co+/iqe2HsCZnYEOw5ZZCkwP8aqlO8xNtCZmYic38lpfOKIBNwX5MEpcpwKc8qGPz5 g/Mywhvu28LVJ2fyDciZnjWLgYez1cAv6rlNt4vRIZRGjMt+LIFN1Bx29ZI+6njFS+iy QYd1gvGlKXVk0SVWvQT5w5+W3mYtGKePXfKUm0tM5L92/vF/BTWa1XSvb7t3LHOTswhX aE1w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712662320; x=1713267120; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=E4DFnz/WvqbVMqJ3REDURlQMNEnJzpbcoDSyqNDWBm4=; b=lzYYdU4bCVjjCgMVh0Ckw9FR1PBp9Atuo120XWmp5/fhDb9xX0ZXedCf3vlTkuGv+U bwO/wqbIr21knCCz3jgGppWxR3MHAt/9/j8/0fyew6nYBSyT3r6ajaIsDZ8JNxzorpci Q677+i4DX1vCBlIrET/eNUHvcZQx563TAEGdok2RRb86QLIwmvU2aPMKJhCKNgGb8BsG 6wd46LjByb9WH6B2S0Vx6tpf5uWmA3TzuqEyHBQAiEGlNJFhoyz8iwKZyzoYCPXJ4e7k 7pS6vWxt1wARPGCEJCBDMwpoUPL3q/7GX6S6O309rYlp4KPFVST965bID51CpYcptk2n HirA== X-Forwarded-Encrypted: i=1; AJvYcCU7f5NKwYth+o9I9FCZVSHL2FybMvmGp+Ro+V21jQFhc4lQ5wkr/oRigp6FAvCB95dTUTGoN7irxzIeriXYao4LJEuJ/vc= X-Gm-Message-State: AOJu0YyonrVB3RhAlhXZWDJLSI6sIHp0wqb4czGbOiHYMjIybGSbKbdH tZD/0Gdhx0T+hx/rdUxIutITWfspJJUa5T8Afxel00Q9pjlRg29EYahdXFegWA== X-Google-Smtp-Source: AGHT+IEKhWdjBCLhSgPhpTkaQshxax9sUIa24Y/ydpxEHLgbRl9WWQbrCX4RqHImsXU0Q6eJ0iLhyA== X-Received: by 2002:a05:600c:1e0a:b0:414:1400:a776 with SMTP id ay10-20020a05600c1e0a00b004141400a776mr121340wmb.5.1712662319674; Tue, 09 Apr 2024 04:31:59 -0700 (PDT) Received: from google.com (180.232.140.34.bc.googleusercontent.com. [34.140.232.180]) by smtp.gmail.com with ESMTPSA id h16-20020a05600c315000b00416b8da335esm400432wmo.48.2024.04.09.04.31.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 09 Apr 2024 04:31:59 -0700 (PDT) Date: Tue, 9 Apr 2024 11:31:55 +0000 From: Mostafa Saleh To: Robin Murphy Cc: Aleksandr Aprelkov , Will Deacon , Joerg Roedel , Jason Gunthorpe , Nicolin Chen , Michael Shavit , Lu Baolu , Marc Zyngier , linux-arm-kernel@lists.infradead.org, iommu@lists.linux.dev, linux-kernel@vger.kernel.org Subject: Re: [PATCH v2] iommu/arm-smmu-v3: Free MSIs in case of ENOMEM Message-ID: References: <20240403053759.643164-1-aaprelkov@usergate.com> <8a7f0218-39e3-4e4b-ba99-7fe4389fb703@arm.com> Precedence: bulk X-Mailing-List: iommu@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <8a7f0218-39e3-4e4b-ba99-7fe4389fb703@arm.com> Hi Robin, On Tue, Apr 09, 2024 at 12:17:54PM +0100, Robin Murphy wrote: > On 09/04/2024 11:43 am, Mostafa Saleh wrote: > > Hi Aleksandr, > > > > On Wed, Apr 03, 2024 at 12:37:59PM +0700, Aleksandr Aprelkov wrote: > > > If devm_add_action() returns ENOMEM, then MSIs allocated but > > > not freed on teardown. > > > > > > Found by Linux Verification Center (linuxtesting.org) with SVACE. > > > > > > Fixes: 166bdbd23161 ("iommu/arm-smmu: Add support for MSI on SMMUv3") > > > Signed-off-by: Aleksandr Aprelkov > > > --- > > > v2: Use appropriate function for registration failure as > > > Jonathan Cameron suggested. > > > > > > drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c | 4 +++- > > > 1 file changed, 3 insertions(+), 1 deletion(-) > > > > > > diff --git a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c > > > index 41f93c3ab160..8800af041e5f 100644 > > > --- a/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c > > > +++ b/drivers/iommu/arm/arm-smmu-v3/arm-smmu-v3.c > > > @@ -3402,7 +3402,9 @@ static void arm_smmu_setup_msis(struct arm_smmu_device *smmu) > > > smmu->priq.q.irq = msi_get_virq(dev, PRIQ_MSI_INDEX); > > > /* Add callback to free MSIs on teardown */ > > > - devm_add_action(dev, arm_smmu_free_msis, dev); > > > + ret = devm_add_action_or_reset(dev, arm_smmu_free_msis, dev); > > > + if (ret) > > > + dev_warn(dev, "failed to add free MSIs callback - falling back to wired irqs\n"); > > > > I am not sure that is the right fix, as allowing the driver to probe > > without MSIs, seems worse than leaking MSI memory. > > > > IMHO, we can just add something like: > > dev_err(smmu->dev, “Can’t allocate devm action, MSIs are never freed! !\n”) ; > > Honestly I don't think this matters. If we ever really did fail to allocate > 16 bytes, SLUB would already be screaming and spewing stacktraces, and the > system is dead already. > > > Also, we can’t unconditionally fallback to wired irqs if MSI exists, > > according to the user manual: > > An implementation must support one of, or optionally both of, > > wired interrupts and MSIs > > ... > > The discovery of support for wired interrupts is IMPLEMENTATION DEFINED. > > > > We can add some logic, to check dt/acpi irqs and to choose to fallback > > or not based on that, but, if we get -ENOMEM, (especially early at > > probe) something really went wrong, so I am not sure it’s worth > > the complexity. > > That logic already exists in arm_smmu_setup_unique_irqs() - the messages > here are in the sense of "we're giving up on MSIs and falling back to trying > whatever wired IRQs we may or may not have." The critical point is that > we're not using MSIs for some potentially actionable reason, i.e. if the > user does expect the system to be MSI-capable, then it could be an > indication of perhaps a wrong or missing msi-parent, for which they may > pursue a firmware fix. In other cases it's normal and expected not to use > MSIs though (e.g. the system just doesn't have an ITS), so we don't want to > be *too* noisy about it. The case I am worried about in this patch, is for systems with MSIs only. With this patch, that means, we fallback to wired irqs which don't exist, so the driver will probe with no interrupts at all, which in my opinion worse than leaking the memory. Thanks, Mostafa > > Thanks, > Robin. > > > > > > } > > > static void arm_smmu_setup_unique_irqs(struct arm_smmu_device *smmu) > > > -- > > > 2.34.1 > > > > > Thanks, > > Mostafa 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 53202C67861 for ; Tue, 9 Apr 2024 11:32:24 +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:In-Reply-To:MIME-Version:References: 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=cPi1BAYotND9q+dUNsmuRlD/afFDi0rHcm1huRdOnfs=; b=g/1cgbjzS2ownk icToe+ilNeq333GjiaZ1eLomZ7Xt+bJmlPtRgmUc/0MFvQ1E+8cksH3rVcBOFalQ/A01wLKRaktYA V7fp3i0O3o6i+3CJOeSyL5Ey51YSQAeMeuKtKQmMHV4RKd+YSCStEcOjVhoaFwaNB4z1M6c1+zZFG 49vg4pwcXj+qtRyGjdX+HCkkkLmCihAah8v1OOjPZwo2oPklZGFlX6KhGhwYH5hEDVcqBReRk1e4i 6mQ028El8NLSCKzjfK/J/jWDX0rmN63AeZAUCuG8E/7YZSUcqe3RW1OTO1Fxp4ZfUW6SBs0wCN7+/ mfzSAuSUrRLTO0uUkVAw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1ru9hy-00000001fb6-3APv; Tue, 09 Apr 2024 11:32:10 +0000 Received: from mail-wm1-x334.google.com ([2a00:1450:4864:20::334]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1ru9hq-00000001fXO-3C6e for linux-arm-kernel@lists.infradead.org; Tue, 09 Apr 2024 11:32:09 +0000 Received: by mail-wm1-x334.google.com with SMTP id 5b1f17b1804b1-41641a889ccso54555e9.1 for ; Tue, 09 Apr 2024 04:32:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1712662320; x=1713267120; darn=lists.infradead.org; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=E4DFnz/WvqbVMqJ3REDURlQMNEnJzpbcoDSyqNDWBm4=; b=ZqgC+/1pK6d0+yJu3WGw2nJ9xmn9CIRBsZbSOcd7gOdIGPm6Vg/GxR7FuP6Wq6rIIS dzaNznTD/7lZh+Omz/JcPFLXpXSaQvk2oO3y6SXlZ+ahr2l9eoi8SIijv0Jfsb6ZzVdM opvP3YWy0jBiDio2sz2/2vNr7F6C0edefKPpWNhTfljIQSL86mNJVaoYUbe8PUieK5bm PQv8CB0uMBYPrBdcPJc66dMStMn450j7gcx+ewUPLmq7sgsCt2MWmYCviB1NP/aNEMLx u6LL8ZD6VLFNUgMKrEaYMqGuBLE1W9PdDoFjegRNhd2wuOngYleUFTCRQbWzhGPM6ejf Ktdw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712662320; x=1713267120; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=E4DFnz/WvqbVMqJ3REDURlQMNEnJzpbcoDSyqNDWBm4=; b=Tvnz96D7oLnxtethsl3bVCoGGPefOdRrWxr2CoBL/zF6M8shII/qo1s3iTAQMQRvmJ XsvdSKHye+4jVJN0+vsU+dFxOcIORML/Mxx3ImUs7LqATiSLYsoG2SvS8V+RHrPzszO5 6dWCpo34U+c9NwS4cbFmRsMZUNyu1i31rzpomwuST5xMSH0+DXBQcMZLq7XnDLZWXdmF h7dXGKZ+7QyQxCM+7Jauxn2WweJwsdm69ZTTXzyO/5gPxAd13kTQPPBsBe+mFgD2aeEJ jzCto9gtcOUPEoCVTIFmQKF6IFT2LkfGzzeBaxvMMn8/Sbrq91wFsk2qwQVGqHSJk1du 5ACw== X-Forwarded-Encrypted: i=1; AJvYcCVwncs7Pb6uXGZE2pwZbrc2uw94aTQIwvOQuG/PsMhlt5meyr5XUarg6ao3fP3odNu6k/2FUVz4g5k158xkFYjHj/Ur1RaqH/Ciw2UY7RpRKBMn6aI= X-Gm-Message-State: AOJu0YwYUPp4oKX+2go4Mak7gzjDsHax36pgZZOrITsWW4Q1/HuqFOjk av8UZe0WZxarEFrjFkTKjwKP7qcMBoX6WT9J2vY5TcsmZCfy4y7TgVo6Y8PL0g== X-Google-Smtp-Source: AGHT+IEKhWdjBCLhSgPhpTkaQshxax9sUIa24Y/ydpxEHLgbRl9WWQbrCX4RqHImsXU0Q6eJ0iLhyA== X-Received: by 2002:a05:600c:1e0a:b0:414:1400:a776 with SMTP id ay10-20020a05600c1e0a00b004141400a776mr121340wmb.5.1712662319674; Tue, 09 Apr 2024 04:31:59 -0700 (PDT) Received: from google.com (180.232.140.34.bc.googleusercontent.com. [34.140.232.180]) by smtp.gmail.com with ESMTPSA id h16-20020a05600c315000b00416b8da335esm400432wmo.48.2024.04.09.04.31.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 09 Apr 2024 04:31:59 -0700 (PDT) Date: Tue, 9 Apr 2024 11:31:55 +0000 From: Mostafa Saleh To: Robin Murphy Cc: Aleksandr Aprelkov , Will Deacon , Joerg Roedel , Jason Gunthorpe , Nicolin Chen , Michael Shavit , Lu Baolu , Marc Zyngier , linux-arm-kernel@lists.infradead.org, iommu@lists.linux.dev, linux-kernel@vger.kernel.org Subject: Re: [PATCH v2] iommu/arm-smmu-v3: Free MSIs in case of ENOMEM Message-ID: References: <20240403053759.643164-1-aaprelkov@usergate.com> <8a7f0218-39e3-4e4b-ba99-7fe4389fb703@arm.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <8a7f0218-39e3-4e4b-ba99-7fe4389fb703@arm.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240409_043205_226452_9900EBFC X-CRM114-Status: GOOD ( 38.10 ) 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 SGkgUm9iaW4sCgpPbiBUdWUsIEFwciAwOSwgMjAyNCBhdCAxMjoxNzo1NFBNICswMTAwLCBSb2Jp biBNdXJwaHkgd3JvdGU6Cj4gT24gMDkvMDQvMjAyNCAxMTo0MyBhbSwgTW9zdGFmYSBTYWxlaCB3 cm90ZToKPiA+IEhpIEFsZWtzYW5kciwKPiA+IAo+ID4gT24gV2VkLCBBcHIgMDMsIDIwMjQgYXQg MTI6Mzc6NTlQTSArMDcwMCwgQWxla3NhbmRyIEFwcmVsa292IHdyb3RlOgo+ID4gPiBJZiBkZXZt X2FkZF9hY3Rpb24oKSByZXR1cm5zIEVOT01FTSwgdGhlbiBNU0lzIGFsbG9jYXRlZCBidXQKPiA+ ID4gbm90IGZyZWVkIG9uIHRlYXJkb3duLgo+ID4gPiAKPiA+ID4gRm91bmQgYnkgTGludXggVmVy aWZpY2F0aW9uIENlbnRlciAobGludXh0ZXN0aW5nLm9yZykgd2l0aCBTVkFDRS4KPiA+ID4gCj4g PiA+IEZpeGVzOiAxNjZiZGJkMjMxNjEgKCJpb21tdS9hcm0tc21tdTogQWRkIHN1cHBvcnQgZm9y IE1TSSBvbiBTTU1VdjMiKQo+ID4gPiBTaWduZWQtb2ZmLWJ5OiBBbGVrc2FuZHIgQXByZWxrb3Yg PGFhcHJlbGtvdkB1c2VyZ2F0ZS5jb20+Cj4gPiA+IC0tLQo+ID4gPiB2MjogVXNlIGFwcHJvcHJp YXRlIGZ1bmN0aW9uIGZvciByZWdpc3RyYXRpb24gZmFpbHVyZSBhcwo+ID4gPiBKb25hdGhhbiBD YW1lcm9uIDxKb25hdGhhbi5DYW1lcm9uQEh1YXdlaS5jb20+IHN1Z2dlc3RlZC4KPiA+ID4gCj4g PiA+ICAgZHJpdmVycy9pb21tdS9hcm0vYXJtLXNtbXUtdjMvYXJtLXNtbXUtdjMuYyB8IDQgKysr LQo+ID4gPiAgIDEgZmlsZSBjaGFuZ2VkLCAzIGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSkK PiA+ID4gCj4gPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2FybS9hcm0tc21tdS12My9h cm0tc21tdS12My5jIGIvZHJpdmVycy9pb21tdS9hcm0vYXJtLXNtbXUtdjMvYXJtLXNtbXUtdjMu Ywo+ID4gPiBpbmRleCA0MWY5M2MzYWIxNjAuLjg4MDBhZjA0MWU1ZiAxMDA2NDQKPiA+ID4gLS0t IGEvZHJpdmVycy9pb21tdS9hcm0vYXJtLXNtbXUtdjMvYXJtLXNtbXUtdjMuYwo+ID4gPiArKysg Yi9kcml2ZXJzL2lvbW11L2FybS9hcm0tc21tdS12My9hcm0tc21tdS12My5jCj4gPiA+IEBAIC0z NDAyLDcgKzM0MDIsOSBAQCBzdGF0aWMgdm9pZCBhcm1fc21tdV9zZXR1cF9tc2lzKHN0cnVjdCBh cm1fc21tdV9kZXZpY2UgKnNtbXUpCj4gPiA+ICAgCXNtbXUtPnByaXEucS5pcnEgPSBtc2lfZ2V0 X3ZpcnEoZGV2LCBQUklRX01TSV9JTkRFWCk7Cj4gPiA+ICAgCS8qIEFkZCBjYWxsYmFjayB0byBm cmVlIE1TSXMgb24gdGVhcmRvd24gKi8KPiA+ID4gLQlkZXZtX2FkZF9hY3Rpb24oZGV2LCBhcm1f c21tdV9mcmVlX21zaXMsIGRldik7Cj4gPiA+ICsJcmV0ID0gZGV2bV9hZGRfYWN0aW9uX29yX3Jl c2V0KGRldiwgYXJtX3NtbXVfZnJlZV9tc2lzLCBkZXYpOwo+ID4gPiArCWlmIChyZXQpCj4gPiA+ ICsJCWRldl93YXJuKGRldiwgImZhaWxlZCB0byBhZGQgZnJlZSBNU0lzIGNhbGxiYWNrIC0gZmFs bGluZyBiYWNrIHRvIHdpcmVkIGlycXNcbiIpOwo+ID4gCj4gPiBJIGFtIG5vdCBzdXJlIHRoYXQg aXMgdGhlIHJpZ2h0IGZpeCwgYXMgYWxsb3dpbmcgdGhlIGRyaXZlciB0byBwcm9iZQo+ID4gd2l0 aG91dCBNU0lzLCBzZWVtcyB3b3JzZSB0aGFuIGxlYWtpbmcgTVNJIG1lbW9yeS4KPiA+IAo+ID4g SU1ITywgd2UgY2FuIGp1c3QgYWRkIHNvbWV0aGluZyBsaWtlOgo+ID4gICAgICBkZXZfZXJyKHNt bXUtPmRldiwg4oCcQ2Fu4oCZdCBhbGxvY2F0ZSBkZXZtIGFjdGlvbiwgTVNJcyBhcmUgbmV2ZXIg ZnJlZWQhICFcbuKAnSkgOwo+IAo+IEhvbmVzdGx5IEkgZG9uJ3QgdGhpbmsgdGhpcyBtYXR0ZXJz LiBJZiB3ZSBldmVyIHJlYWxseSBkaWQgZmFpbCB0byBhbGxvY2F0ZQo+IDE2IGJ5dGVzLCBTTFVC IHdvdWxkIGFscmVhZHkgYmUgc2NyZWFtaW5nIGFuZCBzcGV3aW5nIHN0YWNrdHJhY2VzLCBhbmQg dGhlCj4gc3lzdGVtIGlzIGRlYWQgYWxyZWFkeS4KPiAKPiA+IEFsc28sIHdlIGNhbuKAmXQgdW5j b25kaXRpb25hbGx5IGZhbGxiYWNrIHRvIHdpcmVkIGlycXMgaWYgTVNJIGV4aXN0cywKPiA+IGFj Y29yZGluZyB0byB0aGUgdXNlciBtYW51YWw6Cj4gPiAgICAgIEFuIGltcGxlbWVudGF0aW9uIG11 c3Qgc3VwcG9ydCBvbmUgb2YsIG9yIG9wdGlvbmFsbHkgYm90aCBvZiwKPiA+ICAgICAgd2lyZWQg aW50ZXJydXB0cyBhbmQgTVNJcwo+ID4gICAgICAuLi4KPiA+ICAgICAgVGhlIGRpc2NvdmVyeSBv ZiBzdXBwb3J0IGZvciB3aXJlZCBpbnRlcnJ1cHRzIGlzIElNUExFTUVOVEFUSU9OIERFRklORUQu Cj4gPiAKPiA+IFdlIGNhbiBhZGQgc29tZSBsb2dpYywgdG8gY2hlY2sgZHQvYWNwaSBpcnFzIGFu ZCB0byBjaG9vc2UgdG8gZmFsbGJhY2sKPiA+IG9yIG5vdCBiYXNlZCBvbiB0aGF0LCBidXQsIGlm IHdlIGdldCAtRU5PTUVNLCAoZXNwZWNpYWxseSBlYXJseSBhdAo+ID4gcHJvYmUpIHNvbWV0aGlu ZyByZWFsbHkgd2VudCB3cm9uZywgc28gSSBhbSBub3Qgc3VyZSBpdOKAmXMgd29ydGgKPiA+IHRo ZSBjb21wbGV4aXR5Lgo+IAo+IFRoYXQgbG9naWMgYWxyZWFkeSBleGlzdHMgaW4gYXJtX3NtbXVf c2V0dXBfdW5pcXVlX2lycXMoKSAtIHRoZSBtZXNzYWdlcwo+IGhlcmUgYXJlIGluIHRoZSBzZW5z ZSBvZiAid2UncmUgZ2l2aW5nIHVwIG9uIE1TSXMgYW5kIGZhbGxpbmcgYmFjayB0byB0cnlpbmcK PiB3aGF0ZXZlciB3aXJlZCBJUlFzIHdlIG1heSBvciBtYXkgbm90IGhhdmUuIiBUaGUgY3JpdGlj YWwgcG9pbnQgaXMgdGhhdAo+IHdlJ3JlIG5vdCB1c2luZyBNU0lzIGZvciBzb21lIHBvdGVudGlh bGx5IGFjdGlvbmFibGUgcmVhc29uLCBpLmUuIGlmIHRoZQo+IHVzZXIgZG9lcyBleHBlY3QgdGhl IHN5c3RlbSB0byBiZSBNU0ktY2FwYWJsZSwgdGhlbiBpdCBjb3VsZCBiZSBhbgo+IGluZGljYXRp b24gb2YgcGVyaGFwcyBhIHdyb25nIG9yIG1pc3NpbmcgbXNpLXBhcmVudCwgZm9yIHdoaWNoIHRo ZXkgbWF5Cj4gcHVyc3VlIGEgZmlybXdhcmUgZml4LiBJbiBvdGhlciBjYXNlcyBpdCdzIG5vcm1h bCBhbmQgZXhwZWN0ZWQgbm90IHRvIHVzZQo+IE1TSXMgdGhvdWdoIChlLmcuIHRoZSBzeXN0ZW0g anVzdCBkb2Vzbid0IGhhdmUgYW4gSVRTKSwgc28gd2UgZG9uJ3Qgd2FudCB0bwo+IGJlICp0b28q IG5vaXN5IGFib3V0IGl0LgoKVGhlIGNhc2UgSSBhbSB3b3JyaWVkIGFib3V0IGluIHRoaXMgcGF0 Y2gsIGlzIGZvciBzeXN0ZW1zIHdpdGgKTVNJcyBvbmx5LgpXaXRoIHRoaXMgcGF0Y2gsIHRoYXQg bWVhbnMsIHdlIGZhbGxiYWNrIHRvIHdpcmVkIGlycXMgd2hpY2ggZG9uJ3QKZXhpc3QsIHNvIHRo ZSBkcml2ZXIgd2lsbCBwcm9iZSB3aXRoIG5vIGludGVycnVwdHMgYXQgYWxsLCB3aGljaCBpbiBt eQpvcGluaW9uIHdvcnNlIHRoYW4gbGVha2luZyB0aGUgbWVtb3J5LgoKVGhhbmtzLApNb3N0YWZh Cj4gCj4gVGhhbmtzLAo+IFJvYmluLgo+IAo+ID4gCj4gPiA+ICAgfQo+ID4gPiAgIHN0YXRpYyB2 b2lkIGFybV9zbW11X3NldHVwX3VuaXF1ZV9pcnFzKHN0cnVjdCBhcm1fc21tdV9kZXZpY2UgKnNt bXUpCj4gPiA+IC0tIAo+ID4gPiAyLjM0LjEKPiA+ID4gCj4gPiBUaGFua3MsCj4gPiBNb3N0YWZh CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1h cm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5v cmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0t a2VybmVsCg==