From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50530) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fEbBo-00050K-I2 for qemu-devel@nongnu.org; Fri, 04 May 2018 09:56:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fEbBn-0003ZD-Am for qemu-devel@nongnu.org; Fri, 04 May 2018 09:56:00 -0400 From: Paul Durrant Date: Fri, 4 May 2018 14:55:33 +0100 Message-ID: <1525442134-20488-8-git-send-email-paul.durrant@citrix.com> In-Reply-To: <1525442134-20488-1-git-send-email-paul.durrant@citrix.com> References: <1525442134-20488-1-git-send-email-paul.durrant@citrix.com> MIME-Version: 1.0 Content-Type: text/plain Subject: [Qemu-devel] [PATCH v2 7/8] 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 v2: - Re-based --- hw/block/xen_disk.c | 71 ++++++++++++++--------------------------------------- 1 file changed, 18 insertions(+), 53 deletions(-) diff --git a/hw/block/xen_disk.c b/hw/block/xen_disk.c index 28be8b6..230961f 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; - /* grant mapping */ - 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,12 +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->refs, 0, sizeof(ioreq->refs)); - memset(ioreq->page, 0, sizeof(ioreq->page)); - ioreq->pages = NULL; - ioreq->aio_inflight = 0; ioreq->aio_errors = 0; @@ -138,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); @@ -183,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; @@ -230,13 +224,10 @@ static int ioreq_parse(struct ioreq *ioreq) goto err; } - 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; } @@ -247,35 +238,6 @@ 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) { struct XenBlkDev *blkdev = ioreq->blkdev; @@ -284,6 +246,7 @@ static int ioreq_grant_copy(struct ioreq *ioreq) int i, count, rc; int64_t file_blk = ioreq->blkdev->file_blk; bool to_domain = (ioreq->req.operation == BLKIF_OP_READ); + void *virt = ioreq->buf; if (ioreq->v.niov == 0) { return 0; @@ -293,16 +256,17 @@ static int ioreq_grant_copy(struct ioreq *ioreq) for (i = 0; i < count; i++) { if (to_domain) { - segs[i].dest.foreign.ref = ioreq->refs[i]; + segs[i].dest.foreign.ref = ioreq->req.seg[i].gref; 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].source.foreign.ref = ioreq->refs[i]; + segs[i].source.foreign.ref = ioreq->req.seg[i].gref; 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 = xen_be_copy_grant_refs(xendev, to_domain, segs, count); @@ -314,6 +278,7 @@ static int ioreq_grant_copy(struct ioreq *ioreq) return -1; } + qemu_iovec_add(&ioreq->v, ioreq->buf, ioreq->size); return rc; } @@ -348,14 +313,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; @@ -423,12 +388,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 v2 7/8] xen_disk: use a single entry iovec Date: Fri, 4 May 2018 14:55:33 +0100 Message-ID: <1525442134-20488-8-git-send-email-paul.durrant@citrix.com> References: <1525442134-20488-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 1fEbBl-0006xu-92 for xen-devel@lists.xenproject.org; Fri, 04 May 2018 13:55:57 +0000 In-Reply-To: <1525442134-20488-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 ekByZWRoYXQuY29tPgoKdjI6CiAtIFJlLWJhc2VkCi0tLQogaHcvYmxvY2sveGVuX2Rpc2suYyB8 IDcxICsrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CiAxIGZpbGUgY2hhbmdlZCwgMTggaW5zZXJ0aW9ucygrKSwgNTMgZGVsZXRpb25zKC0pCgpkaWZm IC0tZ2l0IGEvaHcvYmxvY2sveGVuX2Rpc2suYyBiL2h3L2Jsb2NrL3hlbl9kaXNrLmMKaW5kZXgg MjhiZThiNi4uMjMwOTYxZiAxMDA2NDQKLS0tIGEvaHcvYmxvY2sveGVuX2Rpc2suYworKysgYi9o dy9ibG9jay94ZW5fZGlzay5jCkBAIC00NiwxMyArNDYsMTAgQEAgc3RydWN0IGlvcmVxIHsKICAg ICAvKiBwYXJzZWQgcmVxdWVzdCAqLwogICAgIG9mZl90ICAgICAgICAgICAgICAgc3RhcnQ7CiAg ICAgUUVNVUlPVmVjdG9yICAgICAgICB2OworICAgIHZvaWQgICAgICAgICAgICAgICAgKmJ1ZjsK KyAgICBzaXplX3QgICAgICAgICAgICAgIHNpemU7CiAgICAgaW50ICAgICAgICAgICAgICAgICBw cmVzeW5jOwogCi0gICAgLyogZ3JhbnQgbWFwcGluZyAqLwotICAgIHVpbnQzMl90ICAgICAgICAg ICAgcmVmc1tCTEtJRl9NQVhfU0VHTUVOVFNfUEVSX1JFUVVFU1RdOwotICAgIHZvaWQgICAgICAg ICAgICAgICAgKnBhZ2VbQkxLSUZfTUFYX1NFR01FTlRTX1BFUl9SRVFVRVNUXTsKLSAgICB2b2lk ICAgICAgICAgICAgICAgICpwYWdlczsKLQogICAgIC8qIGFpbyBzdGF0dXMgKi8KICAgICBpbnQg ICAgICAgICAgICAgICAgIGFpb19pbmZsaWdodDsKICAgICBpbnQgICAgICAgICAgICAgICAgIGFp b19lcnJvcnM7CkBAIC0xMTAsMTIgKzEwNywxMCBAQCBzdGF0aWMgdm9pZCBpb3JlcV9yZXNldChz dHJ1Y3QgaW9yZXEgKmlvcmVxKQogICAgIG1lbXNldCgmaW9yZXEtPnJlcSwgMCwgc2l6ZW9mKGlv cmVxLT5yZXEpKTsKICAgICBpb3JlcS0+c3RhdHVzID0gMDsKICAgICBpb3JlcS0+c3RhcnQgPSAw OworICAgIGlvcmVxLT5idWYgPSBOVUxMOworICAgIGlvcmVxLT5zaXplID0gMDsKICAgICBpb3Jl cS0+cHJlc3luYyA9IDA7CiAKLSAgICBtZW1zZXQoaW9yZXEtPnJlZnMsIDAsIHNpemVvZihpb3Jl cS0+cmVmcykpOwotICAgIG1lbXNldChpb3JlcS0+cGFnZSwgMCwgc2l6ZW9mKGlvcmVxLT5wYWdl KSk7Ci0gICAgaW9yZXEtPnBhZ2VzID0gTlVMTDsKLQogICAgIGlvcmVxLT5haW9faW5mbGlnaHQg PSAwOwogICAgIGlvcmVxLT5haW9fZXJyb3JzID0gMDsKIApAQCAtMTM4LDcgKzEzMyw3IEBAIHN0 YXRpYyBzdHJ1Y3QgaW9yZXEgKmlvcmVxX3N0YXJ0KHN0cnVjdCBYZW5CbGtEZXYgKmJsa2RldikK ICAgICAgICAgaW9yZXEgPSBnX21hbGxvYzAoc2l6ZW9mKCppb3JlcSkpOwogICAgICAgICBpb3Jl cS0+YmxrZGV2ID0gYmxrZGV2OwogICAgICAgICBibGtkZXYtPnJlcXVlc3RzX3RvdGFsKys7Ci0g ICAgICAgIHFlbXVfaW92ZWNfaW5pdCgmaW9yZXEtPnYsIEJMS0lGX01BWF9TRUdNRU5UU19QRVJf UkVRVUVTVCk7CisgICAgICAgIHFlbXVfaW92ZWNfaW5pdCgmaW9yZXEtPnYsIDEpOwogICAgIH0g ZWxzZSB7CiAgICAgICAgIC8qIGdldCBvbmUgZnJvbSBmcmVlbGlzdCAqLwogICAgICAgICBpb3Jl cSA9IFFMSVNUX0ZJUlNUKCZibGtkZXYtPmZyZWVsaXN0KTsKQEAgLTE4Myw3ICsxNzgsNiBAQCBz dGF0aWMgdm9pZCBpb3JlcV9yZWxlYXNlKHN0cnVjdCBpb3JlcSAqaW9yZXEsIGJvb2wgZmluaXNo KQogc3RhdGljIGludCBpb3JlcV9wYXJzZShzdHJ1Y3QgaW9yZXEgKmlvcmVxKQogewogICAgIHN0 cnVjdCBYZW5CbGtEZXYgKmJsa2RldiA9IGlvcmVxLT5ibGtkZXY7Ci0gICAgdWludHB0cl90IG1l bTsKICAgICBzaXplX3QgbGVuOwogICAgIGludCBpOwogCkBAIC0yMzAsMTMgKzIyNCwxMCBAQCBz dGF0aWMgaW50IGlvcmVxX3BhcnNlKHN0cnVjdCBpb3JlcSAqaW9yZXEpCiAgICAgICAgICAgICBn b3RvIGVycjsKICAgICAgICAgfQogCi0gICAgICAgIGlvcmVxLT5yZWZzW2ldICAgPSBpb3JlcS0+ cmVxLnNlZ1tpXS5ncmVmOwotCi0gICAgICAgIG1lbSA9IGlvcmVxLT5yZXEuc2VnW2ldLmZpcnN0 X3NlY3QgKiBibGtkZXYtPmZpbGVfYmxrOwogICAgICAgICBsZW4gPSAoaW9yZXEtPnJlcS5zZWdb aV0ubGFzdF9zZWN0IC0gaW9yZXEtPnJlcS5zZWdbaV0uZmlyc3Rfc2VjdCArIDEpICogYmxrZGV2 LT5maWxlX2JsazsKLSAgICAgICAgcWVtdV9pb3ZlY19hZGQoJmlvcmVxLT52LCAodm9pZCopbWVt LCBsZW4pOworICAgICAgICBpb3JlcS0+c2l6ZSArPSBsZW47CiAgICAgfQotICAgIGlmIChpb3Jl cS0+c3RhcnQgKyBpb3JlcS0+di5zaXplID4gYmxrZGV2LT5maWxlX3NpemUpIHsKKyAgICBpZiAo aW9yZXEtPnN0YXJ0ICsgaW9yZXEtPnNpemUgPiBibGtkZXYtPmZpbGVfc2l6ZSkgewogICAgICAg ICB4ZW5fcHZfcHJpbnRmKCZibGtkZXYtPnhlbmRldiwgMCwgImVycm9yOiBhY2Nlc3MgYmV5b25k IGVuZCBvZiBmaWxlXG4iKTsKICAgICAgICAgZ290byBlcnI7CiAgICAgfQpAQCAtMjQ3LDM1ICsy MzgsNiBAQCBlcnI6CiAgICAgcmV0dXJuIC0xOwogfQogCi1zdGF0aWMgdm9pZCBpb3JlcV9mcmVl X2NvcHlfYnVmZmVycyhzdHJ1Y3QgaW9yZXEgKmlvcmVxKQotewotICAgIGludCBpOwotCi0gICAg Zm9yIChpID0gMDsgaSA8IGlvcmVxLT52Lm5pb3Y7IGkrKykgewotICAgICAgICBpb3JlcS0+cGFn ZVtpXSA9IE5VTEw7Ci0gICAgfQotCi0gICAgcWVtdV92ZnJlZShpb3JlcS0+cGFnZXMpOwotfQot Ci1zdGF0aWMgaW50IGlvcmVxX2luaXRfY29weV9idWZmZXJzKHN0cnVjdCBpb3JlcSAqaW9yZXEp Ci17Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAoaW9yZXEtPnYubmlvdiA9PSAwKSB7Ci0gICAgICAg IHJldHVybiAwOwotICAgIH0KLQotICAgIGlvcmVxLT5wYWdlcyA9IHFlbXVfbWVtYWxpZ24oWENf UEFHRV9TSVpFLCBpb3JlcS0+di5uaW92ICogWENfUEFHRV9TSVpFKTsKLQotICAgIGZvciAoaSA9 IDA7IGkgPCBpb3JlcS0+di5uaW92OyBpKyspIHsKLSAgICAgICAgaW9yZXEtPnBhZ2VbaV0gPSBp b3JlcS0+cGFnZXMgKyBpICogWENfUEFHRV9TSVpFOwotICAgICAgICBpb3JlcS0+di5pb3ZbaV0u aW92X2Jhc2UgPSBpb3JlcS0+cGFnZVtpXTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQog c3RhdGljIGludCBpb3JlcV9ncmFudF9jb3B5KHN0cnVjdCBpb3JlcSAqaW9yZXEpCiB7CiAgICAg c3RydWN0IFhlbkJsa0RldiAqYmxrZGV2ID0gaW9yZXEtPmJsa2RldjsKQEAgLTI4NCw2ICsyNDYs NyBAQCBzdGF0aWMgaW50IGlvcmVxX2dyYW50X2NvcHkoc3RydWN0IGlvcmVxICppb3JlcSkKICAg ICBpbnQgaSwgY291bnQsIHJjOwogICAgIGludDY0X3QgZmlsZV9ibGsgPSBpb3JlcS0+YmxrZGV2 LT5maWxlX2JsazsKICAgICBib29sIHRvX2RvbWFpbiA9IChpb3JlcS0+cmVxLm9wZXJhdGlvbiA9 PSBCTEtJRl9PUF9SRUFEKTsKKyAgICB2b2lkICp2aXJ0ID0gaW9yZXEtPmJ1ZjsKIAogICAgIGlm IChpb3JlcS0+di5uaW92ID09IDApIHsKICAgICAgICAgcmV0dXJuIDA7CkBAIC0yOTMsMTYgKzI1 NiwxNyBAQCBzdGF0aWMgaW50IGlvcmVxX2dyYW50X2NvcHkoc3RydWN0IGlvcmVxICppb3JlcSkK IAogICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgIGlmICh0b19kb21h aW4pIHsKLSAgICAgICAgICAgIHNlZ3NbaV0uZGVzdC5mb3JlaWduLnJlZiA9IGlvcmVxLT5yZWZz W2ldOworICAgICAgICAgICAgc2Vnc1tpXS5kZXN0LmZvcmVpZ24ucmVmID0gaW9yZXEtPnJlcS5z ZWdbaV0uZ3JlZjsKICAgICAgICAgICAgIHNlZ3NbaV0uZGVzdC5mb3JlaWduLm9mZnNldCA9IGlv cmVxLT5yZXEuc2VnW2ldLmZpcnN0X3NlY3QgKiBmaWxlX2JsazsKLSAgICAgICAgICAgIHNlZ3Nb aV0uc291cmNlLnZpcnQgPSBpb3JlcS0+di5pb3ZbaV0uaW92X2Jhc2U7CisgICAgICAgICAgICBz ZWdzW2ldLnNvdXJjZS52aXJ0ID0gdmlydDsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAg IHNlZ3NbaV0uc291cmNlLmZvcmVpZ24ucmVmID0gaW9yZXEtPnJlZnNbaV07CisgICAgICAgICAg ICBzZWdzW2ldLnNvdXJjZS5mb3JlaWduLnJlZiA9IGlvcmVxLT5yZXEuc2VnW2ldLmdyZWY7CiAg ICAgICAgICAgICBzZWdzW2ldLnNvdXJjZS5mb3JlaWduLm9mZnNldCA9IGlvcmVxLT5yZXEuc2Vn W2ldLmZpcnN0X3NlY3QgKiBmaWxlX2JsazsKLSAgICAgICAgICAgIHNlZ3NbaV0uZGVzdC52aXJ0 ID0gaW9yZXEtPnYuaW92W2ldLmlvdl9iYXNlOworICAgICAgICAgICAgc2Vnc1tpXS5kZXN0LnZp cnQgPSB2aXJ0OwogICAgICAgICB9CiAgICAgICAgIHNlZ3NbaV0ubGVuID0gKGlvcmVxLT5yZXEu c2VnW2ldLmxhc3Rfc2VjdAogICAgICAgICAgICAgICAgICAgICAgICAtIGlvcmVxLT5yZXEuc2Vn W2ldLmZpcnN0X3NlY3QgKyAxKSAqIGZpbGVfYmxrOworICAgICAgICB2aXJ0ICs9IHNlZ3NbaV0u bGVuOwogICAgIH0KIAogICAgIHJjID0geGVuX2JlX2NvcHlfZ3JhbnRfcmVmcyh4ZW5kZXYsIHRv X2RvbWFpbiwgc2VncywgY291bnQpOwpAQCAtMzE0LDYgKzI3OCw3IEBAIHN0YXRpYyBpbnQgaW9y ZXFfZ3JhbnRfY29weShzdHJ1Y3QgaW9yZXEgKmlvcmVxKQogICAgICAgICByZXR1cm4gLTE7CiAg ICAgfQogCisgICAgcWVtdV9pb3ZlY19hZGQoJmlvcmVxLT52LCBpb3JlcS0+YnVmLCBpb3JlcS0+ c2l6ZSk7CiAgICAgcmV0dXJuIHJjOwogfQogCkBAIC0zNDgsMTQgKzMxMywxNCBAQCBzdGF0aWMg dm9pZCBxZW11X2Fpb19jb21wbGV0ZSh2b2lkICpvcGFxdWUsIGludCByZXQpCiAgICAgICAgIGlm IChyZXQgPT0gMCkgewogICAgICAgICAgICAgaW9yZXFfZ3JhbnRfY29weShpb3JlcSk7CiAgICAg ICAgIH0KLSAgICAgICAgaW9yZXFfZnJlZV9jb3B5X2J1ZmZlcnMoaW9yZXEpOworICAgICAgICBx ZW11X3ZmcmVlKGlvcmVxLT5idWYpOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEJMS0lGX09Q X1dSSVRFOgogICAgIGNhc2UgQkxLSUZfT1BfRkxVU0hfRElTS0NBQ0hFOgogICAgICAgICBpZiAo IWlvcmVxLT5yZXEubnJfc2VnbWVudHMpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9 Ci0gICAgICAgIGlvcmVxX2ZyZWVfY29weV9idWZmZXJzKGlvcmVxKTsKKyAgICAgICAgcWVtdV92 ZnJlZShpb3JlcS0+YnVmKTsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAg YnJlYWs7CkBAIC00MjMsMTIgKzM4OCwxMiBAQCBzdGF0aWMgaW50IGlvcmVxX3J1bmlvX3FlbXVf YWlvKHN0cnVjdCBpb3JlcSAqaW9yZXEpCiB7CiAgICAgc3RydWN0IFhlbkJsa0RldiAqYmxrZGV2 ID0gaW9yZXEtPmJsa2RldjsKIAotICAgIGlvcmVxX2luaXRfY29weV9idWZmZXJzKGlvcmVxKTsK KyAgICBpb3JlcS0+YnVmID0gcWVtdV9tZW1hbGlnbihYQ19QQUdFX1NJWkUsIGlvcmVxLT5zaXpl KTsKICAgICBpZiAoaW9yZXEtPnJlcS5ucl9zZWdtZW50cyAmJgogICAgICAgICAoaW9yZXEtPnJl cS5vcGVyYXRpb24gPT0gQkxLSUZfT1BfV1JJVEUgfHwKICAgICAgICAgIGlvcmVxLT5yZXEub3Bl cmF0aW9uID09IEJMS0lGX09QX0ZMVVNIX0RJU0tDQUNIRSkgJiYKICAgICAgICAgaW9yZXFfZ3Jh bnRfY29weShpb3JlcSkpIHsKLSAgICAgICAgaW9yZXFfZnJlZV9jb3B5X2J1ZmZlcnMoaW9yZXEp OworICAgICAgICBxZW11X3ZmcmVlKGlvcmVxLT5idWYpOwogICAgICAgICBnb3RvIGVycjsKICAg ICB9CiAKLS0gCjIuMS40CgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KWGVuLWRldmVsIG1haWxpbmcgbGlzdApYZW4tZGV2ZWxAbGlzdHMueGVucHJvamVj dC5vcmcKaHR0cHM6Ly9saXN0cy54ZW5wcm9qZWN0Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL3hlbi1k ZXZlbA==