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 X-Spam-Level: X-Spam-Status: No, score=-19.5 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS, USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 0E053C4338F for ; Wed, 25 Aug 2021 15:27:20 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id DE730610FC for ; Wed, 25 Aug 2021 15:27:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S241611AbhHYP2D (ORCPT ); Wed, 25 Aug 2021 11:28:03 -0400 Received: from smtp-out1.suse.de ([195.135.220.28]:50032 "EHLO smtp-out1.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240735AbhHYP15 (ORCPT ); Wed, 25 Aug 2021 11:27:57 -0400 Received: from imap1.suse-dmz.suse.de (imap1.suse-dmz.suse.de [192.168.254.73]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 138A02219D; Wed, 25 Aug 2021 15:27:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1629905231; h=from:from:reply-to: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=K6znGimf2ixGTtWt5hUOdsdN1LUfaeB7tqHoIk+zA48=; b=yHCCjb9UhXXuSkikeRVxBBCcYQlTf/e3+NiwLdQpM/aZeh3XwIU+OHqhvjmj+93RCYai9f HHTw7hVMV3reCeDiDmLFA/cgAgrf5emNJ2rkFO5IZlxYliFHesdm4mtF8cEDhz/siVxEtY oOACUMKRNbm9ht1u7GepSlUIuiRng0k= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1629905231; h=from:from:reply-to: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=K6znGimf2ixGTtWt5hUOdsdN1LUfaeB7tqHoIk+zA48=; b=P2QLO09sJKY1cGZ47lVzMuLBfok5fYlQfvwLY4VesWnzj3ZFPpzedRs1MYIgBSOjE+5IU+ dQGILW7QxNbuMsCg== Received: from imap1.suse-dmz.suse.de (imap1.suse-dmz.suse.de [192.168.254.73]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap1.suse-dmz.suse.de (Postfix) with ESMTPS id E5BA613A85; Wed, 25 Aug 2021 15:27:10 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap1.suse-dmz.suse.de with ESMTPSA id TtD5Nk5hJmF2WQAAGKfGzw (envelope-from ); Wed, 25 Aug 2021 15:27:10 +0000 Subject: Re: [PATCH v2] nvme-tcp: Do not reset transport on data digest errors To: Daniel Wagner , linux-nvme@lists.infradead.org Cc: linux-kernel@vger.kernel.org, Sagi Grimberg , yi.he@emc.com References: <20210825124259.28707-1-dwagner@suse.de> From: Hannes Reinecke Message-ID: <42916ab0-2997-b19f-47ee-e20e8e868a86@suse.de> Date: Wed, 25 Aug 2021 17:27:10 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.12.0 MIME-Version: 1.0 In-Reply-To: <20210825124259.28707-1-dwagner@suse.de> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 8/25/21 2:42 PM, Daniel Wagner wrote: > The spec says > > 7.4.6.1 Digest Error handling > > When a host detects a data digest error in a C2HData PDU, that host > shall continue processing C2HData PDUs associated with the command and > when the command processing has completed, if a successful status was > returned by the controller, the host shall fail the command with a > non-fatal transport error. > > Currently the transport is reseted when a data digest error is > detected. To fix this, keep track of the final status in the queue > object and use it when completing the request. > > Signed-off-by: Daniel Wagner > --- > > The status member placed so that it fills up a hole in struct > nvme_tcp_request: > > struct nvme_tcp_request { > struct nvme_request req; /* 0 32 */ > void * pdu; /* 32 8 */ > struct nvme_tcp_queue * queue; /* 40 8 */ > u32 data_len; /* 48 4 */ > u32 pdu_len; /* 52 4 */ > u32 pdu_sent; /* 56 4 */ > u16 ttag; /* 60 2 */ > u16 status; /* 62 2 */ > /* --- cacheline 1 boundary (64 bytes) --- */ > struct list_head entry; /* 64 16 */ > struct llist_node lentry; /* 80 8 */ > __le32 ddgst; /* 88 4 */ > > /* XXX 4 bytes hole, try to pack */ > > struct bio * curr_bio; /* 96 8 */ > struct iov_iter iter; /* 104 40 */ > /* --- cacheline 2 boundary (128 bytes) was 16 bytes ago --- */ > size_t offset; /* 144 8 */ > size_t data_sent; /* 152 8 */ > enum nvme_tcp_send_state state; /* 160 4 */ > > /* size: 168, cachelines: 3, members: 16 */ > /* sum members: 160, holes: 1, sum holes: 4 */ > /* padding: 4 */ > /* last cacheline: 40 bytes */ > }; > > v1: > - https://lore.kernel.org/linux-nvme/20210805121541.77613-1-dwagner@suse.de/ > - moved 'status' from nvme_tcp_queue to nvme_tcp_request. > > drivers/nvme/host/tcp.c | 25 +++++++++++++++++++++---- > 1 file changed, 21 insertions(+), 4 deletions(-) > > diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c > index 645025620154..23a8f7e11cfa 100644 > --- a/drivers/nvme/host/tcp.c > +++ b/drivers/nvme/host/tcp.c > @@ -45,6 +45,7 @@ struct nvme_tcp_request { > u32 pdu_len; > u32 pdu_sent; > u16 ttag; > + u16 status; > struct list_head entry; > struct llist_node lentry; > __le32 ddgst; > @@ -485,7 +486,9 @@ static void nvme_tcp_error_recovery(struct nvme_ctrl *ctrl) > static int nvme_tcp_process_nvme_cqe(struct nvme_tcp_queue *queue, > struct nvme_completion *cqe) > { > + struct nvme_tcp_request *req; > struct request *rq; > + u16 status; > > rq = nvme_find_rq(nvme_tcp_tagset(queue), cqe->command_id); > if (!rq) { > @@ -496,7 +499,12 @@ static int nvme_tcp_process_nvme_cqe(struct nvme_tcp_queue *queue, > return -EINVAL; > } > > - if (!nvme_try_complete_req(rq, cqe->status, cqe->result)) > + req = blk_mq_rq_to_pdu(rq); > + status = req->status; > + if (status == NVME_SC_SUCCESS) > + status = cqe->status; > + > + if (!nvme_try_complete_req(rq, status, cqe->result)) > nvme_complete_rq(rq); > queue->nr_cqe++; > > @@ -506,6 +514,7 @@ static int nvme_tcp_process_nvme_cqe(struct nvme_tcp_queue *queue, > static int nvme_tcp_handle_c2h_data(struct nvme_tcp_queue *queue, > struct nvme_tcp_data_pdu *pdu) > { > + struct nvme_tcp_request *req; > struct request *rq; > > rq = nvme_find_rq(nvme_tcp_tagset(queue), pdu->command_id); > @@ -534,6 +543,8 @@ static int nvme_tcp_handle_c2h_data(struct nvme_tcp_queue *queue, > return -EPROTO; > } > > + req = blk_mq_rq_to_pdu(rq); > + req->status = NVME_SC_SUCCESS; > return 0; > } > Can't you move the initialisation to nvme_tcp_setup_cmd_pdu()? That'll save to to have to reference the tcp request here ... > @@ -758,7 +769,7 @@ static int nvme_tcp_recv_data(struct nvme_tcp_queue *queue, struct sk_buff *skb, > queue->ddgst_remaining = NVME_TCP_DIGEST_LENGTH; > } else { > if (pdu->hdr.flags & NVME_TCP_F_DATA_SUCCESS) { > - nvme_tcp_end_request(rq, NVME_SC_SUCCESS); > + nvme_tcp_end_request(rq, req->status); > queue->nr_cqe++; > } > nvme_tcp_init_recv_ctx(queue); > @@ -788,18 +799,24 @@ static int nvme_tcp_recv_ddgst(struct nvme_tcp_queue *queue, > return 0; > > if (queue->recv_ddgst != queue->exp_ddgst) { > + struct request *rq = nvme_cid_to_rq(nvme_tcp_tagset(queue), > + pdu->command_id); > + struct nvme_tcp_request *req = blk_mq_rq_to_pdu(rq); > + > + req->status = NVME_SC_DATA_XFER_ERROR; > + > dev_err(queue->ctrl->ctrl.device, > "data digest error: recv %#x expected %#x\n", > le32_to_cpu(queue->recv_ddgst), > le32_to_cpu(queue->exp_ddgst)); > - return -EIO; > } > > if (pdu->hdr.flags & NVME_TCP_F_DATA_SUCCESS) { > struct request *rq = nvme_cid_to_rq(nvme_tcp_tagset(queue), > pdu->command_id); > + struct nvme_tcp_request *req = blk_mq_rq_to_pdu(rq); > > - nvme_tcp_end_request(rq, NVME_SC_SUCCESS); > + nvme_tcp_end_request(rq, req->status); > queue->nr_cqe++; > } > > Otherwise: Reviewed-by: Hannes Reinecke Cheers, Hannes -- Dr. Hannes Reinecke Kernel Storage Architect hare@suse.de +49 911 74053 688 SUSE Software Solutions GmbH, Maxfeldstr. 5, 90409 Nürnberg HRB 36809 (AG Nürnberg), Geschäftsführer: Felix Imendörffer 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 X-Spam-Level: X-Spam-Status: No, score=-18.2 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS, USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C76C3C4338F for ; Wed, 25 Aug 2021 15:28:18 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (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 8907E61027 for ; Wed, 25 Aug 2021 15:28:18 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 8907E61027 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=suse.de Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:Content-Type: Content-Transfer-Encoding:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date:Message-ID:From: References:Cc:To:Subject:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=sEh74cIiC5JSsESZZrc6BfnAv5RrvVwqZdqO+dr8BoA=; b=B05mKPA7RVAbNiIPC1pCtuOvdH Akr4QTJElp9CN8Ekc13FKSMgL69fG7p1RG/bsrGEOBOkvXbO094zmA3rCj3G42ncesJmeYQ1yg37j KWWafeixQ3Q7WLD2U1oKvjHbXf9SodOOHjxq98ssjE+uIiJv1V2gpG8T871NcktUIAQe3Q4iRuLDl EHoOx5jEgd/XnfAqN4Z8jEFjM5+bU7eRutjk0EsxduYxR7WD8r70Chl+2o5aZkgiVrxAnK0P7NABa JW/0Y5SViH38gxkxFlDHbH4mrsHNRpfxJSHrVohG+Jvs0yzpmbfB+ZVl4G3RgeNobxrz6g1LQk57x pFLlmuWg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1mIuoT-007XYE-CG; Wed, 25 Aug 2021 15:27:37 +0000 Received: from smtp-out1.suse.de ([195.135.220.28]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1mIuo6-007XX1-CY for linux-nvme@lists.infradead.org; Wed, 25 Aug 2021 15:27:18 +0000 Received: from imap1.suse-dmz.suse.de (imap1.suse-dmz.suse.de [192.168.254.73]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id 138A02219D; Wed, 25 Aug 2021 15:27:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1629905231; h=from:from:reply-to: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=K6znGimf2ixGTtWt5hUOdsdN1LUfaeB7tqHoIk+zA48=; b=yHCCjb9UhXXuSkikeRVxBBCcYQlTf/e3+NiwLdQpM/aZeh3XwIU+OHqhvjmj+93RCYai9f HHTw7hVMV3reCeDiDmLFA/cgAgrf5emNJ2rkFO5IZlxYliFHesdm4mtF8cEDhz/siVxEtY oOACUMKRNbm9ht1u7GepSlUIuiRng0k= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1629905231; h=from:from:reply-to: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=K6znGimf2ixGTtWt5hUOdsdN1LUfaeB7tqHoIk+zA48=; b=P2QLO09sJKY1cGZ47lVzMuLBfok5fYlQfvwLY4VesWnzj3ZFPpzedRs1MYIgBSOjE+5IU+ dQGILW7QxNbuMsCg== Received: from imap1.suse-dmz.suse.de (imap1.suse-dmz.suse.de [192.168.254.73]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap1.suse-dmz.suse.de (Postfix) with ESMTPS id E5BA613A85; Wed, 25 Aug 2021 15:27:10 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap1.suse-dmz.suse.de with ESMTPSA id TtD5Nk5hJmF2WQAAGKfGzw (envelope-from ); Wed, 25 Aug 2021 15:27:10 +0000 Subject: Re: [PATCH v2] nvme-tcp: Do not reset transport on data digest errors To: Daniel Wagner , linux-nvme@lists.infradead.org Cc: linux-kernel@vger.kernel.org, Sagi Grimberg , yi.he@emc.com References: <20210825124259.28707-1-dwagner@suse.de> From: Hannes Reinecke Message-ID: <42916ab0-2997-b19f-47ee-e20e8e868a86@suse.de> Date: Wed, 25 Aug 2021 17:27:10 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.12.0 MIME-Version: 1.0 In-Reply-To: <20210825124259.28707-1-dwagner@suse.de> Content-Language: en-US X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210825_082714_631496_41CC5A1B X-CRM114-Status: GOOD ( 31.74 ) X-BeenThere: linux-nvme@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "Linux-nvme" Errors-To: linux-nvme-bounces+linux-nvme=archiver.kernel.org@lists.infradead.org T24gOC8yNS8yMSAyOjQyIFBNLCBEYW5pZWwgV2FnbmVyIHdyb3RlOgo+IFRoZSBzcGVjIHNheXMK PiAKPiAgICA3LjQuNi4xIERpZ2VzdCBFcnJvciBoYW5kbGluZwo+IAo+ICAgIFdoZW4gYSBob3N0 IGRldGVjdHMgYSBkYXRhIGRpZ2VzdCBlcnJvciBpbiBhIEMySERhdGEgUERVLCB0aGF0IGhvc3QK PiAgICBzaGFsbCBjb250aW51ZSBwcm9jZXNzaW5nIEMySERhdGEgUERVcyBhc3NvY2lhdGVkIHdp dGggdGhlIGNvbW1hbmQgYW5kCj4gICAgd2hlbiB0aGUgY29tbWFuZCBwcm9jZXNzaW5nIGhhcyBj b21wbGV0ZWQsIGlmIGEgc3VjY2Vzc2Z1bCBzdGF0dXMgd2FzCj4gICAgcmV0dXJuZWQgYnkgdGhl IGNvbnRyb2xsZXIsIHRoZSBob3N0IHNoYWxsIGZhaWwgdGhlIGNvbW1hbmQgd2l0aCBhCj4gICAg bm9uLWZhdGFsIHRyYW5zcG9ydCBlcnJvci4KPiAKPiBDdXJyZW50bHkgdGhlIHRyYW5zcG9ydCBp cyByZXNldGVkIHdoZW4gYSBkYXRhIGRpZ2VzdCBlcnJvciBpcwo+IGRldGVjdGVkLiBUbyBmaXgg dGhpcywga2VlcCB0cmFjayBvZiB0aGUgZmluYWwgc3RhdHVzIGluIHRoZSBxdWV1ZQo+IG9iamVj dCBhbmQgdXNlIGl0IHdoZW4gY29tcGxldGluZyB0aGUgcmVxdWVzdC4KPiAKPiBTaWduZWQtb2Zm LWJ5OiBEYW5pZWwgV2FnbmVyIDxkd2FnbmVyQHN1c2UuZGU+Cj4gLS0tCj4gCj4gVGhlIHN0YXR1 cyBtZW1iZXIgcGxhY2VkIHNvIHRoYXQgaXQgZmlsbHMgdXAgYSBob2xlIGluIHN0cnVjdAo+IG52 bWVfdGNwX3JlcXVlc3Q6Cj4gCj4gc3RydWN0IG52bWVfdGNwX3JlcXVlc3Qgewo+ICAgICAgICAg IHN0cnVjdCBudm1lX3JlcXVlc3QgICAgICAgIHJlcTsgICAgICAgICAgICAgICAgICAvKiAgICAg MCAgICAzMiAqLwo+ICAgICAgICAgIHZvaWQgKiAgICAgICAgICAgICAgICAgICAgIHBkdTsgICAg ICAgICAgICAgICAgICAvKiAgICAzMiAgICAgOCAqLwo+ICAgICAgICAgIHN0cnVjdCBudm1lX3Rj cF9xdWV1ZSAqICAgIHF1ZXVlOyAgICAgICAgICAgICAgICAvKiAgICA0MCAgICAgOCAqLwo+ICAg ICAgICAgIHUzMiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfbGVuOyAgICAgICAgICAgICAv KiAgICA0OCAgICAgNCAqLwo+ICAgICAgICAgIHUzMiAgICAgICAgICAgICAgICAgICAgICAgIHBk dV9sZW47ICAgICAgICAgICAgICAvKiAgICA1MiAgICAgNCAqLwo+ICAgICAgICAgIHUzMiAgICAg ICAgICAgICAgICAgICAgICAgIHBkdV9zZW50OyAgICAgICAgICAgICAvKiAgICA1NiAgICAgNCAq Lwo+ICAgICAgICAgIHUxNiAgICAgICAgICAgICAgICAgICAgICAgIHR0YWc7ICAgICAgICAgICAg ICAgICAvKiAgICA2MCAgICAgMiAqLwo+ICAgICAgICAgIHUxNiAgICAgICAgICAgICAgICAgICAg ICAgIHN0YXR1czsgICAgICAgICAgICAgICAvKiAgICA2MiAgICAgMiAqLwo+ICAgICAgICAgIC8q IC0tLSBjYWNoZWxpbmUgMSBib3VuZGFyeSAoNjQgYnl0ZXMpIC0tLSAqLwo+ICAgICAgICAgIHN0 cnVjdCBsaXN0X2hlYWQgICAgICAgICAgIGVudHJ5OyAgICAgICAgICAgICAgICAvKiAgICA2NCAg ICAxNiAqLwo+ICAgICAgICAgIHN0cnVjdCBsbGlzdF9ub2RlICAgICAgICAgIGxlbnRyeTsgICAg ICAgICAgICAgICAvKiAgICA4MCAgICAgOCAqLwo+ICAgICAgICAgIF9fbGUzMiAgICAgICAgICAg ICAgICAgICAgIGRkZ3N0OyAgICAgICAgICAgICAgICAvKiAgICA4OCAgICAgNCAqLwo+IAo+ICAg ICAgICAgIC8qIFhYWCA0IGJ5dGVzIGhvbGUsIHRyeSB0byBwYWNrICovCj4gCj4gICAgICAgICAg c3RydWN0IGJpbyAqICAgICAgICAgICAgICAgY3Vycl9iaW87ICAgICAgICAgICAgIC8qICAgIDk2 ICAgICA4ICovCj4gICAgICAgICAgc3RydWN0IGlvdl9pdGVyICAgICAgICAgICAgaXRlcjsgICAg ICAgICAgICAgICAgIC8qICAgMTA0ICAgIDQwICovCj4gICAgICAgICAgLyogLS0tIGNhY2hlbGlu ZSAyIGJvdW5kYXJ5ICgxMjggYnl0ZXMpIHdhcyAxNiBieXRlcyBhZ28gLS0tICovCj4gICAgICAg ICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OyAgICAgICAgICAgICAgIC8qICAg MTQ0ICAgICA4ICovCj4gICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgZGF0YV9z ZW50OyAgICAgICAgICAgIC8qICAgMTUyICAgICA4ICovCj4gICAgICAgICAgZW51bSBudm1lX3Rj cF9zZW5kX3N0YXRlICAgc3RhdGU7ICAgICAgICAgICAgICAgIC8qICAgMTYwICAgICA0ICovCj4g Cj4gICAgICAgICAgLyogc2l6ZTogMTY4LCBjYWNoZWxpbmVzOiAzLCBtZW1iZXJzOiAxNiAqLwo+ ICAgICAgICAgIC8qIHN1bSBtZW1iZXJzOiAxNjAsIGhvbGVzOiAxLCBzdW0gaG9sZXM6IDQgKi8K PiAgICAgICAgICAvKiBwYWRkaW5nOiA0ICovCj4gICAgICAgICAgLyogbGFzdCBjYWNoZWxpbmU6 IDQwIGJ5dGVzICovCj4gfTsKPiAKPiB2MToKPiAgIC0gaHR0cHM6Ly9sb3JlLmtlcm5lbC5vcmcv bGludXgtbnZtZS8yMDIxMDgwNTEyMTU0MS43NzYxMy0xLWR3YWduZXJAc3VzZS5kZS8KPiAgIC0g bW92ZWQgJ3N0YXR1cycgZnJvbSBudm1lX3RjcF9xdWV1ZSB0byBudm1lX3RjcF9yZXF1ZXN0Lgo+ IAo+ICAgZHJpdmVycy9udm1lL2hvc3QvdGNwLmMgfCAyNSArKysrKysrKysrKysrKysrKysrKyst LS0tCj4gICAxIGZpbGUgY2hhbmdlZCwgMjEgaW5zZXJ0aW9ucygrKSwgNCBkZWxldGlvbnMoLSkK PiAKPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9udm1lL2hvc3QvdGNwLmMgYi9kcml2ZXJzL252bWUv aG9zdC90Y3AuYwo+IGluZGV4IDY0NTAyNTYyMDE1NC4uMjNhOGY3ZTExY2ZhIDEwMDY0NAo+IC0t LSBhL2RyaXZlcnMvbnZtZS9ob3N0L3RjcC5jCj4gKysrIGIvZHJpdmVycy9udm1lL2hvc3QvdGNw LmMKPiBAQCAtNDUsNiArNDUsNyBAQCBzdHJ1Y3QgbnZtZV90Y3BfcmVxdWVzdCB7Cj4gICAJdTMy CQkJcGR1X2xlbjsKPiAgIAl1MzIJCQlwZHVfc2VudDsKPiAgIAl1MTYJCQl0dGFnOwo+ICsJdTE2 CQkJc3RhdHVzOwo+ICAgCXN0cnVjdCBsaXN0X2hlYWQJZW50cnk7Cj4gICAJc3RydWN0IGxsaXN0 X25vZGUJbGVudHJ5Owo+ICAgCV9fbGUzMgkJCWRkZ3N0Owo+IEBAIC00ODUsNyArNDg2LDkgQEAg c3RhdGljIHZvaWQgbnZtZV90Y3BfZXJyb3JfcmVjb3Zlcnkoc3RydWN0IG52bWVfY3RybCAqY3Ry bCkKPiAgIHN0YXRpYyBpbnQgbnZtZV90Y3BfcHJvY2Vzc19udm1lX2NxZShzdHJ1Y3QgbnZtZV90 Y3BfcXVldWUgKnF1ZXVlLAo+ICAgCQlzdHJ1Y3QgbnZtZV9jb21wbGV0aW9uICpjcWUpCj4gICB7 Cj4gKwlzdHJ1Y3QgbnZtZV90Y3BfcmVxdWVzdCAqcmVxOwo+ICAgCXN0cnVjdCByZXF1ZXN0ICpy cTsKPiArCXUxNiBzdGF0dXM7Cj4gICAKPiAgIAlycSA9IG52bWVfZmluZF9ycShudm1lX3RjcF90 YWdzZXQocXVldWUpLCBjcWUtPmNvbW1hbmRfaWQpOwo+ICAgCWlmICghcnEpIHsKPiBAQCAtNDk2 LDcgKzQ5OSwxMiBAQCBzdGF0aWMgaW50IG52bWVfdGNwX3Byb2Nlc3NfbnZtZV9jcWUoc3RydWN0 IG52bWVfdGNwX3F1ZXVlICpxdWV1ZSwKPiAgIAkJcmV0dXJuIC1FSU5WQUw7Cj4gICAJfQo+ICAg Cj4gLQlpZiAoIW52bWVfdHJ5X2NvbXBsZXRlX3JlcShycSwgY3FlLT5zdGF0dXMsIGNxZS0+cmVz dWx0KSkKPiArCXJlcSA9IGJsa19tcV9ycV90b19wZHUocnEpOwo+ICsJc3RhdHVzID0gcmVxLT5z dGF0dXM7Cj4gKwlpZiAoc3RhdHVzID09IE5WTUVfU0NfU1VDQ0VTUykKPiArCQlzdGF0dXMgPSBj cWUtPnN0YXR1czsKPiArCj4gKwlpZiAoIW52bWVfdHJ5X2NvbXBsZXRlX3JlcShycSwgc3RhdHVz LCBjcWUtPnJlc3VsdCkpCj4gICAJCW52bWVfY29tcGxldGVfcnEocnEpOwo+ICAgCXF1ZXVlLT5u cl9jcWUrKzsKPiAgIAo+IEBAIC01MDYsNiArNTE0LDcgQEAgc3RhdGljIGludCBudm1lX3RjcF9w cm9jZXNzX252bWVfY3FlKHN0cnVjdCBudm1lX3RjcF9xdWV1ZSAqcXVldWUsCj4gICBzdGF0aWMg aW50IG52bWVfdGNwX2hhbmRsZV9jMmhfZGF0YShzdHJ1Y3QgbnZtZV90Y3BfcXVldWUgKnF1ZXVl LAo+ICAgCQlzdHJ1Y3QgbnZtZV90Y3BfZGF0YV9wZHUgKnBkdSkKPiAgIHsKPiArCXN0cnVjdCBu dm1lX3RjcF9yZXF1ZXN0ICpyZXE7Cj4gICAJc3RydWN0IHJlcXVlc3QgKnJxOwo+ICAgCj4gICAJ cnEgPSBudm1lX2ZpbmRfcnEobnZtZV90Y3BfdGFnc2V0KHF1ZXVlKSwgcGR1LT5jb21tYW5kX2lk KTsKPiBAQCAtNTM0LDYgKzU0Myw4IEBAIHN0YXRpYyBpbnQgbnZtZV90Y3BfaGFuZGxlX2MyaF9k YXRhKHN0cnVjdCBudm1lX3RjcF9xdWV1ZSAqcXVldWUsCj4gICAJCXJldHVybiAtRVBST1RPOwo+ ICAgCX0KPiAgIAo+ICsJcmVxID0gYmxrX21xX3JxX3RvX3BkdShycSk7Cj4gKwlyZXEtPnN0YXR1 cyA9IE5WTUVfU0NfU1VDQ0VTUzsKPiAgIAlyZXR1cm4gMDsKPiAgIH0KPiAgIAoKQ2FuJ3QgeW91 IG1vdmUgdGhlIGluaXRpYWxpc2F0aW9uIHRvIG52bWVfdGNwX3NldHVwX2NtZF9wZHUoKT8KVGhh dCdsbCBzYXZlIHRvIHRvIGhhdmUgdG8gcmVmZXJlbmNlIHRoZSB0Y3AgcmVxdWVzdCBoZXJlIC4u LgoKPiBAQCAtNzU4LDcgKzc2OSw3IEBAIHN0YXRpYyBpbnQgbnZtZV90Y3BfcmVjdl9kYXRhKHN0 cnVjdCBudm1lX3RjcF9xdWV1ZSAqcXVldWUsIHN0cnVjdCBza19idWZmICpza2IsCj4gICAJCQlx dWV1ZS0+ZGRnc3RfcmVtYWluaW5nID0gTlZNRV9UQ1BfRElHRVNUX0xFTkdUSDsKPiAgIAkJfSBl bHNlIHsKPiAgIAkJCWlmIChwZHUtPmhkci5mbGFncyAmIE5WTUVfVENQX0ZfREFUQV9TVUNDRVNT KSB7Cj4gLQkJCQludm1lX3RjcF9lbmRfcmVxdWVzdChycSwgTlZNRV9TQ19TVUNDRVNTKTsKPiAr CQkJCW52bWVfdGNwX2VuZF9yZXF1ZXN0KHJxLCByZXEtPnN0YXR1cyk7Cj4gICAJCQkJcXVldWUt Pm5yX2NxZSsrOwo+ICAgCQkJfQo+ICAgCQkJbnZtZV90Y3BfaW5pdF9yZWN2X2N0eChxdWV1ZSk7 Cj4gQEAgLTc4OCwxOCArNzk5LDI0IEBAIHN0YXRpYyBpbnQgbnZtZV90Y3BfcmVjdl9kZGdzdChz dHJ1Y3QgbnZtZV90Y3BfcXVldWUgKnF1ZXVlLAo+ICAgCQlyZXR1cm4gMDsKPiAgIAo+ICAgCWlm IChxdWV1ZS0+cmVjdl9kZGdzdCAhPSBxdWV1ZS0+ZXhwX2RkZ3N0KSB7Cj4gKwkJc3RydWN0IHJl cXVlc3QgKnJxID0gbnZtZV9jaWRfdG9fcnEobnZtZV90Y3BfdGFnc2V0KHF1ZXVlKSwKPiArCQkJ CQlwZHUtPmNvbW1hbmRfaWQpOwo+ICsJCXN0cnVjdCBudm1lX3RjcF9yZXF1ZXN0ICpyZXEgPSBi bGtfbXFfcnFfdG9fcGR1KHJxKTsKPiArCj4gKwkJcmVxLT5zdGF0dXMgPSBOVk1FX1NDX0RBVEFf WEZFUl9FUlJPUjsKPiArCj4gICAJCWRldl9lcnIocXVldWUtPmN0cmwtPmN0cmwuZGV2aWNlLAo+ ICAgCQkJImRhdGEgZGlnZXN0IGVycm9yOiByZWN2ICUjeCBleHBlY3RlZCAlI3hcbiIsCj4gICAJ CQlsZTMyX3RvX2NwdShxdWV1ZS0+cmVjdl9kZGdzdCksCj4gICAJCQlsZTMyX3RvX2NwdShxdWV1 ZS0+ZXhwX2RkZ3N0KSk7Cj4gLQkJcmV0dXJuIC1FSU87Cj4gICAJfQo+ICAgCj4gICAJaWYgKHBk dS0+aGRyLmZsYWdzICYgTlZNRV9UQ1BfRl9EQVRBX1NVQ0NFU1MpIHsKPiAgIAkJc3RydWN0IHJl cXVlc3QgKnJxID0gbnZtZV9jaWRfdG9fcnEobnZtZV90Y3BfdGFnc2V0KHF1ZXVlKSwKPiAgIAkJ CQkJcGR1LT5jb21tYW5kX2lkKTsKPiArCQlzdHJ1Y3QgbnZtZV90Y3BfcmVxdWVzdCAqcmVxID0g YmxrX21xX3JxX3RvX3BkdShycSk7Cj4gICAKPiAtCQludm1lX3RjcF9lbmRfcmVxdWVzdChycSwg TlZNRV9TQ19TVUNDRVNTKTsKPiArCQludm1lX3RjcF9lbmRfcmVxdWVzdChycSwgcmVxLT5zdGF0 dXMpOwo+ICAgCQlxdWV1ZS0+bnJfY3FlKys7Cj4gICAJfQo+ICAgCj4gCk90aGVyd2lzZToKClJl dmlld2VkLWJ5OiBIYW5uZXMgUmVpbmVja2UgPGhhcmVAc3VzZS5kZT4KCkNoZWVycywKCkhhbm5l cwotLSAKRHIuIEhhbm5lcyBSZWluZWNrZSAgICAgICAgICAgICAgICBLZXJuZWwgU3RvcmFnZSBB cmNoaXRlY3QKaGFyZUBzdXNlLmRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKzQ5IDkx MSA3NDA1MyA2ODgKU1VTRSBTb2Z0d2FyZSBTb2x1dGlvbnMgR21iSCwgTWF4ZmVsZHN0ci4gNSwg OTA0MDkgTsO8cm5iZXJnCkhSQiAzNjgwOSAoQUcgTsO8cm5iZXJnKSwgR2VzY2jDpGZ0c2bDvGhy ZXI6IEZlbGl4IEltZW5kw7ZyZmZlcgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX18KTGludXgtbnZtZSBtYWlsaW5nIGxpc3QKTGludXgtbnZtZUBsaXN0cy5p bmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8v bGludXgtbnZtZQo=