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 F09CAC00144 for ; Fri, 29 Jul 2022 07:34:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234924AbiG2He1 (ORCPT ); Fri, 29 Jul 2022 03:34:27 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:45436 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234903AbiG2HeW (ORCPT ); Fri, 29 Jul 2022 03:34:22 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id C1781804A8 for ; Fri, 29 Jul 2022 00:34:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1659080060; 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=S2q2utn2CzeOeojEKg/tCXnqvan/YkCeq0ehI4nAHW8=; b=KwFr68ctpc/Gitk53THU+0j0hkVO6UwbZsviOPcxR92XNA4n0zH3ME9969GRiKqDQxMpyR w/kRiKe7lgzVksZWBoKDRV3GbrISYrP/BwcQj+5vIBgNVITh3EaTGuGPbsyZ5VdU9lvO1z oM+eBYdxTkWOFw4NoupsXIVwyx+Y0Nc= Received: from mail-lf1-f69.google.com (mail-lf1-f69.google.com [209.85.167.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-5-tvSbqn4fMFSuzWMo9ARzHg-1; Fri, 29 Jul 2022 03:32:16 -0400 X-MC-Unique: tvSbqn4fMFSuzWMo9ARzHg-1 Received: by mail-lf1-f69.google.com with SMTP id z3-20020a19f703000000b0048ae517ee7bso33983lfe.14 for ; Fri, 29 Jul 2022 00:32:15 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=S2q2utn2CzeOeojEKg/tCXnqvan/YkCeq0ehI4nAHW8=; b=z58cb/0Z36J5Mr0YyaVKbbhdwG8aQABb3jx+jPSIcthBCa4IPlX41u2yVHxJad5oQG s/JJTd+KL8LkXur5rBDMoFAbPtdZABCmSQLM3lN4GS8Wi9nkCwgeCabZ3OukERcsfIF1 N/zcKRmsgycY070bF3b27Y8MJ08Gv5HiUdUhb3u9sZ7q5Jt/sHN5F5WqMeZBJwLXXnqI CXm4TwnI+6CqIAd+7qT3HXuMjUrGplrApmyTpps1nLl0j+RZz7YEsfRfL2jSVcvZsH8a /kivhVsAcQ1A52CYiBjfC/V6KFNZjgXdqJ/TpOHCS2F+NItppwjABzXOeueYXEg4AAxa +uUg== X-Gm-Message-State: AJIora+3EU2KuEEqCHfjxDSPotJpzQuO6BxEm3oEphM/bL9gueBUzlUc qO5rQ5GEacunhrlxoRRHlW8BymdzhbJHx6PYP+Pkl/Ze6WAZRqFUb8H8Chqd1Dk79iHuNYKiixA LxeAP7nKxTtg/Ugvh4ePFQ2gMc0QcwBmC2n8Cdejo X-Received: by 2002:a19:9145:0:b0:48a:7ee4:5eac with SMTP id y5-20020a199145000000b0048a7ee45eacmr849963lfj.641.1659079934549; Fri, 29 Jul 2022 00:32:14 -0700 (PDT) X-Google-Smtp-Source: AA6agR724Z9TIFD4TBShsFS+WI+wVQDzXpDufX5nXFkZ8Tvp62c/qrPU4I1gK/YFs9x7sodZ+Vk2IgowAFkA5+mh0bs= X-Received: by 2002:a19:9145:0:b0:48a:7ee4:5eac with SMTP id y5-20020a199145000000b0048a7ee45eacmr849942lfj.641.1659079934017; Fri, 29 Jul 2022 00:32:14 -0700 (PDT) MIME-Version: 1.0 References: <20220721084341.24183-1-qtxuning1999@sjtu.edu.cn> <20220721084341.24183-2-qtxuning1999@sjtu.edu.cn> <16a232ad-e0a1-fd4c-ae3e-27db168daacb@redhat.com> <2a8838c4-2e6f-6de7-dcdc-572699ff3dc9@sjtu.edu.cn> In-Reply-To: <2a8838c4-2e6f-6de7-dcdc-572699ff3dc9@sjtu.edu.cn> From: Jason Wang Date: Fri, 29 Jul 2022 15:32:02 +0800 Message-ID: Subject: Re: [RFC 1/5] vhost: reorder used descriptors in a batch To: Guo Zhi Cc: eperezma , Stefano Garzarella , mst , netdev , linux-kernel , kvm , virtualization Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Thu, Jul 28, 2022 at 4:26 PM Guo Zhi wrote: > > On 2022/7/26 15:36, Jason Wang wrote: > > > =E5=9C=A8 2022/7/21 16:43, Guo Zhi =E5=86=99=E9=81=93: > > Device may not use descriptors in order, for example, NIC and SCSI may > not call __vhost_add_used_n with buffers in order. It's the task of > __vhost_add_used_n to order them. > > > > I'm not sure this is ture. Having ooo descriptors is probably by design t= o have better performance. > > This might be obvious for device that may have elevator or QOS stuffs. > > I suspect the right thing to do here is, for the device that can't perfor= m better in the case of IN_ORDER, let's simply not offer IN_ORDER (zerocopy= or scsi). And for the device we know it can perform better, non-zercopy et= hernet device we can do that. > > > This commit reorder the buffers using > vq->heads, only the batch is begin from the expected start point and is > continuous can the batch be exposed to driver. And only writing out a > single used ring for a batch of descriptors, according to VIRTIO 1.1 > spec. > > > > So this sounds more like a "workaround" of the device that can't consume = buffer in order, I suspect it can help in performance. > > More below. > > > > Signed-off-by: Guo Zhi > --- > drivers/vhost/vhost.c | 44 +++++++++++++++++++++++++++++++++++++++++-- > drivers/vhost/vhost.h | 3 +++ > 2 files changed, 45 insertions(+), 2 deletions(-) > > diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c > index 40097826c..e2e77e29f 100644 > --- a/drivers/vhost/vhost.c > +++ b/drivers/vhost/vhost.c > @@ -317,6 +317,7 @@ static void vhost_vq_reset(struct vhost_dev *dev, > vq->used_flags =3D 0; > vq->log_used =3D false; > vq->log_addr =3D -1ull; > + vq->next_used_head_idx =3D 0; > vq->private_data =3D NULL; > vq->acked_features =3D 0; > vq->acked_backend_features =3D 0; > @@ -398,6 +399,8 @@ static long vhost_dev_alloc_iovecs(struct vhost_dev *= dev) > GFP_KERNEL); > if (!vq->indirect || !vq->log || !vq->heads) > goto err_nomem; > + > + memset(vq->heads, 0, sizeof(*vq->heads) * dev->iov_limit); > } > return 0; > @@ -2374,12 +2377,49 @@ static int __vhost_add_used_n(struct vhost_virt= queue *vq, > unsigned count) > { > vring_used_elem_t __user *used; > + struct vring_desc desc; > u16 old, new; > int start; > + int begin, end, i; > + int copy_n =3D count; > + > + if (vhost_has_feature(vq, VIRTIO_F_IN_ORDER)) { > > > > How do you guarantee that ids of heads are contiguous? > > There is no need to be contiguous for ids of heads. > > For example, I have three buffer { .id =3D 0, 15}, {.id =3D 20, 30} {.id = =3D 15, 20} for vhost_add_used_n. Then I will let the vq->heads[0].len=3D15= . vq->heads[15].len=3D5, vq->heads[20].len=3D10 as reorder. Once I found th= ere is no hold in the batched descriptors. I will expose them to driver. So spec said: "If VIRTIO_F_IN_ORDER has been negotiated, driver uses descriptors in ring order: starting from offset 0 in the table, and wrapping around at the end of the table." And "VIRTIO_F_IN_ORDER(35)This feature indicates that all buffers are used by the device in the same order in which they have been made available." This means your example is not an IN_ORDER device. The driver should submit buffers (assuming each buffer have one descriptor) in order {id =3D 0, 15}, {id =3D 1, 30} and {id =3D 2, 20}. And even if it is submitted in order, we can not use a batch because: "The skipped buffers (for which no used ring entry was written) are assumed to have been used (read or written) by the device completely." This means for TX we are probably ok, but for rx, unless we know the buffers were written completely, we can't write them in a batch. I'd suggest to do cross testing for this series: 1) testing vhost IN_ORDER support with DPDK virtio PMD 2) testing virtio IN_ORDER with DPDK vhost-user via testpmd Thanks > > > + /* calculate descriptor chain length for each used buffer */ > > > > I'm a little bit confused about this comment, we have heads[i].len for th= is? > > Maybe I should not use vq->heads, some misleading. > > > + for (i =3D 0; i < count; i++) { > + begin =3D heads[i].id; > + end =3D begin; > + vq->heads[begin].len =3D 0; > > > > Does this work for e.g RX virtqueue? > > > + do { > + vq->heads[begin].len +=3D 1; > + if (unlikely(vhost_get_desc(vq, &desc, end))) { > > > > Let's try hard to avoid more userspace copy here, it's the source of perf= ormance regression. > > Thanks > > > + vq_err(vq, "Failed to get descriptor: idx %d addr %p= \n", > + end, vq->desc + end); > + return -EFAULT; > + } > + } while ((end =3D next_desc(vq, &desc)) !=3D -1); > + } > + > + count =3D 0; > + /* sort and batch continuous used ring entry */ > + while (vq->heads[vq->next_used_head_idx].len !=3D 0) { > + count++; > + i =3D vq->next_used_head_idx; > + vq->next_used_head_idx =3D (vq->next_used_head_idx + > + vq->heads[vq->next_used_head_idx].len) > + % vq->num; > + vq->heads[i].len =3D 0; > + } > + /* only write out a single used ring entry with the id correspon= ding > + * to the head entry of the descriptor chain describing the last= buffer > + * in the batch. > + */ > + heads[0].id =3D i; > + copy_n =3D 1; > + } > start =3D vq->last_used_idx & (vq->num - 1); > used =3D vq->used->ring + start; > - if (vhost_put_used(vq, heads, start, count)) { > + if (vhost_put_used(vq, heads, start, copy_n)) { > vq_err(vq, "Failed to write used"); > return -EFAULT; > } > @@ -2410,7 +2450,7 @@ int vhost_add_used_n(struct vhost_virtqueue *vq, st= ruct vring_used_elem *heads, > start =3D vq->last_used_idx & (vq->num - 1); > n =3D vq->num - start; > - if (n < count) { > + if (n < count && !vhost_has_feature(vq, VIRTIO_F_IN_ORDER)) { > r =3D __vhost_add_used_n(vq, heads, n); > if (r < 0) > return r; > diff --git a/drivers/vhost/vhost.h b/drivers/vhost/vhost.h > index d9109107a..7b2c0fbb5 100644 > --- a/drivers/vhost/vhost.h > +++ b/drivers/vhost/vhost.h > @@ -107,6 +107,9 @@ struct vhost_virtqueue { > bool log_used; > u64 log_addr; > + /* Sort heads in order */ > + u16 next_used_head_idx; > + > struct iovec iov[UIO_MAXIOV]; > struct iovec iotlb_iov[64]; > struct iovec *indirect; > > > 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 smtp3.osuosl.org (smtp3.osuosl.org [140.211.166.136]) (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 AD774C19F2A for ; Fri, 29 Jul 2022 07:34:22 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id 225F46103F; Fri, 29 Jul 2022 07:34:22 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org 225F46103F Authentication-Results: smtp3.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=LxzEdpDT X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp3.osuosl.org ([127.0.0.1]) by localhost (smtp3.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id LRV6Ua1GKOpb; Fri, 29 Jul 2022 07:34:21 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [IPv6:2605:bc80:3010:104::8cd3:938]) by smtp3.osuosl.org (Postfix) with ESMTPS id 5E6B160E6D; Fri, 29 Jul 2022 07:34:20 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org 5E6B160E6D Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 15052C0035; Fri, 29 Jul 2022 07:34:20 +0000 (UTC) Received: from smtp3.osuosl.org (smtp3.osuosl.org [IPv6:2605:bc80:3010::136]) by lists.linuxfoundation.org (Postfix) with ESMTP id 5C118C002D for ; Fri, 29 Jul 2022 07:34:18 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id 250AC60E96 for ; Fri, 29 Jul 2022 07:34:18 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org 250AC60E96 X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp3.osuosl.org ([127.0.0.1]) by localhost (smtp3.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id EqSMP4ot2qda for ; Fri, 29 Jul 2022 07:34:17 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org 279EE60E6D Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by smtp3.osuosl.org (Postfix) with ESMTPS id 279EE60E6D for ; Fri, 29 Jul 2022 07:34:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1659080055; 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=S2q2utn2CzeOeojEKg/tCXnqvan/YkCeq0ehI4nAHW8=; b=LxzEdpDTTreA0TJH2Ae3nE+nOdtgxAFDKMGyIzpjAxwep66T+TPQFWP2j8V3qo2wqzIrhS 9TXHmQcnEJi4kdrSrlYuNqlmn35hddhQLvD9M22jIpQtfTXxD5jbP/DXU7QH/VkvI+OOq2 e2HSRXwuTlnJMd7gK0vCDV85XX/2l7k= Received: from mail-lf1-f70.google.com (mail-lf1-f70.google.com [209.85.167.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-5-9cHM3a1kNfu05zAIkXX4QA-1; Fri, 29 Jul 2022 03:32:16 -0400 X-MC-Unique: 9cHM3a1kNfu05zAIkXX4QA-1 Received: by mail-lf1-f70.google.com with SMTP id z1-20020a0565120c0100b0048ab2910b13so1459138lfu.23 for ; Fri, 29 Jul 2022 00:32:15 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=S2q2utn2CzeOeojEKg/tCXnqvan/YkCeq0ehI4nAHW8=; b=n4p5MscsUMK3EttSK/ArZT9bci6XUQeeFPFfBgwYjJsw8YXFBD37NRH4etP3nJYWD3 gumuSWpfLbfhpvcGqIBeEAurkMAcWF1ZVPOpHDvFM8CQ5VGvZQKtsjfJAgEbuVAQHvo2 yYMt0V5jVSye8lbUN0gL/2gipjsVYYJSR7UeWlgQoRD7cRdVH+HzfhfbFUbazQByYDIk Wbh5DwipVOWPNp+QMRebpxrlV6SiEcNFyqTPDpaRQnS0UIAbh918IOPhsmoLccaITfrQ 2VVUSzqBq9aYB58NwAfg0rb6xLuPmAwRNlWpBYqQsTzcNOsQLQv2yWyX+c829wFOXgsg 1Q5A== X-Gm-Message-State: AJIora8vxLGU+jioZ1PXLhBt6HTW+x3zVteHnieNTsm1Mn9CDdSu8/ly 2SErvrW9TLkB+HAZ02/4Nx3AKq/EzwkF5GtgtHARY7FbS1XI+jYDrQpDx2JwwgiDCBsgRmhO+Az 7fUYK4sk3xEZJMiB5exC6EYhn3dVMxzugS4+uejsesaIVs+eRENyysCCPHg== X-Received: by 2002:a19:9145:0:b0:48a:7ee4:5eac with SMTP id y5-20020a199145000000b0048a7ee45eacmr849958lfj.641.1659079934547; Fri, 29 Jul 2022 00:32:14 -0700 (PDT) X-Google-Smtp-Source: AA6agR724Z9TIFD4TBShsFS+WI+wVQDzXpDufX5nXFkZ8Tvp62c/qrPU4I1gK/YFs9x7sodZ+Vk2IgowAFkA5+mh0bs= X-Received: by 2002:a19:9145:0:b0:48a:7ee4:5eac with SMTP id y5-20020a199145000000b0048a7ee45eacmr849942lfj.641.1659079934017; Fri, 29 Jul 2022 00:32:14 -0700 (PDT) MIME-Version: 1.0 References: <20220721084341.24183-1-qtxuning1999@sjtu.edu.cn> <20220721084341.24183-2-qtxuning1999@sjtu.edu.cn> <16a232ad-e0a1-fd4c-ae3e-27db168daacb@redhat.com> <2a8838c4-2e6f-6de7-dcdc-572699ff3dc9@sjtu.edu.cn> In-Reply-To: <2a8838c4-2e6f-6de7-dcdc-572699ff3dc9@sjtu.edu.cn> From: Jason Wang Date: Fri, 29 Jul 2022 15:32:02 +0800 Message-ID: Subject: Re: [RFC 1/5] vhost: reorder used descriptors in a batch To: Guo Zhi 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 Cc: kvm , mst , netdev , linux-kernel , virtualization , eperezma 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" T24gVGh1LCBKdWwgMjgsIDIwMjIgYXQgNDoyNiBQTSBHdW8gWmhpIDxxdHh1bmluZzE5OTlAc2p0 dS5lZHUuY24+IHdyb3RlOgo+Cj4gT24gMjAyMi83LzI2IDE1OjM2LCBKYXNvbiBXYW5nIHdyb3Rl Ogo+Cj4KPiDlnKggMjAyMi83LzIxIDE2OjQzLCBHdW8gWmhpIOWGmemBkzoKPgo+IERldmljZSBt YXkgbm90IHVzZSBkZXNjcmlwdG9ycyBpbiBvcmRlciwgZm9yIGV4YW1wbGUsIE5JQyBhbmQgU0NT SSBtYXkKPiBub3QgY2FsbCBfX3Zob3N0X2FkZF91c2VkX24gd2l0aCBidWZmZXJzIGluIG9yZGVy LiAgSXQncyB0aGUgdGFzayBvZgo+IF9fdmhvc3RfYWRkX3VzZWRfbiB0byBvcmRlciB0aGVtLgo+ Cj4KPgo+IEknbSBub3Qgc3VyZSB0aGlzIGlzIHR1cmUuIEhhdmluZyBvb28gZGVzY3JpcHRvcnMg aXMgcHJvYmFibHkgYnkgZGVzaWduIHRvIGhhdmUgYmV0dGVyIHBlcmZvcm1hbmNlLgo+Cj4gVGhp cyBtaWdodCBiZSBvYnZpb3VzIGZvciBkZXZpY2UgdGhhdCBtYXkgaGF2ZSBlbGV2YXRvciBvciBR T1Mgc3R1ZmZzLgo+Cj4gSSBzdXNwZWN0IHRoZSByaWdodCB0aGluZyB0byBkbyBoZXJlIGlzLCBm b3IgdGhlIGRldmljZSB0aGF0IGNhbid0IHBlcmZvcm0gYmV0dGVyIGluIHRoZSBjYXNlIG9mIElO X09SREVSLCBsZXQncyBzaW1wbHkgbm90IG9mZmVyIElOX09SREVSICh6ZXJvY29weSBvciBzY3Np KS4gQW5kIGZvciB0aGUgZGV2aWNlIHdlIGtub3cgaXQgY2FuIHBlcmZvcm0gYmV0dGVyLCBub24t emVyY29weSBldGhlcm5ldCBkZXZpY2Ugd2UgY2FuIGRvIHRoYXQuCj4KPgo+ICAgVGhpcyBjb21t aXQgcmVvcmRlciB0aGUgYnVmZmVycyB1c2luZwo+IHZxLT5oZWFkcywgb25seSB0aGUgYmF0Y2gg aXMgYmVnaW4gZnJvbSB0aGUgZXhwZWN0ZWQgc3RhcnQgcG9pbnQgYW5kIGlzCj4gY29udGludW91 cyBjYW4gdGhlIGJhdGNoIGJlIGV4cG9zZWQgdG8gZHJpdmVyLiAgQW5kIG9ubHkgd3JpdGluZyBv dXQgYQo+IHNpbmdsZSB1c2VkIHJpbmcgZm9yIGEgYmF0Y2ggb2YgZGVzY3JpcHRvcnMsIGFjY29y ZGluZyB0byBWSVJUSU8gMS4xCj4gc3BlYy4KPgo+Cj4KPiBTbyB0aGlzIHNvdW5kcyBtb3JlIGxp a2UgYSAid29ya2Fyb3VuZCIgb2YgdGhlIGRldmljZSB0aGF0IGNhbid0IGNvbnN1bWUgYnVmZmVy IGluIG9yZGVyLCBJIHN1c3BlY3QgaXQgY2FuIGhlbHAgaW4gcGVyZm9ybWFuY2UuCj4KPiBNb3Jl IGJlbG93Lgo+Cj4KPgo+IFNpZ25lZC1vZmYtYnk6IEd1byBaaGkgPHF0eHVuaW5nMTk5OUBzanR1 LmVkdS5jbj4KPiAtLS0KPiAgIGRyaXZlcnMvdmhvc3Qvdmhvc3QuYyB8IDQ0ICsrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0KPiAgIGRyaXZlcnMvdmhvc3Qvdmhvc3Qu aCB8ICAzICsrKwo+ICAgMiBmaWxlcyBjaGFuZ2VkLCA0NSBpbnNlcnRpb25zKCspLCAyIGRlbGV0 aW9ucygtKQo+Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmhvc3Qvdmhvc3QuYyBiL2RyaXZlcnMv dmhvc3Qvdmhvc3QuYwo+IGluZGV4IDQwMDk3ODI2Yy4uZTJlNzdlMjlmIDEwMDY0NAo+IC0tLSBh L2RyaXZlcnMvdmhvc3Qvdmhvc3QuYwo+ICsrKyBiL2RyaXZlcnMvdmhvc3Qvdmhvc3QuYwo+IEBA IC0zMTcsNiArMzE3LDcgQEAgc3RhdGljIHZvaWQgdmhvc3RfdnFfcmVzZXQoc3RydWN0IHZob3N0 X2RldiAqZGV2LAo+ICAgICAgIHZxLT51c2VkX2ZsYWdzID0gMDsKPiAgICAgICB2cS0+bG9nX3Vz ZWQgPSBmYWxzZTsKPiAgICAgICB2cS0+bG9nX2FkZHIgPSAtMXVsbDsKPiArICAgIHZxLT5uZXh0 X3VzZWRfaGVhZF9pZHggPSAwOwo+ICAgICAgIHZxLT5wcml2YXRlX2RhdGEgPSBOVUxMOwo+ICAg ICAgIHZxLT5hY2tlZF9mZWF0dXJlcyA9IDA7Cj4gICAgICAgdnEtPmFja2VkX2JhY2tlbmRfZmVh dHVyZXMgPSAwOwo+IEBAIC0zOTgsNiArMzk5LDggQEAgc3RhdGljIGxvbmcgdmhvc3RfZGV2X2Fs bG9jX2lvdmVjcyhzdHJ1Y3Qgdmhvc3RfZGV2ICpkZXYpCj4gICAgICAgICAgICAgICAgICAgICAg ICAgR0ZQX0tFUk5FTCk7Cj4gICAgICAgICAgIGlmICghdnEtPmluZGlyZWN0IHx8ICF2cS0+bG9n IHx8ICF2cS0+aGVhZHMpCj4gICAgICAgICAgICAgICBnb3RvIGVycl9ub21lbTsKPiArCj4gKyAg ICAgICAgbWVtc2V0KHZxLT5oZWFkcywgMCwgc2l6ZW9mKCp2cS0+aGVhZHMpICogZGV2LT5pb3Zf bGltaXQpOwo+ICAgICAgIH0KPiAgICAgICByZXR1cm4gMDsKPiAgIEBAIC0yMzc0LDEyICsyMzc3 LDQ5IEBAIHN0YXRpYyBpbnQgX192aG9zdF9hZGRfdXNlZF9uKHN0cnVjdCB2aG9zdF92aXJ0cXVl dWUgKnZxLAo+ICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNvdW50KQo+ICAgewo+ICAgICAg IHZyaW5nX3VzZWRfZWxlbV90IF9fdXNlciAqdXNlZDsKPiArICAgIHN0cnVjdCB2cmluZ19kZXNj IGRlc2M7Cj4gICAgICAgdTE2IG9sZCwgbmV3Owo+ICAgICAgIGludCBzdGFydDsKPiArICAgIGlu dCBiZWdpbiwgZW5kLCBpOwo+ICsgICAgaW50IGNvcHlfbiA9IGNvdW50Owo+ICsKPiArICAgIGlm ICh2aG9zdF9oYXNfZmVhdHVyZSh2cSwgVklSVElPX0ZfSU5fT1JERVIpKSB7Cj4KPgo+Cj4gSG93 IGRvIHlvdSBndWFyYW50ZWUgdGhhdCBpZHMgb2YgaGVhZHMgYXJlIGNvbnRpZ3VvdXM/Cj4KPiBU aGVyZSBpcyBubyBuZWVkIHRvIGJlIGNvbnRpZ3VvdXMgZm9yIGlkcyBvZiBoZWFkcy4KPgo+IEZv ciBleGFtcGxlLCBJIGhhdmUgdGhyZWUgYnVmZmVyIHsgLmlkID0gMCwgMTV9LCB7LmlkID0gMjAs IDMwfSB7LmlkID0gMTUsIDIwfSBmb3Igdmhvc3RfYWRkX3VzZWRfbi4gVGhlbiBJIHdpbGwgbGV0 IHRoZSB2cS0+aGVhZHNbMF0ubGVuPTE1LiB2cS0+aGVhZHNbMTVdLmxlbj01LCB2cS0+aGVhZHNb MjBdLmxlbj0xMCBhcyByZW9yZGVyLiBPbmNlIEkgZm91bmQgdGhlcmUgaXMgbm8gaG9sZCBpbiB0 aGUgYmF0Y2hlZCBkZXNjcmlwdG9ycy4gSSB3aWxsIGV4cG9zZSB0aGVtIHRvIGRyaXZlci4KClNv IHNwZWMgc2FpZDoKCiJJZiBWSVJUSU9fRl9JTl9PUkRFUiBoYXMgYmVlbiBuZWdvdGlhdGVkLCBk cml2ZXIgdXNlcyBkZXNjcmlwdG9ycyBpbgpyaW5nIG9yZGVyOiBzdGFydGluZyBmcm9tIG9mZnNl dCAwIGluIHRoZSB0YWJsZSwgYW5kIHdyYXBwaW5nIGFyb3VuZAphdCB0aGUgZW5kIG9mIHRoZSB0 YWJsZS4iCgpBbmQKCiJWSVJUSU9fRl9JTl9PUkRFUigzNSlUaGlzIGZlYXR1cmUgaW5kaWNhdGVz IHRoYXQgYWxsIGJ1ZmZlcnMgYXJlIHVzZWQKYnkgdGhlIGRldmljZSBpbiB0aGUgc2FtZSBvcmRl ciBpbiB3aGljaCB0aGV5IGhhdmUgYmVlbiBtYWRlCmF2YWlsYWJsZS4iCgpUaGlzIG1lYW5zIHlv dXIgZXhhbXBsZSBpcyBub3QgYW4gSU5fT1JERVIgZGV2aWNlLgoKVGhlIGRyaXZlciBzaG91bGQg c3VibWl0IGJ1ZmZlcnMgKGFzc3VtaW5nIGVhY2ggYnVmZmVyIGhhdmUgb25lCmRlc2NyaXB0b3Ip IGluIG9yZGVyIHtpZCA9IDAsIDE1fSwge2lkID0gMSwgMzB9IGFuZCB7aWQgPSAyLCAyMH0uCgpB bmQgZXZlbiBpZiBpdCBpcyBzdWJtaXR0ZWQgaW4gb3JkZXIsIHdlIGNhbiBub3QgdXNlIGEgYmF0 Y2ggYmVjYXVzZToKCiJUaGUgc2tpcHBlZCBidWZmZXJzIChmb3Igd2hpY2ggbm8gdXNlZCByaW5n IGVudHJ5IHdhcyB3cml0dGVuKSBhcmUKYXNzdW1lZCB0byBoYXZlIGJlZW4gdXNlZCAocmVhZCBv ciB3cml0dGVuKSBieSB0aGUgZGV2aWNlIGNvbXBsZXRlbHkuIgoKVGhpcyBtZWFucyBmb3IgVFgg d2UgYXJlIHByb2JhYmx5IG9rLCBidXQgZm9yIHJ4LCB1bmxlc3Mgd2Uga25vdyB0aGUKYnVmZmVy cyB3ZXJlIHdyaXR0ZW4gY29tcGxldGVseSwgd2UgY2FuJ3Qgd3JpdGUgdGhlbSBpbiBhIGJhdGNo LgoKSSdkIHN1Z2dlc3QgdG8gZG8gY3Jvc3MgdGVzdGluZyBmb3IgdGhpcyBzZXJpZXM6CgoxKSB0 ZXN0aW5nIHZob3N0IElOX09SREVSIHN1cHBvcnQgd2l0aCBEUERLIHZpcnRpbyBQTUQKMikgdGVz dGluZyB2aXJ0aW8gSU5fT1JERVIgd2l0aCBEUERLIHZob3N0LXVzZXIgdmlhIHRlc3RwbWQKClRo YW5rcwoKCj4KPgo+ICsgICAgICAgIC8qIGNhbGN1bGF0ZSBkZXNjcmlwdG9yIGNoYWluIGxlbmd0 aCBmb3IgZWFjaCB1c2VkIGJ1ZmZlciAqLwo+Cj4KPgo+IEknbSBhIGxpdHRsZSBiaXQgY29uZnVz ZWQgYWJvdXQgdGhpcyBjb21tZW50LCB3ZSBoYXZlIGhlYWRzW2ldLmxlbiBmb3IgdGhpcz8KPgo+ IE1heWJlIEkgc2hvdWxkIG5vdCB1c2UgdnEtPmhlYWRzLCBzb21lIG1pc2xlYWRpbmcuCj4KPgo+ ICsgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Cj4gKyAgICAgICAgICAgIGJl Z2luID0gaGVhZHNbaV0uaWQ7Cj4gKyAgICAgICAgICAgIGVuZCA9IGJlZ2luOwo+ICsgICAgICAg ICAgICB2cS0+aGVhZHNbYmVnaW5dLmxlbiA9IDA7Cj4KPgo+Cj4gRG9lcyB0aGlzIHdvcmsgZm9y IGUuZyBSWCB2aXJ0cXVldWU/Cj4KPgo+ICsgICAgICAgICAgICBkbyB7Cj4gKyAgICAgICAgICAg ICAgICB2cS0+aGVhZHNbYmVnaW5dLmxlbiArPSAxOwo+ICsgICAgICAgICAgICAgICAgaWYgKHVu bGlrZWx5KHZob3N0X2dldF9kZXNjKHZxLCAmZGVzYywgZW5kKSkpIHsKPgo+Cj4KPiBMZXQncyB0 cnkgaGFyZCB0byBhdm9pZCBtb3JlIHVzZXJzcGFjZSBjb3B5IGhlcmUsIGl0J3MgdGhlIHNvdXJj ZSBvZiBwZXJmb3JtYW5jZSByZWdyZXNzaW9uLgo+Cj4gVGhhbmtzCj4KPgo+ICsgICAgICAgICAg ICAgICAgICAgIHZxX2Vycih2cSwgIkZhaWxlZCB0byBnZXQgZGVzY3JpcHRvcjogaWR4ICVkIGFk ZHIgJXBcbiIsCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCwgdnEtPmRlc2MgKyBl bmQpOwo+ICsgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOwo+ICsgICAgICAgICAg ICAgICAgfQo+ICsgICAgICAgICAgICB9IHdoaWxlICgoZW5kID0gbmV4dF9kZXNjKHZxLCAmZGVz YykpICE9IC0xKTsKPiArICAgICAgICB9Cj4gKwo+ICsgICAgICAgIGNvdW50ID0gMDsKPiArICAg ICAgICAvKiBzb3J0IGFuZCBiYXRjaCBjb250aW51b3VzIHVzZWQgcmluZyBlbnRyeSAqLwo+ICsg ICAgICAgIHdoaWxlICh2cS0+aGVhZHNbdnEtPm5leHRfdXNlZF9oZWFkX2lkeF0ubGVuICE9IDAp IHsKPiArICAgICAgICAgICAgY291bnQrKzsKPiArICAgICAgICAgICAgaSA9IHZxLT5uZXh0X3Vz ZWRfaGVhZF9pZHg7Cj4gKyAgICAgICAgICAgIHZxLT5uZXh0X3VzZWRfaGVhZF9pZHggPSAodnEt Pm5leHRfdXNlZF9oZWFkX2lkeCArCj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgdnEtPmhl YWRzW3ZxLT5uZXh0X3VzZWRfaGVhZF9pZHhdLmxlbikKPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAlIHZxLT5udW07Cj4gKyAgICAgICAgICAgIHZxLT5oZWFkc1tpXS5sZW4gPSAwOwo+ICsg ICAgICAgIH0KPiArICAgICAgICAvKiBvbmx5IHdyaXRlIG91dCBhIHNpbmdsZSB1c2VkIHJpbmcg ZW50cnkgd2l0aCB0aGUgaWQgY29ycmVzcG9uZGluZwo+ICsgICAgICAgICAqIHRvIHRoZSBoZWFk IGVudHJ5IG9mIHRoZSBkZXNjcmlwdG9yIGNoYWluIGRlc2NyaWJpbmcgdGhlIGxhc3QgYnVmZmVy Cj4gKyAgICAgICAgICogaW4gdGhlIGJhdGNoLgo+ICsgICAgICAgICAqLwo+ICsgICAgICAgIGhl YWRzWzBdLmlkID0gaTsKPiArICAgICAgICBjb3B5X24gPSAxOwo+ICsgICAgfQo+ICAgICAgICAg c3RhcnQgPSB2cS0+bGFzdF91c2VkX2lkeCAmICh2cS0+bnVtIC0gMSk7Cj4gICAgICAgdXNlZCA9 IHZxLT51c2VkLT5yaW5nICsgc3RhcnQ7Cj4gLSAgICBpZiAodmhvc3RfcHV0X3VzZWQodnEsIGhl YWRzLCBzdGFydCwgY291bnQpKSB7Cj4gKyAgICBpZiAodmhvc3RfcHV0X3VzZWQodnEsIGhlYWRz LCBzdGFydCwgY29weV9uKSkgewo+ICAgICAgICAgICB2cV9lcnIodnEsICJGYWlsZWQgdG8gd3Jp dGUgdXNlZCIpOwo+ICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKPiAgICAgICB9Cj4gQEAgLTI0 MTAsNyArMjQ1MCw3IEBAIGludCB2aG9zdF9hZGRfdXNlZF9uKHN0cnVjdCB2aG9zdF92aXJ0cXVl dWUgKnZxLCBzdHJ1Y3QgdnJpbmdfdXNlZF9lbGVtICpoZWFkcywKPiAgICAgICAgIHN0YXJ0ID0g dnEtPmxhc3RfdXNlZF9pZHggJiAodnEtPm51bSAtIDEpOwo+ICAgICAgIG4gPSB2cS0+bnVtIC0g c3RhcnQ7Cj4gLSAgICBpZiAobiA8IGNvdW50KSB7Cj4gKyAgICBpZiAobiA8IGNvdW50ICYmICF2 aG9zdF9oYXNfZmVhdHVyZSh2cSwgVklSVElPX0ZfSU5fT1JERVIpKSB7Cj4gICAgICAgICAgIHIg PSBfX3Zob3N0X2FkZF91c2VkX24odnEsIGhlYWRzLCBuKTsKPiAgICAgICAgICAgaWYgKHIgPCAw KQo+ICAgICAgICAgICAgICAgcmV0dXJuIHI7Cj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmhvc3Qv dmhvc3QuaCBiL2RyaXZlcnMvdmhvc3Qvdmhvc3QuaAo+IGluZGV4IGQ5MTA5MTA3YS4uN2IyYzBm YmI1IDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvdmhvc3Qvdmhvc3QuaAo+ICsrKyBiL2RyaXZlcnMv dmhvc3Qvdmhvc3QuaAo+IEBAIC0xMDcsNiArMTA3LDkgQEAgc3RydWN0IHZob3N0X3ZpcnRxdWV1 ZSB7Cj4gICAgICAgYm9vbCBsb2dfdXNlZDsKPiAgICAgICB1NjQgbG9nX2FkZHI7Cj4gICArICAg IC8qIFNvcnQgaGVhZHMgaW4gb3JkZXIgKi8KPiArICAgIHUxNiBuZXh0X3VzZWRfaGVhZF9pZHg7 Cj4gKwo+ICAgICAgIHN0cnVjdCBpb3ZlYyBpb3ZbVUlPX01BWElPVl07Cj4gICAgICAgc3RydWN0 IGlvdmVjIGlvdGxiX2lvdls2NF07Cj4gICAgICAgc3RydWN0IGlvdmVjICppbmRpcmVjdDsKPgo+ Cj4KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClZpcnR1 YWxpemF0aW9uIG1haWxpbmcgbGlzdApWaXJ0dWFsaXphdGlvbkBsaXN0cy5saW51eC1mb3VuZGF0 aW9uLm9yZwpodHRwczovL2xpc3RzLmxpbnV4Zm91bmRhdGlvbi5vcmcvbWFpbG1hbi9saXN0aW5m by92aXJ0dWFsaXphdGlvbg==