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 A770DC433F5 for ; Sun, 30 Jan 2022 05:58:14 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id 073BB40362; Sun, 30 Jan 2022 05:58:14 +0000 (UTC) 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 pHQeOseJCL5s; Sun, 30 Jan 2022 05:58:11 +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 46A9340361; Sun, 30 Jan 2022 05:58:11 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 28DF1C0011; Sun, 30 Jan 2022 05:58:11 +0000 (UTC) Received: from smtp4.osuosl.org (smtp4.osuosl.org [IPv6:2605:bc80:3010::137]) by lists.linuxfoundation.org (Postfix) with ESMTP id 099CEC000B for ; Sun, 30 Jan 2022 05:58:09 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id D6A0740362 for ; Sun, 30 Jan 2022 05:58:08 +0000 (UTC) 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 yVENsnFrNT2q for ; Sun, 30 Jan 2022 05:58:07 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by smtp4.osuosl.org (Postfix) with ESMTPS id 7BBE340361 for ; Sun, 30 Jan 2022 05:58:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1643522286; 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=Wo8jU5htwKnHyMET1V1N4qHSxP3dzjG81gz/TNRkDrc=; b=jMk6kU1Ez7+CIT2jAN+kxYyIEqyW7JEhtB2ki6Ezs1PmBzgt5BYMUu+w54asNyIRv28FDI NV9/OSfoOKceQfz5eURjfbXrvoDYWdCleAgTyqRCnRGKzO7WNwt1zMtTGHYgIRQ/P31F0d Atl3vlocrcpLDG594D4OJIlvd5OZXIM= Received: from mail-pf1-f198.google.com (mail-pf1-f198.google.com [209.85.210.198]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-363-2Ojmw-6LNkqa427GAPYEoQ-1; Sun, 30 Jan 2022 00:58:04 -0500 X-MC-Unique: 2Ojmw-6LNkqa427GAPYEoQ-1 Received: by mail-pf1-f198.google.com with SMTP id f24-20020aa782d8000000b004bc00caa4c0so5542080pfn.3 for ; Sat, 29 Jan 2022 21:58:04 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:subject :content-language:to:cc:references:from:in-reply-to :content-transfer-encoding; bh=Wo8jU5htwKnHyMET1V1N4qHSxP3dzjG81gz/TNRkDrc=; b=J300JYSbfm0n175+2xtEvC1fY3o4EfemC4q7Sew3EVPkn/QpFMtwlt5phebIyunf1P 5rlmPhCyhzYisGhY5xreHg5eyZKs7mYlwA1N8yKWyLjqGK/IMTDRVhPFhMTdTVO5lkzi LqNNCBiTyRHXiATWG2ZC4oCQJZQeFPPEgO8VXC/C4aVsaPo1dnu2Mha6ss90ExAzVYku x+HCXUrqI2aLs4q+nHTmCa5w5Gux4nvK16x8htBewb+7t4wfnWsIECYpQZNryu7d1Bnc 8yS/7gQEs868P1gMCa82akWpj13qVU8jk/h0ynKFnqOQHiLQrQFj9xrfD1NHy9WD54kr VY9Q== X-Gm-Message-State: AOAM5337fiawq2Uz90mKh8m7dR990TfS5lyGGPaCNBbAEw+FjXEfNUNg tNhshLevxUc2gHnbq+5ZmAV5N5LVbK6tLoqG2X4FpNTFuWuNH4A8iqbs32Ymhh/Eu1SYM88B7SN sqLgbTxyus7UXvyR8ZQmobbFuIfpLxjG1NezIIQwNuA== X-Received: by 2002:a17:902:7ecf:: with SMTP id p15mr16062253plb.112.1643522283284; Sat, 29 Jan 2022 21:58:03 -0800 (PST) X-Google-Smtp-Source: ABdhPJze25i7lOWhbcg5vtvFPGJ65Xg5TNjcuy8VXrDi7Fo4OhgVyIvEojG+jiRqIIU87w3LXHcZZA== X-Received: by 2002:a17:902:7ecf:: with SMTP id p15mr16062224plb.112.1643522282891; Sat, 29 Jan 2022 21:58:02 -0800 (PST) Received: from [192.168.72.150] ([114.249.198.133]) by smtp.gmail.com with ESMTPSA id p16sm1171893pgj.79.2022.01.29.21.57.57 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 29 Jan 2022 21:58:01 -0800 (PST) Message-ID: Date: Sun, 30 Jan 2022 13:57:54 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:91.0) Gecko/20100101 Thunderbird/91.5.1 Subject: Re: [PATCH 23/31] vdpa: Add custom IOTLB translations to SVQ To: =?UTF-8?Q?Eugenio_P=c3=a9rez?= , qemu-devel@nongnu.org References: <20220121202733.404989-1-eperezma@redhat.com> <20220121202733.404989-24-eperezma@redhat.com> From: Jason Wang In-Reply-To: <20220121202733.404989-24-eperezma@redhat.com> Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=jasowang@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Cc: Laurent Vivier , Parav Pandit , Cindy Lu , "Michael S. Tsirkin" , Richard Henderson , Markus Armbruster , Gautam Dawar , virtualization@lists.linux-foundation.org, Eduardo Habkost , Harpreet Singh Anand , Xiao W Wang , Stefan Hajnoczi , Eli Cohen , Paolo Bonzini , Zhu Lingshan , Eric Blake 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-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: virtualization-bounces@lists.linux-foundation.org Sender: "Virtualization" CuWcqCAyMDIyLzEvMjIg5LiK5Y2INDoyNywgRXVnZW5pbyBQw6lyZXog5YaZ6YGTOgo+IFVzZSB0 cmFuc2xhdGlvbnMgYWRkZWQgaW4gVmhvc3RJT1ZBVHJlZSBpbiBTVlEuCj4KPiBPbmx5IGludHJv ZHVjZSB1c2FnZSBoZXJlLCBub3QgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uLiBBcyB3aXRo Cj4gcHJldmlvdXMgcGF0Y2hlcywgd2UgdXNlIHRoZSBkZWFkIGNvZGUgcGF0aHMgb2Ygc2hhZG93 X3Zxc19lbmFibGVkIHRvCj4gYXZvaWQgY29tbWl0aW5nIHRvbyBtYW55IGNoYW5nZXMgYXQgb25j ZS4gVGhlc2UgYXJlIGltcG9zc2libGUgdG8gdGFrZQo+IGF0IHRoZSBtb21lbnQuCj4KPiBTaWdu ZWQtb2ZmLWJ5OiBFdWdlbmlvIFDDqXJleiA8ZXBlcmV6bWFAcmVkaGF0LmNvbT4KPiAtLS0KPiAg IGh3L3ZpcnRpby92aG9zdC1zaGFkb3ctdmlydHF1ZXVlLmggfCAgIDMgKy0KPiAgIGluY2x1ZGUv aHcvdmlydGlvL3Zob3N0LXZkcGEuaCAgICAgfCAgIDMgKwo+ICAgaHcvdmlydGlvL3Zob3N0LXNo YWRvdy12aXJ0cXVldWUuYyB8IDExMSArKysrKysrKysrKysrKysrLS0tLQo+ICAgaHcvdmlydGlv L3Zob3N0LXZkcGEuYyAgICAgICAgICAgICB8IDE2MSArKysrKysrKysrKysrKysrKysrKysrKysr LS0tLQo+ICAgNCBmaWxlcyBjaGFuZ2VkLCAyMzggaW5zZXJ0aW9ucygrKSwgNDAgZGVsZXRpb25z KC0pCj4KPiBkaWZmIC0tZ2l0IGEvaHcvdmlydGlvL3Zob3N0LXNoYWRvdy12aXJ0cXVldWUuaCBi L2h3L3ZpcnRpby92aG9zdC1zaGFkb3ctdmlydHF1ZXVlLmgKPiBpbmRleCAxOWM5MzRhZjQ5Li5j NmY2N2Q2Zjc2IDEwMDY0NAo+IC0tLSBhL2h3L3ZpcnRpby92aG9zdC1zaGFkb3ctdmlydHF1ZXVl LmgKPiArKysgYi9ody92aXJ0aW8vdmhvc3Qtc2hhZG93LXZpcnRxdWV1ZS5oCj4gQEAgLTEyLDYg KzEyLDcgQEAKPiAgIAo+ICAgI2luY2x1ZGUgImh3L3ZpcnRpby92aG9zdC5oIgo+ICAgI2luY2x1 ZGUgInFlbXUvZXZlbnRfbm90aWZpZXIuaCIKPiArI2luY2x1ZGUgImh3L3ZpcnRpby92aG9zdC1p b3ZhLXRyZWUuaCIKPiAgIAo+ICAgdHlwZWRlZiBzdHJ1Y3QgVmhvc3RTaGFkb3dWaXJ0cXVldWUg Vmhvc3RTaGFkb3dWaXJ0cXVldWU7Cj4gICAKPiBAQCAtMzcsNyArMzgsNyBAQCB2b2lkIHZob3N0 X3N2cV9zdGFydChWaG9zdFNoYWRvd1ZpcnRxdWV1ZSAqc3ZxLCBWaXJ0SU9EZXZpY2UgKnZkZXYs Cj4gICAgICAgICAgICAgICAgICAgICAgICBWaXJ0UXVldWUgKnZxKTsKPiAgIHZvaWQgdmhvc3Rf c3ZxX3N0b3AoVmhvc3RTaGFkb3dWaXJ0cXVldWUgKnN2cSk7Cj4gICAKPiAtVmhvc3RTaGFkb3dW aXJ0cXVldWUgKnZob3N0X3N2cV9uZXcodWludDE2X3QgcXNpemUpOwo+ICtWaG9zdFNoYWRvd1Zp cnRxdWV1ZSAqdmhvc3Rfc3ZxX25ldyh1aW50MTZfdCBxc2l6ZSwgVmhvc3RJT1ZBVHJlZSAqaW92 YV9tYXApOwo+ICAgCj4gICB2b2lkIHZob3N0X3N2cV9mcmVlKFZob3N0U2hhZG93VmlydHF1ZXVl ICp2cSk7Cj4gICAKPiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9ody92aXJ0aW8vdmhvc3QtdmRwYS5o IGIvaW5jbHVkZS9ody92aXJ0aW8vdmhvc3QtdmRwYS5oCj4gaW5kZXggMDA5YTlmM2I2Yi4uY2Qy Mzg4YjNiZSAxMDA2NDQKPiAtLS0gYS9pbmNsdWRlL2h3L3ZpcnRpby92aG9zdC12ZHBhLmgKPiAr KysgYi9pbmNsdWRlL2h3L3ZpcnRpby92aG9zdC12ZHBhLmgKPiBAQCAtMTQsNiArMTQsNyBAQAo+ ICAgCj4gICAjaW5jbHVkZSA8Z21vZHVsZS5oPgo+ICAgCj4gKyNpbmNsdWRlICJody92aXJ0aW8v dmhvc3QtaW92YS10cmVlLmgiCj4gICAjaW5jbHVkZSAiaHcvdmlydGlvL3ZpcnRpby5oIgo+ICAg I2luY2x1ZGUgInN0YW5kYXJkLWhlYWRlcnMvbGludXgvdmhvc3RfdHlwZXMuaCIKPiAgIAo+IEBA IC0zMCw2ICszMSw4IEBAIHR5cGVkZWYgc3RydWN0IHZob3N0X3ZkcGEgewo+ICAgICAgIE1lbW9y eUxpc3RlbmVyIGxpc3RlbmVyOwo+ICAgICAgIHN0cnVjdCB2aG9zdF92ZHBhX2lvdmFfcmFuZ2Ug aW92YV9yYW5nZTsKPiAgICAgICBib29sIHNoYWRvd192cXNfZW5hYmxlZDsKPiArICAgIC8qIElP VkEgbWFwcGluZyB1c2VkIGJ5IFNoYWRvdyBWaXJ0cXVldWUgKi8KPiArICAgIFZob3N0SU9WQVRy ZWUgKmlvdmFfdHJlZTsKPiAgICAgICBHUHRyQXJyYXkgKnNoYWRvd192cXM7Cj4gICAgICAgc3Ry dWN0IHZob3N0X2RldiAqZGV2Owo+ICAgICAgIFZob3N0VkRQQUhvc3ROb3RpZmllciBub3RpZmll cltWSVJUSU9fUVVFVUVfTUFYXTsKPiBkaWZmIC0tZ2l0IGEvaHcvdmlydGlvL3Zob3N0LXNoYWRv dy12aXJ0cXVldWUuYyBiL2h3L3ZpcnRpby92aG9zdC1zaGFkb3ctdmlydHF1ZXVlLmMKPiBpbmRl eCBhMWE0MDRmNjhmLi5jNzg4OGViOGNmIDEwMDY0NAo+IC0tLSBhL2h3L3ZpcnRpby92aG9zdC1z aGFkb3ctdmlydHF1ZXVlLmMKPiArKysgYi9ody92aXJ0aW8vdmhvc3Qtc2hhZG93LXZpcnRxdWV1 ZS5jCj4gQEAgLTExLDYgKzExLDcgQEAKPiAgICNpbmNsdWRlICJody92aXJ0aW8vdmhvc3Qtc2hh ZG93LXZpcnRxdWV1ZS5oIgo+ICAgI2luY2x1ZGUgImh3L3ZpcnRpby92aG9zdC5oIgo+ICAgI2lu Y2x1ZGUgImh3L3ZpcnRpby92aXJ0aW8tYWNjZXNzLmgiCj4gKyNpbmNsdWRlICJody92aXJ0aW8v dmhvc3QtaW92YS10cmVlLmgiCj4gICAjaW5jbHVkZSAic3RhbmRhcmQtaGVhZGVycy9saW51eC92 aG9zdF90eXBlcy5oIgo+ICAgCj4gICAjaW5jbHVkZSAicWVtdS9lcnJvci1yZXBvcnQuaCIKPiBA QCAtNDUsNiArNDYsOSBAQCB0eXBlZGVmIHN0cnVjdCBWaG9zdFNoYWRvd1ZpcnRxdWV1ZSB7Cj4g ICAgICAgLyogVmlydGlvIGRldmljZSAqLwo+ICAgICAgIFZpcnRJT0RldmljZSAqdmRldjsKPiAg IAo+ICsgICAgLyogSU9WQSBtYXBwaW5nICovCj4gKyAgICBWaG9zdElPVkFUcmVlICppb3ZhX3Ry ZWU7Cj4gKwo+ICAgICAgIC8qIE1hcCBmb3IgcmV0dXJuaW5nIGd1ZXN0J3MgZGVzY3JpcHRvcnMg Ki8KPiAgICAgICBWaXJ0UXVldWVFbGVtZW50ICoqcmluZ19pZF9tYXBzOwo+ICAgCj4gQEAgLTk3 LDEzICsxMDEsNyBAQCBib29sIHZob3N0X3N2cV92YWxpZF9kZXZpY2VfZmVhdHVyZXModWludDY0 X3QgKmRldl9mZWF0dXJlcykKPiAgICAgICAgICAgICAgIGNvbnRpbnVlOwo+ICAgCj4gICAgICAg ICAgIGNhc2UgVklSVElPX0ZfQUNDRVNTX1BMQVRGT1JNOgo+IC0gICAgICAgICAgICAvKiBTVlEg ZG9lcyBub3Qga25vdyBob3cgdG8gdHJhbnNsYXRlIGFkZHJlc3NlcyAqLwo+IC0gICAgICAgICAg ICBpZiAoKmRldl9mZWF0dXJlcyAmIEJJVF9VTEwoYikpIHsKPiAtICAgICAgICAgICAgICAgIGNs ZWFyX2JpdChiLCBkZXZfZmVhdHVyZXMpOwo+IC0gICAgICAgICAgICAgICAgciA9IGZhbHNlOwo+ IC0gICAgICAgICAgICB9Cj4gLSAgICAgICAgICAgIGJyZWFrOwo+IC0KPiArICAgICAgICAgICAg LyogU1ZRIHRydXN0IGluIGhvc3QncyBJT01NVSB0byB0cmFuc2xhdGUgYWRkcmVzc2VzICovCj4g ICAgICAgICAgIGNhc2UgVklSVElPX0ZfVkVSU0lPTl8xOgo+ICAgICAgICAgICAgICAgLyogU1ZR IHRydXN0IHRoYXQgZ3Vlc3QgdnJpbmcgaXMgbGl0dGxlIGVuZGlhbiAqLwo+ICAgICAgICAgICAg ICAgaWYgKCEoKmRldl9mZWF0dXJlcyAmIEJJVF9VTEwoYikpKSB7Cj4gQEAgLTIwNSw3ICsyMDMs NTUgQEAgc3RhdGljIHZvaWQgdmhvc3Rfc3ZxX3NldF9ub3RpZmljYXRpb24oVmhvc3RTaGFkb3dW aXJ0cXVldWUgKnN2cSwgYm9vbCBlbmFibGUpCj4gICAgICAgfQo+ICAgfQo+ICAgCj4gKy8qKgo+ ICsgKiBUcmFuc2xhdGUgYWRkcmVzc2VzIGJldHdlZW4gcWVtdSdzIHZpcnR1YWwgYWRkcmVzcyBh bmQgU1ZRIElPVkEKPiArICoKPiArICogQHN2cSAgICBTaGFkb3cgVmlydFF1ZXVlCj4gKyAqIEB2 YWRkciAgVHJhbnNsYXRlZCBJT1ZBIGFkZHJlc3Nlcwo+ICsgKiBAaW92ZWMgIFNvdXJjZSBxZW11 J3MgVkEgYWRkcmVzc2VzCj4gKyAqIEBudW0gICAgTGVuZ3RoIG9mIGlvdmVjIGFuZCBtaW5pbXVt IGxlbmd0aCBvZiB2YWRkcgo+ICsgKi8KPiArc3RhdGljIGJvb2wgdmhvc3Rfc3ZxX3RyYW5zbGF0 ZV9hZGRyKGNvbnN0IFZob3N0U2hhZG93VmlydHF1ZXVlICpzdnEsCj4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqYWRkcnMsIGNvbnN0IHN0cnVjdCBpb3ZlYyAq aW92ZWMsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVt KQo+ICt7Cj4gKyAgICBzaXplX3QgaTsKPiArCj4gKyAgICBpZiAobnVtID09IDApIHsKPiArICAg ICAgICByZXR1cm4gdHJ1ZTsKPiArICAgIH0KPiArCj4gKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVt OyArK2kpIHsKPiArICAgICAgICBETUFNYXAgbmVlZGxlID0gewo+ICsgICAgICAgICAgICAudHJh bnNsYXRlZF9hZGRyID0gKGh3YWRkcilpb3ZlY1tpXS5pb3ZfYmFzZSwKPiArICAgICAgICAgICAg LnNpemUgPSBpb3ZlY1tpXS5pb3ZfbGVuLAo+ICsgICAgICAgIH07Cj4gKyAgICAgICAgc2l6ZV90 IG9mZjsKPiArCj4gKyAgICAgICAgY29uc3QgRE1BTWFwICptYXAgPSB2aG9zdF9pb3ZhX3RyZWVf ZmluZF9pb3ZhKHN2cS0+aW92YV90cmVlLCAmbmVlZGxlKTsKPiArICAgICAgICAvKgo+ICsgICAg ICAgICAqIE1hcCBjYW5ub3QgYmUgTlVMTCBzaW5jZSBpb3ZhIG1hcCBjb250YWlucyBhbGwgZ3Vl c3Qgc3BhY2UgYW5kCj4gKyAgICAgICAgICogcWVtdSBhbHJlYWR5IGhhcyBhIHBoeXNpY2FsIGFk ZHJlc3MgbWFwcGVkCj4gKyAgICAgICAgICovCj4gKyAgICAgICAgaWYgKHVubGlrZWx5KCFtYXAp KSB7Cj4gKyAgICAgICAgICAgIGVycm9yX3JlcG9ydCgiSW52YWxpZCBhZGRyZXNzIDB4JSJIV0FE RFJfUFJJeCIgZ2l2ZW4gYnkgZ3Vlc3QiLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgbmVl ZGxlLnRyYW5zbGF0ZWRfYWRkcik7CgoKVGhpcyBjYW4gYmUgdHJpZ2dlcmVkIGJ5IGd1ZXN0LCB3 ZSBuZWVkIHVzZSBvbmNlIG9yIGxvZ19ndWVzdF9lcnJvcigpIGV0Yy4KCgo+ICsgICAgICAgICAg ICByZXR1cm4gZmFsc2U7Cj4gKyAgICAgICAgfQo+ICsKPiArICAgICAgICAvKgo+ICsgICAgICAg ICAqIE1hcC0+aW92YSBjaHVuayBzaXplIGlzIGlnbm9yZWQuIFdoYXQgdG8gZG8gaWYgZGVzY3Jp cHRvcgo+ICsgICAgICAgICAqIChhZGRyLCBzaXplKSBkb2VzIG5vdCBmaXQgaXMgZGVsZWdhdGVk IHRvIHRoZSBkZXZpY2UuCj4gKyAgICAgICAgICovCgoKSSB0aGluayB3ZSBuZWVkIGF0IGxlYXN0 IGNoZWNrIHRoZSBzaXplIGFuZCBmYWlsIGlmIHRoZSBzaXplIGRvZXNuJ3QgCm1hdGNoIGhlcmUu IE9yIGlzIGl0IHBvc3NpYmxlIHRoYXQgd2UgaGF2ZSBhIGJ1ZmZlciB0aGF0IG1heSBjcm9zcyB0 d28gCm1lbW9yeSByZWdpb25zPwoKCj4gKyAgICAgICAgb2ZmID0gbmVlZGxlLnRyYW5zbGF0ZWRf YWRkciAtIG1hcC0+dHJhbnNsYXRlZF9hZGRyOwo+ICsgICAgICAgIGFkZHJzW2ldID0gKHZvaWQg KikobWFwLT5pb3ZhICsgb2ZmKTsKPiArICAgIH0KPiArCj4gKyAgICByZXR1cm4gdHJ1ZTsKPiAr fQo+ICsKPiAgIHN0YXRpYyB2b2lkIHZob3N0X3ZyaW5nX3dyaXRlX2Rlc2NzKFZob3N0U2hhZG93 VmlydHF1ZXVlICpzdnEsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZv aWQgKiBjb25zdCAqdmFkZHJfc2csCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdmVjLAo+ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgc2l6ZV90IG51bSwgYm9vbCBtb3JlX2Rlc2NzLCBib29sIHdyaXRlKQo+ ICAgewo+IEBAIC0yMjQsNyArMjcwLDcgQEAgc3RhdGljIHZvaWQgdmhvc3RfdnJpbmdfd3JpdGVf ZGVzY3MoVmhvc3RTaGFkb3dWaXJ0cXVldWUgKnN2cSwKPiAgICAgICAgICAgfSBlbHNlIHsKPiAg ICAgICAgICAgICAgIGRlc2NzW2ldLmZsYWdzID0gZmxhZ3M7Cj4gICAgICAgICAgIH0KPiAtICAg ICAgICBkZXNjc1tpXS5hZGRyID0gY3B1X3RvX2xlNjQoKGh3YWRkcilpb3ZlY1tuXS5pb3ZfYmFz ZSk7Cj4gKyAgICAgICAgZGVzY3NbaV0uYWRkciA9IGNwdV90b19sZTY0KChod2FkZHIpdmFkZHJf c2dbbl0pOwo+ICAgICAgICAgICBkZXNjc1tpXS5sZW4gPSBjcHVfdG9fbGUzMihpb3ZlY1tuXS5p b3ZfbGVuKTsKPiAgIAo+ICAgICAgICAgICBsYXN0ID0gaTsKPiBAQCAtMjM0LDQyICsyODAsNjAg QEAgc3RhdGljIHZvaWQgdmhvc3RfdnJpbmdfd3JpdGVfZGVzY3MoVmhvc3RTaGFkb3dWaXJ0cXVl dWUgKnN2cSwKPiAgICAgICBzdnEtPmZyZWVfaGVhZCA9IGxlMTZfdG9fY3B1KGRlc2NzW2xhc3Rd Lm5leHQpOwo+ICAgfQo+ICAgCj4gLXN0YXRpYyB1bnNpZ25lZCB2aG9zdF9zdnFfYWRkX3NwbGl0 KFZob3N0U2hhZG93VmlydHF1ZXVlICpzdnEsCj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFZpcnRRdWV1ZUVsZW1lbnQgKmVsZW0pCj4gK3N0YXRpYyBib29sIHZob3N0X3N2 cV9hZGRfc3BsaXQoVmhvc3RTaGFkb3dWaXJ0cXVldWUgKnN2cSwKPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBWaXJ0UXVldWVFbGVtZW50ICplbGVtLAo+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpoZWFkKQoKCkknZCBzdWdnZXN0IHRvIG1ha2Ug aXQgcmV0dXJucyBib29sIHNpbmNlIHRoZSBwYXRjaCB0aGF0IGludHJvZHVjZXMgdGhpcyAKZnVu Y3Rpb24uCgoKPiAgIHsKPiAtICAgIGludCBoZWFkOwo+ICAgICAgIHVuc2lnbmVkIGF2YWlsX2lk eDsKPiAgICAgICB2cmluZ19hdmFpbF90ICphdmFpbCA9IHN2cS0+dnJpbmcuYXZhaWw7Cj4gKyAg ICBib29sIG9rOwo+ICsgICAgZ19hdXRvZnJlZSB2b2lkICoqc2dzID0gZ19uZXcodm9pZCAqLCBN QVgoZWxlbS0+b3V0X251bSwgZWxlbS0+aW5fbnVtKSk7Cj4gICAKPiAtICAgIGhlYWQgPSBzdnEt PmZyZWVfaGVhZDsKPiArICAgICpoZWFkID0gc3ZxLT5mcmVlX2hlYWQ7Cj4gICAKPiAgICAgICAv KiBXZSBuZWVkIHNvbWUgZGVzY3JpcHRvcnMgaGVyZSAqLwo+ICAgICAgIGFzc2VydChlbGVtLT5v dXRfbnVtIHx8IGVsZW0tPmluX251bSk7Cj4gICAKPiAtICAgIHZob3N0X3ZyaW5nX3dyaXRlX2Rl c2NzKHN2cSwgZWxlbS0+b3V0X3NnLCBlbGVtLT5vdXRfbnVtLAo+ICsgICAgb2sgPSB2aG9zdF9z dnFfdHJhbnNsYXRlX2FkZHIoc3ZxLCBzZ3MsIGVsZW0tPm91dF9zZywgZWxlbS0+b3V0X251bSk7 Cj4gKyAgICBpZiAodW5saWtlbHkoIW9rKSkgewo+ICsgICAgICAgIHJldHVybiBmYWxzZTsKPiAr ICAgIH0KPiArICAgIHZob3N0X3ZyaW5nX3dyaXRlX2Rlc2NzKHN2cSwgc2dzLCBlbGVtLT5vdXRf c2csIGVsZW0tPm91dF9udW0sCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS0+ aW5fbnVtID4gMCwgZmFsc2UpOwo+IC0gICAgdmhvc3RfdnJpbmdfd3JpdGVfZGVzY3Moc3ZxLCBl bGVtLT5pbl9zZywgZWxlbS0+aW5fbnVtLCBmYWxzZSwgdHJ1ZSk7Cj4gKwo+ICsKPiArICAgIG9r ID0gdmhvc3Rfc3ZxX3RyYW5zbGF0ZV9hZGRyKHN2cSwgc2dzLCBlbGVtLT5pbl9zZywgZWxlbS0+ aW5fbnVtKTsKPiArICAgIGlmICh1bmxpa2VseSghb2spKSB7Cj4gKyAgICAgICAgcmV0dXJuIGZh bHNlOwo+ICsgICAgfQo+ICsKPiArICAgIHZob3N0X3ZyaW5nX3dyaXRlX2Rlc2NzKHN2cSwgc2dz LCBlbGVtLT5pbl9zZywgZWxlbS0+aW5fbnVtLCBmYWxzZSwgdHJ1ZSk7Cj4gICAKPiAgICAgICAv Kgo+ICAgICAgICAqIFB1dCBlbnRyeSBpbiBhdmFpbGFibGUgYXJyYXkgKGJ1dCBkb24ndCB1cGRh dGUgYXZhaWwtPmlkeCB1bnRpbCB0aGV5Cj4gICAgICAgICogZG8gc3luYykuCj4gICAgICAgICov Cj4gICAgICAgYXZhaWxfaWR4ID0gc3ZxLT5hdmFpbF9pZHhfc2hhZG93ICYgKHN2cS0+dnJpbmcu bnVtIC0gMSk7Cj4gLSAgICBhdmFpbC0+cmluZ1thdmFpbF9pZHhdID0gY3B1X3RvX2xlMTYoaGVh ZCk7Cj4gKyAgICBhdmFpbC0+cmluZ1thdmFpbF9pZHhdID0gY3B1X3RvX2xlMTYoKmhlYWQpOwo+ ICAgICAgIHN2cS0+YXZhaWxfaWR4X3NoYWRvdysrOwo+ICAgCj4gICAgICAgLyogVXBkYXRlIGF2 YWlsIGluZGV4IGFmdGVyIHRoZSBkZXNjcmlwdG9yIGlzIHdyb3RlICovCj4gICAgICAgc21wX3dt YigpOwo+ICAgICAgIGF2YWlsLT5pZHggPSBjcHVfdG9fbGUxNihzdnEtPmF2YWlsX2lkeF9zaGFk b3cpOwo+ICAgCj4gLSAgICByZXR1cm4gaGVhZDsKPiArICAgIHJldHVybiB0cnVlOwo+ICAgfQo+ ICAgCj4gLXN0YXRpYyB2b2lkIHZob3N0X3N2cV9hZGQoVmhvc3RTaGFkb3dWaXJ0cXVldWUgKnN2 cSwgVmlydFF1ZXVlRWxlbWVudCAqZWxlbSkKPiArc3RhdGljIGJvb2wgdmhvc3Rfc3ZxX2FkZChW aG9zdFNoYWRvd1ZpcnRxdWV1ZSAqc3ZxLCBWaXJ0UXVldWVFbGVtZW50ICplbGVtKQo+ICAgewo+ IC0gICAgdW5zaWduZWQgcWVtdV9oZWFkID0gdmhvc3Rfc3ZxX2FkZF9zcGxpdChzdnEsIGVsZW0p Owo+ICsgICAgdW5zaWduZWQgcWVtdV9oZWFkOwo+ICsgICAgYm9vbCBvayA9IHZob3N0X3N2cV9h ZGRfc3BsaXQoc3ZxLCBlbGVtLCAmcWVtdV9oZWFkKTsKPiArICAgIGlmICh1bmxpa2VseSghb2sp KSB7Cj4gKyAgICAgICAgcmV0dXJuIGZhbHNlOwo+ICsgICAgfQo+ICAgCj4gICAgICAgc3ZxLT5y aW5nX2lkX21hcHNbcWVtdV9oZWFkXSA9IGVsZW07Cj4gKyAgICByZXR1cm4gdHJ1ZTsKPiAgIH0K PiAgIAo+ICAgc3RhdGljIHZvaWQgdmhvc3Rfc3ZxX2tpY2soVmhvc3RTaGFkb3dWaXJ0cXVldWUg KnN2cSkKPiBAQCAtMzA5LDYgKzM3Myw3IEBAIHN0YXRpYyB2b2lkIHZob3N0X2hhbmRsZV9ndWVz dF9raWNrKFZob3N0U2hhZG93VmlydHF1ZXVlICpzdnEpCj4gICAKPiAgICAgICAgICAgd2hpbGUg KHRydWUpIHsKPiAgICAgICAgICAgICAgIFZpcnRRdWV1ZUVsZW1lbnQgKmVsZW07Cj4gKyAgICAg ICAgICAgIGJvb2wgb2s7Cj4gICAKPiAgICAgICAgICAgICAgIGlmIChzdnEtPm5leHRfZ3Vlc3Rf YXZhaWxfZWxlbSkgewo+ICAgICAgICAgICAgICAgICAgIGVsZW0gPSBnX3N0ZWFsX3BvaW50ZXIo JnN2cS0+bmV4dF9ndWVzdF9hdmFpbF9lbGVtKTsKPiBAQCAtMzM3LDcgKzQwMiwxMSBAQCBzdGF0 aWMgdm9pZCB2aG9zdF9oYW5kbGVfZ3Vlc3Rfa2ljayhWaG9zdFNoYWRvd1ZpcnRxdWV1ZSAqc3Zx KQo+ICAgICAgICAgICAgICAgICAgIHJldHVybjsKPiAgICAgICAgICAgICAgIH0KPiAgIAo+IC0g ICAgICAgICAgICB2aG9zdF9zdnFfYWRkKHN2cSwgZWxlbSk7Cj4gKyAgICAgICAgICAgIG9rID0g dmhvc3Rfc3ZxX2FkZChzdnEsIGVsZW0pOwo+ICsgICAgICAgICAgICBpZiAodW5saWtlbHkoIW9r KSkgewo+ICsgICAgICAgICAgICAgICAgLyogVlEgaXMgYnJva2VuLCBqdXN0IHJldHVybiBhbmQg aWdub3JlIGFueSBvdGhlciBraWNrcyAqLwo+ICsgICAgICAgICAgICAgICAgcmV0dXJuOwo+ICsg ICAgICAgICAgICB9Cj4gICAgICAgICAgICAgICB2aG9zdF9zdnFfa2ljayhzdnEpOwo+ICAgICAg ICAgICB9Cj4gICAKPiBAQCAtNjE5LDEyICs2ODgsMTMgQEAgdm9pZCB2aG9zdF9zdnFfc3RvcChW aG9zdFNoYWRvd1ZpcnRxdWV1ZSAqc3ZxKQo+ICAgICogbWV0aG9kcyBhbmQgZmlsZSBkZXNjcmlw dG9ycy4KPiAgICAqCj4gICAgKiBAcXNpemUgU2hhZG93IFZpcnRRdWV1ZSBzaXplCj4gKyAqIEBp b3ZhX3RyZWUgVHJlZSB0byBwZXJmb3JtIGRlc2NyaXB0b3JzIHRyYW5zbGF0aW9ucwo+ICAgICoK PiAgICAqIFJldHVybnMgdGhlIG5ldyB2aXJ0cXVldWUgb3IgTlVMTC4KPiAgICAqCj4gICAgKiBJ biBjYXNlIG9mIGVycm9yLCByZWFzb24gaXMgcmVwb3J0ZWQgdGhyb3VnaCBlcnJvcl9yZXBvcnQu Cj4gICAgKi8KPiAtVmhvc3RTaGFkb3dWaXJ0cXVldWUgKnZob3N0X3N2cV9uZXcodWludDE2X3Qg cXNpemUpCj4gK1Zob3N0U2hhZG93VmlydHF1ZXVlICp2aG9zdF9zdnFfbmV3KHVpbnQxNl90IHFz aXplLCBWaG9zdElPVkFUcmVlICppb3ZhX3RyZWUpCj4gICB7Cj4gICAgICAgc2l6ZV90IGRlc2Nf c2l6ZSA9IHNpemVvZih2cmluZ19kZXNjX3QpICogcXNpemU7Cj4gICAgICAgc2l6ZV90IGRldmlj ZV9zaXplLCBkcml2ZXJfc2l6ZTsKPiBAQCAtNjU2LDYgKzcyNiw3IEBAIFZob3N0U2hhZG93Vmly dHF1ZXVlICp2aG9zdF9zdnFfbmV3KHVpbnQxNl90IHFzaXplKQo+ICAgICAgIG1lbXNldChzdnEt PnZyaW5nLmRlc2MsIDAsIGRyaXZlcl9zaXplKTsKPiAgICAgICBzdnEtPnZyaW5nLnVzZWQgPSBx ZW11X21lbWFsaWduKHFlbXVfcmVhbF9ob3N0X3BhZ2Vfc2l6ZSwgZGV2aWNlX3NpemUpOwo+ICAg ICAgIG1lbXNldChzdnEtPnZyaW5nLnVzZWQsIDAsIGRldmljZV9zaXplKTsKPiArICAgIHN2cS0+ aW92YV90cmVlID0gaW92YV90cmVlOwo+ICAgICAgIHN2cS0+cmluZ19pZF9tYXBzID0gZ19uZXcw KFZpcnRRdWV1ZUVsZW1lbnQgKiwgcXNpemUpOwo+ICAgICAgIGV2ZW50X25vdGlmaWVyX3NldF9o YW5kbGVyKCZzdnEtPmhkZXZfY2FsbCwgdmhvc3Rfc3ZxX2hhbmRsZV9jYWxsKTsKPiAgICAgICBy ZXR1cm4gZ19zdGVhbF9wb2ludGVyKCZzdnEpOwo+IGRpZmYgLS1naXQgYS9ody92aXJ0aW8vdmhv c3QtdmRwYS5jIGIvaHcvdmlydGlvL3Zob3N0LXZkcGEuYwo+IGluZGV4IDBlNWMwMGVkN2UuLjI3 NmE1NTk2NDkgMTAwNjQ0Cj4gLS0tIGEvaHcvdmlydGlvL3Zob3N0LXZkcGEuYwo+ICsrKyBiL2h3 L3ZpcnRpby92aG9zdC12ZHBhLmMKPiBAQCAtMjA5LDYgKzIwOSwxOCBAQCBzdGF0aWMgdm9pZCB2 aG9zdF92ZHBhX2xpc3RlbmVyX3JlZ2lvbl9hZGQoTWVtb3J5TGlzdGVuZXIgKmxpc3RlbmVyLAo+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWRkciwgc2VjdGlv bi0+cmVhZG9ubHkpOwo+ICAgCj4gICAgICAgbGxzaXplID0gaW50MTI4X3N1YihsbGVuZCwgaW50 MTI4X21ha2U2NChpb3ZhKSk7Cj4gKyAgICBpZiAodi0+c2hhZG93X3Zxc19lbmFibGVkKSB7Cj4g KyAgICAgICAgRE1BTWFwIG1lbV9yZWdpb24gPSB7Cj4gKyAgICAgICAgICAgIC50cmFuc2xhdGVk X2FkZHIgPSAoaHdhZGRyKXZhZGRyLAo+ICsgICAgICAgICAgICAuc2l6ZSA9IGludDEyOF9nZXQ2 NChsbHNpemUpIC0gMSwKPiArICAgICAgICAgICAgLnBlcm0gPSBJT01NVV9BQ0NFU1NfRkxBRyh0 cnVlLCBzZWN0aW9uLT5yZWFkb25seSksCj4gKyAgICAgICAgfTsKPiArCj4gKyAgICAgICAgaW50 IHIgPSB2aG9zdF9pb3ZhX3RyZWVfbWFwX2FsbG9jKHYtPmlvdmFfdHJlZSwgJm1lbV9yZWdpb24p Owo+ICsgICAgICAgIGFzc2VydChyID09IElPVkFfT0spOwoKCkl0J3MgYmV0dGVyIHRvIGZhaWwg b3Igd2FybiBoZXJlLgoKCj4gKwo+ICsgICAgICAgIGlvdmEgPSBtZW1fcmVnaW9uLmlvdmE7Cj4g KyAgICB9Cj4gICAKPiAgICAgICB2aG9zdF92ZHBhX2lvdGxiX2JhdGNoX2JlZ2luX29uY2Uodik7 Cj4gICAgICAgcmV0ID0gdmhvc3RfdmRwYV9kbWFfbWFwKHYsIGlvdmEsIGludDEyOF9nZXQ2NChs bHNpemUpLAo+IEBAIC0yNjEsNiArMjczLDIwIEBAIHN0YXRpYyB2b2lkIHZob3N0X3ZkcGFfbGlz dGVuZXJfcmVnaW9uX2RlbChNZW1vcnlMaXN0ZW5lciAqbGlzdGVuZXIsCj4gICAKPiAgICAgICBs bHNpemUgPSBpbnQxMjhfc3ViKGxsZW5kLCBpbnQxMjhfbWFrZTY0KGlvdmEpKTsKPiAgIAo+ICsg ICAgaWYgKHYtPnNoYWRvd192cXNfZW5hYmxlZCkgewo+ICsgICAgICAgIGNvbnN0IERNQU1hcCAq cmVzdWx0Owo+ICsgICAgICAgIGNvbnN0IHZvaWQgKnZhZGRyID0gbWVtb3J5X3JlZ2lvbl9nZXRf cmFtX3B0cihzZWN0aW9uLT5tcikgKwo+ICsgICAgICAgICAgICBzZWN0aW9uLT5vZmZzZXRfd2l0 aGluX3JlZ2lvbiArCj4gKyAgICAgICAgICAgIChpb3ZhIC0gc2VjdGlvbi0+b2Zmc2V0X3dpdGhp bl9hZGRyZXNzX3NwYWNlKTsKPiArICAgICAgICBETUFNYXAgbWVtX3JlZ2lvbiA9IHsKPiArICAg ICAgICAgICAgLnRyYW5zbGF0ZWRfYWRkciA9IChod2FkZHIpdmFkZHIsCj4gKyAgICAgICAgICAg IC5zaXplID0gaW50MTI4X2dldDY0KGxsc2l6ZSkgLSAxLAo+ICsgICAgICAgIH07Cj4gKwo+ICsg ICAgICAgIHJlc3VsdCA9IHZob3N0X2lvdmFfdHJlZV9maW5kX2lvdmEodi0+aW92YV90cmVlLCAm bWVtX3JlZ2lvbik7Cj4gKyAgICAgICAgaW92YSA9IHJlc3VsdC0+aW92YTsKPiArICAgICAgICB2 aG9zdF9pb3ZhX3RyZWVfcmVtb3ZlKHYtPmlvdmFfdHJlZSwgJm1lbV9yZWdpb24pOwo+ICsgICAg fQo+ICAgICAgIHZob3N0X3ZkcGFfaW90bGJfYmF0Y2hfYmVnaW5fb25jZSh2KTsKPiAgICAgICBy ZXQgPSB2aG9zdF92ZHBhX2RtYV91bm1hcCh2LCBpb3ZhLCBpbnQxMjhfZ2V0NjQobGxzaXplKSk7 Cj4gICAgICAgaWYgKHJldCkgewo+IEBAIC03ODMsMzMgKzgwOSw3MCBAQCBzdGF0aWMgaW50IHZo b3N0X3ZkcGFfc3ZxX3NldF9mZHMoc3RydWN0IHZob3N0X2RldiAqZGV2LAo+ICAgLyoqCj4gICAg KiBVbm1hcCBTVlEgYXJlYSBpbiB0aGUgZGV2aWNlCj4gICAgKi8KPiAtc3RhdGljIGJvb2wgdmhv c3RfdmRwYV9zdnFfdW5tYXBfcmluZyhzdHJ1Y3Qgdmhvc3RfdmRwYSAqdiwgaHdhZGRyIGlvdmEs Cj4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHdhZGRyIHNpemUpCj4g K3N0YXRpYyBib29sIHZob3N0X3ZkcGFfc3ZxX3VubWFwX3Jpbmcoc3RydWN0IHZob3N0X3ZkcGEg KnYsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRE1BTWFw ICpuZWVkbGUpCj4gICB7Cj4gKyAgICBjb25zdCBETUFNYXAgKnJlc3VsdCA9IHZob3N0X2lvdmFf dHJlZV9maW5kX2lvdmEodi0+aW92YV90cmVlLCBuZWVkbGUpOwo+ICsgICAgaHdhZGRyIHNpemU7 Cj4gICAgICAgaW50IHI7Cj4gICAKPiAtICAgIHNpemUgPSBST1VORF9VUChzaXplLCBxZW11X3Jl YWxfaG9zdF9wYWdlX3NpemUpOwo+IC0gICAgciA9IHZob3N0X3ZkcGFfZG1hX3VubWFwKHYsIGlv dmEsIHNpemUpOwo+ICsgICAgaWYgKHVubGlrZWx5KCFyZXN1bHQpKSB7Cj4gKyAgICAgICAgZXJy b3JfcmVwb3J0KCJVbmFibGUgdG8gZmluZCBTVlEgYWRkcmVzcyB0byB1bm1hcCIpOwo+ICsgICAg ICAgIHJldHVybiBmYWxzZTsKPiArICAgIH0KPiArCj4gKyAgICBzaXplID0gUk9VTkRfVVAocmVz dWx0LT5zaXplLCBxZW11X3JlYWxfaG9zdF9wYWdlX3NpemUpOwo+ICsgICAgciA9IHZob3N0X3Zk cGFfZG1hX3VubWFwKHYsIHJlc3VsdC0+aW92YSwgc2l6ZSk7Cj4gICAgICAgcmV0dXJuIHIgPT0g MDsKPiAgIH0KPiAgIAo+ICAgc3RhdGljIGJvb2wgdmhvc3RfdmRwYV9zdnFfdW5tYXBfcmluZ3Mo c3RydWN0IHZob3N0X2RldiAqZGV2LAo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgY29uc3QgVmhvc3RTaGFkb3dWaXJ0cXVldWUgKnN2cSkKPiAgIHsKPiArICAgIERN QU1hcCBuZWVkbGU7Cj4gICAgICAgc3RydWN0IHZob3N0X3ZkcGEgKnYgPSBkZXYtPm9wYXF1ZTsK PiAgICAgICBzdHJ1Y3Qgdmhvc3RfdnJpbmdfYWRkciBzdnFfYWRkcjsKPiAtICAgIHNpemVfdCBk ZXZpY2Vfc2l6ZSA9IHZob3N0X3N2cV9kZXZpY2VfYXJlYV9zaXplKHN2cSk7Cj4gLSAgICBzaXpl X3QgZHJpdmVyX3NpemUgPSB2aG9zdF9zdnFfZHJpdmVyX2FyZWFfc2l6ZShzdnEpOwo+ICAgICAg IGJvb2wgb2s7Cj4gICAKPiAgICAgICB2aG9zdF9zdnFfZ2V0X3ZyaW5nX2FkZHIoc3ZxLCAmc3Zx X2FkZHIpOwo+ICAgCj4gLSAgICBvayA9IHZob3N0X3ZkcGFfc3ZxX3VubWFwX3Jpbmcodiwgc3Zx X2FkZHIuZGVzY191c2VyX2FkZHIsIGRyaXZlcl9zaXplKTsKPiArICAgIG5lZWRsZSA9IChETUFN YXApIHsKPiArICAgICAgICAudHJhbnNsYXRlZF9hZGRyID0gc3ZxX2FkZHIuZGVzY191c2VyX2Fk ZHIsCj4gKyAgICB9Owo+ICsgICAgb2sgPSB2aG9zdF92ZHBhX3N2cV91bm1hcF9yaW5nKHYsICZu ZWVkbGUpOwo+ICAgICAgIGlmICh1bmxpa2VseSghb2spKSB7Cj4gICAgICAgICAgIHJldHVybiBm YWxzZTsKPiAgICAgICB9Cj4gICAKPiAtICAgIHJldHVybiB2aG9zdF92ZHBhX3N2cV91bm1hcF9y aW5nKHYsIHN2cV9hZGRyLnVzZWRfdXNlcl9hZGRyLCBkZXZpY2Vfc2l6ZSk7Cj4gKyAgICBuZWVk bGUgPSAoRE1BTWFwKSB7Cj4gKyAgICAgICAgLnRyYW5zbGF0ZWRfYWRkciA9IHN2cV9hZGRyLnVz ZWRfdXNlcl9hZGRyLAo+ICsgICAgfTsKPiArICAgIHJldHVybiB2aG9zdF92ZHBhX3N2cV91bm1h cF9yaW5nKHYsICZuZWVkbGUpOwo+ICt9Cj4gKwo+ICsvKioKPiArICogTWFwIFNWUSBhcmVhIGlu IHRoZSBkZXZpY2UKPiArICoKPiArICogQHYgICAgICAgICAgVmhvc3QtdmRwYSBkZXZpY2UKPiAr ICogQG5lZWRsZSAgICAgVGhlIGFyZWEgdG8gc2VhcmNoIGlvdmEKPiArICogQHJlYWRvbmx5ICAg UGVybWlzc2lvbnMgb2YgdGhlIGFyZWEKPiArICovCj4gK3N0YXRpYyBib29sIHZob3N0X3ZkcGFf c3ZxX21hcF9yaW5nKHN0cnVjdCB2aG9zdF92ZHBhICp2LCBjb25zdCBETUFNYXAgKm5lZWRsZSwK PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWFkb25seSkKPiAr ewo+ICsgICAgaHdhZGRyIG9mZjsKPiArICAgIGNvbnN0IERNQU1hcCAqcmVzdWx0ID0gdmhvc3Rf aW92YV90cmVlX2ZpbmRfaW92YSh2LT5pb3ZhX3RyZWUsIG5lZWRsZSk7Cj4gKyAgICBpbnQgcjsK PiArCj4gKyAgICBpZiAodW5saWtlbHkoIXJlc3VsdCkpIHsKPiArICAgICAgICBlcnJvcl9yZXBv cnQoIkNhbid0IGxvY2F0ZSBTVlEgcmluZyIpOwo+ICsgICAgICAgIHJldHVybiBmYWxzZTsKPiAr ICAgIH0KPiArCj4gKyAgICBvZmYgPSBuZWVkbGUtPnRyYW5zbGF0ZWRfYWRkciAtIHJlc3VsdC0+ dHJhbnNsYXRlZF9hZGRyOwo+ICsgICAgciA9IHZob3N0X3ZkcGFfZG1hX21hcCh2LCByZXN1bHQt PmlvdmEgKyBvZmYsIG5lZWRsZS0+c2l6ZSwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg KHZvaWQgKiluZWVkbGUtPnRyYW5zbGF0ZWRfYWRkciwgcmVhZG9ubHkpOwo+ICsgICAgcmV0dXJu IHIgPT0gMDsKPiAgIH0KPiAgIAo+ICAgLyoqCj4gQEAgLTgyMSwyMyArODg0LDI5IEBAIHN0YXRp YyBib29sIHZob3N0X3ZkcGFfc3ZxX3VubWFwX3JpbmdzKHN0cnVjdCB2aG9zdF9kZXYgKmRldiwK PiAgIHN0YXRpYyBib29sIHZob3N0X3ZkcGFfc3ZxX21hcF9yaW5ncyhzdHJ1Y3Qgdmhvc3RfZGV2 ICpkZXYsCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmhv c3RTaGFkb3dWaXJ0cXVldWUgKnN2cSkKPiAgIHsKPiArICAgIERNQU1hcCBuZWVkbGU7Cj4gICAg ICAgc3RydWN0IHZob3N0X3ZkcGEgKnYgPSBkZXYtPm9wYXF1ZTsKPiAgICAgICBzdHJ1Y3Qgdmhv c3RfdnJpbmdfYWRkciBzdnFfYWRkcjsKPiAgICAgICBzaXplX3QgZGV2aWNlX3NpemUgPSB2aG9z dF9zdnFfZGV2aWNlX2FyZWFfc2l6ZShzdnEpOwo+ICAgICAgIHNpemVfdCBkcml2ZXJfc2l6ZSA9 IHZob3N0X3N2cV9kcml2ZXJfYXJlYV9zaXplKHN2cSk7Cj4gLSAgICBpbnQgcjsKPiArICAgIGJv b2wgb2s7Cj4gICAKPiAgICAgICB2aG9zdF9zdnFfZ2V0X3ZyaW5nX2FkZHIoc3ZxLCAmc3ZxX2Fk ZHIpOwo+ICAgCj4gLSAgICByID0gdmhvc3RfdmRwYV9kbWFfbWFwKHYsIHN2cV9hZGRyLmRlc2Nf dXNlcl9hZGRyLCBkcml2ZXJfc2l6ZSwKPiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZv aWQgKilzdnFfYWRkci5kZXNjX3VzZXJfYWRkciwgdHJ1ZSk7Cj4gLSAgICBpZiAodW5saWtlbHko ciAhPSAwKSkgewo+ICsgICAgbmVlZGxlID0gKERNQU1hcCkgewo+ICsgICAgICAgIC50cmFuc2xh dGVkX2FkZHIgPSBzdnFfYWRkci5kZXNjX3VzZXJfYWRkciwKPiArICAgICAgICAuc2l6ZSA9IGRy aXZlcl9zaXplLAo+ICsgICAgfTsKPiArICAgIG9rID0gdmhvc3RfdmRwYV9zdnFfbWFwX3Jpbmco diwgJm5lZWRsZSwgdHJ1ZSk7Cj4gKyAgICBpZiAodW5saWtlbHkoIW9rKSkgewo+ICAgICAgICAg ICByZXR1cm4gZmFsc2U7Cj4gICAgICAgfQo+ICAgCj4gLSAgICByID0gdmhvc3RfdmRwYV9kbWFf bWFwKHYsIHN2cV9hZGRyLnVzZWRfdXNlcl9hZGRyLCBkZXZpY2Vfc2l6ZSwKPiAtICAgICAgICAg ICAgICAgICAgICAgICAgICAgKHZvaWQgKilzdnFfYWRkci51c2VkX3VzZXJfYWRkciwgZmFsc2Up Owo+IC0gICAgcmV0dXJuIHIgPT0gMDsKPiArICAgIG5lZWRsZSA9IChETUFNYXApIHsKPiArICAg ICAgICAudHJhbnNsYXRlZF9hZGRyID0gc3ZxX2FkZHIudXNlZF91c2VyX2FkZHIsCj4gKyAgICAg ICAgLnNpemUgPSBkZXZpY2Vfc2l6ZSwKPiArICAgIH07Cj4gKyAgICByZXR1cm4gdmhvc3RfdmRw YV9zdnFfbWFwX3JpbmcodiwgJm5lZWRsZSwgZmFsc2UpOwo+ICAgfQo+ICAgCj4gICBzdGF0aWMg Ym9vbCB2aG9zdF92ZHBhX3N2cV9zZXR1cChzdHJ1Y3Qgdmhvc3RfZGV2ICpkZXYsCj4gQEAgLTEw MDYsNiArMTA3NSwyMyBAQCBzdGF0aWMgaW50IHZob3N0X3ZkcGFfc2V0X293bmVyKHN0cnVjdCB2 aG9zdF9kZXYgKmRldikKPiAgICAgICByZXR1cm4gdmhvc3RfdmRwYV9jYWxsKGRldiwgVkhPU1Rf U0VUX09XTkVSLCBOVUxMKTsKPiAgIH0KPiAgIAo+ICtzdGF0aWMgYm9vbCB2aG9zdF92ZHBhX3N2 cV9nZXRfdnFfcmVnaW9uKHN0cnVjdCB2aG9zdF92ZHBhICp2LAo+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBhZGRyLAo+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90ICppb3ZhX2FkZHIp Cj4gK3sKPiArICAgIGNvbnN0IERNQU1hcCBuZWVkbGUgPSB7Cj4gKyAgICAgICAgLnRyYW5zbGF0 ZWRfYWRkciA9IGFkZHIsCj4gKyAgICB9Owo+ICsgICAgY29uc3QgRE1BTWFwICp0cmFuc2xhdGlv biA9IHZob3N0X2lvdmFfdHJlZV9maW5kX2lvdmEodi0+aW92YV90cmVlLAo+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5lZWRsZSk7 Cj4gKyAgICBpZiAoIXRyYW5zbGF0aW9uKSB7Cj4gKyAgICAgICAgcmV0dXJuIGZhbHNlOwo+ICsg ICAgfQo+ICsKPiArICAgICppb3ZhX2FkZHIgPSB0cmFuc2xhdGlvbi0+aW92YSArIChhZGRyIC0g dHJhbnNsYXRpb24tPnRyYW5zbGF0ZWRfYWRkcik7Cj4gKyAgICByZXR1cm4gdHJ1ZTsKPiArfQo+ ICsKPiAgIHN0YXRpYyB2b2lkIHZob3N0X3ZkcGFfdnFfZ2V0X2d1ZXN0X2FkZHIoc3RydWN0IHZo b3N0X3ZyaW5nX2FkZHIgKmFkZHIsCj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHN0cnVjdCB2aG9zdF92aXJ0cXVldWUgKnZxKQo+ICAgewo+IEBAIC0xMDIzLDEw ICsxMTA5LDIzIEBAIHN0YXRpYyBpbnQgdmhvc3RfdmRwYV92cV9nZXRfYWRkcihzdHJ1Y3Qgdmhv c3RfZGV2ICpkZXYsCj4gICAgICAgYXNzZXJ0KGRldi0+dmhvc3Rfb3BzLT5iYWNrZW5kX3R5cGUg PT0gVkhPU1RfQkFDS0VORF9UWVBFX1ZEUEEpOwo+ICAgCj4gICAgICAgaWYgKHYtPnNoYWRvd192 cXNfZW5hYmxlZCkgewo+ICsgICAgICAgIHN0cnVjdCB2aG9zdF92cmluZ19hZGRyIHN2cV9hZGRy Owo+ICAgICAgICAgICBpbnQgaWR4ID0gdmhvc3RfdmRwYV9nZXRfdnFfaW5kZXgoZGV2LCBhZGRy LT5pbmRleCk7Cj4gICAgICAgICAgIFZob3N0U2hhZG93VmlydHF1ZXVlICpzdnEgPSBnX3B0cl9h cnJheV9pbmRleCh2LT5zaGFkb3dfdnFzLCBpZHgpOwo+ICAgCj4gLSAgICAgICAgdmhvc3Rfc3Zx X2dldF92cmluZ19hZGRyKHN2cSwgYWRkcik7Cj4gKyAgICAgICAgdmhvc3Rfc3ZxX2dldF92cmlu Z19hZGRyKHN2cSwgJnN2cV9hZGRyKTsKPiArICAgICAgICBpZiAoIXZob3N0X3ZkcGFfc3ZxX2dl dF92cV9yZWdpb24odiwgc3ZxX2FkZHIuZGVzY191c2VyX2FkZHIsCj4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZGRyLT5kZXNjX3VzZXJfYWRkcikpIHsKPiAr ICAgICAgICAgICAgcmV0dXJuIC0xOwo+ICsgICAgICAgIH0KPiArICAgICAgICBpZiAoIXZob3N0 X3ZkcGFfc3ZxX2dldF92cV9yZWdpb24odiwgc3ZxX2FkZHIuYXZhaWxfdXNlcl9hZGRyLAo+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWRkci0+YXZhaWxfdXNl cl9hZGRyKSkgewo+ICsgICAgICAgICAgICByZXR1cm4gLTE7Cj4gKyAgICAgICAgfQo+ICsgICAg ICAgIGlmICghdmhvc3RfdmRwYV9zdnFfZ2V0X3ZxX3JlZ2lvbih2LCBzdnFfYWRkci51c2VkX3Vz ZXJfYWRkciwKPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFk ZHItPnVzZWRfdXNlcl9hZGRyKSkgewo+ICsgICAgICAgICAgICByZXR1cm4gLTE7Cj4gKyAgICAg ICAgfQo+ICAgICAgIH0gZWxzZSB7Cj4gICAgICAgICAgIHZob3N0X3ZkcGFfdnFfZ2V0X2d1ZXN0 X2FkZHIoYWRkciwgdnEpOwo+ICAgICAgIH0KPiBAQCAtMTA5NSwxMyArMTE5NCwzNyBAQCBzdGF0 aWMgaW50IHZob3N0X3ZkcGFfaW5pdF9zdnEoc3RydWN0IHZob3N0X2RldiAqaGRldiwgc3RydWN0 IHZob3N0X3ZkcGEgKnYsCj4gICAKPiAgICAgICBzaGFkb3dfdnFzID0gZ19wdHJfYXJyYXlfbmV3 X2Z1bGwoaGRldi0+bnZxcywgdmhvc3RfcHN2cV9mcmVlKTsKPiAgICAgICBmb3IgKHVuc2lnbmVk IG4gPSAwOyBuIDwgaGRldi0+bnZxczsgKytuKSB7Cj4gLSAgICAgICAgVmhvc3RTaGFkb3dWaXJ0 cXVldWUgKnN2cSA9IHZob3N0X3N2cV9uZXcocXNpemUpOwo+IC0KPiArICAgICAgICBETUFNYXAg ZGV2aWNlX3JlZ2lvbiwgZHJpdmVyX3JlZ2lvbjsKPiArICAgICAgICBzdHJ1Y3Qgdmhvc3RfdnJp bmdfYWRkciBhZGRyOwo+ICsgICAgICAgIFZob3N0U2hhZG93VmlydHF1ZXVlICpzdnEgPSB2aG9z dF9zdnFfbmV3KHFzaXplLCB2LT5pb3ZhX3RyZWUpOwo+ICAgICAgICAgICBpZiAodW5saWtlbHko IXN2cSkpIHsKPiAgICAgICAgICAgICAgIGVycm9yX3NldGcoZXJycCwgIkNhbm5vdCBjcmVhdGUg c3ZxICV1Iiwgbik7Cj4gICAgICAgICAgICAgICByZXR1cm4gLTE7Cj4gICAgICAgICAgIH0KPiAt ICAgICAgICBnX3B0cl9hcnJheV9hZGQodi0+c2hhZG93X3Zxcywgc3ZxKTsKPiArCj4gKyAgICAg ICAgdmhvc3Rfc3ZxX2dldF92cmluZ19hZGRyKHN2cSwgJmFkZHIpOwo+ICsgICAgICAgIGRyaXZl cl9yZWdpb24gPSAoRE1BTWFwKSB7Cj4gKyAgICAgICAgICAgIC50cmFuc2xhdGVkX2FkZHIgPSAo aHdhZGRyKWFkZHIuZGVzY191c2VyX2FkZHIsCj4gKwo+ICsgICAgICAgICAgICAvKgo+ICsgICAg ICAgICAgICAgKiBETUFNQXAuc2l6ZSBpbmNsdWRlIHRoZSBsYXN0IGJ5dGUgaW5jbHVkZWQgaW4g dGhlIHJhbmdlLCB3aGlsZQo+ICsgICAgICAgICAgICAgKiBzaXplb2YgbWFya3Mgb25lIHBhc3Qg aXQuIFN1YnN0cmFjdCBvbmUgYnl0ZSB0byBtYWtlIHRoZW0gbWF0Y2guCj4gKyAgICAgICAgICAg ICAqLwo+ICsgICAgICAgICAgICAuc2l6ZSA9IHZob3N0X3N2cV9kcml2ZXJfYXJlYV9zaXplKHN2 cSkgLSAxLAo+ICsgICAgICAgICAgICAucGVybSA9IFZIT1NUX0FDQ0VTU19STywKPiArICAgICAg ICB9Owo+ICsgICAgICAgIGRldmljZV9yZWdpb24gPSAoRE1BTWFwKSB7Cj4gKyAgICAgICAgICAg IC50cmFuc2xhdGVkX2FkZHIgPSAoaHdhZGRyKWFkZHIudXNlZF91c2VyX2FkZHIsCj4gKyAgICAg ICAgICAgIC5zaXplID0gdmhvc3Rfc3ZxX2RldmljZV9hcmVhX3NpemUoc3ZxKSAtIDEsCj4gKyAg ICAgICAgICAgIC5wZXJtID0gVkhPU1RfQUNDRVNTX1JXLAo+ICsgICAgICAgIH07Cj4gKwo+ICsg ICAgICAgIHIgPSB2aG9zdF9pb3ZhX3RyZWVfbWFwX2FsbG9jKHYtPmlvdmFfdHJlZSwgJmRyaXZl cl9yZWdpb24pOwo+ICsgICAgICAgIGFzc2VydChyID09IElPVkFfT0spOwoKCkxldCdzIGZhaWwg aW5zdGVhZCBvZiBhc3NlcnQgaGVyZS4KClRoYW5rcwoKCj4gKyAgICAgICAgciA9IHZob3N0X2lv dmFfdHJlZV9tYXBfYWxsb2Modi0+aW92YV90cmVlLCAmZGV2aWNlX3JlZ2lvbik7Cj4gKyAgICAg ICAgYXNzZXJ0KHIgPT0gSU9WQV9PSyk7Cj4gKwo+ICsgICAgICAgIGdfcHRyX2FycmF5X2FkZChz aGFkb3dfdnFzLCBzdnEpOwo+ICAgICAgIH0KPiAgIAo+ICAgb3V0OgoKX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KVmlydHVhbGl6YXRpb24gbWFpbGluZyBs aXN0ClZpcnR1YWxpemF0aW9uQGxpc3RzLmxpbnV4LWZvdW5kYXRpb24ub3JnCmh0dHBzOi8vbGlz dHMubGludXhmb3VuZGF0aW9uLm9yZy9tYWlsbWFuL2xpc3RpbmZvL3ZpcnR1YWxpemF0aW9u 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 lists.gnu.org (lists.gnu.org [209.51.188.17]) (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 4322FC433F5 for ; Sun, 30 Jan 2022 06:01:49 +0000 (UTC) Received: from localhost ([::1]:40318 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1nE3HX-0002Ms-LR for qemu-devel@archiver.kernel.org; Sun, 30 Jan 2022 01:01:47 -0500 Received: from eggs.gnu.org ([209.51.188.92]:57684) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nE3E3-0000mx-7Z for qemu-devel@nongnu.org; Sun, 30 Jan 2022 00:58:11 -0500 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:34885) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1nE3Dy-0003cq-LL for qemu-devel@nongnu.org; Sun, 30 Jan 2022 00:58:08 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1643522286; 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=Wo8jU5htwKnHyMET1V1N4qHSxP3dzjG81gz/TNRkDrc=; b=jMk6kU1Ez7+CIT2jAN+kxYyIEqyW7JEhtB2ki6Ezs1PmBzgt5BYMUu+w54asNyIRv28FDI NV9/OSfoOKceQfz5eURjfbXrvoDYWdCleAgTyqRCnRGKzO7WNwt1zMtTGHYgIRQ/P31F0d Atl3vlocrcpLDG594D4OJIlvd5OZXIM= Received: from mail-pj1-f69.google.com (mail-pj1-f69.google.com [209.85.216.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-32-ealSXW3NN7GQSOhmKJSVjw-1; Sun, 30 Jan 2022 00:58:04 -0500 X-MC-Unique: ealSXW3NN7GQSOhmKJSVjw-1 Received: by mail-pj1-f69.google.com with SMTP id w15-20020a17090aea0f00b001b53b829d6bso5678700pjy.5 for ; Sat, 29 Jan 2022 21:58:04 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:subject :content-language:to:cc:references:from:in-reply-to :content-transfer-encoding; bh=Wo8jU5htwKnHyMET1V1N4qHSxP3dzjG81gz/TNRkDrc=; b=SIiaHfit10gGATwdBPo+MNSnVLWPu3/6adVKq4Yu98rL9i4IZlm9414pw6+ehHq4Ig 2Gt0Q6EyMwjbBKjjiThiHhp++jHkLUpD2RqvpvBsL8/zIeHXy/v4nKwDTVhiTaAQe5/g ay0kdFpjRmm58p23anRdzf+O+6ry6sczYAUbSZStUNU+cxHbNxsv+bxfJwTLGTP5tkYu l4Hm8kQkgy8ls2bUJLls4v7VxhRTAJpfBl+b4n/0fFj3dVD8dSTC6vJxb2szrMIJJc/v aBBDNQdqaPUs6wACBl9YyMVS/Hh0d6vLJHonkWibGwTGJzrS0FHpR+yJjHmwSn2ZuYz+ rqvA== X-Gm-Message-State: AOAM532fYnu8EyEWMcJj8OsEwZ9sputV9VRmtouqrqncn0QPCl5yCGYC BJg7uBghgO87QXqDwYF+FBNNa9X6Inj7h4LfC2UNfGWuevG+X6oJashx4A3W2628g/OyVD+Eusj 8CxAxXuraJ4pZvO0= X-Received: by 2002:a17:902:7ecf:: with SMTP id p15mr16062256plb.112.1643522283322; Sat, 29 Jan 2022 21:58:03 -0800 (PST) X-Google-Smtp-Source: ABdhPJze25i7lOWhbcg5vtvFPGJ65Xg5TNjcuy8VXrDi7Fo4OhgVyIvEojG+jiRqIIU87w3LXHcZZA== X-Received: by 2002:a17:902:7ecf:: with SMTP id p15mr16062224plb.112.1643522282891; Sat, 29 Jan 2022 21:58:02 -0800 (PST) Received: from [192.168.72.150] ([114.249.198.133]) by smtp.gmail.com with ESMTPSA id p16sm1171893pgj.79.2022.01.29.21.57.57 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 29 Jan 2022 21:58:01 -0800 (PST) Message-ID: Date: Sun, 30 Jan 2022 13:57:54 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:91.0) Gecko/20100101 Thunderbird/91.5.1 Subject: Re: [PATCH 23/31] vdpa: Add custom IOTLB translations to SVQ To: =?UTF-8?Q?Eugenio_P=c3=a9rez?= , qemu-devel@nongnu.org References: <20220121202733.404989-1-eperezma@redhat.com> <20220121202733.404989-24-eperezma@redhat.com> From: Jason Wang In-Reply-To: <20220121202733.404989-24-eperezma@redhat.com> Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=jasowang@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Received-SPF: pass client-ip=170.10.133.124; envelope-from=jasowang@redhat.com; helo=us-smtp-delivery-124.mimecast.com X-Spam_score_int: -29 X-Spam_score: -3.0 X-Spam_bar: --- X-Spam_report: (-3.0 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.167, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, NICE_REPLY_A=-0.001, RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_MSPIKE_H2=-0.001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Laurent Vivier , Parav Pandit , Cindy Lu , "Michael S. Tsirkin" , Juan Quintela , Richard Henderson , Markus Armbruster , Gautam Dawar , virtualization@lists.linux-foundation.org, Eduardo Habkost , Harpreet Singh Anand , Xiao W Wang , Peter Xu , Stefan Hajnoczi , Eli Cohen , Paolo Bonzini , Zhu Lingshan , Eric Blake , Stefano Garzarella Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" 在 2022/1/22 上午4:27, Eugenio Pérez 写道: > Use translations added in VhostIOVATree in SVQ. > > Only introduce usage here, not allocation and deallocation. As with > previous patches, we use the dead code paths of shadow_vqs_enabled to > avoid commiting too many changes at once. These are impossible to take > at the moment. > > Signed-off-by: Eugenio Pérez > --- > hw/virtio/vhost-shadow-virtqueue.h | 3 +- > include/hw/virtio/vhost-vdpa.h | 3 + > hw/virtio/vhost-shadow-virtqueue.c | 111 ++++++++++++++++---- > hw/virtio/vhost-vdpa.c | 161 +++++++++++++++++++++++++---- > 4 files changed, 238 insertions(+), 40 deletions(-) > > diff --git a/hw/virtio/vhost-shadow-virtqueue.h b/hw/virtio/vhost-shadow-virtqueue.h > index 19c934af49..c6f67d6f76 100644 > --- a/hw/virtio/vhost-shadow-virtqueue.h > +++ b/hw/virtio/vhost-shadow-virtqueue.h > @@ -12,6 +12,7 @@ > > #include "hw/virtio/vhost.h" > #include "qemu/event_notifier.h" > +#include "hw/virtio/vhost-iova-tree.h" > > typedef struct VhostShadowVirtqueue VhostShadowVirtqueue; > > @@ -37,7 +38,7 @@ void vhost_svq_start(VhostShadowVirtqueue *svq, VirtIODevice *vdev, > VirtQueue *vq); > void vhost_svq_stop(VhostShadowVirtqueue *svq); > > -VhostShadowVirtqueue *vhost_svq_new(uint16_t qsize); > +VhostShadowVirtqueue *vhost_svq_new(uint16_t qsize, VhostIOVATree *iova_map); > > void vhost_svq_free(VhostShadowVirtqueue *vq); > > diff --git a/include/hw/virtio/vhost-vdpa.h b/include/hw/virtio/vhost-vdpa.h > index 009a9f3b6b..cd2388b3be 100644 > --- a/include/hw/virtio/vhost-vdpa.h > +++ b/include/hw/virtio/vhost-vdpa.h > @@ -14,6 +14,7 @@ > > #include > > +#include "hw/virtio/vhost-iova-tree.h" > #include "hw/virtio/virtio.h" > #include "standard-headers/linux/vhost_types.h" > > @@ -30,6 +31,8 @@ typedef struct vhost_vdpa { > MemoryListener listener; > struct vhost_vdpa_iova_range iova_range; > bool shadow_vqs_enabled; > + /* IOVA mapping used by Shadow Virtqueue */ > + VhostIOVATree *iova_tree; > GPtrArray *shadow_vqs; > struct vhost_dev *dev; > VhostVDPAHostNotifier notifier[VIRTIO_QUEUE_MAX]; > diff --git a/hw/virtio/vhost-shadow-virtqueue.c b/hw/virtio/vhost-shadow-virtqueue.c > index a1a404f68f..c7888eb8cf 100644 > --- a/hw/virtio/vhost-shadow-virtqueue.c > +++ b/hw/virtio/vhost-shadow-virtqueue.c > @@ -11,6 +11,7 @@ > #include "hw/virtio/vhost-shadow-virtqueue.h" > #include "hw/virtio/vhost.h" > #include "hw/virtio/virtio-access.h" > +#include "hw/virtio/vhost-iova-tree.h" > #include "standard-headers/linux/vhost_types.h" > > #include "qemu/error-report.h" > @@ -45,6 +46,9 @@ typedef struct VhostShadowVirtqueue { > /* Virtio device */ > VirtIODevice *vdev; > > + /* IOVA mapping */ > + VhostIOVATree *iova_tree; > + > /* Map for returning guest's descriptors */ > VirtQueueElement **ring_id_maps; > > @@ -97,13 +101,7 @@ bool vhost_svq_valid_device_features(uint64_t *dev_features) > continue; > > case VIRTIO_F_ACCESS_PLATFORM: > - /* SVQ does not know how to translate addresses */ > - if (*dev_features & BIT_ULL(b)) { > - clear_bit(b, dev_features); > - r = false; > - } > - break; > - > + /* SVQ trust in host's IOMMU to translate addresses */ > case VIRTIO_F_VERSION_1: > /* SVQ trust that guest vring is little endian */ > if (!(*dev_features & BIT_ULL(b))) { > @@ -205,7 +203,55 @@ static void vhost_svq_set_notification(VhostShadowVirtqueue *svq, bool enable) > } > } > > +/** > + * Translate addresses between qemu's virtual address and SVQ IOVA > + * > + * @svq Shadow VirtQueue > + * @vaddr Translated IOVA addresses > + * @iovec Source qemu's VA addresses > + * @num Length of iovec and minimum length of vaddr > + */ > +static bool vhost_svq_translate_addr(const VhostShadowVirtqueue *svq, > + void **addrs, const struct iovec *iovec, > + size_t num) > +{ > + size_t i; > + > + if (num == 0) { > + return true; > + } > + > + for (i = 0; i < num; ++i) { > + DMAMap needle = { > + .translated_addr = (hwaddr)iovec[i].iov_base, > + .size = iovec[i].iov_len, > + }; > + size_t off; > + > + const DMAMap *map = vhost_iova_tree_find_iova(svq->iova_tree, &needle); > + /* > + * Map cannot be NULL since iova map contains all guest space and > + * qemu already has a physical address mapped > + */ > + if (unlikely(!map)) { > + error_report("Invalid address 0x%"HWADDR_PRIx" given by guest", > + needle.translated_addr); This can be triggered by guest, we need use once or log_guest_error() etc. > + return false; > + } > + > + /* > + * Map->iova chunk size is ignored. What to do if descriptor > + * (addr, size) does not fit is delegated to the device. > + */ I think we need at least check the size and fail if the size doesn't match here. Or is it possible that we have a buffer that may cross two memory regions? > + off = needle.translated_addr - map->translated_addr; > + addrs[i] = (void *)(map->iova + off); > + } > + > + return true; > +} > + > static void vhost_vring_write_descs(VhostShadowVirtqueue *svq, > + void * const *vaddr_sg, > const struct iovec *iovec, > size_t num, bool more_descs, bool write) > { > @@ -224,7 +270,7 @@ static void vhost_vring_write_descs(VhostShadowVirtqueue *svq, > } else { > descs[i].flags = flags; > } > - descs[i].addr = cpu_to_le64((hwaddr)iovec[n].iov_base); > + descs[i].addr = cpu_to_le64((hwaddr)vaddr_sg[n]); > descs[i].len = cpu_to_le32(iovec[n].iov_len); > > last = i; > @@ -234,42 +280,60 @@ static void vhost_vring_write_descs(VhostShadowVirtqueue *svq, > svq->free_head = le16_to_cpu(descs[last].next); > } > > -static unsigned vhost_svq_add_split(VhostShadowVirtqueue *svq, > - VirtQueueElement *elem) > +static bool vhost_svq_add_split(VhostShadowVirtqueue *svq, > + VirtQueueElement *elem, > + unsigned *head) I'd suggest to make it returns bool since the patch that introduces this function. > { > - int head; > unsigned avail_idx; > vring_avail_t *avail = svq->vring.avail; > + bool ok; > + g_autofree void **sgs = g_new(void *, MAX(elem->out_num, elem->in_num)); > > - head = svq->free_head; > + *head = svq->free_head; > > /* We need some descriptors here */ > assert(elem->out_num || elem->in_num); > > - vhost_vring_write_descs(svq, elem->out_sg, elem->out_num, > + ok = vhost_svq_translate_addr(svq, sgs, elem->out_sg, elem->out_num); > + if (unlikely(!ok)) { > + return false; > + } > + vhost_vring_write_descs(svq, sgs, elem->out_sg, elem->out_num, > elem->in_num > 0, false); > - vhost_vring_write_descs(svq, elem->in_sg, elem->in_num, false, true); > + > + > + ok = vhost_svq_translate_addr(svq, sgs, elem->in_sg, elem->in_num); > + if (unlikely(!ok)) { > + return false; > + } > + > + vhost_vring_write_descs(svq, sgs, elem->in_sg, elem->in_num, false, true); > > /* > * Put entry in available array (but don't update avail->idx until they > * do sync). > */ > avail_idx = svq->avail_idx_shadow & (svq->vring.num - 1); > - avail->ring[avail_idx] = cpu_to_le16(head); > + avail->ring[avail_idx] = cpu_to_le16(*head); > svq->avail_idx_shadow++; > > /* Update avail index after the descriptor is wrote */ > smp_wmb(); > avail->idx = cpu_to_le16(svq->avail_idx_shadow); > > - return head; > + return true; > } > > -static void vhost_svq_add(VhostShadowVirtqueue *svq, VirtQueueElement *elem) > +static bool vhost_svq_add(VhostShadowVirtqueue *svq, VirtQueueElement *elem) > { > - unsigned qemu_head = vhost_svq_add_split(svq, elem); > + unsigned qemu_head; > + bool ok = vhost_svq_add_split(svq, elem, &qemu_head); > + if (unlikely(!ok)) { > + return false; > + } > > svq->ring_id_maps[qemu_head] = elem; > + return true; > } > > static void vhost_svq_kick(VhostShadowVirtqueue *svq) > @@ -309,6 +373,7 @@ static void vhost_handle_guest_kick(VhostShadowVirtqueue *svq) > > while (true) { > VirtQueueElement *elem; > + bool ok; > > if (svq->next_guest_avail_elem) { > elem = g_steal_pointer(&svq->next_guest_avail_elem); > @@ -337,7 +402,11 @@ static void vhost_handle_guest_kick(VhostShadowVirtqueue *svq) > return; > } > > - vhost_svq_add(svq, elem); > + ok = vhost_svq_add(svq, elem); > + if (unlikely(!ok)) { > + /* VQ is broken, just return and ignore any other kicks */ > + return; > + } > vhost_svq_kick(svq); > } > > @@ -619,12 +688,13 @@ void vhost_svq_stop(VhostShadowVirtqueue *svq) > * methods and file descriptors. > * > * @qsize Shadow VirtQueue size > + * @iova_tree Tree to perform descriptors translations > * > * Returns the new virtqueue or NULL. > * > * In case of error, reason is reported through error_report. > */ > -VhostShadowVirtqueue *vhost_svq_new(uint16_t qsize) > +VhostShadowVirtqueue *vhost_svq_new(uint16_t qsize, VhostIOVATree *iova_tree) > { > size_t desc_size = sizeof(vring_desc_t) * qsize; > size_t device_size, driver_size; > @@ -656,6 +726,7 @@ VhostShadowVirtqueue *vhost_svq_new(uint16_t qsize) > memset(svq->vring.desc, 0, driver_size); > svq->vring.used = qemu_memalign(qemu_real_host_page_size, device_size); > memset(svq->vring.used, 0, device_size); > + svq->iova_tree = iova_tree; > svq->ring_id_maps = g_new0(VirtQueueElement *, qsize); > event_notifier_set_handler(&svq->hdev_call, vhost_svq_handle_call); > return g_steal_pointer(&svq); > diff --git a/hw/virtio/vhost-vdpa.c b/hw/virtio/vhost-vdpa.c > index 0e5c00ed7e..276a559649 100644 > --- a/hw/virtio/vhost-vdpa.c > +++ b/hw/virtio/vhost-vdpa.c > @@ -209,6 +209,18 @@ static void vhost_vdpa_listener_region_add(MemoryListener *listener, > vaddr, section->readonly); > > llsize = int128_sub(llend, int128_make64(iova)); > + if (v->shadow_vqs_enabled) { > + DMAMap mem_region = { > + .translated_addr = (hwaddr)vaddr, > + .size = int128_get64(llsize) - 1, > + .perm = IOMMU_ACCESS_FLAG(true, section->readonly), > + }; > + > + int r = vhost_iova_tree_map_alloc(v->iova_tree, &mem_region); > + assert(r == IOVA_OK); It's better to fail or warn here. > + > + iova = mem_region.iova; > + } > > vhost_vdpa_iotlb_batch_begin_once(v); > ret = vhost_vdpa_dma_map(v, iova, int128_get64(llsize), > @@ -261,6 +273,20 @@ static void vhost_vdpa_listener_region_del(MemoryListener *listener, > > llsize = int128_sub(llend, int128_make64(iova)); > > + if (v->shadow_vqs_enabled) { > + const DMAMap *result; > + const void *vaddr = memory_region_get_ram_ptr(section->mr) + > + section->offset_within_region + > + (iova - section->offset_within_address_space); > + DMAMap mem_region = { > + .translated_addr = (hwaddr)vaddr, > + .size = int128_get64(llsize) - 1, > + }; > + > + result = vhost_iova_tree_find_iova(v->iova_tree, &mem_region); > + iova = result->iova; > + vhost_iova_tree_remove(v->iova_tree, &mem_region); > + } > vhost_vdpa_iotlb_batch_begin_once(v); > ret = vhost_vdpa_dma_unmap(v, iova, int128_get64(llsize)); > if (ret) { > @@ -783,33 +809,70 @@ static int vhost_vdpa_svq_set_fds(struct vhost_dev *dev, > /** > * Unmap SVQ area in the device > */ > -static bool vhost_vdpa_svq_unmap_ring(struct vhost_vdpa *v, hwaddr iova, > - hwaddr size) > +static bool vhost_vdpa_svq_unmap_ring(struct vhost_vdpa *v, > + const DMAMap *needle) > { > + const DMAMap *result = vhost_iova_tree_find_iova(v->iova_tree, needle); > + hwaddr size; > int r; > > - size = ROUND_UP(size, qemu_real_host_page_size); > - r = vhost_vdpa_dma_unmap(v, iova, size); > + if (unlikely(!result)) { > + error_report("Unable to find SVQ address to unmap"); > + return false; > + } > + > + size = ROUND_UP(result->size, qemu_real_host_page_size); > + r = vhost_vdpa_dma_unmap(v, result->iova, size); > return r == 0; > } > > static bool vhost_vdpa_svq_unmap_rings(struct vhost_dev *dev, > const VhostShadowVirtqueue *svq) > { > + DMAMap needle; > struct vhost_vdpa *v = dev->opaque; > struct vhost_vring_addr svq_addr; > - size_t device_size = vhost_svq_device_area_size(svq); > - size_t driver_size = vhost_svq_driver_area_size(svq); > bool ok; > > vhost_svq_get_vring_addr(svq, &svq_addr); > > - ok = vhost_vdpa_svq_unmap_ring(v, svq_addr.desc_user_addr, driver_size); > + needle = (DMAMap) { > + .translated_addr = svq_addr.desc_user_addr, > + }; > + ok = vhost_vdpa_svq_unmap_ring(v, &needle); > if (unlikely(!ok)) { > return false; > } > > - return vhost_vdpa_svq_unmap_ring(v, svq_addr.used_user_addr, device_size); > + needle = (DMAMap) { > + .translated_addr = svq_addr.used_user_addr, > + }; > + return vhost_vdpa_svq_unmap_ring(v, &needle); > +} > + > +/** > + * Map SVQ area in the device > + * > + * @v Vhost-vdpa device > + * @needle The area to search iova > + * @readonly Permissions of the area > + */ > +static bool vhost_vdpa_svq_map_ring(struct vhost_vdpa *v, const DMAMap *needle, > + bool readonly) > +{ > + hwaddr off; > + const DMAMap *result = vhost_iova_tree_find_iova(v->iova_tree, needle); > + int r; > + > + if (unlikely(!result)) { > + error_report("Can't locate SVQ ring"); > + return false; > + } > + > + off = needle->translated_addr - result->translated_addr; > + r = vhost_vdpa_dma_map(v, result->iova + off, needle->size, > + (void *)needle->translated_addr, readonly); > + return r == 0; > } > > /** > @@ -821,23 +884,29 @@ static bool vhost_vdpa_svq_unmap_rings(struct vhost_dev *dev, > static bool vhost_vdpa_svq_map_rings(struct vhost_dev *dev, > const VhostShadowVirtqueue *svq) > { > + DMAMap needle; > struct vhost_vdpa *v = dev->opaque; > struct vhost_vring_addr svq_addr; > size_t device_size = vhost_svq_device_area_size(svq); > size_t driver_size = vhost_svq_driver_area_size(svq); > - int r; > + bool ok; > > vhost_svq_get_vring_addr(svq, &svq_addr); > > - r = vhost_vdpa_dma_map(v, svq_addr.desc_user_addr, driver_size, > - (void *)svq_addr.desc_user_addr, true); > - if (unlikely(r != 0)) { > + needle = (DMAMap) { > + .translated_addr = svq_addr.desc_user_addr, > + .size = driver_size, > + }; > + ok = vhost_vdpa_svq_map_ring(v, &needle, true); > + if (unlikely(!ok)) { > return false; > } > > - r = vhost_vdpa_dma_map(v, svq_addr.used_user_addr, device_size, > - (void *)svq_addr.used_user_addr, false); > - return r == 0; > + needle = (DMAMap) { > + .translated_addr = svq_addr.used_user_addr, > + .size = device_size, > + }; > + return vhost_vdpa_svq_map_ring(v, &needle, false); > } > > static bool vhost_vdpa_svq_setup(struct vhost_dev *dev, > @@ -1006,6 +1075,23 @@ static int vhost_vdpa_set_owner(struct vhost_dev *dev) > return vhost_vdpa_call(dev, VHOST_SET_OWNER, NULL); > } > > +static bool vhost_vdpa_svq_get_vq_region(struct vhost_vdpa *v, > + unsigned long long addr, > + uint64_t *iova_addr) > +{ > + const DMAMap needle = { > + .translated_addr = addr, > + }; > + const DMAMap *translation = vhost_iova_tree_find_iova(v->iova_tree, > + &needle); > + if (!translation) { > + return false; > + } > + > + *iova_addr = translation->iova + (addr - translation->translated_addr); > + return true; > +} > + > static void vhost_vdpa_vq_get_guest_addr(struct vhost_vring_addr *addr, > struct vhost_virtqueue *vq) > { > @@ -1023,10 +1109,23 @@ static int vhost_vdpa_vq_get_addr(struct vhost_dev *dev, > assert(dev->vhost_ops->backend_type == VHOST_BACKEND_TYPE_VDPA); > > if (v->shadow_vqs_enabled) { > + struct vhost_vring_addr svq_addr; > int idx = vhost_vdpa_get_vq_index(dev, addr->index); > VhostShadowVirtqueue *svq = g_ptr_array_index(v->shadow_vqs, idx); > > - vhost_svq_get_vring_addr(svq, addr); > + vhost_svq_get_vring_addr(svq, &svq_addr); > + if (!vhost_vdpa_svq_get_vq_region(v, svq_addr.desc_user_addr, > + &addr->desc_user_addr)) { > + return -1; > + } > + if (!vhost_vdpa_svq_get_vq_region(v, svq_addr.avail_user_addr, > + &addr->avail_user_addr)) { > + return -1; > + } > + if (!vhost_vdpa_svq_get_vq_region(v, svq_addr.used_user_addr, > + &addr->used_user_addr)) { > + return -1; > + } > } else { > vhost_vdpa_vq_get_guest_addr(addr, vq); > } > @@ -1095,13 +1194,37 @@ static int vhost_vdpa_init_svq(struct vhost_dev *hdev, struct vhost_vdpa *v, > > shadow_vqs = g_ptr_array_new_full(hdev->nvqs, vhost_psvq_free); > for (unsigned n = 0; n < hdev->nvqs; ++n) { > - VhostShadowVirtqueue *svq = vhost_svq_new(qsize); > - > + DMAMap device_region, driver_region; > + struct vhost_vring_addr addr; > + VhostShadowVirtqueue *svq = vhost_svq_new(qsize, v->iova_tree); > if (unlikely(!svq)) { > error_setg(errp, "Cannot create svq %u", n); > return -1; > } > - g_ptr_array_add(v->shadow_vqs, svq); > + > + vhost_svq_get_vring_addr(svq, &addr); > + driver_region = (DMAMap) { > + .translated_addr = (hwaddr)addr.desc_user_addr, > + > + /* > + * DMAMAp.size include the last byte included in the range, while > + * sizeof marks one past it. Substract one byte to make them match. > + */ > + .size = vhost_svq_driver_area_size(svq) - 1, > + .perm = VHOST_ACCESS_RO, > + }; > + device_region = (DMAMap) { > + .translated_addr = (hwaddr)addr.used_user_addr, > + .size = vhost_svq_device_area_size(svq) - 1, > + .perm = VHOST_ACCESS_RW, > + }; > + > + r = vhost_iova_tree_map_alloc(v->iova_tree, &driver_region); > + assert(r == IOVA_OK); Let's fail instead of assert here. Thanks > + r = vhost_iova_tree_map_alloc(v->iova_tree, &device_region); > + assert(r == IOVA_OK); > + > + g_ptr_array_add(shadow_vqs, svq); > } > > out: