From patchwork Mon Oct 24 11:30:50 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Greg KH X-Patchwork-Id: 9753 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:6687:0:0:0:0:0 with SMTP id l7csp549496wru; Mon, 24 Oct 2022 09:44:01 -0700 (PDT) X-Google-Smtp-Source: AMsMyM4mFoHvzjxw/2xs5RV7aATcwZuUZCSRaM8XZiOMRZ6Wvz/jSSlAcxoiPn32bTXne83flKAy X-Received: by 2002:a17:902:eb8e:b0:17f:637b:9548 with SMTP id q14-20020a170902eb8e00b0017f637b9548mr34968534plg.158.1666629840744; Mon, 24 Oct 2022 09:44:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1666629840; cv=none; d=google.com; s=arc-20160816; b=F3MVFyq0MSYlMXIY/D6nrx5UcmykpQL5K8Jdi+Y9/TKKWMCdTO1d8aBRZAPu8oUVWH IBZtgMXdO7M0+Bl5kUPA6AXBCBG2QAHKA2sWFLZynPpyfQueeUuQsyfkatuzJ1Qx0WsW jagXZMHmipgFLVJku2PyjnyfZ8aHdLNYpFWevM2OoSjmpo1f1hzhncKRNZtp/fN28b4u hOGXYq9QqpOIedi1seKU+zA3jTk6dpbWDgMUPp1y/1ZVIuxiViBqLYdWiAuc+ORmmtpI CJJk9AVBRX8TFMjI+P2mlwCTND+PM1ZCltnOAqMvI11PbF5IzrraUJW+Ozl4IU/T35U7 lyFA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=z6jNpnPRrfL3p5Pocn5zJarLiKBPrjuG/YJQ229yvPo=; b=Ur3X1frdNzHCzwRZ7GZUoeKJ84m4b8DVMsAk9OkmJfXHHBju6w2rpH6lJYwb5jV/W6 wmt4dmZVF4XuhyPcbB9p3L+XI/SGx6vrrPmEYqRzsO+pvYhM0frxinegUbBzBz5xkeHj P4BQ2TVLj8m9q0zq07iX+qV9gdbez2QDwJKh+GuC5m1/bjjXZ2DrB/G2BFrILDhr0ZbI Irj2/yCQEfzsg7h6a65WrhSLUEF8KJgMu0vL/yuHdXXyuT6CUBrvxKC8Qqb0FGRN1M57 cZ1WYDDoKk2C/V4NIX91v8HIc+LmFzwkrcQw5GK5C66vgdrkcobCTrQPETrM7VfVbJaU 5JnQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=UcDpDQm7; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id k4-20020a170902c40400b00185402cfee2si41916508plk.390.2022.10.24.09.43.48; Mon, 24 Oct 2022 09:44:00 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=UcDpDQm7; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234746AbiJXQnZ (ORCPT + 99 others); Mon, 24 Oct 2022 12:43:25 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56262 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234704AbiJXQmu (ORCPT ); Mon, 24 Oct 2022 12:42:50 -0400 Received: from ams.source.kernel.org (ams.source.kernel.org [145.40.68.75]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D609FCC5; Mon, 24 Oct 2022 08:29:23 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ams.source.kernel.org (Postfix) with ESMTPS id 6C80AB815AE; Mon, 24 Oct 2022 12:10:49 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id BFD7DC433D6; Mon, 24 Oct 2022 12:10:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1666613448; bh=/HiONoJLixYYJMotsCLlT211vd+a59UGQzRL4UvcskU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UcDpDQm7ZbIOHf2wFreeRMy72rqlo90yuY2P+op1fhYiKUw2MvAhCNUJIcqiNlrxL dkh5rB8EC5YZVwn5bZs7vezwVxNnOT6lUFkXcHuUpe2GSILE9nObmsjE//6c5faUqf GzXzAAvtjntZPM87+rj6meEEqyH4GpdprYow5B/g= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Olga Kornievskaia , Bernard Metzler , Leon Romanovsky , Sasha Levin Subject: [PATCH 5.4 140/255] RDMA/siw: Always consume all skbuf data in sk_data_ready() upcall. Date: Mon, 24 Oct 2022 13:30:50 +0200 Message-Id: <20221024113007.238775802@linuxfoundation.org> X-Mailer: git-send-email 2.38.1 In-Reply-To: <20221024113002.471093005@linuxfoundation.org> References: <20221024113002.471093005@linuxfoundation.org> User-Agent: quilt/0.67 MIME-Version: 1.0 X-Spam-Status: No, score=-7.6 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_HI, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1747588051818577996?= X-GMAIL-MSGID: =?utf-8?q?1747588051818577996?= From: Bernard Metzler [ Upstream commit 754209850df8367c954ac1de7671c7430b1f342c ] For header and trailer/padding processing, siw did not consume new skb data until minimum amount present to fill current header or trailer structure, including potential payload padding. Not consuming any data during upcall may cause a receive stall, since tcp_read_sock() is not upcalling again if no new data arrive. A NFSoRDMA client got stuck at RDMA Write reception of unaligned payload, if the current skb did contain only the expected 3 padding bytes, but not the 4 bytes CRC trailer. Expecting 4 more bytes already arrived in another skb, and not consuming those 3 bytes in the current upcall left the Write incomplete, waiting for the CRC forever. Fixes: 8b6a361b8c48 ("rdma/siw: receive path") Reported-by: Olga Kornievskaia Tested-by: Olga Kornievskaia Signed-off-by: Bernard Metzler Link: https://lore.kernel.org/r/20220920081202.223629-1-bmt@zurich.ibm.com Signed-off-by: Leon Romanovsky Signed-off-by: Sasha Levin --- drivers/infiniband/sw/siw/siw_qp_rx.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/drivers/infiniband/sw/siw/siw_qp_rx.c b/drivers/infiniband/sw/siw/siw_qp_rx.c index 5f94c716301f..e8a1aa07f058 100644 --- a/drivers/infiniband/sw/siw/siw_qp_rx.c +++ b/drivers/infiniband/sw/siw/siw_qp_rx.c @@ -961,27 +961,28 @@ int siw_proc_terminate(struct siw_qp *qp) static int siw_get_trailer(struct siw_qp *qp, struct siw_rx_stream *srx) { struct sk_buff *skb = srx->skb; + int avail = min(srx->skb_new, srx->fpdu_part_rem); u8 *tbuf = (u8 *)&srx->trailer.crc - srx->pad; __wsum crc_in, crc_own = 0; siw_dbg_qp(qp, "expected %d, available %d, pad %u\n", srx->fpdu_part_rem, srx->skb_new, srx->pad); - if (srx->skb_new < srx->fpdu_part_rem) - return -EAGAIN; - - skb_copy_bits(skb, srx->skb_offset, tbuf, srx->fpdu_part_rem); + skb_copy_bits(skb, srx->skb_offset, tbuf, avail); - if (srx->mpa_crc_hd && srx->pad) - crypto_shash_update(srx->mpa_crc_hd, tbuf, srx->pad); + srx->skb_new -= avail; + srx->skb_offset += avail; + srx->skb_copied += avail; + srx->fpdu_part_rem -= avail; - srx->skb_new -= srx->fpdu_part_rem; - srx->skb_offset += srx->fpdu_part_rem; - srx->skb_copied += srx->fpdu_part_rem; + if (srx->fpdu_part_rem) + return -EAGAIN; if (!srx->mpa_crc_hd) return 0; + if (srx->pad) + crypto_shash_update(srx->mpa_crc_hd, tbuf, srx->pad); /* * CRC32 is computed, transmitted and received directly in NBO, * so there's never a reason to convert byte order. @@ -1083,10 +1084,9 @@ static int siw_get_hdr(struct siw_rx_stream *srx) * completely received. */ if (iwarp_pktinfo[opcode].hdr_len > sizeof(struct iwarp_ctrl_tagged)) { - bytes = iwarp_pktinfo[opcode].hdr_len - MIN_DDP_HDR; + int hdrlen = iwarp_pktinfo[opcode].hdr_len; - if (srx->skb_new < bytes) - return -EAGAIN; + bytes = min_t(int, hdrlen - MIN_DDP_HDR, srx->skb_new); skb_copy_bits(skb, srx->skb_offset, (char *)c_hdr + srx->fpdu_part_rcvd, bytes); @@ -1096,6 +1096,9 @@ static int siw_get_hdr(struct siw_rx_stream *srx) srx->skb_new -= bytes; srx->skb_offset += bytes; srx->skb_copied += bytes; + + if (srx->fpdu_part_rcvd < hdrlen) + return -EAGAIN; } /*