Received: by 2002:a05:6a11:4021:0:0:0:0 with SMTP id ky33csp4154574pxb; Mon, 27 Sep 2021 10:30:03 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxjSxmVIVGyQpH0stsGoNx734NtWniEmAqMhnF03kAaEEkdgeFbzACLVkcTG2XLNJBfdVNU X-Received: by 2002:a63:ea58:: with SMTP id l24mr730575pgk.334.1632763802801; Mon, 27 Sep 2021 10:30:02 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1632763802; cv=none; d=google.com; s=arc-20160816; b=uFLKAPmcYOrVNNe42qifTvq7jWlA86yIgF08e1EEJlubW/eeMWfqAvHC8ZkYwnwq0w rGI6C2vRLiESzDWdMI1I5Zfvpe776d8jHg/X9JLvQnJtu40pgBCxiFBoFymjYFBXrXSS gtj70kq7hu6sQ8Xe8DW8BiREh2HafgVtt7h4g4Gt/tI6qJhIpILqQFk/OdVxBxKv+CP6 Xdy9QdHgcYltF6oy8nQnr5VF+nCjLfTKzLuDJH34N2uHx3iBpgHEY6nluH0ZHH2fvWC6 4WA8oy2gQVGJh01vkuRKqvZt9ZPnp5YJS2ZHyG15zphduXxLWcK4txBO+AFlhtwwt2yf oO9g== 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=RUAGEIR4YZyPkNmvRJIpySOV517TtWrQtEsjmXG4A3c=; b=HlAsiHq/rr2QXWLu8PFeuMU5OLdEtklYwUcT/vjP4JwBjAuba0+FGz1LdmAi+Qb9J+ ETRUuJQS9qEr4Nzoqhm9tTbVvvC6Cl/fpHzfiKimHo7FC36ziTzI7gsQTXzSG/a43xz4 LQLKitioTQRKeCkQntufjg0HhqKcKEjiGI0HZBcGep+l8mYT9ObsXjPRy108vfNXvA/o jHe2hcFZxnCo6XrNYOyIQ5IAD2nz9JT2cign/Xcq+Y9Xs9x/RH03X4iYCY6G82g8GMPj A7KrF+kZsVkyODrk03pZERFw4Sah7vl6O4TOm6ZdTs36nNIApKhL6UJLrltOrXX4Q5Un fzzA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=GycGqs7Q; 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 u15si162102pjr.51.2021.09.27.10.29.50; Mon, 27 Sep 2021 10:30:02 -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=GycGqs7Q; 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 S237926AbhI0R20 (ORCPT + 99 others); Mon, 27 Sep 2021 13:28:26 -0400 Received: from mail.kernel.org ([198.145.29.99]:41016 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S238063AbhI0RYP (ORCPT ); Mon, 27 Sep 2021 13:24:15 -0400 Received: by mail.kernel.org (Postfix) with ESMTPSA id F153D61406; Mon, 27 Sep 2021 17:15:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1632762941; bh=V8QBZXTM6IlzafIwE8mDu6or0szhcE8lQfbwd5h45vk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=GycGqs7QVAyjz1TYjrnOuuAlgXhROXT2JeT6oe7RqlYiWrIEJYm7KcqgpTl8SrgZ2 531dKVhnFfEEDCXHNjEx63vdeVTmPsrktbsB0qZLBgmoC4nBeo3usxZ/U9bi+YPJs7 Z1W3AW/LZgBOeJ85MgWF36csuWgzbpXgijCTY6QE= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Philip Yang , Felix Kuehling , Alex Deucher , Sasha Levin Subject: [PATCH 5.14 091/162] drm/amdkfd: fix dma mapping leaking warning Date: Mon, 27 Sep 2021 19:02:17 +0200 Message-Id: <20210927170236.588991777@linuxfoundation.org> X-Mailer: git-send-email 2.33.0 In-Reply-To: <20210927170233.453060397@linuxfoundation.org> References: <20210927170233.453060397@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: Philip Yang [ Upstream commit f63251184a81039ebc805306505838c2a073e51a ] For xnack off, restore work dma unmap previous system memory page, and dma map the updated system memory page to update GPU mapping, this is not dma mapping leaking, remove the WARN_ONCE for dma mapping leaking. prange->dma_addr store the VRAM page pfn after the range migrated to VRAM, should not dma unmap VRAM page when updating GPU mapping or remove prange. Add helper svm_is_valid_dma_mapping_addr to check VRAM page and error cases. Mask out SVM_RANGE_VRAM_DOMAIN flag in dma_addr before calling amdgpu vm update to avoid BUG_ON(*addr & 0xFFFF00000000003FULL), and set it again immediately after. This flag is used to know the type of page later to dma unmapping system memory page. Fixes: 1d5dbfe6c06a ("drm/amdkfd: classify and map mixed svm range pages in GPU") Signed-off-by: Philip Yang Reviewed-by: Felix Kuehling Signed-off-by: Alex Deucher Signed-off-by: Sasha Levin --- drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c index ddac10b5bd3a..e85035fd1ccb 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_svm.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_svm.c @@ -118,6 +118,13 @@ static void svm_range_remove_notifier(struct svm_range *prange) mmu_interval_notifier_remove(&prange->notifier); } +static bool +svm_is_valid_dma_mapping_addr(struct device *dev, dma_addr_t dma_addr) +{ + return dma_addr && !dma_mapping_error(dev, dma_addr) && + !(dma_addr & SVM_RANGE_VRAM_DOMAIN); +} + static int svm_range_dma_map_dev(struct amdgpu_device *adev, struct svm_range *prange, unsigned long offset, unsigned long npages, @@ -139,8 +146,7 @@ svm_range_dma_map_dev(struct amdgpu_device *adev, struct svm_range *prange, addr += offset; for (i = 0; i < npages; i++) { - if (WARN_ONCE(addr[i] && !dma_mapping_error(dev, addr[i]), - "leaking dma mapping\n")) + if (svm_is_valid_dma_mapping_addr(dev, addr[i])) dma_unmap_page(dev, addr[i], PAGE_SIZE, dir); page = hmm_pfn_to_page(hmm_pfns[i]); @@ -209,7 +215,7 @@ void svm_range_dma_unmap(struct device *dev, dma_addr_t *dma_addr, return; for (i = offset; i < offset + npages; i++) { - if (!dma_addr[i] || dma_mapping_error(dev, dma_addr[i])) + if (!svm_is_valid_dma_mapping_addr(dev, dma_addr[i])) continue; pr_debug("dma unmapping 0x%llx\n", dma_addr[i] >> PAGE_SHIFT); dma_unmap_page(dev, dma_addr[i], PAGE_SIZE, dir); @@ -1165,7 +1171,7 @@ svm_range_map_to_gpu(struct amdgpu_device *adev, struct amdgpu_vm *vm, unsigned long last_start; int last_domain; int r = 0; - int64_t i; + int64_t i, j; last_start = prange->start + offset; @@ -1201,6 +1207,10 @@ svm_range_map_to_gpu(struct amdgpu_device *adev, struct amdgpu_vm *vm, NULL, dma_addr, &vm->last_update, &table_freed); + + for (j = last_start - prange->start; j <= i; j++) + dma_addr[j] |= last_domain; + if (r) { pr_debug("failed %d to map to gpu 0x%lx\n", r, prange->start); goto out; -- 2.33.0