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 smtp4.osuosl.org (smtp4.osuosl.org [140.211.166.137]) (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 76C72C77B7C for ; Sun, 28 May 2023 06:40:41 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id D58B941E25; Sun, 28 May 2023 06:40:40 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org D58B941E25 Authentication-Results: smtp4.osuosl.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=C3XZmk2d X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 2h1hpX-8uRpO; Sun, 28 May 2023 06:40:38 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [IPv6:2605:bc80:3010:104::8cd3:938]) by smtp4.osuosl.org (Postfix) with ESMTPS id B6F8441DA8; Sun, 28 May 2023 06:40:37 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org B6F8441DA8 Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 7A707C0036; Sun, 28 May 2023 06:40:37 +0000 (UTC) Received: from smtp1.osuosl.org (smtp1.osuosl.org [140.211.166.138]) by lists.linuxfoundation.org (Postfix) with ESMTP id 25C8BC002A for ; Sun, 28 May 2023 06:40:37 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id ED83281EF1 for ; Sun, 28 May 2023 06:40:36 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp1.osuosl.org ED83281EF1 Authentication-Results: smtp1.osuosl.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=C3XZmk2d X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp1.osuosl.org ([127.0.0.1]) by localhost (smtp1.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 2s6-HqKZaygk for ; Sun, 28 May 2023 06:40:35 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp1.osuosl.org 5B2B281EDA Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by smtp1.osuosl.org (Postfix) with ESMTPS id 5B2B281EDA for ; Sun, 28 May 2023 06:40:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1685256034; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=8QYlBHTB2cWeSDeDa6j2ExXKXJkK86ds7nWJ9n+wiYA=; b=C3XZmk2dxb+FzNor0gLqnMP5mAGTuNiCb51TXRXsLGCRkmosy32WAJqW7oVB9SguCt0VQn iXmVjTlxN8JVgLi+XH33kSBt6XoyZ6VkkmWy1xBfYM1TVS0iSxLVNVUxPDWt68ALJqcTiI wI1gbyrOcT5wxTl13lywJtrSDT0MTK8= Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-93-fnVfu8fLMLCpL83NDgchlQ-1; Sun, 28 May 2023 02:40:32 -0400 X-MC-Unique: fnVfu8fLMLCpL83NDgchlQ-1 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-3f60481749eso11961675e9.1 for ; Sat, 27 May 2023 23:40:32 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1685256031; x=1687848031; 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=8QYlBHTB2cWeSDeDa6j2ExXKXJkK86ds7nWJ9n+wiYA=; b=JfSFHeFFqTgjAZj6AVPYl9EBy3FNJOK/52WGcAK3J/93CW8CnabPO0MfSiCrz7NoFu hehFU3tLQrXcNP+exqAifr/lxG23Y7dKkQ7+/Q5NxXin3FJIVd8bL34cap+/sGNh+0Hr HL40oqW6ITXgmFLfb2PlT7S4HEWvkkB1GU48mLMJOrqdKjj02+B9jVcqRbmHBtfjznmi yzF35RIHw8BM6MASqEzDE00m3WhyqU4NWVY1OhBGcHMsPKFqLr8mx3mc6mz2UY1bQaQL D7XlEREyC8KDe28YE2pbfd5/C6PIs7lciNDMur/NM7zRiyUjSWaUev4XK1jpKi9DjoE1 nvHg== X-Gm-Message-State: AC+VfDyCTzy5Sllr2F/hslr1ruVFjbziQdLhPkEDAu6K9Gdh2Qos0wN9 uAlRtyJocEXYQBVTc3FGk7WNNhk6Way27bDpKbSWNK/+Zn9UkDiFlifXCd26prfrfTFIvqA+Xrv Q0jY2ytzrY7KalvKXQdjuafdxC4UPmDY5UbrQAIKuKg== X-Received: by 2002:a05:600c:82c5:b0:3f5:a54:9f97 with SMTP id eo5-20020a05600c82c500b003f50a549f97mr4132788wmb.0.1685256031648; Sat, 27 May 2023 23:40:31 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6carfBTFTY4poallAVBlDBPUIDVfLDD46smd64cTSCUbV8twVW3Yl6/MXRl0LYrWO0pV7R+w== X-Received: by 2002:a05:600c:82c5:b0:3f5:a54:9f97 with SMTP id eo5-20020a05600c82c500b003f50a549f97mr4132776wmb.0.1685256031258; Sat, 27 May 2023 23:40:31 -0700 (PDT) Received: from redhat.com ([2.52.146.27]) by smtp.gmail.com with ESMTPSA id u3-20020a7bc043000000b003f17848673fsm10203265wmc.27.2023.05.27.23.40.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 27 May 2023 23:40:30 -0700 (PDT) Date: Sun, 28 May 2023 02:40:27 -0400 From: "Michael S. Tsirkin" To: Liang Chen Subject: Re: [PATCH net-next 2/5] virtio_net: Add page_pool support to improve performance Message-ID: <20230528023956-mutt-send-email-mst@kernel.org> References: <20230526054621.18371-1-liangchen.linux@gmail.com> <20230526054621.18371-2-liangchen.linux@gmail.com> MIME-Version: 1.0 In-Reply-To: X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Disposition: inline Cc: xuanzhuo@linux.alibaba.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, alexander.duyck@gmail.com, virtualization@lists.linux-foundation.org, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, davem@davemloft.net X-BeenThere: virtualization@lists.linux-foundation.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Linux virtualization List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: virtualization-bounces@lists.linux-foundation.org Sender: "Virtualization" T24gU2F0LCBNYXkgMjcsIDIwMjMgYXQgMDg6MzU6MDFQTSArMDgwMCwgTGlhbmcgQ2hlbiB3cm90 ZToKPiBPbiBGcmksIE1heSAyNiwgMjAyMyBhdCAyOjUx4oCvUE0gSmFzb24gV2FuZyA8amFzb3dh bmdAcmVkaGF0LmNvbT4gd3JvdGU6Cj4gPgo+ID4gT24gRnJpLCBNYXkgMjYsIDIwMjMgYXQgMTo0 NuKAr1BNIExpYW5nIENoZW4gPGxpYW5nY2hlbi5saW51eEBnbWFpbC5jb20+IHdyb3RlOgo+ID4g Pgo+ID4gPiBUaGUgaW1wbGVtZW50YXRpb24gYXQgdGhlIG1vbWVudCB1c2VzIG9uZSBwYWdlIHBl ciBwYWNrZXQgaW4gYm90aCB0aGUKPiA+ID4gbm9ybWFsIGFuZCBYRFAgcGF0aC4KPiA+Cj4gPiBJ dCdzIGJldHRlciB0byBleHBsYWluIHdoeSB3ZSBuZWVkIGEgcGFnZSBwb29sIGFuZCBob3cgaXQg Y2FuIGhlbHAgdGhlCj4gPiBwZXJmb3JtYW5jZS4KPiA+Cj4gCj4gU3VyZSwgSSB3aWxsIGluY2x1 ZGUgdGhhdCBvbiB2Mi4KPiA+ID4gSW4gYWRkaXRpb24sIGludHJvZHVjaW5nIGEgbW9kdWxlIHBh cmFtZXRlciB0byBlbmFibGUKPiA+ID4gb3IgZGlzYWJsZSB0aGUgdXNhZ2Ugb2YgcGFnZSBwb29s IChkaXNhYmxlZCBieSBkZWZhdWx0KS4KPiA+Cj4gPiBJZiBwYWdlIHBvb2wgd2lucyBmb3IgbW9z dCBvZiB0aGUgY2FzZXMsIGFueSByZWFzb24gdG8gZGlzYWJsZSBpdCBieSBkZWZhdWx0Pwo+ID4K PiAKPiBUaGFuayB5b3UgZm9yIHJhaXNpbmcgdGhlIHBvaW50LiBJdCBkb2VzIG1ha2Ugc2Vuc2Ug dG8gZW5hYmxlIGl0IGJ5IGRlZmF1bHQuCgpJJ2QgbGlrZSB0byBzZWUgbW9yZSBiZW5jaG1hcmtz IHBscyB0aGVuLCB3aXRoIGEgdmFyaWV0eSBvZiBwYWNrZXQKc2l6ZXMsIHVkcCBhbmQgdGNwLgoK PiA+ID4KPiA+ID4gSW4gc2luZ2xlLWNvcmUgdm0gdGVzdGluZyBlbnZpcm9ubWVudHMsIGl0IGdp dmVzIGEgbW9kZXN0IHBlcmZvcm1hbmNlIGdhaW4KPiA+ID4gaW4gdGhlIG5vcm1hbCBwYXRoLgo+ ID4gPiAgIFVwc3RyZWFtIGNvZGViYXNlOiA0Ny41IEdiaXRzL3NlYwo+ID4gPiAgIFVwc3RyZWFt IGNvZGViYXNlICsgcGFnZV9wb29sIHN1cHBvcnQ6IDUwLjIgR2JpdHMvc2VjCj4gPiA+Cj4gPiA+ IEluIG11bHRpLWNvcmUgdm0gdGVzdGluZyBlbnZpcm9ubWVudHMsIFRoZSBtb3N0IHNpZ25pZmlj YW50IHBlcmZvcm1hbmNlCj4gPiA+IGdhaW4gaXMgb2JzZXJ2ZWQgaW4gWERQIGNwdW1hcDoKPiA+ ID4gICBVcHN0cmVhbSBjb2RlYmFzZTogMS4zOCBHYml0cy9zZWMKPiA+ID4gICBVcHN0cmVhbSBj b2RlYmFzZSArIHBhZ2VfcG9vbCBzdXBwb3J0OiA5Ljc0IEdiaXRzL3NlYwo+ID4KPiA+IFBsZWFz ZSBzaG93IG1vcmUgZGV0YWlscyBvbiB0aGUgdGVzdC4gRS5nIHdoaWNoIGtpbmRzIG9mIHRlc3Rz IGhhdmUKPiA+IHlvdSBtZWFzdXJlZD8KPiA+Cj4gPiBCdHcsIGl0IHdvdWxkIGJlIGJldHRlciB0 byBtZWFzdXJlIFBQUyBhcyB3ZWxsLgo+ID4KPiAKPiBTdXJlLiBJdCB3aWxsIGJlIGFkZGVkIG9u IHYyLgo+ID4gPgo+ID4gPiBXaXRoIHRoaXMgZm91bmRhdGlvbiwgd2UgY2FuIGZ1cnRoZXIgaW50 ZWdyYXRlIHBhZ2UgcG9vbCBmcmFnbWVudGF0aW9uIGFuZAo+ID4gPiBETUEgbWFwL3VubWFwIHN1 cHBvcnQuCj4gPiA+Cj4gPiA+IFNpZ25lZC1vZmYtYnk6IExpYW5nIENoZW4gPGxpYW5nY2hlbi5s aW51eEBnbWFpbC5jb20+Cj4gPiA+IC0tLQo+ID4gPiAgZHJpdmVycy9uZXQvdmlydGlvX25ldC5j IHwgMTg4ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0tLS0tLQo+ID4KPiA+IEkg YmVsaWV2ZSB3ZSBzaG91bGQgbWFrZSB2aXJ0aW8tbmV0IHRvIHNlbGVjdCBDT05GSUdfUEFHRV9Q T09MIG9yIGRvCj4gPiB0aGUgaWZkZWYgdHJpY2tzIGF0IGxlYXN0Lgo+ID4KPiAKPiBTdXJlLiBp dCB3aWxsIGJlIGRvbmUgb24gdjIuCj4gPiA+ICAxIGZpbGUgY2hhbmdlZCwgMTQ2IGluc2VydGlv bnMoKyksIDQyIGRlbGV0aW9ucygtKQo+ID4gPgo+ID4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9u ZXQvdmlydGlvX25ldC5jIGIvZHJpdmVycy9uZXQvdmlydGlvX25ldC5jCj4gPiA+IGluZGV4IGM1 ZGNhMGQ5MmU2NC4uOTljMGNhMGMxNzgxIDEwMDY0NAo+ID4gPiAtLS0gYS9kcml2ZXJzL25ldC92 aXJ0aW9fbmV0LmMKPiA+ID4gKysrIGIvZHJpdmVycy9uZXQvdmlydGlvX25ldC5jCj4gPiA+IEBA IC0zMSw2ICszMSw5IEBAIG1vZHVsZV9wYXJhbShjc3VtLCBib29sLCAwNDQ0KTsKPiA+ID4gIG1v ZHVsZV9wYXJhbShnc28sIGJvb2wsIDA0NDQpOwo+ID4gPiAgbW9kdWxlX3BhcmFtKG5hcGlfdHgs IGJvb2wsIDA2NDQpOwo+ID4gPgo+ID4gPiArc3RhdGljIGJvb2wgcGFnZV9wb29sX2VuYWJsZWQ7 Cj4gPiA+ICttb2R1bGVfcGFyYW0ocGFnZV9wb29sX2VuYWJsZWQsIGJvb2wsIDA0MDApOwo+ID4g PiArCj4gPiA+ICAvKiBGSVhNRTogTVRVIGluIGNvbmZpZy4gKi8KPiA+ID4gICNkZWZpbmUgR09P RF9QQUNLRVRfTEVOIChFVEhfSExFTiArIFZMQU5fSExFTiArIEVUSF9EQVRBX0xFTikKPiA+ID4g ICNkZWZpbmUgR09PRF9DT1BZX0xFTiAgMTI4Cj4gPiA+IEBAIC0xNTksNiArMTYyLDkgQEAgc3Ry dWN0IHJlY2VpdmVfcXVldWUgewo+ID4gPiAgICAgICAgIC8qIENoYWluIHBhZ2VzIGJ5IHRoZSBw cml2YXRlIHB0ci4gKi8KPiA+ID4gICAgICAgICBzdHJ1Y3QgcGFnZSAqcGFnZXM7Cj4gPiA+Cj4g PiA+ICsgICAgICAgLyogUGFnZSBwb29sICovCj4gPiA+ICsgICAgICAgc3RydWN0IHBhZ2VfcG9v bCAqcGFnZV9wb29sOwo+ID4gPiArCj4gPiA+ICAgICAgICAgLyogQXZlcmFnZSBwYWNrZXQgbGVu Z3RoIGZvciBtZXJnZWFibGUgcmVjZWl2ZSBidWZmZXJzLiAqLwo+ID4gPiAgICAgICAgIHN0cnVj dCBld21hX3BrdF9sZW4gbXJnX2F2Z19wa3RfbGVuOwo+ID4gPgo+ID4gPiBAQCAtNDU5LDYgKzQ2 NSwxNCBAQCBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnZpcnRuZXRfYnVpbGRfc2tiKHZvaWQgKmJ1 ZiwgdW5zaWduZWQgaW50IGJ1ZmxlbiwKPiA+ID4gICAgICAgICByZXR1cm4gc2tiOwo+ID4gPiAg fQo+ID4gPgo+ID4gPiArc3RhdGljIHZvaWQgdmlydG5ldF9wdXRfcGFnZShzdHJ1Y3QgcmVjZWl2 ZV9xdWV1ZSAqcnEsIHN0cnVjdCBwYWdlICpwYWdlKQo+ID4gPiArewo+ID4gPiArICAgICAgIGlm IChycS0+cGFnZV9wb29sKQo+ID4gPiArICAgICAgICAgICAgICAgcGFnZV9wb29sX3B1dF9mdWxs X3BhZ2UocnEtPnBhZ2VfcG9vbCwgcGFnZSwgdHJ1ZSk7Cj4gPiA+ICsgICAgICAgZWxzZQo+ID4g PiArICAgICAgICAgICAgICAgcHV0X3BhZ2UocGFnZSk7Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4g IC8qIENhbGxlZCBmcm9tIGJvdHRvbSBoYWxmIGNvbnRleHQgKi8KPiA+ID4gIHN0YXRpYyBzdHJ1 Y3Qgc2tfYnVmZiAqcGFnZV90b19za2Ioc3RydWN0IHZpcnRuZXRfaW5mbyAqdmksCj4gPiA+ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJlY2VpdmVfcXVldWUgKnJx LAo+ID4gPiBAQCAtNTU1LDcgKzU2OSw3IEBAIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqcGFnZV90 b19za2Ioc3RydWN0IHZpcnRuZXRfaW5mbyAqdmksCj4gPiA+ICAgICAgICAgaGRyID0gc2tiX3Zu ZXRfaGRyKHNrYik7Cj4gPiA+ICAgICAgICAgbWVtY3B5KGhkciwgaGRyX3AsIGhkcl9sZW4pOwo+ ID4gPiAgICAgICAgIGlmIChwYWdlX3RvX2ZyZWUpCj4gPiA+IC0gICAgICAgICAgICAgICBwdXRf cGFnZShwYWdlX3RvX2ZyZWUpOwo+ID4gPiArICAgICAgICAgICAgICAgdmlydG5ldF9wdXRfcGFn ZShycSwgcGFnZV90b19mcmVlKTsKPiA+ID4KPiA+ID4gICAgICAgICByZXR1cm4gc2tiOwo+ID4g PiAgfQo+ID4gPiBAQCAtODAyLDcgKzgxNiw3IEBAIHN0YXRpYyBpbnQgdmlydG5ldF94ZHBfeG1p dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAo+ID4gPiAgICAgICAgIHJldHVybiByZXQ7Cj4gPiA+ ICB9Cj4gPiA+Cj4gPiA+IC1zdGF0aWMgdm9pZCBwdXRfeGRwX2ZyYWdzKHN0cnVjdCB4ZHBfYnVm ZiAqeGRwKQo+ID4gPiArc3RhdGljIHZvaWQgcHV0X3hkcF9mcmFncyhzdHJ1Y3QgeGRwX2J1ZmYg KnhkcCwgc3RydWN0IHJlY2VpdmVfcXVldWUgKnJxKQo+ID4gPiAgewo+ID4KPiA+IHJxIGNvdWxk IGJlIGZldGNoZWQgZnJvbSB4ZHBfcnhxX2luZm8/Cj4gCj4gWWVhaCwgaXQgaGFzIHRoZSBxdWV1 ZV9pbmRleCB0aGVyZS4KPiA+Cj4gPiA+ICAgICAgICAgc3RydWN0IHNrYl9zaGFyZWRfaW5mbyAq c2hpbmZvOwo+ID4gPiAgICAgICAgIHN0cnVjdCBwYWdlICp4ZHBfcGFnZTsKPiA+ID4gQEAgLTgx Miw3ICs4MjYsNyBAQCBzdGF0aWMgdm9pZCBwdXRfeGRwX2ZyYWdzKHN0cnVjdCB4ZHBfYnVmZiAq eGRwKQo+ID4gPiAgICAgICAgICAgICAgICAgc2hpbmZvID0geGRwX2dldF9zaGFyZWRfaW5mb19m cm9tX2J1ZmYoeGRwKTsKPiA+ID4gICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaGlu Zm8tPm5yX2ZyYWdzOyBpKyspIHsKPiA+ID4gICAgICAgICAgICAgICAgICAgICAgICAgeGRwX3Bh Z2UgPSBza2JfZnJhZ19wYWdlKCZzaGluZm8tPmZyYWdzW2ldKTsKPiA+ID4gLSAgICAgICAgICAg ICAgICAgICAgICAgcHV0X3BhZ2UoeGRwX3BhZ2UpOwo+ID4gPiArICAgICAgICAgICAgICAgICAg ICAgICB2aXJ0bmV0X3B1dF9wYWdlKHJxLCB4ZHBfcGFnZSk7Cj4gPiA+ICAgICAgICAgICAgICAg ICB9Cj4gPiA+ICAgICAgICAgfQo+ID4gPiAgfQo+ID4gPiBAQCAtOTAzLDcgKzkxNywxMSBAQCBz dGF0aWMgc3RydWN0IHBhZ2UgKnhkcF9saW5lYXJpemVfcGFnZShzdHJ1Y3QgcmVjZWl2ZV9xdWV1 ZSAqcnEsCj4gPiA+ICAgICAgICAgaWYgKHBhZ2Vfb2ZmICsgKmxlbiArIHRhaWxyb29tID4gUEFH RV9TSVpFKQo+ID4gPiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Cj4gPiA+Cj4gPiA+IC0g ICAgICAgcGFnZSA9IGFsbG9jX3BhZ2UoR0ZQX0FUT01JQyk7Cj4gPiA+ICsgICAgICAgaWYgKHJx LT5wYWdlX3Bvb2wpCj4gPiA+ICsgICAgICAgICAgICAgICBwYWdlID0gcGFnZV9wb29sX2Rldl9h bGxvY19wYWdlcyhycS0+cGFnZV9wb29sKTsKPiA+ID4gKyAgICAgICBlbHNlCj4gPiA+ICsgICAg ICAgICAgICAgICBwYWdlID0gYWxsb2NfcGFnZShHRlBfQVRPTUlDKTsKPiA+ID4gKwo+ID4gPiAg ICAgICAgIGlmICghcGFnZSkKPiA+ID4gICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwo+ID4g Pgo+ID4gPiBAQCAtOTI2LDIxICs5NDQsMjQgQEAgc3RhdGljIHN0cnVjdCBwYWdlICp4ZHBfbGlu ZWFyaXplX3BhZ2Uoc3RydWN0IHJlY2VpdmVfcXVldWUgKnJxLAo+ID4gPiAgICAgICAgICAgICAg ICAgICogaXMgc2VuZGluZyBwYWNrZXQgbGFyZ2VyIHRoYW4gdGhlIE1UVS4KPiA+ID4gICAgICAg ICAgICAgICAgICAqLwo+ID4gPiAgICAgICAgICAgICAgICAgaWYgKChwYWdlX29mZiArIGJ1Zmxl biArIHRhaWxyb29tKSA+IFBBR0VfU0laRSkgewo+ID4gPiAtICAgICAgICAgICAgICAgICAgICAg ICBwdXRfcGFnZShwKTsKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgdmlydG5ldF9wdXRf cGFnZShycSwgcCk7Cj4gPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyX2J1ZjsK PiA+ID4gICAgICAgICAgICAgICAgIH0KPiA+ID4KPiA+ID4gICAgICAgICAgICAgICAgIG1lbWNw eShwYWdlX2FkZHJlc3MocGFnZSkgKyBwYWdlX29mZiwKPiA+ID4gICAgICAgICAgICAgICAgICAg ICAgICBwYWdlX2FkZHJlc3MocCkgKyBvZmYsIGJ1Zmxlbik7Cj4gPiA+ICAgICAgICAgICAgICAg ICBwYWdlX29mZiArPSBidWZsZW47Cj4gPiA+IC0gICAgICAgICAgICAgICBwdXRfcGFnZShwKTsK PiA+ID4gKyAgICAgICAgICAgICAgIHZpcnRuZXRfcHV0X3BhZ2UocnEsIHApOwo+ID4gPiAgICAg ICAgIH0KPiA+ID4KPiA+ID4gICAgICAgICAvKiBIZWFkcm9vbSBkb2VzIG5vdCBjb250cmlidXRl IHRvIHBhY2tldCBsZW5ndGggKi8KPiA+ID4gICAgICAgICAqbGVuID0gcGFnZV9vZmYgLSBWSVJU SU9fWERQX0hFQURST09NOwo+ID4gPiAgICAgICAgIHJldHVybiBwYWdlOwo+ID4gPiAgZXJyX2J1 ZjoKPiA+ID4gLSAgICAgICBfX2ZyZWVfcGFnZXMocGFnZSwgMCk7Cj4gPiA+ICsgICAgICAgaWYg KHJxLT5wYWdlX3Bvb2wpCj4gPiA+ICsgICAgICAgICAgICAgICBwYWdlX3Bvb2xfcHV0X2Z1bGxf cGFnZShycS0+cGFnZV9wb29sLCBwYWdlLCB0cnVlKTsKPiA+ID4gKyAgICAgICBlbHNlCj4gPiA+ ICsgICAgICAgICAgICAgICBfX2ZyZWVfcGFnZXMocGFnZSwgMCk7Cj4gPiA+ICAgICAgICAgcmV0 dXJuIE5VTEw7Cj4gPiA+ICB9Cj4gPiA+Cj4gPiA+IEBAIC0xMTQ0LDcgKzExNjUsNyBAQCBzdGF0 aWMgdm9pZCBtZXJnZWFibGVfYnVmX2ZyZWUoc3RydWN0IHJlY2VpdmVfcXVldWUgKnJxLCBpbnQg bnVtX2J1ZiwKPiA+ID4gICAgICAgICAgICAgICAgIH0KPiA+ID4gICAgICAgICAgICAgICAgIHN0 YXRzLT5ieXRlcyArPSBsZW47Cj4gPiA+ICAgICAgICAgICAgICAgICBwYWdlID0gdmlydF90b19o ZWFkX3BhZ2UoYnVmKTsKPiA+ID4gLSAgICAgICAgICAgICAgIHB1dF9wYWdlKHBhZ2UpOwo+ID4g PiArICAgICAgICAgICAgICAgdmlydG5ldF9wdXRfcGFnZShycSwgcGFnZSk7Cj4gPiA+ICAgICAg ICAgfQo+ID4gPiAgfQo+ID4gPgo+ID4gPiBAQCAtMTI2NCw3ICsxMjg1LDcgQEAgc3RhdGljIGlu dCB2aXJ0bmV0X2J1aWxkX3hkcF9idWZmX21yZyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAo+ID4g PiAgICAgICAgICAgICAgICAgY3VyX2ZyYWdfc2l6ZSA9IHRydWVzaXplOwo+ID4gPiAgICAgICAg ICAgICAgICAgeGRwX2ZyYWdzX3RydWVzeiArPSBjdXJfZnJhZ19zaXplOwo+ID4gPiAgICAgICAg ICAgICAgICAgaWYgKHVubGlrZWx5KGxlbiA+IHRydWVzaXplIC0gcm9vbSB8fCBjdXJfZnJhZ19z aXplID4gUEFHRV9TSVpFKSkgewo+ID4gPiAtICAgICAgICAgICAgICAgICAgICAgICBwdXRfcGFn ZShwYWdlKTsKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgdmlydG5ldF9wdXRfcGFnZShy cSwgcGFnZSk7Cj4gPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIHByX2RlYnVnKCIlczogcngg ZXJyb3I6IGxlbiAldSBleGNlZWRzIHRydWVzaXplICVsdVxuIiwKPiA+ID4gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgZGV2LT5uYW1lLCBsZW4sICh1bnNpZ25lZCBsb25nKSh0cnVl c2l6ZSAtIHJvb20pKTsKPiA+ID4gICAgICAgICAgICAgICAgICAgICAgICAgZGV2LT5zdGF0cy5y eF9sZW5ndGhfZXJyb3JzKys7Cj4gPiA+IEBAIC0xMjgzLDcgKzEzMDQsNyBAQCBzdGF0aWMgaW50 IHZpcnRuZXRfYnVpbGRfeGRwX2J1ZmZfbXJnKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCj4gPiA+ ICAgICAgICAgcmV0dXJuIDA7Cj4gPiA+Cj4gPiA+ICBlcnI6Cj4gPiA+IC0gICAgICAgcHV0X3hk cF9mcmFncyh4ZHApOwo+ID4gPiArICAgICAgIHB1dF94ZHBfZnJhZ3MoeGRwLCBycSk7Cj4gPiA+ ICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4gPiA+ICB9Cj4gPiA+Cj4gPiA+IEBAIC0xMzQ0LDcg KzEzNjUsMTAgQEAgc3RhdGljIHZvaWQgKm1lcmdlYWJsZV94ZHBfZ2V0X2J1ZihzdHJ1Y3Qgdmly dG5ldF9pbmZvICp2aSwKPiA+ID4gICAgICAgICAgICAgICAgIGlmICgqbGVuICsgeGRwX3Jvb20g PiBQQUdFX1NJWkUpCj4gPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwo+ ID4gPgo+ID4gPiAtICAgICAgICAgICAgICAgeGRwX3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9BVE9N SUMpOwo+ID4gPiArICAgICAgICAgICAgICAgaWYgKHJxLT5wYWdlX3Bvb2wpCj4gPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgIHhkcF9wYWdlID0gcGFnZV9wb29sX2Rldl9hbGxvY19wYWdlcyhy cS0+cGFnZV9wb29sKTsKPiA+ID4gKyAgICAgICAgICAgICAgIGVsc2UKPiA+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgeGRwX3BhZ2UgPSBhbGxvY19wYWdlKEdGUF9BVE9NSUMpOwo+ID4gPiAg ICAgICAgICAgICAgICAgaWYgKCF4ZHBfcGFnZSkKPiA+ID4gICAgICAgICAgICAgICAgICAgICAg ICAgcmV0dXJuIE5VTEw7Cj4gPiA+Cj4gPiA+IEBAIC0xMzU0LDcgKzEzNzgsNyBAQCBzdGF0aWMg dm9pZCAqbWVyZ2VhYmxlX3hkcF9nZXRfYnVmKHN0cnVjdCB2aXJ0bmV0X2luZm8gKnZpLAo+ID4g Pgo+ID4gPiAgICAgICAgICpmcmFtZV9zeiA9IFBBR0VfU0laRTsKPiA+ID4KPiA+ID4gLSAgICAg ICBwdXRfcGFnZSgqcGFnZSk7Cj4gPiA+ICsgICAgICAgdmlydG5ldF9wdXRfcGFnZShycSwgKnBh Z2UpOwo+ID4gPgo+ID4gPiAgICAgICAgICpwYWdlID0geGRwX3BhZ2U7Cj4gPiA+Cj4gPiA+IEBA IC0xNDAwLDYgKzE0MjQsOCBAQCBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnJlY2VpdmVfbWVyZ2Vh YmxlX3hkcChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAo+ID4gPiAgICAgICAgICAgICAgICAgaGVh ZF9za2IgPSBidWlsZF9za2JfZnJvbV94ZHBfYnVmZihkZXYsIHZpLCAmeGRwLCB4ZHBfZnJhZ3Nf dHJ1ZXN6KTsKPiA+ID4gICAgICAgICAgICAgICAgIGlmICh1bmxpa2VseSghaGVhZF9za2IpKQo+ ID4gPiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKPiA+ID4gKyAgICAgICAgICAgICAg IGlmIChycS0+cGFnZV9wb29sKQo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICBza2JfbWFy a19mb3JfcmVjeWNsZShoZWFkX3NrYik7Cj4gPiA+ICAgICAgICAgICAgICAgICByZXR1cm4gaGVh ZF9za2I7Cj4gPiA+Cj4gPiA+ICAgICAgICAgY2FzZSBYRFBfVFg6Cj4gPiA+IEBAIC0xNDEwLDEw ICsxNDM2LDEwIEBAIHN0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAqcmVjZWl2ZV9tZXJnZWFibGVfeGRw KHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCj4gPiA+ICAgICAgICAgICAgICAgICBicmVhazsKPiA+ ID4gICAgICAgICB9Cj4gPiA+Cj4gPiA+IC0gICAgICAgcHV0X3hkcF9mcmFncygmeGRwKTsKPiA+ ID4gKyAgICAgICBwdXRfeGRwX2ZyYWdzKCZ4ZHAsIHJxKTsKPiA+ID4KPiA+ID4gIGVycl94ZHA6 Cj4gPiA+IC0gICAgICAgcHV0X3BhZ2UocGFnZSk7Cj4gPiA+ICsgICAgICAgdmlydG5ldF9wdXRf cGFnZShycSwgcGFnZSk7Cj4gPiA+ICAgICAgICAgbWVyZ2VhYmxlX2J1Zl9mcmVlKHJxLCBudW1f YnVmLCBkZXYsIHN0YXRzKTsKPiA+ID4KPiA+ID4gICAgICAgICBzdGF0cy0+eGRwX2Ryb3BzKys7 Cj4gPiA+IEBAIC0xNDY3LDYgKzE0OTMsOSBAQCBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnJlY2Vp dmVfbWVyZ2VhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCj4gPiA+ICAgICAgICAgaGVhZF9z a2IgPSBwYWdlX3RvX3NrYih2aSwgcnEsIHBhZ2UsIG9mZnNldCwgbGVuLCB0cnVlc2l6ZSwgaGVh ZHJvb20pOwo+ID4gPiAgICAgICAgIGN1cnJfc2tiID0gaGVhZF9za2I7Cj4gPiA+Cj4gPiA+ICsg ICAgICAgaWYgKHJxLT5wYWdlX3Bvb2wpCj4gPiA+ICsgICAgICAgICAgICAgICBza2JfbWFya19m b3JfcmVjeWNsZShjdXJyX3NrYik7Cj4gPiA+ICsKPiA+ID4gICAgICAgICBpZiAodW5saWtlbHko IWN1cnJfc2tiKSkKPiA+ID4gICAgICAgICAgICAgICAgIGdvdG8gZXJyX3NrYjsKPiA+ID4gICAg ICAgICB3aGlsZSAoLS1udW1fYnVmKSB7Cj4gPiA+IEBAIC0xNTA5LDYgKzE1MzgsOCBAQCBzdGF0 aWMgc3RydWN0IHNrX2J1ZmYgKnJlY2VpdmVfbWVyZ2VhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpk ZXYsCj4gPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJfc2tiID0gbnNrYjsKPiA+ID4g ICAgICAgICAgICAgICAgICAgICAgICAgaGVhZF9za2ItPnRydWVzaXplICs9IG5za2ItPnRydWVz aXplOwo+ID4gPiAgICAgICAgICAgICAgICAgICAgICAgICBudW1fc2tiX2ZyYWdzID0gMDsKPiA+ ID4gKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJxLT5wYWdlX3Bvb2wpCj4gPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tiX21hcmtfZm9yX3JlY3ljbGUoY3Vycl9za2Ip Owo+ID4gPiAgICAgICAgICAgICAgICAgfQo+ID4gPiAgICAgICAgICAgICAgICAgaWYgKGN1cnJf c2tiICE9IGhlYWRfc2tiKSB7Cj4gPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRfc2ti LT5kYXRhX2xlbiArPSBsZW47Cj4gPiA+IEBAIC0xNTE3LDcgKzE1NDgsNyBAQCBzdGF0aWMgc3Ry dWN0IHNrX2J1ZmYgKnJlY2VpdmVfbWVyZ2VhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCj4g PiA+ICAgICAgICAgICAgICAgICB9Cj4gPiA+ICAgICAgICAgICAgICAgICBvZmZzZXQgPSBidWYg LSBwYWdlX2FkZHJlc3MocGFnZSk7Cj4gPiA+ICAgICAgICAgICAgICAgICBpZiAoc2tiX2Nhbl9j b2FsZXNjZShjdXJyX3NrYiwgbnVtX3NrYl9mcmFncywgcGFnZSwgb2Zmc2V0KSkgewo+ID4gPiAt ICAgICAgICAgICAgICAgICAgICAgICBwdXRfcGFnZShwYWdlKTsKPiA+ID4gKyAgICAgICAgICAg ICAgICAgICAgICAgdmlydG5ldF9wdXRfcGFnZShycSwgcGFnZSk7Cj4gPgo+ID4gSSB3b25kZXIg d2h5IG5vdCB3ZSBjYW4ndCBkbyB0aGlzIGR1cmluZyBidWZmZXIgYWxsb2NhdGlvbiBsaWtlIG90 aGVyIGRyaXZlcnM/Cj4gPgo+IAo+IFNvcnJ5LCBJIGRvbid0IHF1aXRlIHVuZGVyc3RhbmQgdGhl IHBvaW50IGhlcmUuIFdvdWxkIHlvdSBwbGVhc2UKPiBlbGFib3JhdGUgYSBiaXQgbW9yZT8KPiA+ ID4gICAgICAgICAgICAgICAgICAgICAgICAgc2tiX2NvYWxlc2NlX3J4X2ZyYWcoY3Vycl9za2Is IG51bV9za2JfZnJhZ3MgLSAxLAo+ID4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBsZW4sIHRydWVzaXplKTsKPiA+ID4gICAgICAgICAgICAgICAgIH0gZWxz ZSB7Cj4gPiA+IEBAIC0xNTMwLDcgKzE1NjEsNyBAQCBzdGF0aWMgc3RydWN0IHNrX2J1ZmYgKnJl Y2VpdmVfbWVyZ2VhYmxlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsCj4gPiA+ICAgICAgICAgcmV0 dXJuIGhlYWRfc2tiOwo+ID4gPgo+ID4gPiAgZXJyX3NrYjoKPiA+ID4gLSAgICAgICBwdXRfcGFn ZShwYWdlKTsKPiA+ID4gKyAgICAgICB2aXJ0bmV0X3B1dF9wYWdlKHJxLCBwYWdlKTsKPiA+ID4g ICAgICAgICBtZXJnZWFibGVfYnVmX2ZyZWUocnEsIG51bV9idWYsIGRldiwgc3RhdHMpOwo+ID4g Pgo+ID4gPiAgZXJyX2J1ZjoKPiA+ID4gQEAgLTE3MzcsMzEgKzE3NjgsNDAgQEAgc3RhdGljIGlu dCBhZGRfcmVjdmJ1Zl9tZXJnZWFibGUoc3RydWN0IHZpcnRuZXRfaW5mbyAqdmksCj4gPiA+ICAg ICAgICAgICogZGlzYWJsZWQgR1NPIGZvciBYRFAsIGl0IHdvbid0IGJlIGEgYmlnIGlzc3VlLgo+ ID4gPiAgICAgICAgICAqLwo+ID4gPiAgICAgICAgIGxlbiA9IGdldF9tZXJnZWFibGVfYnVmX2xl bihycSwgJnJxLT5tcmdfYXZnX3BrdF9sZW4sIHJvb20pOwo+ID4gPiAtICAgICAgIGlmICh1bmxp a2VseSghc2tiX3BhZ2VfZnJhZ19yZWZpbGwobGVuICsgcm9vbSwgYWxsb2NfZnJhZywgZ2ZwKSkp Cj4gPiA+IC0gICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKPiA+ID4gKyAgICAgICBpZiAo cnEtPnBhZ2VfcG9vbCkgewo+ID4gPiArICAgICAgICAgICAgICAgc3RydWN0IHBhZ2UgKnBhZ2U7 Cj4gPiA+Cj4gPiA+IC0gICAgICAgYnVmID0gKGNoYXIgKilwYWdlX2FkZHJlc3MoYWxsb2NfZnJh Zy0+cGFnZSkgKyBhbGxvY19mcmFnLT5vZmZzZXQ7Cj4gPiA+IC0gICAgICAgYnVmICs9IGhlYWRy b29tOyAvKiBhZHZhbmNlIGFkZHJlc3MgbGVhdmluZyBob2xlIGF0IGZyb250IG9mIHBrdCAqLwo+ ID4gPiAtICAgICAgIGdldF9wYWdlKGFsbG9jX2ZyYWctPnBhZ2UpOwo+ID4gPiAtICAgICAgIGFs bG9jX2ZyYWctPm9mZnNldCArPSBsZW4gKyByb29tOwo+ID4gPiAtICAgICAgIGhvbGUgPSBhbGxv Y19mcmFnLT5zaXplIC0gYWxsb2NfZnJhZy0+b2Zmc2V0Owo+ID4gPiAtICAgICAgIGlmIChob2xl IDwgbGVuICsgcm9vbSkgewo+ID4gPiAtICAgICAgICAgICAgICAgLyogVG8gYXZvaWQgaW50ZXJu YWwgZnJhZ21lbnRhdGlvbiwgaWYgdGhlcmUgaXMgdmVyeSBsaWtlbHkgbm90Cj4gPiA+IC0gICAg ICAgICAgICAgICAgKiBlbm91Z2ggc3BhY2UgZm9yIGFub3RoZXIgYnVmZmVyLCBhZGQgdGhlIHJl bWFpbmluZyBzcGFjZSB0bwo+ID4gPiAtICAgICAgICAgICAgICAgICogdGhlIGN1cnJlbnQgYnVm ZmVyLgo+ID4gPiAtICAgICAgICAgICAgICAgICogWERQIGNvcmUgYXNzdW1lcyB0aGF0IGZyYW1l X3NpemUgb2YgeGRwX2J1ZmYgYW5kIHRoZSBsZW5ndGgKPiA+ID4gLSAgICAgICAgICAgICAgICAq IG9mIHRoZSBmcmFnIGFyZSBQQUdFX1NJWkUsIHNvIHdlIGRpc2FibGUgdGhlIGhvbGUgbWVjaGFu aXNtLgo+ID4gPiAtICAgICAgICAgICAgICAgICovCj4gPiA+IC0gICAgICAgICAgICAgICBpZiAo IWhlYWRyb29tKQo+ID4gPiAtICAgICAgICAgICAgICAgICAgICAgICBsZW4gKz0gaG9sZTsKPiA+ ID4gLSAgICAgICAgICAgICAgIGFsbG9jX2ZyYWctPm9mZnNldCArPSBob2xlOwo+ID4gPiAtICAg ICAgIH0KPiA+ID4gKyAgICAgICAgICAgICAgIHBhZ2UgPSBwYWdlX3Bvb2xfZGV2X2FsbG9jX3Bh Z2VzKHJxLT5wYWdlX3Bvb2wpOwo+ID4gPiArICAgICAgICAgICAgICAgaWYgKHVubGlrZWx5KCFw YWdlKSkKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07Cj4gPiA+ ICsgICAgICAgICAgICAgICBidWYgPSAoY2hhciAqKXBhZ2VfYWRkcmVzcyhwYWdlKTsKPiA+ID4g KyAgICAgICAgICAgICAgIGJ1ZiArPSBoZWFkcm9vbTsgLyogYWR2YW5jZSBhZGRyZXNzIGxlYXZp bmcgaG9sZSBhdCBmcm9udCBvZiBwa3QgKi8KPiA+ID4gKyAgICAgICB9IGVsc2Ugewo+ID4gPiAr ICAgICAgICAgICAgICAgaWYgKHVubGlrZWx5KCFza2JfcGFnZV9mcmFnX3JlZmlsbChsZW4gKyBy b29tLCBhbGxvY19mcmFnLCBnZnApKSkKPiA+Cj4gPiBXaHkgbm90IHNpbXBseSB1c2UgYSBoZWxw ZXIgbGlrZSB2aXJ0bmV0X3BhZ2VfZnJhZ19yZWZpbGwoKSBhbmQgYWRkCj4gPiB0aGUgcGFnZV9w b29sIGFsbG9jYXRpb24gbG9naWMgdGhlcmU/IEl0IGhlbHBzIHRvIHJlZHVjZSB0aGUKPiA+IGNo YW5nZXNldC4KPiA+Cj4gCj4gU3VyZS4gV2lsbCBkbyB0aGF0IG9uIHYyLgo+ID4gPiArICAgICAg ICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKPiA+ID4KPiA+ID4gKyAgICAgICAgICAg ICAgIGJ1ZiA9IChjaGFyICopcGFnZV9hZGRyZXNzKGFsbG9jX2ZyYWctPnBhZ2UpICsgYWxsb2Nf ZnJhZy0+b2Zmc2V0Owo+ID4gPiArICAgICAgICAgICAgICAgYnVmICs9IGhlYWRyb29tOyAvKiBh ZHZhbmNlIGFkZHJlc3MgbGVhdmluZyBob2xlIGF0IGZyb250IG9mIHBrdCAqLwo+ID4gPiArICAg ICAgICAgICAgICAgZ2V0X3BhZ2UoYWxsb2NfZnJhZy0+cGFnZSk7Cj4gPiA+ICsgICAgICAgICAg ICAgICBhbGxvY19mcmFnLT5vZmZzZXQgKz0gbGVuICsgcm9vbTsKPiA+ID4gKyAgICAgICAgICAg ICAgIGhvbGUgPSBhbGxvY19mcmFnLT5zaXplIC0gYWxsb2NfZnJhZy0+b2Zmc2V0Owo+ID4gPiAr ICAgICAgICAgICAgICAgaWYgKGhvbGUgPCBsZW4gKyByb29tKSB7Cj4gPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgIC8qIFRvIGF2b2lkIGludGVybmFsIGZyYWdtZW50YXRpb24sIGlmIHRoZXJl IGlzIHZlcnkgbGlrZWx5IG5vdAo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgKiBlbm91 Z2ggc3BhY2UgZm9yIGFub3RoZXIgYnVmZmVyLCBhZGQgdGhlIHJlbWFpbmluZyBzcGFjZSB0bwo+ ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgY3VycmVudCBidWZmZXIuCj4gPiA+ ICsgICAgICAgICAgICAgICAgICAgICAgICAqIFhEUCBjb3JlIGFzc3VtZXMgdGhhdCBmcmFtZV9z aXplIG9mIHhkcF9idWZmIGFuZCB0aGUgbGVuZ3RoCj4gPiA+ICsgICAgICAgICAgICAgICAgICAg ICAgICAqIG9mIHRoZSBmcmFnIGFyZSBQQUdFX1NJWkUsIHNvIHdlIGRpc2FibGUgdGhlIGhvbGUg bWVjaGFuaXNtLgo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgKi8KPiA+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgaWYgKCFoZWFkcm9vbSkKPiA+ID4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBsZW4gKz0gaG9sZTsKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg YWxsb2NfZnJhZy0+b2Zmc2V0ICs9IGhvbGU7Cj4gPiA+ICsgICAgICAgICAgICAgICB9Cj4gPiA+ ICsgICAgICAgfQo+ID4gPiAgICAgICAgIHNnX2luaXRfb25lKHJxLT5zZywgYnVmLCBsZW4pOwo+ ID4gPiAgICAgICAgIGN0eCA9IG1lcmdlYWJsZV9sZW5fdG9fY3R4KGxlbiArIHJvb20sIGhlYWRy b29tKTsKPiA+ID4gICAgICAgICBlcnIgPSB2aXJ0cXVldWVfYWRkX2luYnVmX2N0eChycS0+dnEs IHJxLT5zZywgMSwgYnVmLCBjdHgsIGdmcCk7Cj4gPiA+ICAgICAgICAgaWYgKGVyciA8IDApCj4g PiA+IC0gICAgICAgICAgICAgICBwdXRfcGFnZSh2aXJ0X3RvX2hlYWRfcGFnZShidWYpKTsKPiA+ ID4gKyAgICAgICAgICAgICAgIHZpcnRuZXRfcHV0X3BhZ2UocnEsIHZpcnRfdG9faGVhZF9wYWdl KGJ1ZikpOwo+ID4gPgo+ID4gPiAgICAgICAgIHJldHVybiBlcnI7Cj4gPiA+ICB9Cj4gPiA+IEBA IC0xOTk0LDggKzIwMzQsMTUgQEAgc3RhdGljIGludCB2aXJ0bmV0X2VuYWJsZV9xdWV1ZV9wYWly KHN0cnVjdCB2aXJ0bmV0X2luZm8gKnZpLCBpbnQgcXBfaW5kZXgpCj4gPiA+ICAgICAgICAgaWYg KGVyciA8IDApCj4gPiA+ICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwo+ID4gPgo+ID4gPiAt ICAgICAgIGVyciA9IHhkcF9yeHFfaW5mb19yZWdfbWVtX21vZGVsKCZ2aS0+cnFbcXBfaW5kZXhd LnhkcF9yeHEsCj4gPiA+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg TUVNX1RZUEVfUEFHRV9TSEFSRUQsIE5VTEwpOwo+ID4gPiArICAgICAgIGlmICh2aS0+cnFbcXBf aW5kZXhdLnBhZ2VfcG9vbCkKPiA+ID4gKyAgICAgICAgICAgICAgIGVyciA9IHhkcF9yeHFfaW5m b19yZWdfbWVtX21vZGVsKCZ2aS0+cnFbcXBfaW5kZXhdLnhkcF9yeHEsCj4gPiA+ICsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRU1fVFlQRV9QQUdFX1BP T0wsCj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB2aS0+cnFbcXBfaW5kZXhdLnBhZ2VfcG9vbCk7Cj4gPiA+ICsgICAgICAgZWxzZQo+ID4gPiAr ICAgICAgICAgICAgICAgZXJyID0geGRwX3J4cV9pbmZvX3JlZ19tZW1fbW9kZWwoJnZpLT5ycVtx cF9pbmRleF0ueGRwX3J4cSwKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIE1FTV9UWVBFX1BBR0VfU0hBUkVELAo+ID4gPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Cj4gPiA+ICsKPiA+ID4g ICAgICAgICBpZiAoZXJyIDwgMCkKPiA+ID4gICAgICAgICAgICAgICAgIGdvdG8gZXJyX3hkcF9y ZWdfbWVtX21vZGVsOwo+ID4gPgo+ID4gPiBAQCAtMjk1MSw2ICsyOTk4LDcgQEAgc3RhdGljIHZv aWQgdmlydG5ldF9nZXRfc3RyaW5ncyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCB1MzIgc3RyaW5n c2V0LCB1OCAqZGF0YSkKPiA+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGh0 b29sX3NwcmludGYoJnAsICJ0eF9xdWV1ZV8ldV8lcyIsIGksCj4gPiA+ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpcnRuZXRfc3Ffc3RhdHNfZGVzY1tq XS5kZXNjKTsKPiA+ID4gICAgICAgICAgICAgICAgIH0KPiA+ID4gKyAgICAgICAgICAgICAgIHBh Z2VfcG9vbF9ldGh0b29sX3N0YXRzX2dldF9zdHJpbmdzKHApOwo+ID4gPiAgICAgICAgICAgICAg ICAgYnJlYWs7Cj4gPiA+ICAgICAgICAgfQo+ID4gPiAgfQo+ID4gPiBAQCAtMjk2MiwxMiArMzAx MCwzMCBAQCBzdGF0aWMgaW50IHZpcnRuZXRfZ2V0X3NzZXRfY291bnQoc3RydWN0IG5ldF9kZXZp Y2UgKmRldiwgaW50IHNzZXQpCj4gPiA+ICAgICAgICAgc3dpdGNoIChzc2V0KSB7Cj4gPiA+ICAg ICAgICAgY2FzZSBFVEhfU1NfU1RBVFM6Cj4gPiA+ICAgICAgICAgICAgICAgICByZXR1cm4gdmkt PmN1cnJfcXVldWVfcGFpcnMgKiAoVklSVE5FVF9SUV9TVEFUU19MRU4gKwo+ID4gPiAtICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZJUlRORVRfU1FfU1RBVFNf TEVOKTsKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBWSVJUTkVUX1NRX1NUQVRTX0xFTiArCj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIChwYWdlX3Bvb2xfZW5hYmxlZCAmJiB2aS0+bWVyZ2VhYmxl X3J4X2J1ZnMgPwo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcGFnZV9wb29sX2V0aHRvb2xfc3RhdHNfZ2V0X2NvdW50KCkgOiAwKSk7Cj4gPiA+ ICAgICAgICAgZGVmYXVsdDoKPiA+ID4gICAgICAgICAgICAgICAgIHJldHVybiAtRU9QTk9UU1VQ UDsKPiA+ID4gICAgICAgICB9Cj4gPiA+ICB9Cj4gPiA+Cj4gPiA+ICtzdGF0aWMgdm9pZCB2aXJ0 bmV0X2dldF9wYWdlX3Bvb2xfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgdTY0ICpkYXRh KQo+ID4gPiArewo+ID4gPiArI2lmZGVmIENPTkZJR19QQUdFX1BPT0xfU1RBVFMKPiA+ID4gKyAg ICAgICBzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSA9IG5ldGRldl9wcml2KGRldik7Cj4gPiA+ICsg ICAgICAgc3RydWN0IHBhZ2VfcG9vbF9zdGF0cyBwcF9zdGF0cyA9IHt9Owo+ID4gPiArICAgICAg IGludCBpOwo+ID4gPiArCj4gPiA+ICsgICAgICAgZm9yIChpID0gMDsgaSA8IHZpLT5jdXJyX3F1 ZXVlX3BhaXJzOyBpKyspIHsKPiA+ID4gKyAgICAgICAgICAgICAgIGlmICghdmktPnJxW2ldLnBh Z2VfcG9vbCkKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Cj4gPiA+ICsg ICAgICAgICAgICAgICBwYWdlX3Bvb2xfZ2V0X3N0YXRzKHZpLT5ycVtpXS5wYWdlX3Bvb2wsICZw cF9zdGF0cyk7Cj4gPiA+ICsgICAgICAgfQo+ID4gPiArICAgICAgIHBhZ2VfcG9vbF9ldGh0b29s X3N0YXRzX2dldChkYXRhLCAmcHBfc3RhdHMpOwo+ID4gPiArI2VuZGlmIC8qIENPTkZJR19QQUdF X1BPT0xfU1RBVFMgKi8KPiA+ID4gK30KPiA+ID4gKwo+ID4gPiAgc3RhdGljIHZvaWQgdmlydG5l dF9nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAo+ID4gPiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBldGh0b29sX3N0YXRzICpzdGF0 cywgdTY0ICpkYXRhKQo+ID4gPiAgewo+ID4gPiBAQCAtMzAwMyw2ICszMDY5LDggQEAgc3RhdGlj IHZvaWQgdmlydG5ldF9nZXRfZXRodG9vbF9zdGF0cyhzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LAo+ ID4gPiAgICAgICAgICAgICAgICAgfSB3aGlsZSAodTY0X3N0YXRzX2ZldGNoX3JldHJ5KCZzcS0+ c3RhdHMuc3luY3AsIHN0YXJ0KSk7Cj4gPiA+ICAgICAgICAgICAgICAgICBpZHggKz0gVklSVE5F VF9TUV9TVEFUU19MRU47Cj4gPiA+ICAgICAgICAgfQo+ID4gPiArCj4gPiA+ICsgICAgICAgdmly dG5ldF9nZXRfcGFnZV9wb29sX3N0YXRzKGRldiwgJmRhdGFbaWR4XSk7Cj4gPiA+ICB9Cj4gPiA+ Cj4gPiA+ICBzdGF0aWMgdm9pZCB2aXJ0bmV0X2dldF9jaGFubmVscyhzdHJ1Y3QgbmV0X2Rldmlj ZSAqZGV2LAo+ID4gPiBAQCAtMzYyMyw2ICszNjkxLDggQEAgc3RhdGljIHZvaWQgdmlydG5ldF9m cmVlX3F1ZXVlcyhzdHJ1Y3QgdmlydG5ldF9pbmZvICp2aSkKPiA+ID4gICAgICAgICBmb3IgKGkg PSAwOyBpIDwgdmktPm1heF9xdWV1ZV9wYWlyczsgaSsrKSB7Cj4gPiA+ICAgICAgICAgICAgICAg ICBfX25ldGlmX25hcGlfZGVsKCZ2aS0+cnFbaV0ubmFwaSk7Cj4gPiA+ICAgICAgICAgICAgICAg ICBfX25ldGlmX25hcGlfZGVsKCZ2aS0+c3FbaV0ubmFwaSk7Cj4gPiA+ICsgICAgICAgICAgICAg ICBpZiAodmktPnJxW2ldLnBhZ2VfcG9vbCkKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg cGFnZV9wb29sX2Rlc3Ryb3kodmktPnJxW2ldLnBhZ2VfcG9vbCk7Cj4gPiA+ICAgICAgICAgfQo+ ID4gPgo+ID4gPiAgICAgICAgIC8qIFdlIGNhbGxlZCBfX25ldGlmX25hcGlfZGVsKCksCj4gPiA+ IEBAIC0zNjc5LDEyICszNzQ5LDE5IEBAIHN0YXRpYyB2b2lkIHZpcnRuZXRfcnFfZnJlZV91bnVz ZWRfYnVmKHN0cnVjdCB2aXJ0cXVldWUgKnZxLCB2b2lkICpidWYpCj4gPiA+ICAgICAgICAgc3Ry dWN0IHZpcnRuZXRfaW5mbyAqdmkgPSB2cS0+dmRldi0+cHJpdjsKPiA+ID4gICAgICAgICBpbnQg aSA9IHZxMnJ4cSh2cSk7Cj4gPiA+Cj4gPiA+IC0gICAgICAgaWYgKHZpLT5tZXJnZWFibGVfcnhf YnVmcykKPiA+ID4gLSAgICAgICAgICAgICAgIHB1dF9wYWdlKHZpcnRfdG9faGVhZF9wYWdlKGJ1 ZikpOwo+ID4gPiAtICAgICAgIGVsc2UgaWYgKHZpLT5iaWdfcGFja2V0cykKPiA+ID4gKyAgICAg ICBpZiAodmktPm1lcmdlYWJsZV9yeF9idWZzKSB7Cj4gPiA+ICsgICAgICAgICAgICAgICBpZiAo dmktPnJxW2ldLnBhZ2VfcG9vbCkgewo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICBwYWdl X3Bvb2xfcHV0X2Z1bGxfcGFnZSh2aS0+cnFbaV0ucGFnZV9wb29sLAo+ID4gPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXJ0X3RvX2hlYWRfcGFnZShi dWYpLAo+ID4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICB0cnVlKTsKPiA+ID4gKyAgICAgICAgICAgICAgIH0gZWxzZSB7Cj4gPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgIHB1dF9wYWdlKHZpcnRfdG9faGVhZF9wYWdlKGJ1ZikpOwo+ID4gPiArICAg ICAgICAgICAgICAgfQo+ID4gPiArICAgICAgIH0gZWxzZSBpZiAodmktPmJpZ19wYWNrZXRzKSB7 Cj4gPiA+ICAgICAgICAgICAgICAgICBnaXZlX3BhZ2VzKCZ2aS0+cnFbaV0sIGJ1Zik7Cj4gPgo+ ID4gQW55IHJlYXNvbiBvbmx5IG1lcmdlYWJsZSB3ZXJlIG1vZGlmaWVkIGJ1dCBub3QgZm9yIHNt YWxsIGFuZCBiaWc/Cj4gPgo+ID4gVGhhbmtzCj4gPgo+IAo+IEJpZyBtb2RlIHVzZXMgdGhlIHBh Z2UgY2hhaW4gdG8gcmVjeWNsZSBwYWdlcywgdGh1cyB0aGUgdXNpbmcgb2YKPiAicHJpdmF0ZSIg b2YgdGhlIGJ1ZmZlciBwYWdlLiBJIHdpbGwgdGFrZSBmdXJ0aGVyIGxvb2sgaW50byB0aGF0IHRv Cj4gc2VlIGlmIGl0IGlzIGJldHRlciB0byB1c2UgcGFnZSBwb29sIGluIHRoZXNlIGNhc2VzLiBU aGFua3MhCj4gCj4gCj4gCj4gPiA+IC0gICAgICAgZWxzZQo+ID4gPiArICAgICAgIH0gZWxzZSB7 Cj4gPiA+ICAgICAgICAgICAgICAgICBwdXRfcGFnZSh2aXJ0X3RvX2hlYWRfcGFnZShidWYpKTsK PiA+ID4gKyAgICAgICB9Cj4gPiA+ICB9Cj4gPiA+Cj4gPiA+ICBzdGF0aWMgdm9pZCBmcmVlX3Vu dXNlZF9idWZzKHN0cnVjdCB2aXJ0bmV0X2luZm8gKnZpKQo+ID4gPiBAQCAtMzcxOCw2ICszNzk1 LDI2IEBAIHN0YXRpYyB2b2lkIHZpcnRuZXRfZGVsX3ZxcyhzdHJ1Y3QgdmlydG5ldF9pbmZvICp2 aSkKPiA+ID4gICAgICAgICB2aXJ0bmV0X2ZyZWVfcXVldWVzKHZpKTsKPiA+ID4gIH0KPiA+ID4K PiA+ID4gK3N0YXRpYyB2b2lkIHZpcnRuZXRfYWxsb2NfcGFnZV9wb29sKHN0cnVjdCByZWNlaXZl X3F1ZXVlICpycSkKPiA+ID4gK3sKPiA+ID4gKyAgICAgICBzdHJ1Y3QgdmlydGlvX2RldmljZSAq dmRldiA9IHJxLT52cS0+dmRldjsKPiA+ID4gKwo+ID4gPiArICAgICAgIHN0cnVjdCBwYWdlX3Bv b2xfcGFyYW1zIHBwX3BhcmFtcyA9IHsKPiA+ID4gKyAgICAgICAgICAgICAgIC5vcmRlciA9IDAs Cj4gPiA+ICsgICAgICAgICAgICAgICAucG9vbF9zaXplID0gcnEtPnZxLT5udW1fbWF4LAo+ID4g PiArICAgICAgICAgICAgICAgLm5pZCA9IGRldl90b19ub2RlKHZkZXYtPmRldi5wYXJlbnQpLAo+ ID4gPiArICAgICAgICAgICAgICAgLmRldiA9IHZkZXYtPmRldi5wYXJlbnQsCj4gPiA+ICsgICAg ICAgICAgICAgICAub2Zmc2V0ID0gMCwKPiA+ID4gKyAgICAgICB9Owo+ID4gPiArCj4gPiA+ICsg ICAgICAgcnEtPnBhZ2VfcG9vbCA9IHBhZ2VfcG9vbF9jcmVhdGUoJnBwX3BhcmFtcyk7Cj4gPiA+ ICsgICAgICAgaWYgKElTX0VSUihycS0+cGFnZV9wb29sKSkgewo+ID4gPiArICAgICAgICAgICAg ICAgZGV2X3dhcm4oJnZkZXYtPmRldiwgInBhZ2UgcG9vbCBjcmVhdGlvbiBmYWlsZWQ6ICVsZFxu IiwKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgIFBUUl9FUlIocnEtPnBhZ2VfcG9vbCkp Owo+ID4gPiArICAgICAgICAgICAgICAgcnEtPnBhZ2VfcG9vbCA9IE5VTEw7Cj4gPiA+ICsgICAg ICAgfQo+ID4gPiArfQo+ID4gPiArCj4gPiA+ICAvKiBIb3cgbGFyZ2Ugc2hvdWxkIGEgc2luZ2xl IGJ1ZmZlciBiZSBzbyBhIHF1ZXVlIGZ1bGwgb2YgdGhlc2UgY2FuIGZpdCBhdAo+ID4gPiAgICog bGVhc3Qgb25lIGZ1bGwgcGFja2V0Pwo+ID4gPiAgICogTG9naWMgYmVsb3cgYXNzdW1lcyB0aGUg bWVyZ2VhYmxlIGJ1ZmZlciBoZWFkZXIgaXMgdXNlZC4KPiA+ID4gQEAgLTM4MDEsNiArMzg5OCwx MyBAQCBzdGF0aWMgaW50IHZpcnRuZXRfZmluZF92cXMoc3RydWN0IHZpcnRuZXRfaW5mbyAqdmkp Cj4gPiA+ICAgICAgICAgICAgICAgICB2aS0+cnFbaV0udnEgPSB2cXNbcnhxMnZxKGkpXTsKPiA+ ID4gICAgICAgICAgICAgICAgIHZpLT5ycVtpXS5taW5fYnVmX2xlbiA9IG1lcmdlYWJsZV9taW5f YnVmX2xlbih2aSwgdmktPnJxW2ldLnZxKTsKPiA+ID4gICAgICAgICAgICAgICAgIHZpLT5zcVtp XS52cSA9IHZxc1t0eHEydnEoaSldOwo+ID4gPiArCj4gPiA+ICsgICAgICAgICAgICAgICBpZiAo cGFnZV9wb29sX2VuYWJsZWQgJiYgdmktPm1lcmdlYWJsZV9yeF9idWZzKQo+ID4gPiArICAgICAg ICAgICAgICAgICAgICAgICB2aXJ0bmV0X2FsbG9jX3BhZ2VfcG9vbCgmdmktPnJxW2ldKTsKPiA+ ID4gKyAgICAgICAgICAgICAgIGVsc2UKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgZGV2 X3dhcm4oJnZpLT52ZGV2LT5kZXYsCj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICJwYWdlIHBvb2wgb25seSBzdXBwb3J0IG1lcmdlYWJsZSBtb2RlXG4iKTsKPiA+ID4gKwo+ ID4gPiAgICAgICAgIH0KPiA+ID4KPiA+ID4gICAgICAgICAvKiBydW4gaGVyZTogcmV0ID09IDAu ICovCj4gPiA+IC0tCj4gPiA+IDIuMzEuMQo+ID4gPgo+ID4KCl9fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fClZpcnR1YWxpemF0aW9uIG1haWxpbmcgbGlzdApW aXJ0dWFsaXphdGlvbkBsaXN0cy5saW51eC1mb3VuZGF0aW9uLm9yZwpodHRwczovL2xpc3RzLmxp bnV4Zm91bmRhdGlvbi5vcmcvbWFpbG1hbi9saXN0aW5mby92aXJ0dWFsaXphdGlvbg== 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 48EC3C77B7C for ; Sun, 28 May 2023 06:41:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229552AbjE1Gl0 (ORCPT ); Sun, 28 May 2023 02:41:26 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54074 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229441AbjE1GlZ (ORCPT ); Sun, 28 May 2023 02:41:25 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 1EB43D8 for ; Sat, 27 May 2023 23:40:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1685256034; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=8QYlBHTB2cWeSDeDa6j2ExXKXJkK86ds7nWJ9n+wiYA=; b=C3XZmk2dxb+FzNor0gLqnMP5mAGTuNiCb51TXRXsLGCRkmosy32WAJqW7oVB9SguCt0VQn iXmVjTlxN8JVgLi+XH33kSBt6XoyZ6VkkmWy1xBfYM1TVS0iSxLVNVUxPDWt68ALJqcTiI wI1gbyrOcT5wxTl13lywJtrSDT0MTK8= Received: from mail-wm1-f70.google.com (mail-wm1-f70.google.com [209.85.128.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-656-0JSo_cvLNrmmRBxdqtyU8g-1; Sun, 28 May 2023 02:40:33 -0400 X-MC-Unique: 0JSo_cvLNrmmRBxdqtyU8g-1 Received: by mail-wm1-f70.google.com with SMTP id 5b1f17b1804b1-3f6ffc45209so756085e9.0 for ; Sat, 27 May 2023 23:40:32 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1685256031; x=1687848031; 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=8QYlBHTB2cWeSDeDa6j2ExXKXJkK86ds7nWJ9n+wiYA=; b=JA+oov44WqajTvKfQSHgvGW45KKnQ4bziPOifMCZlpI+ZME7jgC/E9AlnWHRg4FGEs z4l6KfTkNeuxEKq4JJPG4nfr7fd+IcLAfZUR+YDeGP9WSRmWBOU9Q+o6b6RDVSUPOedx qGRLdh8NHRDw8PHlBopsxkeHCwjVbqKVIeGbbmYiWde8Q+jt6y9s9c67y7llHPxFVvpg tJK5zwMzl+v2Ln739BDajvfVe07uECxpD34WuUSYnedDJKljhOeeU8pyJ7I+rorrc1EJ sP8J3fbT6yVOgXrM4TZjohyC09F1yn1harwPKiO6WXx05plPMwxJtUc7wOoEi8mbp37J fssw== X-Gm-Message-State: AC+VfDwtWU9+hzjMpbzZoV0s6qN9g9frvOkRM+IhKs7mPy3vpdCbid36 6dA+bNLx54Zg0zon6/Y85dh9aaoyZ3XLShep+WrcTqLdGqBmnwibXWa5Gf6n4huwqfrbb6l+lZD wj6tXS4NgNuyESPX2OO5tADNveQEFb72H X-Received: by 2002:a05:600c:82c5:b0:3f5:a54:9f97 with SMTP id eo5-20020a05600c82c500b003f50a549f97mr4132791wmb.0.1685256031649; Sat, 27 May 2023 23:40:31 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6carfBTFTY4poallAVBlDBPUIDVfLDD46smd64cTSCUbV8twVW3Yl6/MXRl0LYrWO0pV7R+w== X-Received: by 2002:a05:600c:82c5:b0:3f5:a54:9f97 with SMTP id eo5-20020a05600c82c500b003f50a549f97mr4132776wmb.0.1685256031258; Sat, 27 May 2023 23:40:31 -0700 (PDT) Received: from redhat.com ([2.52.146.27]) by smtp.gmail.com with ESMTPSA id u3-20020a7bc043000000b003f17848673fsm10203265wmc.27.2023.05.27.23.40.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 27 May 2023 23:40:30 -0700 (PDT) Date: Sun, 28 May 2023 02:40:27 -0400 From: "Michael S. Tsirkin" To: Liang Chen Cc: Jason Wang , virtualization@lists.linux-foundation.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, xuanzhuo@linux.alibaba.com, kuba@kernel.org, edumazet@google.com, davem@davemloft.net, pabeni@redhat.com, alexander.duyck@gmail.com Subject: Re: [PATCH net-next 2/5] virtio_net: Add page_pool support to improve performance Message-ID: <20230528023956-mutt-send-email-mst@kernel.org> References: <20230526054621.18371-1-liangchen.linux@gmail.com> <20230526054621.18371-2-liangchen.linux@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sat, May 27, 2023 at 08:35:01PM +0800, Liang Chen wrote: > On Fri, May 26, 2023 at 2:51 PM Jason Wang wrote: > > > > On Fri, May 26, 2023 at 1:46 PM Liang Chen wrote: > > > > > > The implementation at the moment uses one page per packet in both the > > > normal and XDP path. > > > > It's better to explain why we need a page pool and how it can help the > > performance. > > > > Sure, I will include that on v2. > > > In addition, introducing a module parameter to enable > > > or disable the usage of page pool (disabled by default). > > > > If page pool wins for most of the cases, any reason to disable it by default? > > > > Thank you for raising the point. It does make sense to enable it by default. I'd like to see more benchmarks pls then, with a variety of packet sizes, udp and tcp. > > > > > > In single-core vm testing environments, it gives a modest performance gain > > > in the normal path. > > > Upstream codebase: 47.5 Gbits/sec > > > Upstream codebase + page_pool support: 50.2 Gbits/sec > > > > > > In multi-core vm testing environments, The most significant performance > > > gain is observed in XDP cpumap: > > > Upstream codebase: 1.38 Gbits/sec > > > Upstream codebase + page_pool support: 9.74 Gbits/sec > > > > Please show more details on the test. E.g which kinds of tests have > > you measured? > > > > Btw, it would be better to measure PPS as well. > > > > Sure. It will be added on v2. > > > > > > With this foundation, we can further integrate page pool fragmentation and > > > DMA map/unmap support. > > > > > > Signed-off-by: Liang Chen > > > --- > > > drivers/net/virtio_net.c | 188 ++++++++++++++++++++++++++++++--------- > > > > I believe we should make virtio-net to select CONFIG_PAGE_POOL or do > > the ifdef tricks at least. > > > > Sure. it will be done on v2. > > > 1 file changed, 146 insertions(+), 42 deletions(-) > > > > > > diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c > > > index c5dca0d92e64..99c0ca0c1781 100644 > > > --- a/drivers/net/virtio_net.c > > > +++ b/drivers/net/virtio_net.c > > > @@ -31,6 +31,9 @@ module_param(csum, bool, 0444); > > > module_param(gso, bool, 0444); > > > module_param(napi_tx, bool, 0644); > > > > > > +static bool page_pool_enabled; > > > +module_param(page_pool_enabled, bool, 0400); > > > + > > > /* FIXME: MTU in config. */ > > > #define GOOD_PACKET_LEN (ETH_HLEN + VLAN_HLEN + ETH_DATA_LEN) > > > #define GOOD_COPY_LEN 128 > > > @@ -159,6 +162,9 @@ struct receive_queue { > > > /* Chain pages by the private ptr. */ > > > struct page *pages; > > > > > > + /* Page pool */ > > > + struct page_pool *page_pool; > > > + > > > /* Average packet length for mergeable receive buffers. */ > > > struct ewma_pkt_len mrg_avg_pkt_len; > > > > > > @@ -459,6 +465,14 @@ static struct sk_buff *virtnet_build_skb(void *buf, unsigned int buflen, > > > return skb; > > > } > > > > > > +static void virtnet_put_page(struct receive_queue *rq, struct page *page) > > > +{ > > > + if (rq->page_pool) > > > + page_pool_put_full_page(rq->page_pool, page, true); > > > + else > > > + put_page(page); > > > +} > > > + > > > /* Called from bottom half context */ > > > static struct sk_buff *page_to_skb(struct virtnet_info *vi, > > > struct receive_queue *rq, > > > @@ -555,7 +569,7 @@ static struct sk_buff *page_to_skb(struct virtnet_info *vi, > > > hdr = skb_vnet_hdr(skb); > > > memcpy(hdr, hdr_p, hdr_len); > > > if (page_to_free) > > > - put_page(page_to_free); > > > + virtnet_put_page(rq, page_to_free); > > > > > > return skb; > > > } > > > @@ -802,7 +816,7 @@ static int virtnet_xdp_xmit(struct net_device *dev, > > > return ret; > > > } > > > > > > -static void put_xdp_frags(struct xdp_buff *xdp) > > > +static void put_xdp_frags(struct xdp_buff *xdp, struct receive_queue *rq) > > > { > > > > rq could be fetched from xdp_rxq_info? > > Yeah, it has the queue_index there. > > > > > struct skb_shared_info *shinfo; > > > struct page *xdp_page; > > > @@ -812,7 +826,7 @@ static void put_xdp_frags(struct xdp_buff *xdp) > > > shinfo = xdp_get_shared_info_from_buff(xdp); > > > for (i = 0; i < shinfo->nr_frags; i++) { > > > xdp_page = skb_frag_page(&shinfo->frags[i]); > > > - put_page(xdp_page); > > > + virtnet_put_page(rq, xdp_page); > > > } > > > } > > > } > > > @@ -903,7 +917,11 @@ static struct page *xdp_linearize_page(struct receive_queue *rq, > > > if (page_off + *len + tailroom > PAGE_SIZE) > > > return NULL; > > > > > > - page = alloc_page(GFP_ATOMIC); > > > + if (rq->page_pool) > > > + page = page_pool_dev_alloc_pages(rq->page_pool); > > > + else > > > + page = alloc_page(GFP_ATOMIC); > > > + > > > if (!page) > > > return NULL; > > > > > > @@ -926,21 +944,24 @@ static struct page *xdp_linearize_page(struct receive_queue *rq, > > > * is sending packet larger than the MTU. > > > */ > > > if ((page_off + buflen + tailroom) > PAGE_SIZE) { > > > - put_page(p); > > > + virtnet_put_page(rq, p); > > > goto err_buf; > > > } > > > > > > memcpy(page_address(page) + page_off, > > > page_address(p) + off, buflen); > > > page_off += buflen; > > > - put_page(p); > > > + virtnet_put_page(rq, p); > > > } > > > > > > /* Headroom does not contribute to packet length */ > > > *len = page_off - VIRTIO_XDP_HEADROOM; > > > return page; > > > err_buf: > > > - __free_pages(page, 0); > > > + if (rq->page_pool) > > > + page_pool_put_full_page(rq->page_pool, page, true); > > > + else > > > + __free_pages(page, 0); > > > return NULL; > > > } > > > > > > @@ -1144,7 +1165,7 @@ static void mergeable_buf_free(struct receive_queue *rq, int num_buf, > > > } > > > stats->bytes += len; > > > page = virt_to_head_page(buf); > > > - put_page(page); > > > + virtnet_put_page(rq, page); > > > } > > > } > > > > > > @@ -1264,7 +1285,7 @@ static int virtnet_build_xdp_buff_mrg(struct net_device *dev, > > > cur_frag_size = truesize; > > > xdp_frags_truesz += cur_frag_size; > > > if (unlikely(len > truesize - room || cur_frag_size > PAGE_SIZE)) { > > > - put_page(page); > > > + virtnet_put_page(rq, page); > > > pr_debug("%s: rx error: len %u exceeds truesize %lu\n", > > > dev->name, len, (unsigned long)(truesize - room)); > > > dev->stats.rx_length_errors++; > > > @@ -1283,7 +1304,7 @@ static int virtnet_build_xdp_buff_mrg(struct net_device *dev, > > > return 0; > > > > > > err: > > > - put_xdp_frags(xdp); > > > + put_xdp_frags(xdp, rq); > > > return -EINVAL; > > > } > > > > > > @@ -1344,7 +1365,10 @@ static void *mergeable_xdp_get_buf(struct virtnet_info *vi, > > > if (*len + xdp_room > PAGE_SIZE) > > > return NULL; > > > > > > - xdp_page = alloc_page(GFP_ATOMIC); > > > + if (rq->page_pool) > > > + xdp_page = page_pool_dev_alloc_pages(rq->page_pool); > > > + else > > > + xdp_page = alloc_page(GFP_ATOMIC); > > > if (!xdp_page) > > > return NULL; > > > > > > @@ -1354,7 +1378,7 @@ static void *mergeable_xdp_get_buf(struct virtnet_info *vi, > > > > > > *frame_sz = PAGE_SIZE; > > > > > > - put_page(*page); > > > + virtnet_put_page(rq, *page); > > > > > > *page = xdp_page; > > > > > > @@ -1400,6 +1424,8 @@ static struct sk_buff *receive_mergeable_xdp(struct net_device *dev, > > > head_skb = build_skb_from_xdp_buff(dev, vi, &xdp, xdp_frags_truesz); > > > if (unlikely(!head_skb)) > > > break; > > > + if (rq->page_pool) > > > + skb_mark_for_recycle(head_skb); > > > return head_skb; > > > > > > case XDP_TX: > > > @@ -1410,10 +1436,10 @@ static struct sk_buff *receive_mergeable_xdp(struct net_device *dev, > > > break; > > > } > > > > > > - put_xdp_frags(&xdp); > > > + put_xdp_frags(&xdp, rq); > > > > > > err_xdp: > > > - put_page(page); > > > + virtnet_put_page(rq, page); > > > mergeable_buf_free(rq, num_buf, dev, stats); > > > > > > stats->xdp_drops++; > > > @@ -1467,6 +1493,9 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, > > > head_skb = page_to_skb(vi, rq, page, offset, len, truesize, headroom); > > > curr_skb = head_skb; > > > > > > + if (rq->page_pool) > > > + skb_mark_for_recycle(curr_skb); > > > + > > > if (unlikely(!curr_skb)) > > > goto err_skb; > > > while (--num_buf) { > > > @@ -1509,6 +1538,8 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, > > > curr_skb = nskb; > > > head_skb->truesize += nskb->truesize; > > > num_skb_frags = 0; > > > + if (rq->page_pool) > > > + skb_mark_for_recycle(curr_skb); > > > } > > > if (curr_skb != head_skb) { > > > head_skb->data_len += len; > > > @@ -1517,7 +1548,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, > > > } > > > offset = buf - page_address(page); > > > if (skb_can_coalesce(curr_skb, num_skb_frags, page, offset)) { > > > - put_page(page); > > > + virtnet_put_page(rq, page); > > > > I wonder why not we can't do this during buffer allocation like other drivers? > > > > Sorry, I don't quite understand the point here. Would you please > elaborate a bit more? > > > skb_coalesce_rx_frag(curr_skb, num_skb_frags - 1, > > > len, truesize); > > > } else { > > > @@ -1530,7 +1561,7 @@ static struct sk_buff *receive_mergeable(struct net_device *dev, > > > return head_skb; > > > > > > err_skb: > > > - put_page(page); > > > + virtnet_put_page(rq, page); > > > mergeable_buf_free(rq, num_buf, dev, stats); > > > > > > err_buf: > > > @@ -1737,31 +1768,40 @@ static int add_recvbuf_mergeable(struct virtnet_info *vi, > > > * disabled GSO for XDP, it won't be a big issue. > > > */ > > > len = get_mergeable_buf_len(rq, &rq->mrg_avg_pkt_len, room); > > > - if (unlikely(!skb_page_frag_refill(len + room, alloc_frag, gfp))) > > > - return -ENOMEM; > > > + if (rq->page_pool) { > > > + struct page *page; > > > > > > - buf = (char *)page_address(alloc_frag->page) + alloc_frag->offset; > > > - buf += headroom; /* advance address leaving hole at front of pkt */ > > > - get_page(alloc_frag->page); > > > - alloc_frag->offset += len + room; > > > - hole = alloc_frag->size - alloc_frag->offset; > > > - if (hole < len + room) { > > > - /* To avoid internal fragmentation, if there is very likely not > > > - * enough space for another buffer, add the remaining space to > > > - * the current buffer. > > > - * XDP core assumes that frame_size of xdp_buff and the length > > > - * of the frag are PAGE_SIZE, so we disable the hole mechanism. > > > - */ > > > - if (!headroom) > > > - len += hole; > > > - alloc_frag->offset += hole; > > > - } > > > + page = page_pool_dev_alloc_pages(rq->page_pool); > > > + if (unlikely(!page)) > > > + return -ENOMEM; > > > + buf = (char *)page_address(page); > > > + buf += headroom; /* advance address leaving hole at front of pkt */ > > > + } else { > > > + if (unlikely(!skb_page_frag_refill(len + room, alloc_frag, gfp))) > > > > Why not simply use a helper like virtnet_page_frag_refill() and add > > the page_pool allocation logic there? It helps to reduce the > > changeset. > > > > Sure. Will do that on v2. > > > + return -ENOMEM; > > > > > > + buf = (char *)page_address(alloc_frag->page) + alloc_frag->offset; > > > + buf += headroom; /* advance address leaving hole at front of pkt */ > > > + get_page(alloc_frag->page); > > > + alloc_frag->offset += len + room; > > > + hole = alloc_frag->size - alloc_frag->offset; > > > + if (hole < len + room) { > > > + /* To avoid internal fragmentation, if there is very likely not > > > + * enough space for another buffer, add the remaining space to > > > + * the current buffer. > > > + * XDP core assumes that frame_size of xdp_buff and the length > > > + * of the frag are PAGE_SIZE, so we disable the hole mechanism. > > > + */ > > > + if (!headroom) > > > + len += hole; > > > + alloc_frag->offset += hole; > > > + } > > > + } > > > sg_init_one(rq->sg, buf, len); > > > ctx = mergeable_len_to_ctx(len + room, headroom); > > > err = virtqueue_add_inbuf_ctx(rq->vq, rq->sg, 1, buf, ctx, gfp); > > > if (err < 0) > > > - put_page(virt_to_head_page(buf)); > > > + virtnet_put_page(rq, virt_to_head_page(buf)); > > > > > > return err; > > > } > > > @@ -1994,8 +2034,15 @@ static int virtnet_enable_queue_pair(struct virtnet_info *vi, int qp_index) > > > if (err < 0) > > > return err; > > > > > > - err = xdp_rxq_info_reg_mem_model(&vi->rq[qp_index].xdp_rxq, > > > - MEM_TYPE_PAGE_SHARED, NULL); > > > + if (vi->rq[qp_index].page_pool) > > > + err = xdp_rxq_info_reg_mem_model(&vi->rq[qp_index].xdp_rxq, > > > + MEM_TYPE_PAGE_POOL, > > > + vi->rq[qp_index].page_pool); > > > + else > > > + err = xdp_rxq_info_reg_mem_model(&vi->rq[qp_index].xdp_rxq, > > > + MEM_TYPE_PAGE_SHARED, > > > + NULL); > > > + > > > if (err < 0) > > > goto err_xdp_reg_mem_model; > > > > > > @@ -2951,6 +2998,7 @@ static void virtnet_get_strings(struct net_device *dev, u32 stringset, u8 *data) > > > ethtool_sprintf(&p, "tx_queue_%u_%s", i, > > > virtnet_sq_stats_desc[j].desc); > > > } > > > + page_pool_ethtool_stats_get_strings(p); > > > break; > > > } > > > } > > > @@ -2962,12 +3010,30 @@ static int virtnet_get_sset_count(struct net_device *dev, int sset) > > > switch (sset) { > > > case ETH_SS_STATS: > > > return vi->curr_queue_pairs * (VIRTNET_RQ_STATS_LEN + > > > - VIRTNET_SQ_STATS_LEN); > > > + VIRTNET_SQ_STATS_LEN + > > > + (page_pool_enabled && vi->mergeable_rx_bufs ? > > > + page_pool_ethtool_stats_get_count() : 0)); > > > default: > > > return -EOPNOTSUPP; > > > } > > > } > > > > > > +static void virtnet_get_page_pool_stats(struct net_device *dev, u64 *data) > > > +{ > > > +#ifdef CONFIG_PAGE_POOL_STATS > > > + struct virtnet_info *vi = netdev_priv(dev); > > > + struct page_pool_stats pp_stats = {}; > > > + int i; > > > + > > > + for (i = 0; i < vi->curr_queue_pairs; i++) { > > > + if (!vi->rq[i].page_pool) > > > + continue; > > > + page_pool_get_stats(vi->rq[i].page_pool, &pp_stats); > > > + } > > > + page_pool_ethtool_stats_get(data, &pp_stats); > > > +#endif /* CONFIG_PAGE_POOL_STATS */ > > > +} > > > + > > > static void virtnet_get_ethtool_stats(struct net_device *dev, > > > struct ethtool_stats *stats, u64 *data) > > > { > > > @@ -3003,6 +3069,8 @@ static void virtnet_get_ethtool_stats(struct net_device *dev, > > > } while (u64_stats_fetch_retry(&sq->stats.syncp, start)); > > > idx += VIRTNET_SQ_STATS_LEN; > > > } > > > + > > > + virtnet_get_page_pool_stats(dev, &data[idx]); > > > } > > > > > > static void virtnet_get_channels(struct net_device *dev, > > > @@ -3623,6 +3691,8 @@ static void virtnet_free_queues(struct virtnet_info *vi) > > > for (i = 0; i < vi->max_queue_pairs; i++) { > > > __netif_napi_del(&vi->rq[i].napi); > > > __netif_napi_del(&vi->sq[i].napi); > > > + if (vi->rq[i].page_pool) > > > + page_pool_destroy(vi->rq[i].page_pool); > > > } > > > > > > /* We called __netif_napi_del(), > > > @@ -3679,12 +3749,19 @@ static void virtnet_rq_free_unused_buf(struct virtqueue *vq, void *buf) > > > struct virtnet_info *vi = vq->vdev->priv; > > > int i = vq2rxq(vq); > > > > > > - if (vi->mergeable_rx_bufs) > > > - put_page(virt_to_head_page(buf)); > > > - else if (vi->big_packets) > > > + if (vi->mergeable_rx_bufs) { > > > + if (vi->rq[i].page_pool) { > > > + page_pool_put_full_page(vi->rq[i].page_pool, > > > + virt_to_head_page(buf), > > > + true); > > > + } else { > > > + put_page(virt_to_head_page(buf)); > > > + } > > > + } else if (vi->big_packets) { > > > give_pages(&vi->rq[i], buf); > > > > Any reason only mergeable were modified but not for small and big? > > > > Thanks > > > > Big mode uses the page chain to recycle pages, thus the using of > "private" of the buffer page. I will take further look into that to > see if it is better to use page pool in these cases. Thanks! > > > > > > - else > > > + } else { > > > put_page(virt_to_head_page(buf)); > > > + } > > > } > > > > > > static void free_unused_bufs(struct virtnet_info *vi) > > > @@ -3718,6 +3795,26 @@ static void virtnet_del_vqs(struct virtnet_info *vi) > > > virtnet_free_queues(vi); > > > } > > > > > > +static void virtnet_alloc_page_pool(struct receive_queue *rq) > > > +{ > > > + struct virtio_device *vdev = rq->vq->vdev; > > > + > > > + struct page_pool_params pp_params = { > > > + .order = 0, > > > + .pool_size = rq->vq->num_max, > > > + .nid = dev_to_node(vdev->dev.parent), > > > + .dev = vdev->dev.parent, > > > + .offset = 0, > > > + }; > > > + > > > + rq->page_pool = page_pool_create(&pp_params); > > > + if (IS_ERR(rq->page_pool)) { > > > + dev_warn(&vdev->dev, "page pool creation failed: %ld\n", > > > + PTR_ERR(rq->page_pool)); > > > + rq->page_pool = NULL; > > > + } > > > +} > > > + > > > /* How large should a single buffer be so a queue full of these can fit at > > > * least one full packet? > > > * Logic below assumes the mergeable buffer header is used. > > > @@ -3801,6 +3898,13 @@ static int virtnet_find_vqs(struct virtnet_info *vi) > > > vi->rq[i].vq = vqs[rxq2vq(i)]; > > > vi->rq[i].min_buf_len = mergeable_min_buf_len(vi, vi->rq[i].vq); > > > vi->sq[i].vq = vqs[txq2vq(i)]; > > > + > > > + if (page_pool_enabled && vi->mergeable_rx_bufs) > > > + virtnet_alloc_page_pool(&vi->rq[i]); > > > + else > > > + dev_warn(&vi->vdev->dev, > > > + "page pool only support mergeable mode\n"); > > > + > > > } > > > > > > /* run here: ret == 0. */ > > > -- > > > 2.31.1 > > > > >