Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp111168pxu; Wed, 6 Jan 2021 23:21:00 -0800 (PST) X-Google-Smtp-Source: ABdhPJyBoEnE9thAAuhhLA/nQR1QHtm6FwNfGpZhV1USZEzssf7D/b7Qr9KtMK2JegdvAqOeEJOc X-Received: by 2002:a50:d2d2:: with SMTP id q18mr656977edg.346.1610004060023; Wed, 06 Jan 2021 23:21:00 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1610004060; cv=none; d=google.com; s=arc-20160816; b=e9oMvgx+zkkcZLtQNn9u9x7OFqZCFVWQ5imvHQMpGJNxcCOcoq1EbJcJzcpWqybA5m +q3OZU7IMGpbmuOC3TFYseJhmvxOWRps3XjeUdF45quhHwXs98bwdFLMsLV9LhwB/okA aZPJ+0Tlb2SGN/Ke2FAJDlKoZcV/WSXZMce2sH54wv5VCEK61JbJKFKFQm6LqmW1pH6o I6Ut4XAmIHJwT+U3kdu4kwEwBvH0ukgW1ONUb5lOU7Rk0SxOnC8LxHPuYVXmyphchMel OIgUvLyHO38SxKrAEmZDp/W89Ds+rh+98QGZlTCxNKS0zcMhFeEbRiAVJ0m43qssnlio gu0w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:dkim-signature:user-agent:content-disposition :mime-version:message-id:subject:cc:to:from:date; bh=NcydAXraYOykiJbtHv9bmDl70gtSvpqSHEMl3kNpZO8=; b=ruvwTTDoao8nlqOwecgSDYSc/qD4JuxPj/UfGn5Vo/EC9/T0+ZWywt/oM5KC9PcryH 4RwFy/TODldu8mw7pjRKmH36rm/pzJ34a9ee8e0ndfTJ7NMjVxuL+wILpG42T+AYw08z YhQuzoIsvm5bbEeXO7oT8JcDV3fEPANlqUHLPf3VsrDfI0g33X6ToO8Gqas4ZBt7NudG VrErxhDgjM6AqHZRthFD2jrexfn6atsxr4MboTivuhduV+joD/kl8hNjAl23Z7xqVOFr PlI3XzNfSpjgZ1qS4daTCGl5L/1WwrxOBl7K0Qrkil5xz/Klt1NNXEsQtlvp7beuNu3J VFAw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@nvidia.com header.s=n1 header.b=EFXLbCIv; 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=nvidia.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id dn20si2082887ejc.47.2021.01.06.23.20.36; Wed, 06 Jan 2021 23:21:00 -0800 (PST) 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=@nvidia.com header.s=n1 header.b=EFXLbCIv; 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=nvidia.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726498AbhAGHTc (ORCPT + 99 others); Thu, 7 Jan 2021 02:19:32 -0500 Received: from hqnvemgate26.nvidia.com ([216.228.121.65]:4082 "EHLO hqnvemgate26.nvidia.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726013AbhAGHTc (ORCPT ); Thu, 7 Jan 2021 02:19:32 -0500 Received: from hqmail.nvidia.com (Not Verified[216.228.121.13]) by hqnvemgate26.nvidia.com (using TLS: TLSv1.2, AES256-SHA) id ; Wed, 06 Jan 2021 23:18:51 -0800 Received: from mtl-vdi-166.wap.labs.mlnx (172.20.145.6) by HQMAIL107.nvidia.com (172.20.187.13) with Microsoft SMTP Server (TLS) id 15.0.1473.3; Thu, 7 Jan 2021 07:18:49 +0000 Date: Thu, 7 Jan 2021 09:18:45 +0200 From: Eli Cohen To: , , , CC: , Subject: [PATCH v1] vdpa/mlx5: Fix memory key MTT population Message-ID: <20210107071845.GA224876@mtl-vdi-166.wap.labs.mlnx> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Disposition: inline User-Agent: Mutt/1.9.5 (bf161cf53efb) (2018-04-13) X-Originating-IP: [172.20.145.6] X-ClientProxiedBy: HQMAIL105.nvidia.com (172.20.187.12) To HQMAIL107.nvidia.com (172.20.187.13) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nvidia.com; s=n1; t=1610003931; bh=NcydAXraYOykiJbtHv9bmDl70gtSvpqSHEMl3kNpZO8=; h=Date:From:To:CC:Subject:Message-ID:MIME-Version:Content-Type: Content-Disposition:User-Agent:X-Originating-IP:X-ClientProxiedBy; b=EFXLbCIvQe13kA7AHEjQ9n0tm19Rd4J4Rb75BI47Vy4roYv1K7pAfpmoFhuhsLqQJ uCuqETEMA169PIo8YwAIZ1kpcnhSzWdueW4b1oH/2D6W11JZqcCjh6Og8Ijz5iy1Pp yQ8esk5Vv0x+VSz+E/GR6eRNPamLt24yvobdKNpwUpnKHWGrov8HMpb0VmbJ980aH1 dcgQyfQLdUr5zBk46PMix8m1U3/wtQ0eC4Pi3lG9xUwdGA5fTcAAHFlyXfPdx+qLXZ RZ3izX28oPfb0ax2Yt7mNxdcetxedVtYUcBeO1E64W5+eTxxHXxNYz4i1M2H/NLgmW qbRPcV5/vEKOQ== Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org map_direct_mr() assumed that the number of scatter/gather entries returned by dma_map_sg_attrs() was equal to the number of segments in the sgl list. This led to wrong population of the mkey object. Fix this by properly referring to the returned value. The hardware expects each MTT entry to contain the DMA address of a contiguous block of memory of size (1 << mr->log_size) bytes. dma_map_sg_attrs() can coalesce several sg entries into a single scatter/gather entry of contiguous DMA range so we need to scan the list and refer to the size of each s/g entry. In addition, get rid of fill_sg() which effect is overwritten by populate_mtts(). Fixes: 94abbccdf291 ("vdpa/mlx5: Add shared memory registration code") Signed-off-by: Eli Cohen --- V0->V1: 1. Fix typos 2. Improve changelog drivers/vdpa/mlx5/core/mlx5_vdpa.h | 1 + drivers/vdpa/mlx5/core/mr.c | 28 ++++++++++++---------------- 2 files changed, 13 insertions(+), 16 deletions(-) diff --git a/drivers/vdpa/mlx5/core/mlx5_vdpa.h b/drivers/vdpa/mlx5/core/mlx5_vdpa.h index 5c92a576edae..08f742fd2409 100644 --- a/drivers/vdpa/mlx5/core/mlx5_vdpa.h +++ b/drivers/vdpa/mlx5/core/mlx5_vdpa.h @@ -15,6 +15,7 @@ struct mlx5_vdpa_direct_mr { struct sg_table sg_head; int log_size; int nsg; + int nent; struct list_head list; u64 offset; }; diff --git a/drivers/vdpa/mlx5/core/mr.c b/drivers/vdpa/mlx5/core/mr.c index 4b6195666c58..d300f799efcd 100644 --- a/drivers/vdpa/mlx5/core/mr.c +++ b/drivers/vdpa/mlx5/core/mr.c @@ -25,17 +25,6 @@ static int get_octo_len(u64 len, int page_shift) return (npages + 1) / 2; } -static void fill_sg(struct mlx5_vdpa_direct_mr *mr, void *in) -{ - struct scatterlist *sg; - __be64 *pas; - int i; - - pas = MLX5_ADDR_OF(create_mkey_in, in, klm_pas_mtt); - for_each_sg(mr->sg_head.sgl, sg, mr->nsg, i) - (*pas) = cpu_to_be64(sg_dma_address(sg)); -} - static void mlx5_set_access_mode(void *mkc, int mode) { MLX5_SET(mkc, mkc, access_mode_1_0, mode & 0x3); @@ -45,10 +34,18 @@ static void mlx5_set_access_mode(void *mkc, int mode) static void populate_mtts(struct mlx5_vdpa_direct_mr *mr, __be64 *mtt) { struct scatterlist *sg; + int nsg = mr->nsg; + u64 dma_addr; + u64 dma_len; + int j = 0; int i; - for_each_sg(mr->sg_head.sgl, sg, mr->nsg, i) - mtt[i] = cpu_to_be64(sg_dma_address(sg)); + for_each_sg(mr->sg_head.sgl, sg, mr->nent, i) { + for (dma_addr = sg_dma_address(sg), dma_len = sg_dma_len(sg); + nsg && dma_len; + nsg--, dma_addr += BIT(mr->log_size), dma_len -= BIT(mr->log_size)) + mtt[j++] = cpu_to_be64(dma_addr); + } } static int create_direct_mr(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_direct_mr *mr) @@ -64,7 +61,6 @@ static int create_direct_mr(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_direct return -ENOMEM; MLX5_SET(create_mkey_in, in, uid, mvdev->res.uid); - fill_sg(mr, in); mkc = MLX5_ADDR_OF(create_mkey_in, in, memory_key_mkey_entry); MLX5_SET(mkc, mkc, lw, !!(mr->perm & VHOST_MAP_WO)); MLX5_SET(mkc, mkc, lr, !!(mr->perm & VHOST_MAP_RO)); @@ -276,8 +272,8 @@ static int map_direct_mr(struct mlx5_vdpa_dev *mvdev, struct mlx5_vdpa_direct_mr done: mr->log_size = log_entity_size; mr->nsg = nsg; - err = dma_map_sg_attrs(dma, mr->sg_head.sgl, mr->nsg, DMA_BIDIRECTIONAL, 0); - if (!err) + mr->nent = dma_map_sg_attrs(dma, mr->sg_head.sgl, mr->nsg, DMA_BIDIRECTIONAL, 0); + if (!mr->nent) goto err_map; err = create_direct_mr(mvdev, mr); -- 2.28.0