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 mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9C17CC433EF for ; Tue, 26 Oct 2021 13:10:01 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 7726860EFF for ; Tue, 26 Oct 2021 13:10:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235191AbhJZNMY (ORCPT ); Tue, 26 Oct 2021 09:12:24 -0400 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]:45235 "EHLO us-smtp-delivery-124.mimecast.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235182AbhJZNMX (ORCPT ); Tue, 26 Oct 2021 09:12:23 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1635253799; 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=+T1jaOaI5BChreD/xv26cx5yavKeXy0N+IRJc86+8zA=; b=ZQ6rav5XDvV7+zXWp+Zulr4AgIzB76O7At9yzrbX6rFEudNbgFhaOI+0vqH+yMaXgwUxsP RGj8QEoe1NrrI+i094MH2x1VegzKBWFFF/MJBV0jz20DKfBQCyKILVnJLW4fRx8OIwHC/Q VRPml2D4GEk4ZiMtrU3Gt7/vdQ0snKw= Received: from mail-ed1-f71.google.com (mail-ed1-f71.google.com [209.85.208.71]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-222-X3lsb4zGNgO8UoopqLyyyA-1; Tue, 26 Oct 2021 09:09:58 -0400 X-MC-Unique: X3lsb4zGNgO8UoopqLyyyA-1 Received: by mail-ed1-f71.google.com with SMTP id k28-20020a508adc000000b003dd5e21da4bso5366734edk.11 for ; Tue, 26 Oct 2021 06:09:58 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=+T1jaOaI5BChreD/xv26cx5yavKeXy0N+IRJc86+8zA=; b=w1ONUsOHbHu9puRLcqJW1OJHHOgofqyof1hMFWZOQu5P1zf5IPgwJuVFP8opwLgFLq zDDwT5Afg5asD1b/lnMgs6Mpw5ODzFqOHUu1OCJcq+8P3Y8+5zot8fOeccQ7x/lq4h3h tgAHP+CDxKQemQtYRRHUbDbkW54rWzd0bjNzUg31BWOS2B12dAPZ1Y1Ebkj7evSqKZGU rlTZE47bvgVsHj7JjAEea/c3kUQn8dBQL4OyYgZ7AYBSZSFvYAIC4T0hHyUKAoy73Uzi YbfcQUZjoUJDSZlgU08hJZ2pGOZkzgXJAZaFs2zJNwIUjsAcbfCcaME1c6K8+oIjAVAI fnMg== X-Gm-Message-State: AOAM531+y/qNq/Ejk7+UgZt+id87zuIarazPzkGTRMaOuaQxxIMIjzhe GuqWmkc8841g0CtotdF14FWScLtjUgnNt+gbSeN0eqrvhqtf5G7v69L7FT4GKqqGTRTyi1fp6Ku OQO1I92L019aF6P/AmUNtG+BR X-Received: by 2002:a50:e089:: with SMTP id f9mr35469312edl.290.1635253797314; Tue, 26 Oct 2021 06:09:57 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzS16VF15bYjw6cvyx4L7QAFjS9aeDgYBqxdayK9ps2NSM0wqv1vAECb1yP1LoL59OvZWcF4g== X-Received: by 2002:a50:e089:: with SMTP id f9mr35469275edl.290.1635253797038; Tue, 26 Oct 2021 06:09:57 -0700 (PDT) Received: from redhat.com ([2.55.34.39]) by smtp.gmail.com with ESMTPSA id y22sm11958781edc.76.2021.10.26.06.09.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Oct 2021 06:09:56 -0700 (PDT) Date: Tue, 26 Oct 2021 09:09:52 -0400 From: "Michael S. Tsirkin" To: Jason Wang Cc: Mike Christie , target-devel@vger.kernel.org, linux-scsi@vger.kernel.org, stefanha@redhat.com, pbonzini@redhat.com, sgarzare@redhat.com, virtualization@lists.linux-foundation.org Subject: Re: [PATCH V3 11/11] vhost: allow userspace to create workers Message-ID: <20211026090923-mutt-send-email-mst@kernel.org> References: <20211022051911.108383-1-michael.christie@oracle.com> <20211022051911.108383-13-michael.christie@oracle.com> <8aee8f07-76bd-f111-bc5f-fc5cad46ce56@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <8aee8f07-76bd-f111-bc5f-fc5cad46ce56@redhat.com> Precedence: bulk List-ID: X-Mailing-List: target-devel@vger.kernel.org On Tue, Oct 26, 2021 at 01:37:14PM +0800, Jason Wang wrote: > > 在 2021/10/22 下午1:19, Mike Christie 写道: > > This patch allows userspace to create workers and bind them to vqs. You > > can have N workers per dev and also share N workers with M vqs. > > > > Signed-off-by: Mike Christie > > > A question, who is the best one to determine the binding? Is it the VMM > (Qemu etc) or the management stack? If the latter, it looks to me it's > better to expose this via sysfs? I think it's a bit much to expect this from management. > > > --- > > drivers/vhost/vhost.c | 99 ++++++++++++++++++++++++++++---- > > drivers/vhost/vhost.h | 2 +- > > include/uapi/linux/vhost.h | 11 ++++ > > include/uapi/linux/vhost_types.h | 12 ++++ > > 4 files changed, 112 insertions(+), 12 deletions(-) > > > > diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c > > index 04f43a6445e1..c86e88d7f35c 100644 > > --- a/drivers/vhost/vhost.c > > +++ b/drivers/vhost/vhost.c > > @@ -493,7 +493,6 @@ void vhost_dev_init(struct vhost_dev *dev, > > dev->umem = NULL; > > dev->iotlb = NULL; > > dev->mm = NULL; > > - dev->worker = NULL; > > dev->iov_limit = iov_limit; > > dev->weight = weight; > > dev->byte_weight = byte_weight; > > @@ -576,20 +575,40 @@ static void vhost_worker_stop(struct vhost_worker *worker) > > wait_for_completion(worker->exit_done); > > } > > -static void vhost_worker_free(struct vhost_dev *dev) > > -{ > > - struct vhost_worker *worker = dev->worker; > > +static void vhost_worker_put(struct vhost_worker *worker) > > +{ > > if (!worker) > > return; > > - dev->worker = NULL; > > + if (!refcount_dec_and_test(&worker->refcount)) > > + return; > > + > > WARN_ON(!llist_empty(&worker->work_list)); > > vhost_worker_stop(worker); > > kfree(worker); > > } > > -static struct vhost_worker *vhost_worker_create(struct vhost_dev *dev) > > +static void vhost_vq_clear_worker(struct vhost_virtqueue *vq) > > +{ > > + if (vq->worker) > > + vhost_worker_put(vq->worker); > > + vq->worker = NULL; > > +} > > + > > +static void vhost_workers_free(struct vhost_dev *dev) > > +{ > > + int i; > > + > > + if (!dev->use_worker) > > + return; > > + > > + for (i = 0; i < dev->nvqs; i++) > > + vhost_vq_clear_worker(dev->vqs[i]); > > +} > > + > > +static struct vhost_worker *vhost_worker_create(struct vhost_dev *dev, > > + int init_vq_map_count) > > { > > struct vhost_worker *worker; > > struct task_struct *task; > > @@ -598,9 +617,9 @@ static struct vhost_worker *vhost_worker_create(struct vhost_dev *dev) > > if (!worker) > > return NULL; > > - dev->worker = worker; > > worker->kcov_handle = kcov_common_handle(); > > init_llist_head(&worker->work_list); > > + refcount_set(&worker->refcount, init_vq_map_count); > > /* > > * vhost used to use the kthread API which ignores all signals by > > @@ -617,10 +636,58 @@ static struct vhost_worker *vhost_worker_create(struct vhost_dev *dev) > > free_worker: > > kfree(worker); > > - dev->worker = NULL; > > return NULL; > > } > > +static struct vhost_worker *vhost_worker_find(struct vhost_dev *dev, pid_t pid) > > +{ > > + struct vhost_worker *worker = NULL; > > + int i; > > + > > + for (i = 0; i < dev->nvqs; i++) { > > + if (dev->vqs[i]->worker->task->pid != pid) > > + continue; > > + > > + worker = dev->vqs[i]->worker; > > + break; > > + } > > + > > + return worker; > > +} > > + > > +/* Caller must have device mutex */ > > +static int vhost_vq_setup_worker(struct vhost_virtqueue *vq, > > + struct vhost_vring_worker *info) > > +{ > > + struct vhost_dev *dev = vq->dev; > > + struct vhost_worker *worker; > > + > > + if (!dev->use_worker) > > + return -EINVAL; > > + > > + /* We don't support setting a worker on an active vq */ > > + if (vq->private_data) > > + return -EBUSY; > > > Is it valuable to allow the worker switching on active vq? > > > > + > > + if (info->pid == VHOST_VRING_NEW_WORKER) { > > + worker = vhost_worker_create(dev, 1); > > + if (!worker) > > + return -ENOMEM; > > + > > + info->pid = worker->task->pid; > > + } else { > > + worker = vhost_worker_find(dev, info->pid); > > + if (!worker) > > + return -ENODEV; > > + > > + refcount_inc(&worker->refcount); > > + } > > + > > + vhost_vq_clear_worker(vq); > > + vq->worker = worker; > > + return 0; > > +} > > + > > /* Caller should have device mutex */ > > long vhost_dev_set_owner(struct vhost_dev *dev) > > { > > @@ -636,7 +703,7 @@ long vhost_dev_set_owner(struct vhost_dev *dev) > > vhost_attach_mm(dev); > > if (dev->use_worker) { > > - worker = vhost_worker_create(dev); > > + worker = vhost_worker_create(dev, dev->nvqs); > > if (!worker) > > goto err_worker; > > @@ -650,7 +717,7 @@ long vhost_dev_set_owner(struct vhost_dev *dev) > > return 0; > > err_iovecs: > > - vhost_worker_free(dev); > > + vhost_workers_free(dev); > > err_worker: > > vhost_detach_mm(dev); > > err_mm: > > @@ -742,7 +809,7 @@ void vhost_dev_cleanup(struct vhost_dev *dev) > > dev->iotlb = NULL; > > vhost_clear_msg(dev); > > wake_up_interruptible_poll(&dev->wait, EPOLLIN | EPOLLRDNORM); > > - vhost_worker_free(dev); > > + vhost_workers_free(dev); > > vhost_detach_mm(dev); > > } > > EXPORT_SYMBOL_GPL(vhost_dev_cleanup); > > @@ -1612,6 +1679,7 @@ long vhost_vring_ioctl(struct vhost_dev *d, unsigned int ioctl, void __user *arg > > struct eventfd_ctx *ctx = NULL; > > u32 __user *idxp = argp; > > struct vhost_virtqueue *vq; > > + struct vhost_vring_worker w; > > struct vhost_vring_state s; > > struct vhost_vring_file f; > > u32 idx; > > @@ -1719,6 +1787,15 @@ long vhost_vring_ioctl(struct vhost_dev *d, unsigned int ioctl, void __user *arg > > if (copy_to_user(argp, &s, sizeof(s))) > > r = -EFAULT; > > break; > > + case VHOST_SET_VRING_WORKER: > > + if (copy_from_user(&w, argp, sizeof(w))) { > > + r = -EFAULT; > > + break; > > + } > > + r = vhost_vq_setup_worker(vq, &w); > > + if (!r && copy_to_user(argp, &w, sizeof(w))) > > + r = -EFAULT; > > + break; > > default: > > r = -ENOIOCTLCMD; > > } > > diff --git a/drivers/vhost/vhost.h b/drivers/vhost/vhost.h > > index 33c63b24187a..0911d1a9bd3b 100644 > > --- a/drivers/vhost/vhost.h > > +++ b/drivers/vhost/vhost.h > > @@ -35,6 +35,7 @@ struct vhost_worker { > > struct llist_head work_list; > > u64 kcov_handle; > > unsigned long flags; > > + refcount_t refcount; > > }; > > /* Poll a file (eventfd or socket) */ > > @@ -160,7 +161,6 @@ struct vhost_dev { > > struct vhost_virtqueue **vqs; > > int nvqs; > > struct eventfd_ctx *log_ctx; > > - struct vhost_worker *worker; > > struct vhost_iotlb *umem; > > struct vhost_iotlb *iotlb; > > spinlock_t iotlb_lock; > > diff --git a/include/uapi/linux/vhost.h b/include/uapi/linux/vhost.h > > index c998860d7bbc..e5c0669430e5 100644 > > --- a/include/uapi/linux/vhost.h > > +++ b/include/uapi/linux/vhost.h > > @@ -70,6 +70,17 @@ > > #define VHOST_VRING_BIG_ENDIAN 1 > > #define VHOST_SET_VRING_ENDIAN _IOW(VHOST_VIRTIO, 0x13, struct vhost_vring_state) > > #define VHOST_GET_VRING_ENDIAN _IOW(VHOST_VIRTIO, 0x14, struct vhost_vring_state) > > +/* By default, a device gets one vhost_worker created during VHOST_SET_OWNER > > + * that its virtqueues share. This allows userspace to create a vhost_worker > > + * and map a virtqueue to it or map a virtqueue to an existing worker. > > + * > > + * If pid > 0 and it matches an existing vhost_worker thread it will be bound > > + * to the vq. If pid is VHOST_VRING_NEW_WORKER, then a new worker will be > > + * created and bound to the vq. > > + * > > + * This must be called after VHOST_SET_OWNER and before the vq is active. > > + */ > > +#define VHOST_SET_VRING_WORKER _IOWR(VHOST_VIRTIO, 0x15, struct vhost_vring_worker) > > /* The following ioctls use eventfd file descriptors to signal and poll > > * for events. */ > > diff --git a/include/uapi/linux/vhost_types.h b/include/uapi/linux/vhost_types.h > > index f7f6a3a28977..af654e3cef0e 100644 > > --- a/include/uapi/linux/vhost_types.h > > +++ b/include/uapi/linux/vhost_types.h > > @@ -47,6 +47,18 @@ struct vhost_vring_addr { > > __u64 log_guest_addr; > > }; > > +#define VHOST_VRING_NEW_WORKER -1 > > > Do we need VHOST_VRING_FREE_WORKER? And I wonder if using dedicated ioctls > are better: > > VHOST_VRING_NEW/FREE_WORKER > VHOST_VRING_ATTACH_WORKER > > etc. > > Thanks > > > > + > > +struct vhost_vring_worker { > > + unsigned int index; > > + /* > > + * The pid of the vhost worker that the vq will be bound to. If > > + * pid is VHOST_VRING_NEW_WORKER a new worker will be created and its > > + * pid will be returned in pid. > > + */ > > + __kernel_pid_t pid; > > +}; > > + > > /* no alignment requirement */ > > struct vhost_iotlb_msg { > > __u64 iova; 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 mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DF573C433EF for ; Tue, 26 Oct 2021 13:10:06 +0000 (UTC) Received: from smtp1.osuosl.org (smtp1.osuosl.org [140.211.166.138]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 955AF61078 for ; Tue, 26 Oct 2021 13:10:06 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 955AF61078 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=lists.linux-foundation.org Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id 5529480A7B; Tue, 26 Oct 2021 13:10:06 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp1.osuosl.org ([127.0.0.1]) by localhost (smtp1.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id ECKCFYk-igbY; Tue, 26 Oct 2021 13:10:04 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp1.osuosl.org (Postfix) with ESMTPS id CC82D80DAF; Tue, 26 Oct 2021 13:10:03 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id A2992C0019; Tue, 26 Oct 2021 13:10:03 +0000 (UTC) Received: from smtp1.osuosl.org (smtp1.osuosl.org [140.211.166.138]) by lists.linuxfoundation.org (Postfix) with ESMTP id 01A41C000E for ; Tue, 26 Oct 2021 13:10:03 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp1.osuosl.org (Postfix) with ESMTP id E469E80DAF for ; Tue, 26 Oct 2021 13:10:02 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp1.osuosl.org ([127.0.0.1]) by localhost (smtp1.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id g14MNIx_-pjJ for ; Tue, 26 Oct 2021 13:10:01 +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.133.124]) by smtp1.osuosl.org (Postfix) with ESMTPS id E419580A7B for ; Tue, 26 Oct 2021 13:10:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1635253799; 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=+T1jaOaI5BChreD/xv26cx5yavKeXy0N+IRJc86+8zA=; b=ZQ6rav5XDvV7+zXWp+Zulr4AgIzB76O7At9yzrbX6rFEudNbgFhaOI+0vqH+yMaXgwUxsP RGj8QEoe1NrrI+i094MH2x1VegzKBWFFF/MJBV0jz20DKfBQCyKILVnJLW4fRx8OIwHC/Q VRPml2D4GEk4ZiMtrU3Gt7/vdQ0snKw= Received: from mail-ed1-f70.google.com (mail-ed1-f70.google.com [209.85.208.70]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-136-k4IlMx1cN4mxxI-tG_a31Q-1; Tue, 26 Oct 2021 09:09:58 -0400 X-MC-Unique: k4IlMx1cN4mxxI-tG_a31Q-1 Received: by mail-ed1-f70.google.com with SMTP id w7-20020a056402268700b003dd46823a18so7116157edd.18 for ; Tue, 26 Oct 2021 06:09:58 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=+T1jaOaI5BChreD/xv26cx5yavKeXy0N+IRJc86+8zA=; b=mwB0Ba28hsQpWca6Gz3m+hm6CvNcCQWZMIImLLP1+CHzmmNZl4bPyQJbPDf78OeV8y OC1232De09tYX4UZznFI2lnYPhuNQwQEsQv+2Z38+WqA6qdJxNF3aPy4FJ3Q61xwouSH 71dTiq8o7CAtPWVulUnX4CDGOmIj7OOw9aAoP1L98kPZbqbLFLATFmaaE5060RBunYY2 ZTFQd0V0lX6dNTA1E0w99EJkYj86niPCplIAg1k+mSaKXloA+zA/oaBpNT+rKx/DLvXW N7xnG9kLqqHABEZqpccoMUkk7L4o+Mvjp2BQXJBe5+NcLkleVdkEU3dQX5Z7CrMq3/Rj l9Cw== X-Gm-Message-State: AOAM531ZR1U+Rg1CeHpeFhNh6MskzH5apJx+dkNjid20RWN1zhOlFmOc gjRBAgd44sf6ygcppb9Ij4v8IeJjSp8yGZxmZjTBjYrlbOi61O+OjONy76DtWiyi/0ogYLDhYQk MopDgLofXN5zcBPaBJvVgM4qvlmn1GMc71JXWK0jkQg== X-Received: by 2002:a50:e089:: with SMTP id f9mr35469309edl.290.1635253797312; Tue, 26 Oct 2021 06:09:57 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzS16VF15bYjw6cvyx4L7QAFjS9aeDgYBqxdayK9ps2NSM0wqv1vAECb1yP1LoL59OvZWcF4g== X-Received: by 2002:a50:e089:: with SMTP id f9mr35469275edl.290.1635253797038; Tue, 26 Oct 2021 06:09:57 -0700 (PDT) Received: from redhat.com ([2.55.34.39]) by smtp.gmail.com with ESMTPSA id y22sm11958781edc.76.2021.10.26.06.09.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Oct 2021 06:09:56 -0700 (PDT) Date: Tue, 26 Oct 2021 09:09:52 -0400 From: "Michael S. Tsirkin" To: Jason Wang Subject: Re: [PATCH V3 11/11] vhost: allow userspace to create workers Message-ID: <20211026090923-mutt-send-email-mst@kernel.org> References: <20211022051911.108383-1-michael.christie@oracle.com> <20211022051911.108383-13-michael.christie@oracle.com> <8aee8f07-76bd-f111-bc5f-fc5cad46ce56@redhat.com> MIME-Version: 1.0 In-Reply-To: <8aee8f07-76bd-f111-bc5f-fc5cad46ce56@redhat.com> Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=mst@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Disposition: inline Cc: linux-scsi@vger.kernel.org, virtualization@lists.linux-foundation.org, target-devel@vger.kernel.org, stefanha@redhat.com, pbonzini@redhat.com 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" T24gVHVlLCBPY3QgMjYsIDIwMjEgYXQgMDE6Mzc6MTRQTSArMDgwMCwgSmFzb24gV2FuZyB3cm90 ZToKPiAKPiDlnKggMjAyMS8xMC8yMiDkuIvljYgxOjE5LCBNaWtlIENocmlzdGllIOWGmemBkzoK PiA+IFRoaXMgcGF0Y2ggYWxsb3dzIHVzZXJzcGFjZSB0byBjcmVhdGUgd29ya2VycyBhbmQgYmlu ZCB0aGVtIHRvIHZxcy4gWW91Cj4gPiBjYW4gaGF2ZSBOIHdvcmtlcnMgcGVyIGRldiBhbmQgYWxz byBzaGFyZSBOIHdvcmtlcnMgd2l0aCBNIHZxcy4KPiA+IAo+ID4gU2lnbmVkLW9mZi1ieTogTWlr ZSBDaHJpc3RpZSA8bWljaGFlbC5jaHJpc3RpZUBvcmFjbGUuY29tPgo+IAo+IAo+IEEgcXVlc3Rp b24sIHdobyBpcyB0aGUgYmVzdCBvbmUgdG8gZGV0ZXJtaW5lIHRoZSBiaW5kaW5nPyBJcyBpdCB0 aGUgVk1NCj4gKFFlbXUgZXRjKSBvciB0aGUgbWFuYWdlbWVudCBzdGFjaz8gSWYgdGhlIGxhdHRl ciwgaXQgbG9va3MgdG8gbWUgaXQncwo+IGJldHRlciB0byBleHBvc2UgdGhpcyB2aWEgc3lzZnM/ CgpJIHRoaW5rIGl0J3MgYSBiaXQgbXVjaCB0byBleHBlY3QgdGhpcyBmcm9tIG1hbmFnZW1lbnQu Cgo+IAo+ID4gLS0tCj4gPiAgIGRyaXZlcnMvdmhvc3Qvdmhvc3QuYyAgICAgICAgICAgIHwgOTkg KysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0KPiA+ICAgZHJpdmVycy92aG9zdC92aG9z dC5oICAgICAgICAgICAgfCAgMiArLQo+ID4gICBpbmNsdWRlL3VhcGkvbGludXgvdmhvc3QuaCAg ICAgICB8IDExICsrKysKPiA+ICAgaW5jbHVkZS91YXBpL2xpbnV4L3Zob3N0X3R5cGVzLmggfCAx MiArKysrCj4gPiAgIDQgZmlsZXMgY2hhbmdlZCwgMTEyIGluc2VydGlvbnMoKyksIDEyIGRlbGV0 aW9ucygtKQo+ID4gCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy92aG9zdC92aG9zdC5jIGIvZHJp dmVycy92aG9zdC92aG9zdC5jCj4gPiBpbmRleCAwNGY0M2E2NDQ1ZTEuLmM4NmU4OGQ3ZjM1YyAx MDA2NDQKPiA+IC0tLSBhL2RyaXZlcnMvdmhvc3Qvdmhvc3QuYwo+ID4gKysrIGIvZHJpdmVycy92 aG9zdC92aG9zdC5jCj4gPiBAQCAtNDkzLDcgKzQ5Myw2IEBAIHZvaWQgdmhvc3RfZGV2X2luaXQo c3RydWN0IHZob3N0X2RldiAqZGV2LAo+ID4gICAJZGV2LT51bWVtID0gTlVMTDsKPiA+ICAgCWRl di0+aW90bGIgPSBOVUxMOwo+ID4gICAJZGV2LT5tbSA9IE5VTEw7Cj4gPiAtCWRldi0+d29ya2Vy ID0gTlVMTDsKPiA+ICAgCWRldi0+aW92X2xpbWl0ID0gaW92X2xpbWl0Owo+ID4gICAJZGV2LT53 ZWlnaHQgPSB3ZWlnaHQ7Cj4gPiAgIAlkZXYtPmJ5dGVfd2VpZ2h0ID0gYnl0ZV93ZWlnaHQ7Cj4g PiBAQCAtNTc2LDIwICs1NzUsNDAgQEAgc3RhdGljIHZvaWQgdmhvc3Rfd29ya2VyX3N0b3Aoc3Ry dWN0IHZob3N0X3dvcmtlciAqd29ya2VyKQo+ID4gICAJd2FpdF9mb3JfY29tcGxldGlvbih3b3Jr ZXItPmV4aXRfZG9uZSk7Cj4gPiAgIH0KPiA+IC1zdGF0aWMgdm9pZCB2aG9zdF93b3JrZXJfZnJl ZShzdHJ1Y3Qgdmhvc3RfZGV2ICpkZXYpCj4gPiAtewo+ID4gLQlzdHJ1Y3Qgdmhvc3Rfd29ya2Vy ICp3b3JrZXIgPSBkZXYtPndvcmtlcjsKPiA+ICtzdGF0aWMgdm9pZCB2aG9zdF93b3JrZXJfcHV0 KHN0cnVjdCB2aG9zdF93b3JrZXIgKndvcmtlcikKPiA+ICt7Cj4gPiAgIAlpZiAoIXdvcmtlcikK PiA+ICAgCQlyZXR1cm47Cj4gPiAtCWRldi0+d29ya2VyID0gTlVMTDsKPiA+ICsJaWYgKCFyZWZj b3VudF9kZWNfYW5kX3Rlc3QoJndvcmtlci0+cmVmY291bnQpKQo+ID4gKwkJcmV0dXJuOwo+ID4g Kwo+ID4gICAJV0FSTl9PTighbGxpc3RfZW1wdHkoJndvcmtlci0+d29ya19saXN0KSk7Cj4gPiAg IAl2aG9zdF93b3JrZXJfc3RvcCh3b3JrZXIpOwo+ID4gICAJa2ZyZWUod29ya2VyKTsKPiA+ICAg fQo+ID4gLXN0YXRpYyBzdHJ1Y3Qgdmhvc3Rfd29ya2VyICp2aG9zdF93b3JrZXJfY3JlYXRlKHN0 cnVjdCB2aG9zdF9kZXYgKmRldikKPiA+ICtzdGF0aWMgdm9pZCB2aG9zdF92cV9jbGVhcl93b3Jr ZXIoc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnEpCj4gPiArewo+ID4gKwlpZiAodnEtPndvcmtl cikKPiA+ICsJCXZob3N0X3dvcmtlcl9wdXQodnEtPndvcmtlcik7Cj4gPiArCXZxLT53b3JrZXIg PSBOVUxMOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgdm9pZCB2aG9zdF93b3JrZXJzX2ZyZWUo c3RydWN0IHZob3N0X2RldiAqZGV2KQo+ID4gK3sKPiA+ICsJaW50IGk7Cj4gPiArCj4gPiArCWlm ICghZGV2LT51c2Vfd29ya2VyKQo+ID4gKwkJcmV0dXJuOwo+ID4gKwo+ID4gKwlmb3IgKGkgPSAw OyBpIDwgZGV2LT5udnFzOyBpKyspCj4gPiArCQl2aG9zdF92cV9jbGVhcl93b3JrZXIoZGV2LT52 cXNbaV0pOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMgc3RydWN0IHZob3N0X3dvcmtlciAqdmhv c3Rfd29ya2VyX2NyZWF0ZShzdHJ1Y3Qgdmhvc3RfZGV2ICpkZXYsCj4gPiArCQkJCQkJaW50IGlu aXRfdnFfbWFwX2NvdW50KQo+ID4gICB7Cj4gPiAgIAlzdHJ1Y3Qgdmhvc3Rfd29ya2VyICp3b3Jr ZXI7Cj4gPiAgIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7Cj4gPiBAQCAtNTk4LDkgKzYxNyw5 IEBAIHN0YXRpYyBzdHJ1Y3Qgdmhvc3Rfd29ya2VyICp2aG9zdF93b3JrZXJfY3JlYXRlKHN0cnVj dCB2aG9zdF9kZXYgKmRldikKPiA+ICAgCWlmICghd29ya2VyKQo+ID4gICAJCXJldHVybiBOVUxM Owo+ID4gLQlkZXYtPndvcmtlciA9IHdvcmtlcjsKPiA+ICAgCXdvcmtlci0+a2Nvdl9oYW5kbGUg PSBrY292X2NvbW1vbl9oYW5kbGUoKTsKPiA+ICAgCWluaXRfbGxpc3RfaGVhZCgmd29ya2VyLT53 b3JrX2xpc3QpOwo+ID4gKwlyZWZjb3VudF9zZXQoJndvcmtlci0+cmVmY291bnQsIGluaXRfdnFf bWFwX2NvdW50KTsKPiA+ICAgCS8qCj4gPiAgIAkgKiB2aG9zdCB1c2VkIHRvIHVzZSB0aGUga3Ro cmVhZCBBUEkgd2hpY2ggaWdub3JlcyBhbGwgc2lnbmFscyBieQo+ID4gQEAgLTYxNywxMCArNjM2 LDU4IEBAIHN0YXRpYyBzdHJ1Y3Qgdmhvc3Rfd29ya2VyICp2aG9zdF93b3JrZXJfY3JlYXRlKHN0 cnVjdCB2aG9zdF9kZXYgKmRldikKPiA+ICAgZnJlZV93b3JrZXI6Cj4gPiAgIAlrZnJlZSh3b3Jr ZXIpOwo+ID4gLQlkZXYtPndvcmtlciA9IE5VTEw7Cj4gPiAgIAlyZXR1cm4gTlVMTDsKPiA+ICAg fQo+ID4gK3N0YXRpYyBzdHJ1Y3Qgdmhvc3Rfd29ya2VyICp2aG9zdF93b3JrZXJfZmluZChzdHJ1 Y3Qgdmhvc3RfZGV2ICpkZXYsIHBpZF90IHBpZCkKPiA+ICt7Cj4gPiArCXN0cnVjdCB2aG9zdF93 b3JrZXIgKndvcmtlciA9IE5VTEw7Cj4gPiArCWludCBpOwo+ID4gKwo+ID4gKwlmb3IgKGkgPSAw OyBpIDwgZGV2LT5udnFzOyBpKyspIHsKPiA+ICsJCWlmIChkZXYtPnZxc1tpXS0+d29ya2VyLT50 YXNrLT5waWQgIT0gcGlkKQo+ID4gKwkJCWNvbnRpbnVlOwo+ID4gKwo+ID4gKwkJd29ya2VyID0g ZGV2LT52cXNbaV0tPndvcmtlcjsKPiA+ICsJCWJyZWFrOwo+ID4gKwl9Cj4gPiArCj4gPiArCXJl dHVybiB3b3JrZXI7Cj4gPiArfQo+ID4gKwo+ID4gKy8qIENhbGxlciBtdXN0IGhhdmUgZGV2aWNl IG11dGV4ICovCj4gPiArc3RhdGljIGludCB2aG9zdF92cV9zZXR1cF93b3JrZXIoc3RydWN0IHZo b3N0X3ZpcnRxdWV1ZSAqdnEsCj4gPiArCQkJCSBzdHJ1Y3Qgdmhvc3RfdnJpbmdfd29ya2VyICpp bmZvKQo+ID4gK3sKPiA+ICsJc3RydWN0IHZob3N0X2RldiAqZGV2ID0gdnEtPmRldjsKPiA+ICsJ c3RydWN0IHZob3N0X3dvcmtlciAqd29ya2VyOwo+ID4gKwo+ID4gKwlpZiAoIWRldi0+dXNlX3dv cmtlcikKPiA+ICsJCXJldHVybiAtRUlOVkFMOwo+ID4gKwo+ID4gKwkvKiBXZSBkb24ndCBzdXBw b3J0IHNldHRpbmcgYSB3b3JrZXIgb24gYW4gYWN0aXZlIHZxICovCj4gPiArCWlmICh2cS0+cHJp dmF0ZV9kYXRhKQo+ID4gKwkJcmV0dXJuIC1FQlVTWTsKPiAKPiAKPiBJcyBpdCB2YWx1YWJsZSB0 byBhbGxvdyB0aGUgd29ya2VyIHN3aXRjaGluZyBvbiBhY3RpdmUgdnE/Cj4gCj4gCj4gPiArCj4g PiArCWlmIChpbmZvLT5waWQgPT0gVkhPU1RfVlJJTkdfTkVXX1dPUktFUikgewo+ID4gKwkJd29y a2VyID0gdmhvc3Rfd29ya2VyX2NyZWF0ZShkZXYsIDEpOwo+ID4gKwkJaWYgKCF3b3JrZXIpCj4g PiArCQkJcmV0dXJuIC1FTk9NRU07Cj4gPiArCj4gPiArCQlpbmZvLT5waWQgPSB3b3JrZXItPnRh c2stPnBpZDsKPiA+ICsJfSBlbHNlIHsKPiA+ICsJCXdvcmtlciA9IHZob3N0X3dvcmtlcl9maW5k KGRldiwgaW5mby0+cGlkKTsKPiA+ICsJCWlmICghd29ya2VyKQo+ID4gKwkJCXJldHVybiAtRU5P REVWOwo+ID4gKwo+ID4gKwkJcmVmY291bnRfaW5jKCZ3b3JrZXItPnJlZmNvdW50KTsKPiA+ICsJ fQo+ID4gKwo+ID4gKwl2aG9zdF92cV9jbGVhcl93b3JrZXIodnEpOwo+ID4gKwl2cS0+d29ya2Vy ID0gd29ya2VyOwo+ID4gKwlyZXR1cm4gMDsKPiA+ICt9Cj4gPiArCj4gPiAgIC8qIENhbGxlciBz aG91bGQgaGF2ZSBkZXZpY2UgbXV0ZXggKi8KPiA+ICAgbG9uZyB2aG9zdF9kZXZfc2V0X293bmVy KHN0cnVjdCB2aG9zdF9kZXYgKmRldikKPiA+ICAgewo+ID4gQEAgLTYzNiw3ICs3MDMsNyBAQCBs b25nIHZob3N0X2Rldl9zZXRfb3duZXIoc3RydWN0IHZob3N0X2RldiAqZGV2KQo+ID4gICAJdmhv c3RfYXR0YWNoX21tKGRldik7Cj4gPiAgIAlpZiAoZGV2LT51c2Vfd29ya2VyKSB7Cj4gPiAtCQl3 b3JrZXIgPSB2aG9zdF93b3JrZXJfY3JlYXRlKGRldik7Cj4gPiArCQl3b3JrZXIgPSB2aG9zdF93 b3JrZXJfY3JlYXRlKGRldiwgZGV2LT5udnFzKTsKPiA+ICAgCQlpZiAoIXdvcmtlcikKPiA+ICAg CQkJZ290byBlcnJfd29ya2VyOwo+ID4gQEAgLTY1MCw3ICs3MTcsNyBAQCBsb25nIHZob3N0X2Rl dl9zZXRfb3duZXIoc3RydWN0IHZob3N0X2RldiAqZGV2KQo+ID4gICAJcmV0dXJuIDA7Cj4gPiAg IGVycl9pb3ZlY3M6Cj4gPiAtCXZob3N0X3dvcmtlcl9mcmVlKGRldik7Cj4gPiArCXZob3N0X3dv cmtlcnNfZnJlZShkZXYpOwo+ID4gICBlcnJfd29ya2VyOgo+ID4gICAJdmhvc3RfZGV0YWNoX21t KGRldik7Cj4gPiAgIGVycl9tbToKPiA+IEBAIC03NDIsNyArODA5LDcgQEAgdm9pZCB2aG9zdF9k ZXZfY2xlYW51cChzdHJ1Y3Qgdmhvc3RfZGV2ICpkZXYpCj4gPiAgIAlkZXYtPmlvdGxiID0gTlVM TDsKPiA+ICAgCXZob3N0X2NsZWFyX21zZyhkZXYpOwo+ID4gICAJd2FrZV91cF9pbnRlcnJ1cHRp YmxlX3BvbGwoJmRldi0+d2FpdCwgRVBPTExJTiB8IEVQT0xMUkROT1JNKTsKPiA+IC0Jdmhvc3Rf d29ya2VyX2ZyZWUoZGV2KTsKPiA+ICsJdmhvc3Rfd29ya2Vyc19mcmVlKGRldik7Cj4gPiAgIAl2 aG9zdF9kZXRhY2hfbW0oZGV2KTsKPiA+ICAgfQo+ID4gICBFWFBPUlRfU1lNQk9MX0dQTCh2aG9z dF9kZXZfY2xlYW51cCk7Cj4gPiBAQCAtMTYxMiw2ICsxNjc5LDcgQEAgbG9uZyB2aG9zdF92cmlu Z19pb2N0bChzdHJ1Y3Qgdmhvc3RfZGV2ICpkLCB1bnNpZ25lZCBpbnQgaW9jdGwsIHZvaWQgX191 c2VyICphcmcKPiA+ICAgCXN0cnVjdCBldmVudGZkX2N0eCAqY3R4ID0gTlVMTDsKPiA+ICAgCXUz MiBfX3VzZXIgKmlkeHAgPSBhcmdwOwo+ID4gICAJc3RydWN0IHZob3N0X3ZpcnRxdWV1ZSAqdnE7 Cj4gPiArCXN0cnVjdCB2aG9zdF92cmluZ193b3JrZXIgdzsKPiA+ICAgCXN0cnVjdCB2aG9zdF92 cmluZ19zdGF0ZSBzOwo+ID4gICAJc3RydWN0IHZob3N0X3ZyaW5nX2ZpbGUgZjsKPiA+ICAgCXUz MiBpZHg7Cj4gPiBAQCAtMTcxOSw2ICsxNzg3LDE1IEBAIGxvbmcgdmhvc3RfdnJpbmdfaW9jdGwo c3RydWN0IHZob3N0X2RldiAqZCwgdW5zaWduZWQgaW50IGlvY3RsLCB2b2lkIF9fdXNlciAqYXJn Cj4gPiAgIAkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmcywgc2l6ZW9mKHMpKSkKPiA+ICAgCQkJ ciA9IC1FRkFVTFQ7Cj4gPiAgIAkJYnJlYWs7Cj4gPiArCWNhc2UgVkhPU1RfU0VUX1ZSSU5HX1dP UktFUjoKPiA+ICsJCWlmIChjb3B5X2Zyb21fdXNlcigmdywgYXJncCwgc2l6ZW9mKHcpKSkgewo+ ID4gKwkJCXIgPSAtRUZBVUxUOwo+ID4gKwkJCWJyZWFrOwo+ID4gKwkJfQo+ID4gKwkJciA9IHZo b3N0X3ZxX3NldHVwX3dvcmtlcih2cSwgJncpOwo+ID4gKwkJaWYgKCFyICYmIGNvcHlfdG9fdXNl cihhcmdwLCAmdywgc2l6ZW9mKHcpKSkKPiA+ICsJCQlyID0gLUVGQVVMVDsKPiA+ICsJCWJyZWFr Owo+ID4gICAJZGVmYXVsdDoKPiA+ICAgCQlyID0gLUVOT0lPQ1RMQ01EOwo+ID4gICAJfQo+ID4g ZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmhvc3Qvdmhvc3QuaCBiL2RyaXZlcnMvdmhvc3Qvdmhvc3Qu aAo+ID4gaW5kZXggMzNjNjNiMjQxODdhLi4wOTExZDFhOWJkM2IgMTAwNjQ0Cj4gPiAtLS0gYS9k cml2ZXJzL3Zob3N0L3Zob3N0LmgKPiA+ICsrKyBiL2RyaXZlcnMvdmhvc3Qvdmhvc3QuaAo+ID4g QEAgLTM1LDYgKzM1LDcgQEAgc3RydWN0IHZob3N0X3dvcmtlciB7Cj4gPiAgIAlzdHJ1Y3QgbGxp c3RfaGVhZAl3b3JrX2xpc3Q7Cj4gPiAgIAl1NjQJCQlrY292X2hhbmRsZTsKPiA+ICAgCXVuc2ln bmVkIGxvbmcJCWZsYWdzOwo+ID4gKwlyZWZjb3VudF90CQlyZWZjb3VudDsKPiA+ICAgfTsKPiA+ ICAgLyogUG9sbCBhIGZpbGUgKGV2ZW50ZmQgb3Igc29ja2V0KSAqLwo+ID4gQEAgLTE2MCw3ICsx NjEsNiBAQCBzdHJ1Y3Qgdmhvc3RfZGV2IHsKPiA+ICAgCXN0cnVjdCB2aG9zdF92aXJ0cXVldWUg Kip2cXM7Cj4gPiAgIAlpbnQgbnZxczsKPiA+ICAgCXN0cnVjdCBldmVudGZkX2N0eCAqbG9nX2N0 eDsKPiA+IC0Jc3RydWN0IHZob3N0X3dvcmtlciAqd29ya2VyOwo+ID4gICAJc3RydWN0IHZob3N0 X2lvdGxiICp1bWVtOwo+ID4gICAJc3RydWN0IHZob3N0X2lvdGxiICppb3RsYjsKPiA+ICAgCXNw aW5sb2NrX3QgaW90bGJfbG9jazsKPiA+IGRpZmYgLS1naXQgYS9pbmNsdWRlL3VhcGkvbGludXgv dmhvc3QuaCBiL2luY2x1ZGUvdWFwaS9saW51eC92aG9zdC5oCj4gPiBpbmRleCBjOTk4ODYwZDdi YmMuLmU1YzA2Njk0MzBlNSAxMDA2NDQKPiA+IC0tLSBhL2luY2x1ZGUvdWFwaS9saW51eC92aG9z dC5oCj4gPiArKysgYi9pbmNsdWRlL3VhcGkvbGludXgvdmhvc3QuaAo+ID4gQEAgLTcwLDYgKzcw LDE3IEBACj4gPiAgICNkZWZpbmUgVkhPU1RfVlJJTkdfQklHX0VORElBTiAxCj4gPiAgICNkZWZp bmUgVkhPU1RfU0VUX1ZSSU5HX0VORElBTiBfSU9XKFZIT1NUX1ZJUlRJTywgMHgxMywgc3RydWN0 IHZob3N0X3ZyaW5nX3N0YXRlKQo+ID4gICAjZGVmaW5lIFZIT1NUX0dFVF9WUklOR19FTkRJQU4g X0lPVyhWSE9TVF9WSVJUSU8sIDB4MTQsIHN0cnVjdCB2aG9zdF92cmluZ19zdGF0ZSkKPiA+ICsv KiBCeSBkZWZhdWx0LCBhIGRldmljZSBnZXRzIG9uZSB2aG9zdF93b3JrZXIgY3JlYXRlZCBkdXJp bmcgVkhPU1RfU0VUX09XTkVSCj4gPiArICogdGhhdCBpdHMgdmlydHF1ZXVlcyBzaGFyZS4gVGhp cyBhbGxvd3MgdXNlcnNwYWNlIHRvIGNyZWF0ZSBhIHZob3N0X3dvcmtlcgo+ID4gKyAqIGFuZCBt YXAgYSB2aXJ0cXVldWUgdG8gaXQgb3IgbWFwIGEgdmlydHF1ZXVlIHRvIGFuIGV4aXN0aW5nIHdv cmtlci4KPiA+ICsgKgo+ID4gKyAqIElmIHBpZCA+IDAgYW5kIGl0IG1hdGNoZXMgYW4gZXhpc3Rp bmcgdmhvc3Rfd29ya2VyIHRocmVhZCBpdCB3aWxsIGJlIGJvdW5kCj4gPiArICogdG8gdGhlIHZx LiBJZiBwaWQgaXMgVkhPU1RfVlJJTkdfTkVXX1dPUktFUiwgdGhlbiBhIG5ldyB3b3JrZXIgd2ls bCBiZQo+ID4gKyAqIGNyZWF0ZWQgYW5kIGJvdW5kIHRvIHRoZSB2cS4KPiA+ICsgKgo+ID4gKyAq IFRoaXMgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgVkhPU1RfU0VUX09XTkVSIGFuZCBiZWZvcmUgdGhl IHZxIGlzIGFjdGl2ZS4KPiA+ICsgKi8KPiA+ICsjZGVmaW5lIFZIT1NUX1NFVF9WUklOR19XT1JL RVIgX0lPV1IoVkhPU1RfVklSVElPLCAweDE1LCBzdHJ1Y3Qgdmhvc3RfdnJpbmdfd29ya2VyKQo+ ID4gICAvKiBUaGUgZm9sbG93aW5nIGlvY3RscyB1c2UgZXZlbnRmZCBmaWxlIGRlc2NyaXB0b3Jz IHRvIHNpZ25hbCBhbmQgcG9sbAo+ID4gICAgKiBmb3IgZXZlbnRzLiAqLwo+ID4gZGlmZiAtLWdp dCBhL2luY2x1ZGUvdWFwaS9saW51eC92aG9zdF90eXBlcy5oIGIvaW5jbHVkZS91YXBpL2xpbnV4 L3Zob3N0X3R5cGVzLmgKPiA+IGluZGV4IGY3ZjZhM2EyODk3Ny4uYWY2NTRlM2NlZjBlIDEwMDY0 NAo+ID4gLS0tIGEvaW5jbHVkZS91YXBpL2xpbnV4L3Zob3N0X3R5cGVzLmgKPiA+ICsrKyBiL2lu Y2x1ZGUvdWFwaS9saW51eC92aG9zdF90eXBlcy5oCj4gPiBAQCAtNDcsNiArNDcsMTggQEAgc3Ry dWN0IHZob3N0X3ZyaW5nX2FkZHIgewo+ID4gICAJX191NjQgbG9nX2d1ZXN0X2FkZHI7Cj4gPiAg IH07Cj4gPiArI2RlZmluZSBWSE9TVF9WUklOR19ORVdfV09SS0VSIC0xCj4gCj4gCj4gRG8gd2Ug bmVlZCBWSE9TVF9WUklOR19GUkVFX1dPUktFUj8gQW5kIEkgd29uZGVyIGlmIHVzaW5nIGRlZGlj YXRlZCBpb2N0bHMKPiBhcmUgYmV0dGVyOgo+IAo+IFZIT1NUX1ZSSU5HX05FVy9GUkVFX1dPUktF Ugo+IFZIT1NUX1ZSSU5HX0FUVEFDSF9XT1JLRVIKPiAKPiBldGMuCj4gCj4gVGhhbmtzCj4gCj4g Cj4gPiArCj4gPiArc3RydWN0IHZob3N0X3ZyaW5nX3dvcmtlciB7Cj4gPiArCXVuc2lnbmVkIGlu dCBpbmRleDsKPiA+ICsJLyoKPiA+ICsJICogVGhlIHBpZCBvZiB0aGUgdmhvc3Qgd29ya2VyIHRo YXQgdGhlIHZxIHdpbGwgYmUgYm91bmQgdG8uIElmCj4gPiArCSAqIHBpZCBpcyBWSE9TVF9WUklO R19ORVdfV09SS0VSIGEgbmV3IHdvcmtlciB3aWxsIGJlIGNyZWF0ZWQgYW5kIGl0cwo+ID4gKwkg KiBwaWQgd2lsbCBiZSByZXR1cm5lZCBpbiBwaWQuCj4gPiArCSAqLwo+ID4gKwlfX2tlcm5lbF9w aWRfdCBwaWQ7Cj4gPiArfTsKPiA+ICsKPiA+ICAgLyogbm8gYWxpZ25tZW50IHJlcXVpcmVtZW50 ICovCj4gPiAgIHN0cnVjdCB2aG9zdF9pb3RsYl9tc2cgewo+ID4gICAJX191NjQgaW92YTsKCl9f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClZpcnR1YWxpemF0 aW9uIG1haWxpbmcgbGlzdApWaXJ0dWFsaXphdGlvbkBsaXN0cy5saW51eC1mb3VuZGF0aW9uLm9y ZwpodHRwczovL2xpc3RzLmxpbnV4Zm91bmRhdGlvbi5vcmcvbWFpbG1hbi9saXN0aW5mby92aXJ0 dWFsaXphdGlvbg==