Received: by 2002:ac0:a594:0:0:0:0:0 with SMTP id m20-v6csp1924235imm; Thu, 24 May 2018 03:01:43 -0700 (PDT) X-Google-Smtp-Source: AB8JxZqnd6iVtQv9JnBVceLkzfJ6JdyiynaW997Ec5zHKmKgrV0cAsnPCCZpgc961fSa7IU5P0/l X-Received: by 2002:a63:384d:: with SMTP id h13-v6mr5259862pgn.209.1527156103186; Thu, 24 May 2018 03:01:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1527156103; cv=none; d=google.com; s=arc-20160816; b=QbibZq42qY2adBgNr8b/TQ3YE0a8FrcUq8hPp116OTjYlpdCQ0hk+T9UYZKSpjqhI/ GBIP23Qvw/EWR6w8yWYJ98trQtJvbfGs5eBUpWIBILpZ7gEq2b0LZp5I7pMcTS8+5EDg h4nJhARThrOCpPkGD554WmybxindSn9AKZ2Z2Y6oJo05iFgk85rRGp6W++zpYpt5aVkg AdvaNOYCbKgMAW9A3+aClA+8yimpYdo4Zq1YY9svg67RB8JQZ/CUD9ETXAJ/6kJ2QG5I bs/NFs/OL0AXsaZqvw+WJ6ft0pqU5Md41tLJJTX3V595TLj8/itGA+FflFUG9db+3lmb T3LA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from:dkim-signature :arc-authentication-results; bh=Nz9+RdAtPamUIrXRwwYbvR1sqOlV94E98VR+HW0vWV8=; b=VA8dgPV/ep+6ynGIIGDEnJHvqZJPW8F7IjFCAb/stKe/yqIVKtOPW9yv48dOS+IFRk cRUTKf/pE5e8a6htt393GytHgsvqObMc74ZQnOFxNVye0SB4Ak7WJ8BoT/byWG6svdtz /CZ5+kUU10Qis+R/anaMn1etJBK+PcS4TKZso218HLBZrJVhe99e+fiMsD1qhbsVeBUQ yEZGTV+lg3AFQ0pGvuRRXf9mbLqm+2NRae66AtxsGhnsz2kKu65VpCDxZ5pToxQGr8G3 HhPxcGgd6RjriCs0kg2skUDI0bjWMVMZRyCLbFfWwUDiA+bHShThM/vBryjkus6rYq0m QfzA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=DczaX/34; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f9-v6si7030121pgo.250.2018.05.24.03.01.27; Thu, 24 May 2018 03:01:43 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=DczaX/34; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1030849AbeEXKAf (ORCPT + 99 others); Thu, 24 May 2018 06:00:35 -0400 Received: from mail.kernel.org ([198.145.29.99]:42008 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1030424AbeEXKAL (ORCPT ); Thu, 24 May 2018 06:00:11 -0400 Received: from localhost (LFbn-1-12247-202.w90-92.abo.wanadoo.fr [90.92.61.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 5069620893; Thu, 24 May 2018 10:00:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1527156010; bh=DwtwQpHdA+/KY0xuAoEK+KLqDAubFfNWMUI6oelQGGg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DczaX/34C/bLhbup+u4ONrDdsuEbro1DJ9+P2fQhpYTEhUycTSy1s0MjUR5a0ckDM DE09/o+YNHpDcjyRw3Ic3QMxpmHmKu9PP4TlY3VLtUFuSdZZQNSR5ykz7wnVDUq1G6 vppytnby/Zv5XIqWKFFz+74HX4b75ZAqdO9T/vVg= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Ariel Elior , Michal Kalderon , "David S. Miller" Subject: [PATCH 4.16 032/161] qed: Fix LL2 race during connection terminate Date: Thu, 24 May 2018 11:37:37 +0200 Message-Id: <20180524093022.201857268@linuxfoundation.org> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180524093018.331893860@linuxfoundation.org> References: <20180524093018.331893860@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.16-stable review patch. If anyone has any objections, please let me know. ------------------ From: Michal Kalderon [ Upstream commit 490068deaef0c76e47bf89c457de899b7d3995c7 ] Stress on qedi/qedr load unload lead to list_del corruption. This is due to ll2 connection terminate freeing resources without verifying that no more ll2 processing will occur. This patch unregisters the ll2 status block before terminating the connection to assure this race does not occur. Fixes: 1d6cff4fca4366 ("qed: Add iSCSI out of order packet handling") Signed-off-by: Ariel Elior Signed-off-by: Michal Kalderon Signed-off-by: David S. Miller Signed-off-by: Greg Kroah-Hartman --- drivers/net/ethernet/qlogic/qed/qed_ll2.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) --- a/drivers/net/ethernet/qlogic/qed/qed_ll2.c +++ b/drivers/net/ethernet/qlogic/qed/qed_ll2.c @@ -842,6 +842,9 @@ static int qed_ll2_lb_rxq_completion(str struct qed_ll2_info *p_ll2_conn = (struct qed_ll2_info *)p_cookie; int rc; + if (!QED_LL2_RX_REGISTERED(p_ll2_conn)) + return 0; + rc = qed_ll2_lb_rxq_handler(p_hwfn, p_ll2_conn); if (rc) return rc; @@ -862,6 +865,9 @@ static int qed_ll2_lb_txq_completion(str u16 new_idx = 0, num_bds = 0; int rc; + if (!QED_LL2_TX_REGISTERED(p_ll2_conn)) + return 0; + new_idx = le16_to_cpu(*p_tx->p_fw_cons); num_bds = ((s16)new_idx - (s16)p_tx->bds_idx); @@ -1915,17 +1921,25 @@ int qed_ll2_terminate_connection(void *c /* Stop Tx & Rx of connection, if needed */ if (QED_LL2_TX_REGISTERED(p_ll2_conn)) { + p_ll2_conn->tx_queue.b_cb_registred = false; + smp_wmb(); /* Make sure this is seen by ll2_lb_rxq_completion */ rc = qed_sp_ll2_tx_queue_stop(p_hwfn, p_ll2_conn); if (rc) goto out; + qed_ll2_txq_flush(p_hwfn, connection_handle); + qed_int_unregister_cb(p_hwfn, p_ll2_conn->tx_queue.tx_sb_index); } if (QED_LL2_RX_REGISTERED(p_ll2_conn)) { + p_ll2_conn->rx_queue.b_cb_registred = false; + smp_wmb(); /* Make sure this is seen by ll2_lb_rxq_completion */ rc = qed_sp_ll2_rx_queue_stop(p_hwfn, p_ll2_conn); if (rc) goto out; + qed_ll2_rxq_flush(p_hwfn, connection_handle); + qed_int_unregister_cb(p_hwfn, p_ll2_conn->rx_queue.rx_sb_index); } if (p_ll2_conn->input.conn_type == QED_LL2_TYPE_OOO) @@ -1973,16 +1987,6 @@ void qed_ll2_release_connection(void *cx if (!p_ll2_conn) return; - if (QED_LL2_RX_REGISTERED(p_ll2_conn)) { - p_ll2_conn->rx_queue.b_cb_registred = false; - qed_int_unregister_cb(p_hwfn, p_ll2_conn->rx_queue.rx_sb_index); - } - - if (QED_LL2_TX_REGISTERED(p_ll2_conn)) { - p_ll2_conn->tx_queue.b_cb_registred = false; - qed_int_unregister_cb(p_hwfn, p_ll2_conn->tx_queue.tx_sb_index); - } - kfree(p_ll2_conn->tx_queue.descq_mem); qed_chain_free(p_hwfn->cdev, &p_ll2_conn->tx_queue.txq_chain);