From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: Christoph Hellwig To: Jens Axboe Cc: Ming Lei , Konrad Rzeszutek Wilk , linux-block@vger.kernel.org, xen-devel@lists.xen.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH 09/13] block: merge BIOVEC_SEG_BOUNDARY into biovec_phys_mergeable Date: Tue, 4 Sep 2018 12:14:27 -0700 Message-Id: <20180904191431.20102-10-hch@lst.de> In-Reply-To: <20180904191431.20102-1-hch@lst.de> References: <20180904191431.20102-1-hch@lst.de> List-ID: These two checks should always be performed together, so merge them into a single helper. Signed-off-by: Christoph Hellwig --- block/bio.c | 4 +--- block/blk-integrity.c | 12 ++---------- block/blk-merge.c | 29 +++++------------------------ block/blk.h | 12 +++++++++--- include/linux/bio.h | 8 -------- 5 files changed, 17 insertions(+), 48 deletions(-) diff --git a/block/bio.c b/block/bio.c index d15a228d1bfc..26f6e8deee2d 100644 --- a/block/bio.c +++ b/block/bio.c @@ -729,9 +729,7 @@ int bio_add_pc_page(struct request_queue *q, struct bio *bio, struct page } /* If we may be able to merge these biovecs, force a recount */ - if (bio->bi_vcnt > 1 && - biovec_phys_mergeable(bvec - 1, bvec) && - BIOVEC_SEG_BOUNDARY(q, bvec - 1, bvec)) + if (bio->bi_vcnt > 1 && biovec_phys_mergeable(q, bvec - 1, bvec)) bio_clear_flag(bio, BIO_SEG_VALID); done: diff --git a/block/blk-integrity.c b/block/blk-integrity.c index 0f7267916509..d1ab089e0919 100644 --- a/block/blk-integrity.c +++ b/block/blk-integrity.c @@ -49,12 +49,8 @@ int blk_rq_count_integrity_sg(struct request_queue *q, struct bio *bio) bio_for_each_integrity_vec(iv, bio, iter) { if (prev) { - if (!biovec_phys_mergeable(&ivprv, &iv)) + if (!biovec_phys_mergeable(q, &ivprv, &iv)) goto new_segment; - - if (!BIOVEC_SEG_BOUNDARY(q, &ivprv, &iv)) - goto new_segment; - if (seg_size + iv.bv_len > queue_max_segment_size(q)) goto new_segment; @@ -95,12 +91,8 @@ int blk_rq_map_integrity_sg(struct request_queue *q, struct bio *bio, bio_for_each_integrity_vec(iv, bio, iter) { if (prev) { - if (!biovec_phys_mergeable(&ivprv, &iv)) + if (!biovec_phys_mergeable(q, &ivprv, &iv)) goto new_segment; - - if (!BIOVEC_SEG_BOUNDARY(q, &ivprv, &iv)) - goto new_segment; - if (sg->length + iv.bv_len > queue_max_segment_size(q)) goto new_segment; diff --git a/block/blk-merge.c b/block/blk-merge.c index 5e63e8259f92..42a46744c11b 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -21,9 +21,7 @@ static inline bool bios_segs_mergeable(struct request_queue *q, struct bio *prev, struct bio_vec *prev_last_bv, struct bio_vec *next_first_bv) { - if (!biovec_phys_mergeable(prev_last_bv, next_first_bv)) - return false; - if (!BIOVEC_SEG_BOUNDARY(q, prev_last_bv, next_first_bv)) + if (!biovec_phys_mergeable(q, prev_last_bv, next_first_bv)) return false; if (prev->bi_seg_back_size + next_first_bv->bv_len > queue_max_segment_size(q)) @@ -199,9 +197,7 @@ static struct bio *blk_bio_segment_split(struct request_queue *q, if (bvprvp && blk_queue_cluster(q)) { if (seg_size + bv.bv_len > queue_max_segment_size(q)) goto new_segment; - if (!biovec_phys_mergeable(bvprvp, &bv)) - goto new_segment; - if (!BIOVEC_SEG_BOUNDARY(q, bvprvp, &bv)) + if (!biovec_phys_mergeable(q, bvprvp, &bv)) goto new_segment; seg_size += bv.bv_len; @@ -332,9 +328,7 @@ static unsigned int __blk_recalc_rq_segments(struct request_queue *q, if (seg_size + bv.bv_len > queue_max_segment_size(q)) goto new_segment; - if (!biovec_phys_mergeable(&bvprv, &bv)) - goto new_segment; - if (!BIOVEC_SEG_BOUNDARY(q, &bvprv, &bv)) + if (!biovec_phys_mergeable(q, &bvprv, &bv)) goto new_segment; seg_size += bv.bv_len; @@ -414,17 +408,7 @@ static int blk_phys_contig_segment(struct request_queue *q, struct bio *bio, bio_get_last_bvec(bio, &end_bv); bio_get_first_bvec(nxt, &nxt_bv); - if (!biovec_phys_mergeable(&end_bv, &nxt_bv)) - return 0; - - /* - * bio and nxt are contiguous in memory; check if the queue allows - * these two to be merged into one - */ - if (BIOVEC_SEG_BOUNDARY(q, &end_bv, &nxt_bv)) - return 1; - - return 0; + return biovec_phys_mergeable(q, &end_bv, &nxt_bv); } static inline void @@ -438,10 +422,7 @@ __blk_segment_map_sg(struct request_queue *q, struct bio_vec *bvec, if (*sg && *cluster) { if ((*sg)->length + nbytes > queue_max_segment_size(q)) goto new_segment; - - if (!biovec_phys_mergeable(bvprv, bvec)) - goto new_segment; - if (!BIOVEC_SEG_BOUNDARY(q, bvprv, bvec)) + if (!biovec_phys_mergeable(q, bvprv, bvec)) goto new_segment; (*sg)->length += nbytes; diff --git a/block/blk.h b/block/blk.h index e36395e4c686..e903ce783624 100644 --- a/block/blk.h +++ b/block/blk.h @@ -150,13 +150,19 @@ static inline void blk_queue_enter_live(struct request_queue *q) percpu_ref_get(&q->q_usage_counter); } -static inline bool biovec_phys_mergeable(const struct bio_vec *vec1, - const struct bio_vec *vec2) +static inline bool biovec_phys_mergeable(struct request_queue *q, + struct bio_vec *vec1, struct bio_vec *vec2) { - if (bvec_to_phys(vec1) + vec1->bv_len != bvec_to_phys(vec2)) + unsigned long mask = queue_segment_boundary(q); + phys_addr_t addr1 = bvec_to_phys(vec1); + phys_addr_t addr2 = bvec_to_phys(vec2); + + if (addr1 + vec1->bv_len != addr2) return false; if (xen_domain() && !xen_biovec_phys_mergeable(vec1, vec2)) return false; + if ((addr1 | mask) != ((addr2 + vec2->bv_len - 1) | mask)) + return false; return true; } diff --git a/include/linux/bio.h b/include/linux/bio.h index e3d0abb694d4..8bec9f248ab8 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -137,14 +137,6 @@ static inline bool bio_full(struct bio *bio) */ #define bvec_to_phys(bv) (page_to_phys((bv)->bv_page) + (unsigned long) (bv)->bv_offset) -/* - * merge helpers etc - */ -#define __BIO_SEG_BOUNDARY(addr1, addr2, mask) \ - (((addr1) | (mask)) == (((addr2) - 1) | (mask))) -#define BIOVEC_SEG_BOUNDARY(q, b1, b2) \ - __BIO_SEG_BOUNDARY(bvec_to_phys((b1)), bvec_to_phys((b2)) + (b2)->bv_len, queue_segment_boundary((q))) - /* * drivers should _never_ use the all version - the bio may have been split * before it got to the driver and the driver won't own all of it -- 2.18.0 From mboxrd@z Thu Jan 1 00:00:00 1970 From: hch@lst.de (Christoph Hellwig) Date: Tue, 4 Sep 2018 12:14:27 -0700 Subject: [PATCH 09/13] block: merge BIOVEC_SEG_BOUNDARY into biovec_phys_mergeable In-Reply-To: <20180904191431.20102-1-hch@lst.de> References: <20180904191431.20102-1-hch@lst.de> Message-ID: <20180904191431.20102-10-hch@lst.de> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org These two checks should always be performed together, so merge them into a single helper. Signed-off-by: Christoph Hellwig --- block/bio.c | 4 +--- block/blk-integrity.c | 12 ++---------- block/blk-merge.c | 29 +++++------------------------ block/blk.h | 12 +++++++++--- include/linux/bio.h | 8 -------- 5 files changed, 17 insertions(+), 48 deletions(-) diff --git a/block/bio.c b/block/bio.c index d15a228d1bfc..26f6e8deee2d 100644 --- a/block/bio.c +++ b/block/bio.c @@ -729,9 +729,7 @@ int bio_add_pc_page(struct request_queue *q, struct bio *bio, struct page } /* If we may be able to merge these biovecs, force a recount */ - if (bio->bi_vcnt > 1 && - biovec_phys_mergeable(bvec - 1, bvec) && - BIOVEC_SEG_BOUNDARY(q, bvec - 1, bvec)) + if (bio->bi_vcnt > 1 && biovec_phys_mergeable(q, bvec - 1, bvec)) bio_clear_flag(bio, BIO_SEG_VALID); done: diff --git a/block/blk-integrity.c b/block/blk-integrity.c index 0f7267916509..d1ab089e0919 100644 --- a/block/blk-integrity.c +++ b/block/blk-integrity.c @@ -49,12 +49,8 @@ int blk_rq_count_integrity_sg(struct request_queue *q, struct bio *bio) bio_for_each_integrity_vec(iv, bio, iter) { if (prev) { - if (!biovec_phys_mergeable(&ivprv, &iv)) + if (!biovec_phys_mergeable(q, &ivprv, &iv)) goto new_segment; - - if (!BIOVEC_SEG_BOUNDARY(q, &ivprv, &iv)) - goto new_segment; - if (seg_size + iv.bv_len > queue_max_segment_size(q)) goto new_segment; @@ -95,12 +91,8 @@ int blk_rq_map_integrity_sg(struct request_queue *q, struct bio *bio, bio_for_each_integrity_vec(iv, bio, iter) { if (prev) { - if (!biovec_phys_mergeable(&ivprv, &iv)) + if (!biovec_phys_mergeable(q, &ivprv, &iv)) goto new_segment; - - if (!BIOVEC_SEG_BOUNDARY(q, &ivprv, &iv)) - goto new_segment; - if (sg->length + iv.bv_len > queue_max_segment_size(q)) goto new_segment; diff --git a/block/blk-merge.c b/block/blk-merge.c index 5e63e8259f92..42a46744c11b 100644 --- a/block/blk-merge.c +++ b/block/blk-merge.c @@ -21,9 +21,7 @@ static inline bool bios_segs_mergeable(struct request_queue *q, struct bio *prev, struct bio_vec *prev_last_bv, struct bio_vec *next_first_bv) { - if (!biovec_phys_mergeable(prev_last_bv, next_first_bv)) - return false; - if (!BIOVEC_SEG_BOUNDARY(q, prev_last_bv, next_first_bv)) + if (!biovec_phys_mergeable(q, prev_last_bv, next_first_bv)) return false; if (prev->bi_seg_back_size + next_first_bv->bv_len > queue_max_segment_size(q)) @@ -199,9 +197,7 @@ static struct bio *blk_bio_segment_split(struct request_queue *q, if (bvprvp && blk_queue_cluster(q)) { if (seg_size + bv.bv_len > queue_max_segment_size(q)) goto new_segment; - if (!biovec_phys_mergeable(bvprvp, &bv)) - goto new_segment; - if (!BIOVEC_SEG_BOUNDARY(q, bvprvp, &bv)) + if (!biovec_phys_mergeable(q, bvprvp, &bv)) goto new_segment; seg_size += bv.bv_len; @@ -332,9 +328,7 @@ static unsigned int __blk_recalc_rq_segments(struct request_queue *q, if (seg_size + bv.bv_len > queue_max_segment_size(q)) goto new_segment; - if (!biovec_phys_mergeable(&bvprv, &bv)) - goto new_segment; - if (!BIOVEC_SEG_BOUNDARY(q, &bvprv, &bv)) + if (!biovec_phys_mergeable(q, &bvprv, &bv)) goto new_segment; seg_size += bv.bv_len; @@ -414,17 +408,7 @@ static int blk_phys_contig_segment(struct request_queue *q, struct bio *bio, bio_get_last_bvec(bio, &end_bv); bio_get_first_bvec(nxt, &nxt_bv); - if (!biovec_phys_mergeable(&end_bv, &nxt_bv)) - return 0; - - /* - * bio and nxt are contiguous in memory; check if the queue allows - * these two to be merged into one - */ - if (BIOVEC_SEG_BOUNDARY(q, &end_bv, &nxt_bv)) - return 1; - - return 0; + return biovec_phys_mergeable(q, &end_bv, &nxt_bv); } static inline void @@ -438,10 +422,7 @@ __blk_segment_map_sg(struct request_queue *q, struct bio_vec *bvec, if (*sg && *cluster) { if ((*sg)->length + nbytes > queue_max_segment_size(q)) goto new_segment; - - if (!biovec_phys_mergeable(bvprv, bvec)) - goto new_segment; - if (!BIOVEC_SEG_BOUNDARY(q, bvprv, bvec)) + if (!biovec_phys_mergeable(q, bvprv, bvec)) goto new_segment; (*sg)->length += nbytes; diff --git a/block/blk.h b/block/blk.h index e36395e4c686..e903ce783624 100644 --- a/block/blk.h +++ b/block/blk.h @@ -150,13 +150,19 @@ static inline void blk_queue_enter_live(struct request_queue *q) percpu_ref_get(&q->q_usage_counter); } -static inline bool biovec_phys_mergeable(const struct bio_vec *vec1, - const struct bio_vec *vec2) +static inline bool biovec_phys_mergeable(struct request_queue *q, + struct bio_vec *vec1, struct bio_vec *vec2) { - if (bvec_to_phys(vec1) + vec1->bv_len != bvec_to_phys(vec2)) + unsigned long mask = queue_segment_boundary(q); + phys_addr_t addr1 = bvec_to_phys(vec1); + phys_addr_t addr2 = bvec_to_phys(vec2); + + if (addr1 + vec1->bv_len != addr2) return false; if (xen_domain() && !xen_biovec_phys_mergeable(vec1, vec2)) return false; + if ((addr1 | mask) != ((addr2 + vec2->bv_len - 1) | mask)) + return false; return true; } diff --git a/include/linux/bio.h b/include/linux/bio.h index e3d0abb694d4..8bec9f248ab8 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -137,14 +137,6 @@ static inline bool bio_full(struct bio *bio) */ #define bvec_to_phys(bv) (page_to_phys((bv)->bv_page) + (unsigned long) (bv)->bv_offset) -/* - * merge helpers etc - */ -#define __BIO_SEG_BOUNDARY(addr1, addr2, mask) \ - (((addr1) | (mask)) == (((addr2) - 1) | (mask))) -#define BIOVEC_SEG_BOUNDARY(q, b1, b2) \ - __BIO_SEG_BOUNDARY(bvec_to_phys((b1)), bvec_to_phys((b2)) + (b2)->bv_len, queue_segment_boundary((q))) - /* * drivers should _never_ use the all version - the bio may have been split * before it got to the driver and the driver won't own all of it -- 2.18.0 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christoph Hellwig Subject: [PATCH 09/13] block: merge BIOVEC_SEG_BOUNDARY into biovec_phys_mergeable Date: Tue, 4 Sep 2018 12:14:27 -0700 Message-ID: <20180904191431.20102-10-hch@lst.de> References: <20180904191431.20102-1-hch@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20180904191431.20102-1-hch@lst.de> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" To: Jens Axboe Cc: linux-block@vger.kernel.org, xen-devel@lists.xen.org, linux-arm-kernel@lists.infradead.org, Ming Lei List-Id: xen-devel@lists.xenproject.org VGhlc2UgdHdvIGNoZWNrcyBzaG91bGQgYWx3YXlzIGJlIHBlcmZvcm1lZCB0b2dldGhlciwgc28g bWVyZ2UgdGhlbSBpbnRvCmEgc2luZ2xlIGhlbHBlci4KClNpZ25lZC1vZmYtYnk6IENocmlzdG9w aCBIZWxsd2lnIDxoY2hAbHN0LmRlPgotLS0KIGJsb2NrL2Jpby5jICAgICAgICAgICB8ICA0ICst LS0KIGJsb2NrL2Jsay1pbnRlZ3JpdHkuYyB8IDEyICsrLS0tLS0tLS0tLQogYmxvY2svYmxrLW1l cmdlLmMgICAgIHwgMjkgKysrKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGJsb2NrL2Jsay5o ICAgICAgICAgICB8IDEyICsrKysrKysrKy0tLQogaW5jbHVkZS9saW51eC9iaW8uaCAgIHwgIDgg LS0tLS0tLS0KIDUgZmlsZXMgY2hhbmdlZCwgMTcgaW5zZXJ0aW9ucygrKSwgNDggZGVsZXRpb25z KC0pCgpkaWZmIC0tZ2l0IGEvYmxvY2svYmlvLmMgYi9ibG9jay9iaW8uYwppbmRleCBkMTVhMjI4 ZDFiZmMuLjI2ZjZlOGRlZWUyZCAxMDA2NDQKLS0tIGEvYmxvY2svYmlvLmMKKysrIGIvYmxvY2sv YmlvLmMKQEAgLTcyOSw5ICs3MjksNyBAQCBpbnQgYmlvX2FkZF9wY19wYWdlKHN0cnVjdCByZXF1 ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8sIHN0cnVjdCBwYWdlCiAJfQogCiAJLyogSWYg d2UgbWF5IGJlIGFibGUgdG8gbWVyZ2UgdGhlc2UgYmlvdmVjcywgZm9yY2UgYSByZWNvdW50ICov Ci0JaWYgKGJpby0+YmlfdmNudCA+IDEgJiYKLQkgICAgYmlvdmVjX3BoeXNfbWVyZ2VhYmxlKGJ2 ZWMgLSAxLCBidmVjKSAmJgotCSAgICBCSU9WRUNfU0VHX0JPVU5EQVJZKHEsIGJ2ZWMgLSAxLCBi dmVjKSkKKwlpZiAoYmlvLT5iaV92Y250ID4gMSAmJiBiaW92ZWNfcGh5c19tZXJnZWFibGUocSwg YnZlYyAtIDEsIGJ2ZWMpKQogCQliaW9fY2xlYXJfZmxhZyhiaW8sIEJJT19TRUdfVkFMSUQpOwog CiAgZG9uZToKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1pbnRlZ3JpdHkuYyBiL2Jsb2NrL2Jsay1p bnRlZ3JpdHkuYwppbmRleCAwZjcyNjc5MTY1MDkuLmQxYWIwODllMDkxOSAxMDA2NDQKLS0tIGEv YmxvY2svYmxrLWludGVncml0eS5jCisrKyBiL2Jsb2NrL2Jsay1pbnRlZ3JpdHkuYwpAQCAtNDks MTIgKzQ5LDggQEAgaW50IGJsa19ycV9jb3VudF9pbnRlZ3JpdHlfc2coc3RydWN0IHJlcXVlc3Rf cXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbykKIAliaW9fZm9yX2VhY2hfaW50ZWdyaXR5X3ZlYyhp diwgYmlvLCBpdGVyKSB7CiAKIAkJaWYgKHByZXYpIHsKLQkJCWlmICghYmlvdmVjX3BoeXNfbWVy Z2VhYmxlKCZpdnBydiwgJml2KSkKKwkJCWlmICghYmlvdmVjX3BoeXNfbWVyZ2VhYmxlKHEsICZp dnBydiwgJml2KSkKIAkJCQlnb3RvIG5ld19zZWdtZW50OwotCi0JCQlpZiAoIUJJT1ZFQ19TRUdf Qk9VTkRBUlkocSwgJml2cHJ2LCAmaXYpKQotCQkJCWdvdG8gbmV3X3NlZ21lbnQ7Ci0KIAkJCWlm IChzZWdfc2l6ZSArIGl2LmJ2X2xlbiA+IHF1ZXVlX21heF9zZWdtZW50X3NpemUocSkpCiAJCQkJ Z290byBuZXdfc2VnbWVudDsKIApAQCAtOTUsMTIgKzkxLDggQEAgaW50IGJsa19ycV9tYXBfaW50 ZWdyaXR5X3NnKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8sCiAJYmlv X2Zvcl9lYWNoX2ludGVncml0eV92ZWMoaXYsIGJpbywgaXRlcikgewogCiAJCWlmIChwcmV2KSB7 Ci0JCQlpZiAoIWJpb3ZlY19waHlzX21lcmdlYWJsZSgmaXZwcnYsICZpdikpCisJCQlpZiAoIWJp b3ZlY19waHlzX21lcmdlYWJsZShxLCAmaXZwcnYsICZpdikpCiAJCQkJZ290byBuZXdfc2VnbWVu dDsKLQotCQkJaWYgKCFCSU9WRUNfU0VHX0JPVU5EQVJZKHEsICZpdnBydiwgJml2KSkKLQkJCQln b3RvIG5ld19zZWdtZW50OwotCiAJCQlpZiAoc2ctPmxlbmd0aCArIGl2LmJ2X2xlbiA+IHF1ZXVl X21heF9zZWdtZW50X3NpemUocSkpCiAJCQkJZ290byBuZXdfc2VnbWVudDsKIApkaWZmIC0tZ2l0 IGEvYmxvY2svYmxrLW1lcmdlLmMgYi9ibG9jay9ibGstbWVyZ2UuYwppbmRleCA1ZTYzZTgyNTlm OTIuLjQyYTQ2NzQ0YzExYiAxMDA2NDQKLS0tIGEvYmxvY2svYmxrLW1lcmdlLmMKKysrIGIvYmxv Y2svYmxrLW1lcmdlLmMKQEAgLTIxLDkgKzIxLDcgQEAgc3RhdGljIGlubGluZSBib29sIGJpb3Nf c2Vnc19tZXJnZWFibGUoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsCiAJCXN0cnVjdCBiaW8gKnBy ZXYsIHN0cnVjdCBiaW9fdmVjICpwcmV2X2xhc3RfYnYsCiAJCXN0cnVjdCBiaW9fdmVjICpuZXh0 X2ZpcnN0X2J2KQogewotCWlmICghYmlvdmVjX3BoeXNfbWVyZ2VhYmxlKHByZXZfbGFzdF9idiwg bmV4dF9maXJzdF9idikpCi0JCXJldHVybiBmYWxzZTsKLQlpZiAoIUJJT1ZFQ19TRUdfQk9VTkRB UlkocSwgcHJldl9sYXN0X2J2LCBuZXh0X2ZpcnN0X2J2KSkKKwlpZiAoIWJpb3ZlY19waHlzX21l cmdlYWJsZShxLCBwcmV2X2xhc3RfYnYsIG5leHRfZmlyc3RfYnYpKQogCQlyZXR1cm4gZmFsc2U7 CiAJaWYgKHByZXYtPmJpX3NlZ19iYWNrX3NpemUgKyBuZXh0X2ZpcnN0X2J2LT5idl9sZW4gPgog CQkJcXVldWVfbWF4X3NlZ21lbnRfc2l6ZShxKSkKQEAgLTE5OSw5ICsxOTcsNyBAQCBzdGF0aWMg c3RydWN0IGJpbyAqYmxrX2Jpb19zZWdtZW50X3NwbGl0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpx LAogCQlpZiAoYnZwcnZwICYmIGJsa19xdWV1ZV9jbHVzdGVyKHEpKSB7CiAJCQlpZiAoc2VnX3Np emUgKyBidi5idl9sZW4gPiBxdWV1ZV9tYXhfc2VnbWVudF9zaXplKHEpKQogCQkJCWdvdG8gbmV3 X3NlZ21lbnQ7Ci0JCQlpZiAoIWJpb3ZlY19waHlzX21lcmdlYWJsZShidnBydnAsICZidikpCi0J CQkJZ290byBuZXdfc2VnbWVudDsKLQkJCWlmICghQklPVkVDX1NFR19CT1VOREFSWShxLCBidnBy dnAsICZidikpCisJCQlpZiAoIWJpb3ZlY19waHlzX21lcmdlYWJsZShxLCBidnBydnAsICZidikp CiAJCQkJZ290byBuZXdfc2VnbWVudDsKIAogCQkJc2VnX3NpemUgKz0gYnYuYnZfbGVuOwpAQCAt MzMyLDkgKzMyOCw3IEBAIHN0YXRpYyB1bnNpZ25lZCBpbnQgX19ibGtfcmVjYWxjX3JxX3NlZ21l bnRzKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLAogCQkJCWlmIChzZWdfc2l6ZSArIGJ2LmJ2X2xl bgogCQkJCSAgICA+IHF1ZXVlX21heF9zZWdtZW50X3NpemUocSkpCiAJCQkJCWdvdG8gbmV3X3Nl Z21lbnQ7Ci0JCQkJaWYgKCFiaW92ZWNfcGh5c19tZXJnZWFibGUoJmJ2cHJ2LCAmYnYpKQotCQkJ CQlnb3RvIG5ld19zZWdtZW50OwotCQkJCWlmICghQklPVkVDX1NFR19CT1VOREFSWShxLCAmYnZw cnYsICZidikpCisJCQkJaWYgKCFiaW92ZWNfcGh5c19tZXJnZWFibGUocSwgJmJ2cHJ2LCAmYnYp KQogCQkJCQlnb3RvIG5ld19zZWdtZW50OwogCiAJCQkJc2VnX3NpemUgKz0gYnYuYnZfbGVuOwpA QCAtNDE0LDE3ICs0MDgsNyBAQCBzdGF0aWMgaW50IGJsa19waHlzX2NvbnRpZ19zZWdtZW50KHN0 cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8sCiAJYmlvX2dldF9sYXN0X2J2 ZWMoYmlvLCAmZW5kX2J2KTsKIAliaW9fZ2V0X2ZpcnN0X2J2ZWMobnh0LCAmbnh0X2J2KTsKIAot CWlmICghYmlvdmVjX3BoeXNfbWVyZ2VhYmxlKCZlbmRfYnYsICZueHRfYnYpKQotCQlyZXR1cm4g MDsKLQotCS8qCi0JICogYmlvIGFuZCBueHQgYXJlIGNvbnRpZ3VvdXMgaW4gbWVtb3J5OyBjaGVj ayBpZiB0aGUgcXVldWUgYWxsb3dzCi0JICogdGhlc2UgdHdvIHRvIGJlIG1lcmdlZCBpbnRvIG9u ZQotCSAqLwotCWlmIChCSU9WRUNfU0VHX0JPVU5EQVJZKHEsICZlbmRfYnYsICZueHRfYnYpKQot CQlyZXR1cm4gMTsKLQotCXJldHVybiAwOworCXJldHVybiBiaW92ZWNfcGh5c19tZXJnZWFibGUo cSwgJmVuZF9idiwgJm54dF9idik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZApAQCAtNDM4LDEw ICs0MjIsNyBAQCBfX2Jsa19zZWdtZW50X21hcF9zZyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwg c3RydWN0IGJpb192ZWMgKmJ2ZWMsCiAJaWYgKCpzZyAmJiAqY2x1c3RlcikgewogCQlpZiAoKCpz ZyktPmxlbmd0aCArIG5ieXRlcyA+IHF1ZXVlX21heF9zZWdtZW50X3NpemUocSkpCiAJCQlnb3Rv IG5ld19zZWdtZW50OwotCi0JCWlmICghYmlvdmVjX3BoeXNfbWVyZ2VhYmxlKGJ2cHJ2LCBidmVj KSkKLQkJCWdvdG8gbmV3X3NlZ21lbnQ7Ci0JCWlmICghQklPVkVDX1NFR19CT1VOREFSWShxLCBi dnBydiwgYnZlYykpCisJCWlmICghYmlvdmVjX3BoeXNfbWVyZ2VhYmxlKHEsIGJ2cHJ2LCBidmVj KSkKIAkJCWdvdG8gbmV3X3NlZ21lbnQ7CiAKIAkJKCpzZyktPmxlbmd0aCArPSBuYnl0ZXM7CmRp ZmYgLS1naXQgYS9ibG9jay9ibGsuaCBiL2Jsb2NrL2Jsay5oCmluZGV4IGUzNjM5NWU0YzY4Ni4u ZTkwM2NlNzgzNjI0IDEwMDY0NAotLS0gYS9ibG9jay9ibGsuaAorKysgYi9ibG9jay9ibGsuaApA QCAtMTUwLDEzICsxNTAsMTkgQEAgc3RhdGljIGlubGluZSB2b2lkIGJsa19xdWV1ZV9lbnRlcl9s aXZlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKQogCXBlcmNwdV9yZWZfZ2V0KCZxLT5xX3VzYWdl X2NvdW50ZXIpOwogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgYmlvdmVjX3BoeXNfbWVyZ2VhYmxl KGNvbnN0IHN0cnVjdCBiaW9fdmVjICp2ZWMxLAotCQljb25zdCBzdHJ1Y3QgYmlvX3ZlYyAqdmVj MikKK3N0YXRpYyBpbmxpbmUgYm9vbCBiaW92ZWNfcGh5c19tZXJnZWFibGUoc3RydWN0IHJlcXVl c3RfcXVldWUgKnEsCisJCXN0cnVjdCBiaW9fdmVjICp2ZWMxLCBzdHJ1Y3QgYmlvX3ZlYyAqdmVj MikKIHsKLQlpZiAoYnZlY190b19waHlzKHZlYzEpICsgdmVjMS0+YnZfbGVuICE9IGJ2ZWNfdG9f cGh5cyh2ZWMyKSkKKwl1bnNpZ25lZCBsb25nIG1hc2sgPSBxdWV1ZV9zZWdtZW50X2JvdW5kYXJ5 KHEpOworCXBoeXNfYWRkcl90IGFkZHIxID0gYnZlY190b19waHlzKHZlYzEpOworCXBoeXNfYWRk cl90IGFkZHIyID0gYnZlY190b19waHlzKHZlYzIpOworCisJaWYgKGFkZHIxICsgdmVjMS0+YnZf bGVuICE9IGFkZHIyKQogCQlyZXR1cm4gZmFsc2U7CiAJaWYgKHhlbl9kb21haW4oKSAmJiAheGVu X2Jpb3ZlY19waHlzX21lcmdlYWJsZSh2ZWMxLCB2ZWMyKSkKIAkJcmV0dXJuIGZhbHNlOworCWlm ICgoYWRkcjEgfCBtYXNrKSAhPSAoKGFkZHIyICsgdmVjMi0+YnZfbGVuIC0gMSkgfCBtYXNrKSkK KwkJcmV0dXJuIGZhbHNlOwogCXJldHVybiB0cnVlOwogfQogCmRpZmYgLS1naXQgYS9pbmNsdWRl L2xpbnV4L2Jpby5oIGIvaW5jbHVkZS9saW51eC9iaW8uaAppbmRleCBlM2QwYWJiNjk0ZDQuLjhi ZWM5ZjI0OGFiOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9iaW8uaAorKysgYi9pbmNsdWRl L2xpbnV4L2Jpby5oCkBAIC0xMzcsMTQgKzEzNyw2IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBiaW9f ZnVsbChzdHJ1Y3QgYmlvICpiaW8pCiAgKi8KICNkZWZpbmUgYnZlY190b19waHlzKGJ2KQkocGFn ZV90b19waHlzKChidiktPmJ2X3BhZ2UpICsgKHVuc2lnbmVkIGxvbmcpIChidiktPmJ2X29mZnNl dCkKIAotLyoKLSAqIG1lcmdlIGhlbHBlcnMgZXRjCi0gKi8KLSNkZWZpbmUgX19CSU9fU0VHX0JP VU5EQVJZKGFkZHIxLCBhZGRyMiwgbWFzaykgXAotCSgoKGFkZHIxKSB8IChtYXNrKSkgPT0gKCgo YWRkcjIpIC0gMSkgfCAobWFzaykpKQotI2RlZmluZSBCSU9WRUNfU0VHX0JPVU5EQVJZKHEsIGIx LCBiMikgXAotCV9fQklPX1NFR19CT1VOREFSWShidmVjX3RvX3BoeXMoKGIxKSksIGJ2ZWNfdG9f cGh5cygoYjIpKSArIChiMiktPmJ2X2xlbiwgcXVldWVfc2VnbWVudF9ib3VuZGFyeSgocSkpKQot CiAvKgogICogZHJpdmVycyBzaG91bGQgX25ldmVyXyB1c2UgdGhlIGFsbCB2ZXJzaW9uIC0gdGhl IGJpbyBtYXkgaGF2ZSBiZWVuIHNwbGl0CiAgKiBiZWZvcmUgaXQgZ290IHRvIHRoZSBkcml2ZXIg YW5kIHRoZSBkcml2ZXIgd29uJ3Qgb3duIGFsbCBvZiBpdAotLSAKMi4xOC4wCgoKX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVsIG1haWxpbmcg bGlzdApYZW4tZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcKaHR0cHM6Ly9saXN0cy54ZW5wcm9q ZWN0Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL3hlbi1kZXZlbA==