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 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id B2EB9C369CB for ; Wed, 23 Apr 2025 09:24:48 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 55C8B6B00A7; Wed, 23 Apr 2025 05:24:47 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 50B3E6B00A8; Wed, 23 Apr 2025 05:24:47 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 3D2D86B00A9; Wed, 23 Apr 2025 05:24:47 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id 202E16B00A7 for ; Wed, 23 Apr 2025 05:24:47 -0400 (EDT) Received: from smtpin03.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 5A801BD0BC for ; Wed, 23 Apr 2025 09:24:47 +0000 (UTC) X-FDA: 83364773814.03.ED7B247 Received: from verein.lst.de (verein.lst.de [213.95.11.211]) by imf30.hostedemail.com (Postfix) with ESMTP id 7F55780005 for ; Wed, 23 Apr 2025 09:24:45 +0000 (UTC) Authentication-Results: imf30.hostedemail.com; dkim=none; dmarc=pass (policy=none) header.from=lst.de; spf=pass (imf30.hostedemail.com: domain of hch@lst.de designates 213.95.11.211 as permitted sender) smtp.mailfrom=hch@lst.de ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1745400285; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=E/1XSPdcVZFEd9Vs+ac3IuU60oWbClklexpnxG4uCm4=; b=h24II+yE93/W3vPgsGXbN+9CEHUavYmIN1EQkTVaSjeE+gDtbt/3HzHipjwxwxF1Qhcj67 X43NkVesbvu+RYwl/lBgp2wI34szvcs8tcCa/OktHRQGDPzNvG+3VLTAEk/zXMwT5QVG1f eC4LK5tSbljul41XkXiWsXSk27R519U= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1745400285; a=rsa-sha256; cv=none; b=cozPflVTj2wtW6Z1JzerKiIDls7wgdFHHg+Tl9hRqlhlsN6+YQJUWjhNeRCus5f4MZCfNf 27rQR93Bw06I2ocUcXeG7Mv/AV3DxvjI5HYzI32QckhI04fg++/Z6Bd7JlwqfzhVVtk15E ELZsHBWc491n2JqZQz0ItIoKY/SZrb0= ARC-Authentication-Results: i=1; imf30.hostedemail.com; dkim=none; dmarc=pass (policy=none) header.from=lst.de; spf=pass (imf30.hostedemail.com: domain of hch@lst.de designates 213.95.11.211 as permitted sender) smtp.mailfrom=hch@lst.de Received: by verein.lst.de (Postfix, from userid 2407) id E67E268AFE; Wed, 23 Apr 2025 11:24:37 +0200 (CEST) Date: Wed, 23 Apr 2025 11:24:37 +0200 From: Christoph Hellwig To: Leon Romanovsky , Keith Busch Cc: Marek Szyprowski , Jens Axboe , Christoph Hellwig , Jake Edge , Jonathan Corbet , Jason Gunthorpe , Zhu Yanjun , Robin Murphy , Joerg Roedel , Will Deacon , Sagi Grimberg , Bjorn Helgaas , Logan Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Alex Williamson , =?iso-8859-1?B?Suly9G1l?= Glisse , Andrew Morton , linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, linux-rdma@vger.kernel.org, iommu@lists.linux.dev, linux-nvme@lists.infradead.org, linux-pci@vger.kernel.org, kvm@vger.kernel.org, linux-mm@kvack.org, Niklas Schnelle , Chuck Lever , Luis Chamberlain , Matthew Wilcox , Dan Williams , Kanchan Joshi , Chaitanya Kulkarni , Nitesh Shetty , Leon Romanovsky Subject: Re: [PATCH v9 23/24] nvme-pci: convert to blk_rq_dma_map Message-ID: <20250423092437.GA1895@lst.de> References: <7c5c5267cba2c03f6650444d4879ba0d13004584.1745394536.git.leon@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <7c5c5267cba2c03f6650444d4879ba0d13004584.1745394536.git.leon@kernel.org> User-Agent: Mutt/1.5.17 (2007-11-01) X-Rspamd-Server: rspam12 X-Rspamd-Queue-Id: 7F55780005 X-Rspam-User: X-Stat-Signature: qeuxsrcp57tztoys4pqosyz1q37hndkm X-HE-Tag: 1745400285-952691 X-HE-Meta: U2FsdGVkX1/9iYbWqGcxDkjGQ7U2fODLDWfao56A5SezckRCvIiiMMgy3J1WaI0rgdG/fy0BT7iU8dD4V3fq1ER6WWG4DLv9HpR11GYEGrSEm8kna4DqyKbVveYbP8AmsduZzEbUD1W1PK0bp4K0pNAvY1IyM4IIwTz9xr1PQCfIt2TNZSsH1BTPSDHVy0VMBRU0nRg+eIEui5GEB0ROvKqpYFqiSBNRfX8xq9qfv0dgyL4XMtCNCzstQRgXEC6c6NTmf7k4NDukOnSiSeYnO0plnDoBVbxECk7ef+8dmYGMR14mrgvSh3icy1GThVVdWi07F9d87YuRv8GF9JD7q23UbqD16tuSqGG6yC2yX/q2n1HaooQlioT/Vot66ng+gAO5OgBd2A6J0IL2CsPugAaciNRv5rjlDxqX+qBNsXadXlxMYlrTaXeIEPFdjZ3LEF1nkAJvGsKXKuAYHTe1v3nlvVQtLpYXZjGzPm5JVmbsW6IvlevSEgNcmZtUSKO0+NRTbCFijbx+ZGLbY9V3Mg1XanO1PLLePOrbDC5nsDkrcUI5hhEDuNfpXpKUKv7YNdnK+8axgBBnvcObvvfI6e8x/N9PpOWcSuIy46hcgYYt30Bq5u/L2eeFiZaudAkl8rhQ/NLegqT3mOUyDPXPPM9qxIPkJANJMk+Aqevz88KV9GYfuLqFCTem3iTwBfK23J3We86Ragvo9cwKRr4RdNSQFZXAyiF6LTnGDKSRE0muL3YwoYnKGuQHgpIEb97yrVamlKaya9N8VKwIT2jT/tixgfIhW6TFjKvkiD81DQxujBWnJFbMHuW9xrgfZ4L8/ZHL347/GkiTtkB07zxHFX7E+KwxjCez6b4asN+sFyomL4ljMnuiq0oV2+znbZix2LRhVtx3QdAmgJcLDImUMFkwx04qorAhyZDhAB8N81hMd0Q4UiV7kynVwUeGFIrV8QGNpbdwQtrh6B/QPgF JhHU3+/k jGGtW8BKmxMoQm3q2DUMN2De2XD40yC+9JF+FLzZLm4hV6VSUkfuHVpoDWPSbgA+bsVA+npe2qCkS5+GkTreoByF1d3mv20WnY7kKfB3NIEHQgb8K60izZDzEmFsh4B2HWBDTi0MgXNdV5yE= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: I don't think the meta SGL handling is quite right yet, and the single segment data handling also regressed. Totally untested patch below, I'll try to allocate some testing time later today. Right now I don't have a test setup for metasgl, though. Keith, do you have a good qemu config for that? Or anyone else? diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c index f69f1eb4308e..80c21082b0c6 100644 --- a/drivers/nvme/host/pci.c +++ b/drivers/nvme/host/pci.c @@ -634,7 +634,11 @@ static void nvme_unmap_data(struct nvme_dev *dev, struct request *req) dma_addr_t dma_addr; if (iod->flags & IOD_SINGLE_SEGMENT) { - dma_addr = le64_to_cpu(iod->cmd.common.dptr.prp1); + if (iod->cmd.common.flags & + (NVME_CMD_SGL_METABUF | NVME_CMD_SGL_METASEG)) + dma_addr = le64_to_cpu(iod->cmd.common.dptr.sgl.addr); + else + dma_addr = le64_to_cpu(iod->cmd.common.dptr.prp1); dma_unmap_page(dev->dev, dma_addr, iod->total_len, rq_dma_dir(req)); return; @@ -922,35 +926,37 @@ static blk_status_t nvme_map_data(struct nvme_dev *dev, struct request *req) return nvme_pci_setup_prps(dev, req); } -static __always_inline void nvme_unmap_metadata(struct nvme_dev *dev, - struct request *req) +static void nvme_unmap_metadata(struct nvme_dev *dev, struct request *req) { unsigned int entries = req->nr_integrity_segments; struct nvme_iod *iod = blk_mq_rq_to_pdu(req); struct nvme_sgl_desc *sg_list = iod->meta_list; enum dma_data_direction dir = rq_dma_dir(req); - dma_addr_t dma_addr; - if (iod->flags & IOD_SINGLE_SEGMENT) { - dma_addr = le64_to_cpu(iod->cmd.common.dptr.sgl.addr); - dma_unmap_page(dev->dev, dma_addr, iod->total_len, rq_dma_dir(req)); + /* + * If the NVME_CMD_SGL_METASEG flag is not set and we're using the + * non-SGL linear meta buffer we know that we have a single input + * segment as well. + * + * Note that it would be nice to always use the linear buffer when + * using IOVA mappings and kernel buffers to avoid the SGL + * indirection, but that's left for a future optimization. + */ + if (!(iod->cmd.common.flags & NVME_CMD_SGL_METASEG)) { + dma_unmap_page(dev->dev, + le64_to_cpu(iod->cmd.common.dptr.prp1), + iod->total_len, rq_dma_dir(req)); return; } if (!blk_rq_dma_unmap(req, dev->dev, &iod->dma_meta_state, iod->total_meta_len)) { - if (iod->cmd.common.flags & NVME_CMD_SGL_METASEG) { - unsigned int i; + unsigned int i; - for (i = 0; i < entries; i++) - dma_unmap_page(dev->dev, - le64_to_cpu(sg_list[i].addr), - le32_to_cpu(sg_list[i].length), dir); - } else { - dma_unmap_page(dev->dev, iod->meta_dma, - rq_integrity_vec(req).bv_len, dir); - return; - } + for (i = 0; i < entries; i++) + dma_unmap_page(dev->dev, + le64_to_cpu(sg_list[i].addr), + le32_to_cpu(sg_list[i].length), dir); } dma_pool_free(dev->prp_small_pool, iod->meta_list, iod->meta_dma);