Received: by 2002:a05:6a10:f3d0:0:0:0:0 with SMTP id a16csp2714088pxv; Sun, 11 Jul 2021 23:34:38 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyDgsFFUxv81IdJRNJ9CkunQc2NCAactsSElHqhFyLnuAWLkCdI/Sn5dflQzQCoqljPZmwx X-Received: by 2002:a17:906:288d:: with SMTP id o13mr6240233ejd.120.1626071678445; Sun, 11 Jul 2021 23:34:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1626071678; cv=none; d=google.com; s=arc-20160816; b=t4f1+qUqoGHZiWiL5o3QjjlGDnWXRGdq7R08o3OKOVrXYsKheIfaA0IOuau/Pf6d3n WZblLbIhZ0vPTiui3gpbBog2xVGpMfFeSTNx7I/o8ptqzjOo3ey6jWPl+HSM3O9EbtVa 5PA/j1RQ4CDGekQ1P8Na8Ie7ufH2nqmJ8sQ6uK6chM8oQMlFczqzQFxk3bQH74IIkMBI Jp8IYjvez15HvGcK6S4nvgwamrvMCxi/RAtAbVQpLUHlFZ09AVUjwUbLtImnsSjJA5o1 p1kIvs+eee2G2p+H9HjdU1TUK5ipEPiSvKYNs27FU1Q5ArCWsWo1GbNc+yDcTHjwwc4v HsGg== 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=AQ4yfb0A/reo6b6PrhgjROmeC9hya9Q6AGLt5W2MD1s=; b=J7pKoI/loccJIKW51OOS6vZ5eKScqb3eYVxVkor2ca+xmHwGA0SWH6MjJCPzexVPhc BpbYThRyEeqCoXXg9MOoYzqdMy8porhYOJZ0Ebpb9RBk2vgD2YWvmAJOOmAr/tMMSveV kKQSicr2XjPbg2FJz8lamrA7AAybNL8O1oicb1nE4guKDBqw+/luOf3S41bacLV5Zp5g 8CNWf8lVUvxxIo1mNdSmZfUEW3wDybfoo+Ar/uKZp+NQkNVuZ78+g5Ouxbw4/RMF6o8b afuPSbcnD/c9+MClYdeHC9Zf1dRUsx4qPMtcORAbutdHp7d60OOjNIzrK6OtKJvTRYcb j2oA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=PsnkOblE; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id go15si16853724ejc.482.2021.07.11.23.34.15; Sun, 11 Jul 2021 23:34:38 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=PsnkOblE; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 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 S236094AbhGLGfy (ORCPT + 99 others); Mon, 12 Jul 2021 02:35:54 -0400 Received: from mail.kernel.org ([198.145.29.99]:53002 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237373AbhGLGat (ORCPT ); Mon, 12 Jul 2021 02:30:49 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id DE4E660234; Mon, 12 Jul 2021 06:27:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1626071280; bh=BYZqBclRiqG/lzGcsJ67Qe7J1UsQKdstpjlZM7a0u68=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=PsnkOblE3BrajjXUYVmAKElDNlgwjFOYd1YPHxThUuEggDSD4yhEhf1wZkPKFDN8S /FQ0uVA786e1npichBgAqGNQePoBNuB1f3Odzxpx/heA55QSxfSVT+uSfE2TRmH/4n L0mat16+EXbernJ62LV6BflFqTF94fEv4CB7hiy0= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Varun Prakash , "Martin K. Petersen" Subject: [PATCH 5.4 344/348] scsi: target: cxgbit: Unmap DMA buffer before calling target_execute_cmd() Date: Mon, 12 Jul 2021 08:12:08 +0200 Message-Id: <20210712060749.727619566@linuxfoundation.org> X-Mailer: git-send-email 2.32.0 In-Reply-To: <20210712060659.886176320@linuxfoundation.org> References: <20210712060659.886176320@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Varun Prakash commit 6ecdafaec79d4b3388a5b017245f23a0ff9d852d upstream. Instead of calling dma_unmap_sg() after completing WRITE I/O, call dma_unmap_sg() before calling target_execute_cmd() to sync the DMA buffer. Link: https://lore.kernel.org/r/1618403949-3443-1-git-send-email-varun@chelsio.com Cc: # 5.4+ Signed-off-by: Varun Prakash Signed-off-by: Martin K. Petersen Signed-off-by: Greg Kroah-Hartman --- drivers/target/iscsi/cxgbit/cxgbit_ddp.c | 19 ++++++++++--------- drivers/target/iscsi/cxgbit/cxgbit_target.c | 21 ++++++++++++++++++--- 2 files changed, 28 insertions(+), 12 deletions(-) --- a/drivers/target/iscsi/cxgbit/cxgbit_ddp.c +++ b/drivers/target/iscsi/cxgbit/cxgbit_ddp.c @@ -265,12 +265,13 @@ void cxgbit_unmap_cmd(struct iscsi_conn struct cxgbit_cmd *ccmd = iscsit_priv_cmd(cmd); if (ccmd->release) { - struct cxgbi_task_tag_info *ttinfo = &ccmd->ttinfo; - - if (ttinfo->sgl) { + if (cmd->se_cmd.se_cmd_flags & SCF_PASSTHROUGH_SG_TO_MEM_NOALLOC) { + put_page(sg_page(&ccmd->sg)); + } else { struct cxgbit_sock *csk = conn->context; struct cxgbit_device *cdev = csk->com.cdev; struct cxgbi_ppm *ppm = cdev2ppm(cdev); + struct cxgbi_task_tag_info *ttinfo = &ccmd->ttinfo; /* Abort the TCP conn if DDP is not complete to * avoid any possibility of DDP after freeing @@ -280,14 +281,14 @@ void cxgbit_unmap_cmd(struct iscsi_conn cmd->se_cmd.data_length)) cxgbit_abort_conn(csk); + if (unlikely(ttinfo->sgl)) { + dma_unmap_sg(&ppm->pdev->dev, ttinfo->sgl, + ttinfo->nents, DMA_FROM_DEVICE); + ttinfo->nents = 0; + ttinfo->sgl = NULL; + } cxgbi_ppm_ppod_release(ppm, ttinfo->idx); - - dma_unmap_sg(&ppm->pdev->dev, ttinfo->sgl, - ttinfo->nents, DMA_FROM_DEVICE); - } else { - put_page(sg_page(&ccmd->sg)); } - ccmd->release = false; } } --- a/drivers/target/iscsi/cxgbit/cxgbit_target.c +++ b/drivers/target/iscsi/cxgbit/cxgbit_target.c @@ -1013,17 +1013,18 @@ static int cxgbit_handle_iscsi_dataout(s struct scatterlist *sg_start; struct iscsi_conn *conn = csk->conn; struct iscsi_cmd *cmd = NULL; + struct cxgbit_cmd *ccmd; + struct cxgbi_task_tag_info *ttinfo; struct cxgbit_lro_pdu_cb *pdu_cb = cxgbit_rx_pdu_cb(csk->skb); struct iscsi_data *hdr = (struct iscsi_data *)pdu_cb->hdr; u32 data_offset = be32_to_cpu(hdr->offset); - u32 data_len = pdu_cb->dlen; + u32 data_len = ntoh24(hdr->dlength); int rc, sg_nents, sg_off; bool dcrc_err = false; if (pdu_cb->flags & PDUCBF_RX_DDP_CMP) { u32 offset = be32_to_cpu(hdr->offset); u32 ddp_data_len; - u32 payload_length = ntoh24(hdr->dlength); bool success = false; cmd = iscsit_find_cmd_from_itt_or_dump(conn, hdr->itt, 0); @@ -1038,7 +1039,7 @@ static int cxgbit_handle_iscsi_dataout(s cmd->data_sn = be32_to_cpu(hdr->datasn); rc = __iscsit_check_dataout_hdr(conn, (unsigned char *)hdr, - cmd, payload_length, &success); + cmd, data_len, &success); if (rc < 0) return rc; else if (!success) @@ -1076,6 +1077,20 @@ static int cxgbit_handle_iscsi_dataout(s cxgbit_skb_copy_to_sg(csk->skb, sg_start, sg_nents, skip); } + ccmd = iscsit_priv_cmd(cmd); + ttinfo = &ccmd->ttinfo; + + if (ccmd->release && ttinfo->sgl && + (cmd->se_cmd.data_length == (cmd->write_data_done + data_len))) { + struct cxgbit_device *cdev = csk->com.cdev; + struct cxgbi_ppm *ppm = cdev2ppm(cdev); + + dma_unmap_sg(&ppm->pdev->dev, ttinfo->sgl, ttinfo->nents, + DMA_FROM_DEVICE); + ttinfo->nents = 0; + ttinfo->sgl = NULL; + } + check_payload: rc = iscsit_check_dataout_payload(cmd, hdr, dcrc_err);