From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:49114) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fD80b-0005Oe-DW for qemu-devel@nongnu.org; Mon, 30 Apr 2018 08:34:22 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fD80a-0000py-B8 for qemu-devel@nongnu.org; Mon, 30 Apr 2018 08:34:21 -0400 From: Paul Durrant Date: Mon, 30 Apr 2018 13:01:38 +0100 Message-ID: <1525089699-13411-4-git-send-email-paul.durrant@citrix.com> In-Reply-To: <1525089699-13411-1-git-send-email-paul.durrant@citrix.com> References: <1525089699-13411-1-git-send-email-paul.durrant@citrix.com> MIME-Version: 1.0 Content-Type: text/plain Subject: [Qemu-devel] [PATCH 3/4] block/xen_disk: use a single entry iovec List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: xen-devel@lists.xenproject.org, qemu-block@nongnu.org, qemu-devel@nongnu.org Cc: Paul Durrant , Stefano Stabellini , Anthony Perard , Kevin Wolf , Max Reitz Since xen_disk now always copies data to and from a guest there is no need to maintain a vector entry corresponding to every page of a request. This means there is less per-request state to maintain so the ioreq structure can shrink significantly. Signed-off-by: Paul Durrant --- Cc: Stefano Stabellini Cc: Anthony Perard Cc: Kevin Wolf Cc: Max Reitz --- hw/block/xen_disk.c | 103 ++++++++++++++++------------------------------------ 1 file changed, 31 insertions(+), 72 deletions(-) diff --git a/hw/block/xen_disk.c b/hw/block/xen_disk.c index 8f4e229..6d737fd 100644 --- a/hw/block/xen_disk.c +++ b/hw/block/xen_disk.c @@ -46,13 +46,10 @@ struct ioreq { /* parsed request */ off_t start; QEMUIOVector v; + void *buf; + size_t size; int presync; - uint32_t domids[BLKIF_MAX_SEGMENTS_PER_REQUEST]; - uint32_t refs[BLKIF_MAX_SEGMENTS_PER_REQUEST]; - void *page[BLKIF_MAX_SEGMENTS_PER_REQUEST]; - void *pages; - /* aio status */ int aio_inflight; int aio_errors; @@ -110,13 +107,10 @@ static void ioreq_reset(struct ioreq *ioreq) memset(&ioreq->req, 0, sizeof(ioreq->req)); ioreq->status = 0; ioreq->start = 0; + ioreq->buf = NULL; + ioreq->size = 0; ioreq->presync = 0; - memset(ioreq->domids, 0, sizeof(ioreq->domids)); - memset(ioreq->refs, 0, sizeof(ioreq->refs)); - memset(ioreq->page, 0, sizeof(ioreq->page)); - ioreq->pages = NULL; - ioreq->aio_inflight = 0; ioreq->aio_errors = 0; @@ -139,7 +133,7 @@ static struct ioreq *ioreq_start(struct XenBlkDev *blkdev) ioreq = g_malloc0(sizeof(*ioreq)); ioreq->blkdev = blkdev; blkdev->requests_total++; - qemu_iovec_init(&ioreq->v, BLKIF_MAX_SEGMENTS_PER_REQUEST); + qemu_iovec_init(&ioreq->v, 1); } else { /* get one from freelist */ ioreq = QLIST_FIRST(&blkdev->freelist); @@ -184,7 +178,6 @@ static void ioreq_release(struct ioreq *ioreq, bool finish) static int ioreq_parse(struct ioreq *ioreq) { struct XenBlkDev *blkdev = ioreq->blkdev; - uintptr_t mem; size_t len; int i; @@ -231,14 +224,10 @@ static int ioreq_parse(struct ioreq *ioreq) goto err; } - ioreq->domids[i] = blkdev->xendev.dom; - ioreq->refs[i] = ioreq->req.seg[i].gref; - - mem = ioreq->req.seg[i].first_sect * blkdev->file_blk; len = (ioreq->req.seg[i].last_sect - ioreq->req.seg[i].first_sect + 1) * blkdev->file_blk; - qemu_iovec_add(&ioreq->v, (void*)mem, len); + ioreq->size += len; } - if (ioreq->start + ioreq->v.size > blkdev->file_size) { + if (ioreq->start + ioreq->size > blkdev->file_size) { xen_pv_printf(&blkdev->xendev, 0, "error: access beyond end of file\n"); goto err; } @@ -249,85 +238,55 @@ err: return -1; } -static void ioreq_free_copy_buffers(struct ioreq *ioreq) -{ - int i; - - for (i = 0; i < ioreq->v.niov; i++) { - ioreq->page[i] = NULL; - } - - qemu_vfree(ioreq->pages); -} - -static int ioreq_init_copy_buffers(struct ioreq *ioreq) -{ - int i; - - if (ioreq->v.niov == 0) { - return 0; - } - - ioreq->pages = qemu_memalign(XC_PAGE_SIZE, ioreq->v.niov * XC_PAGE_SIZE); - - for (i = 0; i < ioreq->v.niov; i++) { - ioreq->page[i] = ioreq->pages + i * XC_PAGE_SIZE; - ioreq->v.iov[i].iov_base = ioreq->page[i]; - } - - return 0; -} - static int ioreq_grant_copy(struct ioreq *ioreq) { - xengnttab_handle *gnt = ioreq->blkdev->xendev.gnttabdev; + struct XenBlkDev *blkdev = ioreq->blkdev; + xengnttab_handle *gnt = blkdev->xendev.gnttabdev; + void *virt = ioreq->buf; xengnttab_grant_copy_segment_t segs[BLKIF_MAX_SEGMENTS_PER_REQUEST]; - int i, count, rc; - int64_t file_blk = ioreq->blkdev->file_blk; - - if (ioreq->v.niov == 0) { - return 0; - } + int i, rc; + int64_t file_blk = blkdev->file_blk; - count = ioreq->v.niov; - - for (i = 0; i < count; i++) { + for (i = 0; i < ioreq->req.nr_segments; i++) { if (ioreq->req.operation == BLKIF_OP_READ) { segs[i].flags = GNTCOPY_dest_gref; - segs[i].dest.foreign.ref = ioreq->refs[i]; - segs[i].dest.foreign.domid = ioreq->domids[i]; + segs[i].dest.foreign.ref = ioreq->req.seg[i].gref; + segs[i].dest.foreign.domid = blkdev->xendev.dom; segs[i].dest.foreign.offset = ioreq->req.seg[i].first_sect * file_blk; - segs[i].source.virt = ioreq->v.iov[i].iov_base; + segs[i].source.virt = virt; } else { segs[i].flags = GNTCOPY_source_gref; - segs[i].source.foreign.ref = ioreq->refs[i]; - segs[i].source.foreign.domid = ioreq->domids[i]; + segs[i].source.foreign.ref = ioreq->req.seg[i].gref; + segs[i].source.foreign.domid = blkdev->xendev.dom; segs[i].source.foreign.offset = ioreq->req.seg[i].first_sect * file_blk; - segs[i].dest.virt = ioreq->v.iov[i].iov_base; + segs[i].dest.virt = virt; } segs[i].len = (ioreq->req.seg[i].last_sect - ioreq->req.seg[i].first_sect + 1) * file_blk; + virt += segs[i].len; } - rc = xengnttab_grant_copy(gnt, count, segs); + rc = xengnttab_grant_copy(gnt, ioreq->req.nr_segments, segs); if (rc) { - xen_pv_printf(&ioreq->blkdev->xendev, 0, + xen_pv_printf(&blkdev->xendev, 0, "failed to copy data %d\n", rc); ioreq->aio_errors++; return -1; } - for (i = 0; i < count; i++) { + for (i = 0; i < ioreq->req.nr_segments; i++) { if (segs[i].status != GNTST_okay) { - xen_pv_printf(&ioreq->blkdev->xendev, 3, + xen_pv_printf(&blkdev->xendev, 3, "failed to copy data %d for gref %d, domid %d\n", - segs[i].status, ioreq->refs[i], ioreq->domids[i]); + segs[i].status, ioreq->req.seg[i].gref, + blkdev->xendev.dom); ioreq->aio_errors++; rc = -1; } } + qemu_iovec_add(&ioreq->v, ioreq->buf, ioreq->size); return rc; } @@ -362,14 +321,14 @@ static void qemu_aio_complete(void *opaque, int ret) if (ret == 0) { ioreq_grant_copy(ioreq); } - ioreq_free_copy_buffers(ioreq); + qemu_vfree(ioreq->buf); break; case BLKIF_OP_WRITE: case BLKIF_OP_FLUSH_DISKCACHE: if (!ioreq->req.nr_segments) { break; } - ioreq_free_copy_buffers(ioreq); + qemu_vfree(ioreq->buf); break; default: break; @@ -437,12 +396,12 @@ static int ioreq_runio_qemu_aio(struct ioreq *ioreq) { struct XenBlkDev *blkdev = ioreq->blkdev; - ioreq_init_copy_buffers(ioreq); + ioreq->buf = qemu_memalign(XC_PAGE_SIZE, ioreq->size); if (ioreq->req.nr_segments && (ioreq->req.operation == BLKIF_OP_WRITE || ioreq->req.operation == BLKIF_OP_FLUSH_DISKCACHE) && ioreq_grant_copy(ioreq)) { - ioreq_free_copy_buffers(ioreq); + qemu_vfree(ioreq->buf); goto err; } -- 2.1.4 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Paul Durrant Subject: [PATCH 3/4] block/xen_disk: use a single entry iovec Date: Mon, 30 Apr 2018 13:01:38 +0100 Message-ID: <1525089699-13411-4-git-send-email-paul.durrant@citrix.com> References: <1525089699-13411-1-git-send-email-paul.durrant@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1fD7V4-00041Y-Fk for xen-devel@lists.xenproject.org; Mon, 30 Apr 2018 12:01:46 +0000 In-Reply-To: <1525089699-13411-1-git-send-email-paul.durrant@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: xen-devel@lists.xenproject.org, qemu-block@nongnu.org, qemu-devel@nongnu.org Cc: Anthony Perard , Kevin Wolf , Paul Durrant , Stefano Stabellini , Max Reitz List-Id: xen-devel@lists.xenproject.org U2luY2UgeGVuX2Rpc2sgbm93IGFsd2F5cyBjb3BpZXMgZGF0YSB0byBhbmQgZnJvbSBhIGd1ZXN0 IHRoZXJlIGlzIG5vIG5lZWQKdG8gbWFpbnRhaW4gYSB2ZWN0b3IgZW50cnkgY29ycmVzcG9uZGlu ZyB0byBldmVyeSBwYWdlIG9mIGEgcmVxdWVzdC4KVGhpcyBtZWFucyB0aGVyZSBpcyBsZXNzIHBl ci1yZXF1ZXN0IHN0YXRlIHRvIG1haW50YWluIHNvIHRoZSBpb3JlcQpzdHJ1Y3R1cmUgY2FuIHNo cmluayBzaWduaWZpY2FudGx5LgoKU2lnbmVkLW9mZi1ieTogUGF1bCBEdXJyYW50IDxwYXVsLmR1 cnJhbnRAY2l0cml4LmNvbT4KLS0tCkNjOiBTdGVmYW5vIFN0YWJlbGxpbmkgPHNzdGFiZWxsaW5p QGtlcm5lbC5vcmc+CkNjOiBBbnRob255IFBlcmFyZCA8YW50aG9ueS5wZXJhcmRAY2l0cml4LmNv bT4KQ2M6IEtldmluIFdvbGYgPGt3b2xmQHJlZGhhdC5jb20+CkNjOiBNYXggUmVpdHogPG1yZWl0 ekByZWRoYXQuY29tPgotLS0KIGh3L2Jsb2NrL3hlbl9kaXNrLmMgfCAxMDMgKysrKysrKysrKysr KysrKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogMSBmaWxlIGNoYW5nZWQs IDMxIGluc2VydGlvbnMoKyksIDcyIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2h3L2Jsb2Nr L3hlbl9kaXNrLmMgYi9ody9ibG9jay94ZW5fZGlzay5jCmluZGV4IDhmNGUyMjkuLjZkNzM3ZmQg MTAwNjQ0Ci0tLSBhL2h3L2Jsb2NrL3hlbl9kaXNrLmMKKysrIGIvaHcvYmxvY2sveGVuX2Rpc2su YwpAQCAtNDYsMTMgKzQ2LDEwIEBAIHN0cnVjdCBpb3JlcSB7CiAgICAgLyogcGFyc2VkIHJlcXVl c3QgKi8KICAgICBvZmZfdCAgICAgICAgICAgICAgIHN0YXJ0OwogICAgIFFFTVVJT1ZlY3RvciAg ICAgICAgdjsKKyAgICB2b2lkICAgICAgICAgICAgICAgICpidWY7CisgICAgc2l6ZV90ICAgICAg ICAgICAgICBzaXplOwogICAgIGludCAgICAgICAgICAgICAgICAgcHJlc3luYzsKIAotICAgIHVp bnQzMl90ICAgICAgICAgICAgZG9taWRzW0JMS0lGX01BWF9TRUdNRU5UU19QRVJfUkVRVUVTVF07 Ci0gICAgdWludDMyX3QgICAgICAgICAgICByZWZzW0JMS0lGX01BWF9TRUdNRU5UU19QRVJfUkVR VUVTVF07Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAqcGFnZVtCTEtJRl9NQVhfU0VHTUVOVFNf UEVSX1JFUVVFU1RdOwotICAgIHZvaWQgICAgICAgICAgICAgICAgKnBhZ2VzOwotCiAgICAgLyog YWlvIHN0YXR1cyAqLwogICAgIGludCAgICAgICAgICAgICAgICAgYWlvX2luZmxpZ2h0OwogICAg IGludCAgICAgICAgICAgICAgICAgYWlvX2Vycm9yczsKQEAgLTExMCwxMyArMTA3LDEwIEBAIHN0 YXRpYyB2b2lkIGlvcmVxX3Jlc2V0KHN0cnVjdCBpb3JlcSAqaW9yZXEpCiAgICAgbWVtc2V0KCZp b3JlcS0+cmVxLCAwLCBzaXplb2YoaW9yZXEtPnJlcSkpOwogICAgIGlvcmVxLT5zdGF0dXMgPSAw OwogICAgIGlvcmVxLT5zdGFydCA9IDA7CisgICAgaW9yZXEtPmJ1ZiA9IE5VTEw7CisgICAgaW9y ZXEtPnNpemUgPSAwOwogICAgIGlvcmVxLT5wcmVzeW5jID0gMDsKIAotICAgIG1lbXNldChpb3Jl cS0+ZG9taWRzLCAwLCBzaXplb2YoaW9yZXEtPmRvbWlkcykpOwotICAgIG1lbXNldChpb3JlcS0+ cmVmcywgMCwgc2l6ZW9mKGlvcmVxLT5yZWZzKSk7Ci0gICAgbWVtc2V0KGlvcmVxLT5wYWdlLCAw LCBzaXplb2YoaW9yZXEtPnBhZ2UpKTsKLSAgICBpb3JlcS0+cGFnZXMgPSBOVUxMOwotCiAgICAg aW9yZXEtPmFpb19pbmZsaWdodCA9IDA7CiAgICAgaW9yZXEtPmFpb19lcnJvcnMgPSAwOwogCkBA IC0xMzksNyArMTMzLDcgQEAgc3RhdGljIHN0cnVjdCBpb3JlcSAqaW9yZXFfc3RhcnQoc3RydWN0 IFhlbkJsa0RldiAqYmxrZGV2KQogICAgICAgICBpb3JlcSA9IGdfbWFsbG9jMChzaXplb2YoKmlv cmVxKSk7CiAgICAgICAgIGlvcmVxLT5ibGtkZXYgPSBibGtkZXY7CiAgICAgICAgIGJsa2Rldi0+ cmVxdWVzdHNfdG90YWwrKzsKLSAgICAgICAgcWVtdV9pb3ZlY19pbml0KCZpb3JlcS0+diwgQkxL SUZfTUFYX1NFR01FTlRTX1BFUl9SRVFVRVNUKTsKKyAgICAgICAgcWVtdV9pb3ZlY19pbml0KCZp b3JlcS0+diwgMSk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLyogZ2V0IG9uZSBmcm9tIGZyZWVs aXN0ICovCiAgICAgICAgIGlvcmVxID0gUUxJU1RfRklSU1QoJmJsa2Rldi0+ZnJlZWxpc3QpOwpA QCAtMTg0LDcgKzE3OCw2IEBAIHN0YXRpYyB2b2lkIGlvcmVxX3JlbGVhc2Uoc3RydWN0IGlvcmVx ICppb3JlcSwgYm9vbCBmaW5pc2gpCiBzdGF0aWMgaW50IGlvcmVxX3BhcnNlKHN0cnVjdCBpb3Jl cSAqaW9yZXEpCiB7CiAgICAgc3RydWN0IFhlbkJsa0RldiAqYmxrZGV2ID0gaW9yZXEtPmJsa2Rl djsKLSAgICB1aW50cHRyX3QgbWVtOwogICAgIHNpemVfdCBsZW47CiAgICAgaW50IGk7CiAKQEAg LTIzMSwxNCArMjI0LDEwIEBAIHN0YXRpYyBpbnQgaW9yZXFfcGFyc2Uoc3RydWN0IGlvcmVxICpp b3JlcSkKICAgICAgICAgICAgIGdvdG8gZXJyOwogICAgICAgICB9CiAKLSAgICAgICAgaW9yZXEt PmRvbWlkc1tpXSA9IGJsa2Rldi0+eGVuZGV2LmRvbTsKLSAgICAgICAgaW9yZXEtPnJlZnNbaV0g ICA9IGlvcmVxLT5yZXEuc2VnW2ldLmdyZWY7Ci0KLSAgICAgICAgbWVtID0gaW9yZXEtPnJlcS5z ZWdbaV0uZmlyc3Rfc2VjdCAqIGJsa2Rldi0+ZmlsZV9ibGs7CiAgICAgICAgIGxlbiA9IChpb3Jl cS0+cmVxLnNlZ1tpXS5sYXN0X3NlY3QgLSBpb3JlcS0+cmVxLnNlZ1tpXS5maXJzdF9zZWN0ICsg MSkgKiBibGtkZXYtPmZpbGVfYmxrOwotICAgICAgICBxZW11X2lvdmVjX2FkZCgmaW9yZXEtPnYs ICh2b2lkKiltZW0sIGxlbik7CisgICAgICAgIGlvcmVxLT5zaXplICs9IGxlbjsKICAgICB9Ci0g ICAgaWYgKGlvcmVxLT5zdGFydCArIGlvcmVxLT52LnNpemUgPiBibGtkZXYtPmZpbGVfc2l6ZSkg eworICAgIGlmIChpb3JlcS0+c3RhcnQgKyBpb3JlcS0+c2l6ZSA+IGJsa2Rldi0+ZmlsZV9zaXpl KSB7CiAgICAgICAgIHhlbl9wdl9wcmludGYoJmJsa2Rldi0+eGVuZGV2LCAwLCAiZXJyb3I6IGFj Y2VzcyBiZXlvbmQgZW5kIG9mIGZpbGVcbiIpOwogICAgICAgICBnb3RvIGVycjsKICAgICB9CkBA IC0yNDksODUgKzIzOCw1NSBAQCBlcnI6CiAgICAgcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgdm9p ZCBpb3JlcV9mcmVlX2NvcHlfYnVmZmVycyhzdHJ1Y3QgaW9yZXEgKmlvcmVxKQotewotICAgIGlu dCBpOwotCi0gICAgZm9yIChpID0gMDsgaSA8IGlvcmVxLT52Lm5pb3Y7IGkrKykgewotICAgICAg ICBpb3JlcS0+cGFnZVtpXSA9IE5VTEw7Ci0gICAgfQotCi0gICAgcWVtdV92ZnJlZShpb3JlcS0+ cGFnZXMpOwotfQotCi1zdGF0aWMgaW50IGlvcmVxX2luaXRfY29weV9idWZmZXJzKHN0cnVjdCBp b3JlcSAqaW9yZXEpCi17Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAoaW9yZXEtPnYubmlvdiA9PSAw KSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGlvcmVxLT5wYWdlcyA9IHFlbXVf bWVtYWxpZ24oWENfUEFHRV9TSVpFLCBpb3JlcS0+di5uaW92ICogWENfUEFHRV9TSVpFKTsKLQot ICAgIGZvciAoaSA9IDA7IGkgPCBpb3JlcS0+di5uaW92OyBpKyspIHsKLSAgICAgICAgaW9yZXEt PnBhZ2VbaV0gPSBpb3JlcS0+cGFnZXMgKyBpICogWENfUEFHRV9TSVpFOwotICAgICAgICBpb3Jl cS0+di5pb3ZbaV0uaW92X2Jhc2UgPSBpb3JlcS0+cGFnZVtpXTsKLSAgICB9Ci0KLSAgICByZXR1 cm4gMDsKLX0KLQogc3RhdGljIGludCBpb3JlcV9ncmFudF9jb3B5KHN0cnVjdCBpb3JlcSAqaW9y ZXEpCiB7Ci0gICAgeGVuZ250dGFiX2hhbmRsZSAqZ250ID0gaW9yZXEtPmJsa2Rldi0+eGVuZGV2 LmdudHRhYmRldjsKKyAgICBzdHJ1Y3QgWGVuQmxrRGV2ICpibGtkZXYgPSBpb3JlcS0+YmxrZGV2 OworICAgIHhlbmdudHRhYl9oYW5kbGUgKmdudCA9IGJsa2Rldi0+eGVuZGV2LmdudHRhYmRldjsK KyAgICB2b2lkICp2aXJ0ID0gaW9yZXEtPmJ1ZjsKICAgICB4ZW5nbnR0YWJfZ3JhbnRfY29weV9z ZWdtZW50X3Qgc2Vnc1tCTEtJRl9NQVhfU0VHTUVOVFNfUEVSX1JFUVVFU1RdOwotICAgIGludCBp LCBjb3VudCwgcmM7Ci0gICAgaW50NjRfdCBmaWxlX2JsayA9IGlvcmVxLT5ibGtkZXYtPmZpbGVf YmxrOwotCi0gICAgaWYgKGlvcmVxLT52Lm5pb3YgPT0gMCkgewotICAgICAgICByZXR1cm4gMDsK LSAgICB9CisgICAgaW50IGksIHJjOworICAgIGludDY0X3QgZmlsZV9ibGsgPSBibGtkZXYtPmZp bGVfYmxrOwogCi0gICAgY291bnQgPSBpb3JlcS0+di5uaW92OwotCi0gICAgZm9yIChpID0gMDsg aSA8IGNvdW50OyBpKyspIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaW9yZXEtPnJlcS5ucl9zZWdt ZW50czsgaSsrKSB7CiAgICAgICAgIGlmIChpb3JlcS0+cmVxLm9wZXJhdGlvbiA9PSBCTEtJRl9P UF9SRUFEKSB7CiAgICAgICAgICAgICBzZWdzW2ldLmZsYWdzID0gR05UQ09QWV9kZXN0X2dyZWY7 Ci0gICAgICAgICAgICBzZWdzW2ldLmRlc3QuZm9yZWlnbi5yZWYgPSBpb3JlcS0+cmVmc1tpXTsK LSAgICAgICAgICAgIHNlZ3NbaV0uZGVzdC5mb3JlaWduLmRvbWlkID0gaW9yZXEtPmRvbWlkc1tp XTsKKyAgICAgICAgICAgIHNlZ3NbaV0uZGVzdC5mb3JlaWduLnJlZiA9IGlvcmVxLT5yZXEuc2Vn W2ldLmdyZWY7CisgICAgICAgICAgICBzZWdzW2ldLmRlc3QuZm9yZWlnbi5kb21pZCA9IGJsa2Rl di0+eGVuZGV2LmRvbTsKICAgICAgICAgICAgIHNlZ3NbaV0uZGVzdC5mb3JlaWduLm9mZnNldCA9 IGlvcmVxLT5yZXEuc2VnW2ldLmZpcnN0X3NlY3QgKiBmaWxlX2JsazsKLSAgICAgICAgICAgIHNl Z3NbaV0uc291cmNlLnZpcnQgPSBpb3JlcS0+di5pb3ZbaV0uaW92X2Jhc2U7CisgICAgICAgICAg ICBzZWdzW2ldLnNvdXJjZS52aXJ0ID0gdmlydDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAg ICAgIHNlZ3NbaV0uZmxhZ3MgPSBHTlRDT1BZX3NvdXJjZV9ncmVmOwotICAgICAgICAgICAgc2Vn c1tpXS5zb3VyY2UuZm9yZWlnbi5yZWYgPSBpb3JlcS0+cmVmc1tpXTsKLSAgICAgICAgICAgIHNl Z3NbaV0uc291cmNlLmZvcmVpZ24uZG9taWQgPSBpb3JlcS0+ZG9taWRzW2ldOworICAgICAgICAg ICAgc2Vnc1tpXS5zb3VyY2UuZm9yZWlnbi5yZWYgPSBpb3JlcS0+cmVxLnNlZ1tpXS5ncmVmOwor ICAgICAgICAgICAgc2Vnc1tpXS5zb3VyY2UuZm9yZWlnbi5kb21pZCA9IGJsa2Rldi0+eGVuZGV2 LmRvbTsKICAgICAgICAgICAgIHNlZ3NbaV0uc291cmNlLmZvcmVpZ24ub2Zmc2V0ID0gaW9yZXEt PnJlcS5zZWdbaV0uZmlyc3Rfc2VjdCAqIGZpbGVfYmxrOwotICAgICAgICAgICAgc2Vnc1tpXS5k ZXN0LnZpcnQgPSBpb3JlcS0+di5pb3ZbaV0uaW92X2Jhc2U7CisgICAgICAgICAgICBzZWdzW2ld LmRlc3QudmlydCA9IHZpcnQ7CiAgICAgICAgIH0KICAgICAgICAgc2Vnc1tpXS5sZW4gPSAoaW9y ZXEtPnJlcS5zZWdbaV0ubGFzdF9zZWN0CiAgICAgICAgICAgICAgICAgICAgICAgIC0gaW9yZXEt PnJlcS5zZWdbaV0uZmlyc3Rfc2VjdCArIDEpICogZmlsZV9ibGs7CisgICAgICAgIHZpcnQgKz0g c2Vnc1tpXS5sZW47CiAgICAgfQogCi0gICAgcmMgPSB4ZW5nbnR0YWJfZ3JhbnRfY29weShnbnQs IGNvdW50LCBzZWdzKTsKKyAgICByYyA9IHhlbmdudHRhYl9ncmFudF9jb3B5KGdudCwgaW9yZXEt PnJlcS5ucl9zZWdtZW50cywgc2Vncyk7CiAKICAgICBpZiAocmMpIHsKLSAgICAgICAgeGVuX3B2 X3ByaW50ZigmaW9yZXEtPmJsa2Rldi0+eGVuZGV2LCAwLAorICAgICAgICB4ZW5fcHZfcHJpbnRm KCZibGtkZXYtPnhlbmRldiwgMCwKICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIGNv cHkgZGF0YSAlZFxuIiwgcmMpOwogICAgICAgICBpb3JlcS0+YWlvX2Vycm9ycysrOwogICAgICAg ICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsK KyAgICBmb3IgKGkgPSAwOyBpIDwgaW9yZXEtPnJlcS5ucl9zZWdtZW50czsgaSsrKSB7CiAgICAg ICAgIGlmIChzZWdzW2ldLnN0YXR1cyAhPSBHTlRTVF9va2F5KSB7Ci0gICAgICAgICAgICB4ZW5f cHZfcHJpbnRmKCZpb3JlcS0+YmxrZGV2LT54ZW5kZXYsIDMsCisgICAgICAgICAgICB4ZW5fcHZf cHJpbnRmKCZibGtkZXYtPnhlbmRldiwgMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgImZh aWxlZCB0byBjb3B5IGRhdGEgJWQgZm9yIGdyZWYgJWQsIGRvbWlkICVkXG4iLAotICAgICAgICAg ICAgICAgICAgICAgICAgICBzZWdzW2ldLnN0YXR1cywgaW9yZXEtPnJlZnNbaV0sIGlvcmVxLT5k b21pZHNbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdzW2ldLnN0YXR1cywgaW9y ZXEtPnJlcS5zZWdbaV0uZ3JlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYmxrZGV2LT54 ZW5kZXYuZG9tKTsKICAgICAgICAgICAgIGlvcmVxLT5haW9fZXJyb3JzKys7CiAgICAgICAgICAg ICByYyA9IC0xOwogICAgICAgICB9CiAgICAgfQogCisgICAgcWVtdV9pb3ZlY19hZGQoJmlvcmVx LT52LCBpb3JlcS0+YnVmLCBpb3JlcS0+c2l6ZSk7CiAgICAgcmV0dXJuIHJjOwogfQogCkBAIC0z NjIsMTQgKzMyMSwxNCBAQCBzdGF0aWMgdm9pZCBxZW11X2Fpb19jb21wbGV0ZSh2b2lkICpvcGFx dWUsIGludCByZXQpCiAgICAgICAgIGlmIChyZXQgPT0gMCkgewogICAgICAgICAgICAgaW9yZXFf Z3JhbnRfY29weShpb3JlcSk7CiAgICAgICAgIH0KLSAgICAgICAgaW9yZXFfZnJlZV9jb3B5X2J1 ZmZlcnMoaW9yZXEpOworICAgICAgICBxZW11X3ZmcmVlKGlvcmVxLT5idWYpOwogICAgICAgICBi cmVhazsKICAgICBjYXNlIEJMS0lGX09QX1dSSVRFOgogICAgIGNhc2UgQkxLSUZfT1BfRkxVU0hf RElTS0NBQ0hFOgogICAgICAgICBpZiAoIWlvcmVxLT5yZXEubnJfc2VnbWVudHMpIHsKICAgICAg ICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGlvcmVxX2ZyZWVfY29weV9idWZmZXJz KGlvcmVxKTsKKyAgICAgICAgcWVtdV92ZnJlZShpb3JlcS0+YnVmKTsKICAgICAgICAgYnJlYWs7 CiAgICAgZGVmYXVsdDoKICAgICAgICAgYnJlYWs7CkBAIC00MzcsMTIgKzM5NiwxMiBAQCBzdGF0 aWMgaW50IGlvcmVxX3J1bmlvX3FlbXVfYWlvKHN0cnVjdCBpb3JlcSAqaW9yZXEpCiB7CiAgICAg c3RydWN0IFhlbkJsa0RldiAqYmxrZGV2ID0gaW9yZXEtPmJsa2RldjsKIAotICAgIGlvcmVxX2lu aXRfY29weV9idWZmZXJzKGlvcmVxKTsKKyAgICBpb3JlcS0+YnVmID0gcWVtdV9tZW1hbGlnbihY Q19QQUdFX1NJWkUsIGlvcmVxLT5zaXplKTsKICAgICBpZiAoaW9yZXEtPnJlcS5ucl9zZWdtZW50 cyAmJgogICAgICAgICAoaW9yZXEtPnJlcS5vcGVyYXRpb24gPT0gQkxLSUZfT1BfV1JJVEUgfHwK ICAgICAgICAgIGlvcmVxLT5yZXEub3BlcmF0aW9uID09IEJMS0lGX09QX0ZMVVNIX0RJU0tDQUNI RSkgJiYKICAgICAgICAgaW9yZXFfZ3JhbnRfY29weShpb3JlcSkpIHsKLSAgICAgICAgaW9yZXFf ZnJlZV9jb3B5X2J1ZmZlcnMoaW9yZXEpOworICAgICAgICBxZW11X3ZmcmVlKGlvcmVxLT5idWYp OwogICAgICAgICBnb3RvIGVycjsKICAgICB9CiAKLS0gCjIuMS40CgoKX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVsIG1haWxpbmcgbGlzdApY ZW4tZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcKaHR0cHM6Ly9saXN0cy54ZW5wcm9qZWN0Lm9y Zy9tYWlsbWFuL2xpc3RpbmZvL3hlbi1kZXZlbA==