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 X-Spam-Level: X-Spam-Status: No, score=-5.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,HTML_MESSAGE,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SPF_HELO_NONE,SPF_PASS autolearn=no autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8C264C433E7 for ; Tue, 20 Oct 2020 02:18:33 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id B0834222E9 for ; Tue, 20 Oct 2020 02:18:32 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=bytedance-com.20150623.gappssmtp.com header.i=@bytedance-com.20150623.gappssmtp.com header.b="t89QCL5j" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B0834222E9 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=bytedance.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id E07826B005C; Mon, 19 Oct 2020 22:18:31 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id DB9976B0062; Mon, 19 Oct 2020 22:18:31 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id C814A6B0068; Mon, 19 Oct 2020 22:18:31 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0213.hostedemail.com [216.40.44.213]) by kanga.kvack.org (Postfix) with ESMTP id 9BA446B005C for ; Mon, 19 Oct 2020 22:18:31 -0400 (EDT) Received: from smtpin30.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay01.hostedemail.com (Postfix) with ESMTP id 230CE180AD807 for ; Tue, 20 Oct 2020 02:18:31 +0000 (UTC) X-FDA: 77390694822.30.road12_4d0db0d2723c Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin30.hostedemail.com (Postfix) with ESMTP id F28BD180B3C83 for ; Tue, 20 Oct 2020 02:18:30 +0000 (UTC) X-HE-Tag: road12_4d0db0d2723c X-Filterd-Recvd-Size: 17100 Received: from mail-ej1-f52.google.com (mail-ej1-f52.google.com [209.85.218.52]) by imf46.hostedemail.com (Postfix) with ESMTP for ; Tue, 20 Oct 2020 02:18:30 +0000 (UTC) Received: by mail-ej1-f52.google.com with SMTP id e22so386513ejr.4 for ; Mon, 19 Oct 2020 19:18:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bytedance-com.20150623.gappssmtp.com; s=20150623; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=ZORz+aof11gPo38xltaIlUHlhHIZ9xSevLfC3YUz3DU=; b=t89QCL5j278OiFferckCaIyfMuRZsqND9xBO7gDGKlyfJ37fcX/yYDe7HRrMN4ndJ2 7Q9HopLjXHR4Hl3q1auujQKs/Sm2oAxDP9yFwQi7VlKesGwBsXL+rkvTlBg6kubECmmR 2b46bd1Nzzg4yyfMBqwglEvOzWzFrAjI1TcS8QJXzC2HecUV34w/5AImkSEIMqFushv5 LbmtaPznKZerCPZBzBbuldJyWW4fLOeLPrE7Dfez74Fnsk8QLZB26TDX7LGf87NXz9ob Y3xB66yw72ziA5M06goMy/B/CUh0qNjpW01StSpDcS51Kqy+m7oB+gx47UR9N+sX4AVy P4fA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=ZORz+aof11gPo38xltaIlUHlhHIZ9xSevLfC3YUz3DU=; b=nPlqAbKA9+ZJFqgpt0ib+vIQRqB42KizAKBB09PT245+R1dbFh4qTrxb6cal/QM4uB dZvVK/AelpWLm1g64+3mMtOP5T52N4FdLidRC+Q63LKdUIvwmnXKsb8hEsV21FyZIf1w c+1J9aY5Ub+/MLzlZx9au8jt4dJfPoFwoFe470weM9sEHZSHdulFT6DwrMnUXrf9h3sR 0C+So2/axXhz2vvr32gD2KIPH/9z0Jz2ON4mjyU31hGmpiSwKF1Cf7sRokM1dssU4fFv 76tXuKSf2Hkrj+LPDAwKXO3mqtloC0uI+6/mUolYQU227O7VqSGbOnkbiGToERPDIaCJ uyow== X-Gm-Message-State: AOAM533hKgz/78Gx5KrWdJFkIKwIrpFjrbridOAKrU8I69mZ8eeZiypm AI1Cr57+lAEgzthwQQ/1MY7WO4KPZD3uZq6gF+QO X-Google-Smtp-Source: ABdhPJztXbVJ2+krSU9MzyXvDgXqWYY4gYyRSRAFGXVT/y5Cbt2Mx+9qIXE9JYQrbKUoX1AMgR+gdcxCWUYwjdmmirQ= X-Received: by 2002:a17:906:f118:: with SMTP id gv24mr856745ejb.174.1603160309269; Mon, 19 Oct 2020 19:18:29 -0700 (PDT) MIME-Version: 1.0 References: <20201019145623.671-1-xieyongji@bytedance.com> <20201019130815-mutt-send-email-mst@kernel.org> In-Reply-To: <20201019130815-mutt-send-email-mst@kernel.org> From: =?UTF-8?B?6LCi5rC45ZCJ?= Date: Tue, 20 Oct 2020 10:18:18 +0800 Message-ID: Subject: Re: [External] Re: [RFC 0/4] Introduce VDUSE - vDPA Device in Userspace To: "Michael S. Tsirkin" Cc: jasowang@redhat.com, akpm@linux-foundation.org, linux-mm@kvack.org, virtualization@lists.linux-foundation.org Content-Type: multipart/alternative; boundary="000000000000c0adc005b210d88c" X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: --000000000000c0adc005b210d88c Content-Type: text/plain; charset="UTF-8" On Tue, Oct 20, 2020 at 1:16 AM Michael S. Tsirkin wrote: > On Mon, Oct 19, 2020 at 10:56:19PM +0800, Xie Yongji wrote: > > This series introduces a framework, which can be used to implement > > vDPA Devices in a userspace program. To implement it, the work > > consist of two parts: control path emulating and data path offloading. > > > > In the control path, the VDUSE driver will make use of message > > mechnism to forward the actions (get/set features, get/st status, > > get/set config space and set virtqueue states) from virtio-vdpa > > driver to userspace. Userspace can use read()/write() to > > receive/reply to those control messages. > > > > In the data path, the VDUSE driver implements a MMU-based > > on-chip IOMMU driver which supports both direct mapping and > > indirect mapping with bounce buffer. Then userspace can access > > those iova space via mmap(). Besides, eventfd mechnism is used to > > trigger interrupts and forward virtqueue kicks. > > > > The details and our user case is shown below: > > > > ------------------------ > ----------------------------------------------------------- > > | APP | | QEMU > | > > | --------- | | -------------------- > -------------------+<-->+------ | > > | |dev/vdx| | | | device emulation | | virtio > dataplane | | BDS | | > > ------------+----------- > -----------+-----------------------+-----------------+----- > > | | | > | > > | | emulating | > offloading | > > > ------------+---------------------------+-----------------------+-----------------+------ > > | | block device | | vduse driver | | vdpa device > | | TCP/IP | | > > | -------+-------- --------+-------- > +------+------- -----+---- | > > | | | | | > | | > > | | | | | > | | > > | ----------+---------- ----------+----------- | | > | | > > | | virtio-blk driver | | virtio-vdpa driver | | | > | | > > | ----------+---------- ----------+----------- | | > | | > > | | | | | > | | > > | | ------------------ | > | | > > | ----------------------------------------------------- > ---+--- | > > > ------------------------------------------------------------------------------ > | NIC |--- > > > ---+--- > > > | > > > ---------+--------- > > > | Remote Storages | > > > ------------------- > > We make use of it to implement a block device connecting to > > our distributed storage, which can be used in containers and > > bare metal. > > What is not exactly clear is what is the APP above doing. > > Taking virtio blk requests and sending them over the network > in some proprietary way? > > No, the APP doesn't need to know details on virtio-blk. Maybe replace "APP" with "Container" here could be more clear. Our purpose is to make virtio device available for container and bare metal, so that we can reuse the VM's technology stack to provide service, e.g. SPDK's remote bdev, ovs-dpdk and so on. > > Compared with qemu-nbd solution, this solution has > > higher performance, and we can have an unified technology stack > > in VM and containers for remote storages. > > > > To test it with a host disk (e.g. /dev/sdx): > > > > $ qemu-storage-daemon \ > > --chardev socket,id=charmonitor,path=/tmp/qmp.sock,server,nowait \ > > --monitor chardev=charmonitor \ > > --blockdev > driver=host_device,cache.direct=on,aio=native,filename=/dev/sdx,node-name=disk0 > \ > > --export > vduse-blk,id=test,node-name=disk0,writable=on,vduse-id=1,num-queues=16,queue-size=128 > > > > The qemu-storage-daemon can be found at > https://github.com/bytedance/qemu/tree/vduse > > > > Future work: > > - Improve performance (e.g. zero copy implementation in datapath) > > - Config interrupt support > > - Userspace library (find a way to reuse device emulation code in > qemu/rust-vmm) > > > How does this driver compare with vhost-user-blk (which doesn't need > kernel support)? > > We want to implement a block device rather than a virtio-blk dataplane. And with this driver's help, the vhost-user-blk process could provide storage service to all APPs in the host. Thanks, Yongji --000000000000c0adc005b210d88c Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+PGRpdiBkaXI9Imx0ciI+PGJyPjwvZGl2Pjxicj48ZGl2IGNsYXNzPSJn bWFpbF9xdW90ZSI+PGRpdiBkaXI9Imx0ciIgY2xhc3M9ImdtYWlsX2F0dHIiPk9uIFR1ZSwgT2N0 IDIwLCAyMDIwIGF0IDE6MTYgQU0gTWljaGFlbCBTLiBUc2lya2luICZsdDs8YSBocmVmPSJtYWls dG86bXN0QHJlZGhhdC5jb20iPm1zdEByZWRoYXQuY29tPC9hPiZndDsgd3JvdGU6PGJyPjwvZGl2 PjxibG9ja3F1b3RlIGNsYXNzPSJnbWFpbF9xdW90ZSIgc3R5bGU9Im1hcmdpbjowcHggMHB4IDBw eCAwLjhleDtib3JkZXItbGVmdDoxcHggc29saWQgcmdiKDIwNCwyMDQsMjA0KTtwYWRkaW5nLWxl ZnQ6MWV4Ij5PbiBNb24sIE9jdCAxOSwgMjAyMCBhdCAxMDo1NjoxOVBNICswODAwLCBYaWUgWW9u Z2ppIHdyb3RlOjxicj4NCiZndDsgVGhpcyBzZXJpZXMgaW50cm9kdWNlcyBhIGZyYW1ld29yaywg d2hpY2ggY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50PGJyPg0KJmd0OyB2RFBBIERldmljZXMgaW4g YSB1c2Vyc3BhY2UgcHJvZ3JhbS4gVG8gaW1wbGVtZW50IGl0LCB0aGUgd29yazxicj4NCiZndDsg Y29uc2lzdCBvZiB0d28gcGFydHM6IGNvbnRyb2wgcGF0aCBlbXVsYXRpbmcgYW5kIGRhdGEgcGF0 aCBvZmZsb2FkaW5nLjxicj4NCiZndDsgPGJyPg0KJmd0OyBJbiB0aGUgY29udHJvbCBwYXRoLCB0 aGUgVkRVU0UgZHJpdmVyIHdpbGwgbWFrZSB1c2Ugb2YgbWVzc2FnZTxicj4NCiZndDsgbWVjaG5p c20gdG8gZm9yd2FyZCB0aGUgYWN0aW9ucyAoZ2V0L3NldCBmZWF0dXJlcywgZ2V0L3N0IHN0YXR1 cyw8YnI+DQomZ3Q7IGdldC9zZXQgY29uZmlnIHNwYWNlIGFuZCBzZXQgdmlydHF1ZXVlIHN0YXRl cykgZnJvbSB2aXJ0aW8tdmRwYTxicj4NCiZndDsgZHJpdmVyIHRvIHVzZXJzcGFjZS4gVXNlcnNw YWNlIGNhbiB1c2UgcmVhZCgpL3dyaXRlKCkgdG88YnI+DQomZ3Q7IHJlY2VpdmUvcmVwbHkgdG8g dGhvc2UgY29udHJvbCBtZXNzYWdlcy48YnI+DQomZ3Q7IDxicj4NCiZndDsgSW4gdGhlIGRhdGEg cGF0aCwgdGhlIFZEVVNFIGRyaXZlciBpbXBsZW1lbnRzIGEgTU1VLWJhc2VkPGJyPg0KJmd0OyBv bi1jaGlwIElPTU1VIGRyaXZlciB3aGljaCBzdXBwb3J0cyBib3RoIGRpcmVjdCBtYXBwaW5nIGFu ZDxicj4NCiZndDsgaW5kaXJlY3QgbWFwcGluZyB3aXRoIGJvdW5jZSBidWZmZXIuIFRoZW4gdXNl cnNwYWNlIGNhbiBhY2Nlc3M8YnI+DQomZ3Q7IHRob3NlIGlvdmEgc3BhY2UgdmlhIG1tYXAoKS4g QmVzaWRlcywgZXZlbnRmZCBtZWNobmlzbSBpcyB1c2VkIHRvPGJyPg0KJmd0OyB0cmlnZ2VyIGlu dGVycnVwdHMgYW5kIGZvcndhcmQgdmlydHF1ZXVlIGtpY2tzLjxicj4NCiZndDsgPGJyPg0KJmd0 OyBUaGUgZGV0YWlscyBhbmQgb3VyIHVzZXIgY2FzZSBpcyBzaG93biBiZWxvdzo8YnI+DQomZ3Q7 IDxicj4NCiZndDsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0twqAgwqAgwqAtLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTxicj4NCiZndDsg fMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIEFQUCB8wqAgwqAgwqB8wqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgUUVNVcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgfDxicj4NCiZndDsgfMKgIMKgIMKgIMKgLS0tLS0tLS0twqAgwqAgwqAgfMKg IMKgIMKgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLcKgIMKgIC0tLS0tLS0tLS0tLS0tLS0tLS0rJmx0 Oy0tJmd0OystLS0tLS0gfDxicj4NCiZndDsgfMKgIMKgIMKgIMKgfGRldi92ZHh8wqAgwqAgwqAg fMKgIMKgIMKgfCB8IGRldmljZSBlbXVsYXRpb24gfMKgIMKgIHwgdmlydGlvIGRhdGFwbGFuZSB8 wqAgwqAgfCBCRFMgfCB8PGJyPg0KJmd0OyAtLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS3CoCDCoCDC oC0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKy0t LS0tPGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgfMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgfMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfDxicj4NCiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoHzC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHwgZW11bGF0aW5nwqAgwqAg wqAgwqAgwqAgwqAgwqB8IG9mZmxvYWRpbmfCoCDCoCDCoCB8PGJyPg0KJmd0OyAtLS0tLS0tLS0t LS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0t LS0tLS0tLS0tLS0tLS0tKy0tLS0tLTxicj4NCiZndDsgfMKgIMKgIHwgYmxvY2sgZGV2aWNlIHzC oCDCoCDCoCDCoCDCoCDCoHzCoCB2ZHVzZSBkcml2ZXIgfMKgIMKgIMKgIMKgIHzCoCB2ZHBhIGRl dmljZSB8wqAgwqAgfCBUQ1AvSVAgfCB8PGJyPg0KJmd0OyB8wqAgwqAgLS0tLS0tLSstLS0tLS0t LcKgIMKgIMKgIMKgIMKgIMKgLS0tLS0tLS0rLS0tLS0tLS3CoCDCoCDCoCDCoCArLS0tLS0tKy0t LS0tLS3CoCDCoCDCoC0tLS0tKy0tLS0gfDxicj4NCiZndDsgfMKgIMKgIMKgIMKgIMKgIMKgfMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIHzCoCDCoCDCoCB8wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB8wqAgwqAgwqB8PGJy Pg0KJmd0OyB8wqAgwqAgwqAgwqAgwqAgwqB8wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqB8wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgfMKgIMKgIMKgIHzCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoHzCoCDCoCDCoHw8YnI+DQomZ3Q7IHwgLS0tLS0tLS0tLSstLS0tLS0t LS0twqAgwqAgwqAgwqAtLS0tLS0tLS0tKy0tLS0tLS0tLS0twqAgwqAgwqB8wqAgwqAgwqAgfMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfMKgIMKgIMKgfDxicj4NCiZndDsgfCB8IHZpcnRpby1i bGsgZHJpdmVyIHzCoCDCoCDCoCDCoHwgdmlydGlvLXZkcGEgZHJpdmVyIHzCoCDCoCDCoHzCoCDC oCDCoCB8wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqB8wqAgwqAgwqB8PGJyPg0KJmd0OyB8IC0t LS0tLS0tLS0rLS0tLS0tLS0tLcKgIMKgIMKgIMKgLS0tLS0tLS0tLSstLS0tLS0tLS0tLcKgIMKg IMKgfMKgIMKgIMKgIHzCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoHzCoCDCoCDCoHw8YnI+DQom Z3Q7IHzCoCDCoCDCoCDCoCDCoCDCoHzCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoHzCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB8wqAgwqAgwqAgfMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgfMKgIMKgIMKgfDxicj4NCiZndDsgfMKgIMKgIMKgIMKgIMKgIMKgfMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgLS0tLS0tLS0tLS0tLS0tLS0twqAg wqAgwqAgfMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgfMKgIMKgIMKgfDxicj4NCiZndDsgfMKg IMKgIMKgIMKgIMKgIMKgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS3CoCDCoCDCoCDCoCDCoCDCoCDCoCAtLS0rLS0twqAgfDxicj4NCiZndDsgLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tIHwgTklDIHwtLS08YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgLS0tKy0tLTxicj4N CiZndDvCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoHw8YnI+DQomZ3Q7wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgLS0tLS0tLS0tKy0tLS0tLS0tLTxicj4NCiZndDvCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCB8IFJlbW90 ZSBTdG9yYWdlcyB8PGJyPg0KJmd0O8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIC0tLS0tLS0tLS0tLS0tLS0tLS08YnI+DQomZ3Q7IFdlIG1ha2Ug dXNlIG9mIGl0IHRvIGltcGxlbWVudCBhIGJsb2NrIGRldmljZSBjb25uZWN0aW5nIHRvPGJyPg0K Jmd0OyBvdXIgZGlzdHJpYnV0ZWQgc3RvcmFnZSwgd2hpY2ggY2FuIGJlIHVzZWQgaW4gY29udGFp bmVycyBhbmQ8YnI+DQomZ3Q7IGJhcmUgbWV0YWwuPGJyPg0KPGJyPg0KV2hhdCBpcyBub3QgZXhh Y3RseSBjbGVhciBpcyB3aGF0IGlzIHRoZSBBUFAgYWJvdmUgZG9pbmcuPGJyPg0KPGJyPg0KVGFr aW5nIHZpcnRpbyBibGsgcmVxdWVzdHMgYW5kIHNlbmRpbmcgdGhlbSBvdmVyIHRoZSBuZXR3b3Jr PGJyPg0KaW4gc29tZSBwcm9wcmlldGFyeSB3YXk/PGJyPg0KPGJyPjwvYmxvY2txdW90ZT48ZGl2 Pjxicj48L2Rpdj48ZGl2Pk5vLCB0aGUgQVBQwqBkb2VzbiYjMzk7dCBuZWVkIHRvIGtub3cgZGV0 YWlscyBvbiB2aXJ0aW8tYmxrLiBNYXliZSByZXBsYWNlwqAmcXVvdDtBUFAmcXVvdDsgd2l0aCAm cXVvdDtDb250YWluZXImcXVvdDsgaGVyZSBjb3VsZCBiZSBtb3JlIGNsZWFyLiBPdXIgcHVycG9z ZSBpcyB0byBtYWtlIHZpcnRpbyBkZXZpY2UgYXZhaWxhYmxlwqBmb3IgY29udGFpbmVyIGFuZCBi YXJlIG1ldGFsLCBzbyB0aGF0IHdlIGNhbiByZXVzZSB0aGUgVk0mIzM5O3MgdGVjaG5vbG9neSBz dGFjayB0b8KgcHJvdmlkZSBzZXJ2aWNlLCBlLmcuIFNQREsmIzM5O3MgcmVtb3RlIGJkZXYsIG92 cy1kcGRrIGFuZCBzbyBvbi48L2Rpdj48ZGl2PsKgPC9kaXY+PGJsb2NrcXVvdGUgY2xhc3M9Imdt YWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2luOjBweCAwcHggMHB4IDAuOGV4O2JvcmRlci1sZWZ0OjFw eCBzb2xpZCByZ2IoMjA0LDIwNCwyMDQpO3BhZGRpbmctbGVmdDoxZXgiPg0KJmd0OyBDb21wYXJl ZCB3aXRoIHFlbXUtbmJkIHNvbHV0aW9uLCB0aGlzIHNvbHV0aW9uIGhhczxicj4NCiZndDsgaGln aGVyIHBlcmZvcm1hbmNlLCBhbmQgd2UgY2FuIGhhdmUgYW4gdW5pZmllZCB0ZWNobm9sb2d5IHN0 YWNrPGJyPg0KJmd0OyBpbiBWTSBhbmQgY29udGFpbmVycyBmb3IgcmVtb3RlIHN0b3JhZ2VzLjxi cj4NCiZndDsgPGJyPg0KJmd0OyBUbyB0ZXN0IGl0IHdpdGggYSBob3N0IGRpc2sgKGUuZy4gL2Rl di9zZHgpOjxicj4NCiZndDsgPGJyPg0KJmd0O8KgIMKgJCBxZW11LXN0b3JhZ2UtZGFlbW9uIFw8 YnI+DQomZ3Q7wqAgwqAgwqAgwqAtLWNoYXJkZXYgc29ja2V0LGlkPWNoYXJtb25pdG9yLHBhdGg9 L3RtcC9xbXAuc29jayxzZXJ2ZXIsbm93YWl0IFw8YnI+DQomZ3Q7wqAgwqAgwqAgwqAtLW1vbml0 b3IgY2hhcmRldj1jaGFybW9uaXRvciBcPGJyPg0KJmd0O8KgIMKgIMKgIMKgLS1ibG9ja2RldiBk cml2ZXI9aG9zdF9kZXZpY2UsY2FjaGUuZGlyZWN0PW9uLGFpbz1uYXRpdmUsZmlsZW5hbWU9L2Rl di9zZHgsbm9kZS1uYW1lPWRpc2swIFw8YnI+DQomZ3Q7wqAgwqAgwqAgwqAtLWV4cG9ydCB2ZHVz ZS1ibGssaWQ9dGVzdCxub2RlLW5hbWU9ZGlzazAsd3JpdGFibGU9b24sdmR1c2UtaWQ9MSxudW0t cXVldWVzPTE2LHF1ZXVlLXNpemU9MTI4PGJyPg0KJmd0OyA8YnI+DQomZ3Q7IFRoZSBxZW11LXN0 b3JhZ2UtZGFlbW9uIGNhbiBiZSBmb3VuZCBhdCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v Ynl0ZWRhbmNlL3FlbXUvdHJlZS92ZHVzZSIgcmVsPSJub3JlZmVycmVyIiB0YXJnZXQ9Il9ibGFu ayI+aHR0cHM6Ly9naXRodWIuY29tL2J5dGVkYW5jZS9xZW11L3RyZWUvdmR1c2U8L2E+PGJyPg0K Jmd0OyA8YnI+DQomZ3Q7IEZ1dHVyZSB3b3JrOjxicj4NCiZndDvCoCDCoC0gSW1wcm92ZSBwZXJm b3JtYW5jZSAoZS5nLiB6ZXJvIGNvcHkgaW1wbGVtZW50YXRpb24gaW4gZGF0YXBhdGgpPGJyPg0K Jmd0O8KgIMKgLSBDb25maWcgaW50ZXJydXB0IHN1cHBvcnQ8YnI+DQomZ3Q7wqAgwqAtIFVzZXJz cGFjZSBsaWJyYXJ5IChmaW5kIGEgd2F5IHRvIHJldXNlIGRldmljZSBlbXVsYXRpb24gY29kZSBp biBxZW11L3J1c3Qtdm1tKTxicj4NCjxicj4NCjxicj4NCkhvdyBkb2VzIHRoaXMgZHJpdmVyIGNv bXBhcmUgd2l0aCB2aG9zdC11c2VyLWJsayAod2hpY2ggZG9lc24mIzM5O3QgbmVlZCBrZXJuZWwg c3VwcG9ydCk/PGJyPg0KPGJyPjwvYmxvY2txdW90ZT48ZGl2Pjxicj48L2Rpdj48ZGl2PldlIHdh bnQgdG8gaW1wbGVtZW50IGEgYmxvY2sgZGV2aWNlIHJhdGhlciB0aGFuIGEgdmlydGlvLWJsayBk YXRhcGxhbmUuIEFuZCB3aXRoIHRoaXMgZHJpdmVyJiMzOTtzIGhlbHAsIHRoZSB2aG9zdC11c2Vy LWJsayBwcm9jZXNzIGNvdWxkIHByb3ZpZGUgc3RvcmFnZSBzZXJ2aWNlIHRvIGFsbCBBUFBzIGlu IHRoZSBob3N0LjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+VGhhbmtzLDwvZGl2PjxkaXY+WW9u Z2ppwqA8L2Rpdj48L2Rpdj48L2Rpdj4NCg== --000000000000c0adc005b210d88c--