From nobody Sun Sep 22 13:31:52 2024 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 mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DD786C433EF for ; Mon, 1 Nov 2021 03:16:08 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id AF63A60F42 for ; Mon, 1 Nov 2021 03:16:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230460AbhKADSj (ORCPT ); Sun, 31 Oct 2021 23:18:39 -0400 Received: from mailgw01.mediatek.com ([60.244.123.138]:35560 "EHLO mailgw01.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S230222AbhKADSh (ORCPT ); Sun, 31 Oct 2021 23:18:37 -0400 X-UUID: a197251d0ae64fcd84ee44743b2b31b3-20211101 X-UUID: a197251d0ae64fcd84ee44743b2b31b3-20211101 Received: from mtkmbs10n1.mediatek.inc [(172.21.101.34)] by mailgw01.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 256/256) with ESMTP id 1302630291; Mon, 01 Nov 2021 11:16:01 +0800 Received: from mtkcas11.mediatek.inc (172.21.101.40) by mtkmbs10n1.mediatek.inc (172.21.101.34) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.2.792.15; Mon, 1 Nov 2021 11:15:59 +0800 Received: from mtksdccf07.mediatek.inc (172.21.84.99) by mtkcas11.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Mon, 1 Nov 2021 11:15:59 +0800 From: Walter Wu To: Christoph Hellwig , Marek Szyprowski , Robin Murphy , "Matthias Brugger" CC: , , , wsd_upstream , , Walter Wu , Andrew Morton Subject: [PATCH] dma-direct: fix DMA_ATTR_NO_KERNEL_MAPPING Date: Mon, 1 Nov 2021 11:15:58 +0800 Message-ID: <20211101031558.7184-1-walter-zh.wu@mediatek.com> X-Mailer: git-send-email 2.18.0 MIME-Version: 1.0 X-MTK: N Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" DMA_ATTR_NO_KERNEL_MAPPING is to avoid creating a kernel mapping for the allocated buffer, but current implementation is that PTE of allocated buffer in kernel page table is valid. So we should set invalid for PTE of allocate buffer so that there are no kernel mapping for the allocated buffer. In some cases, we don't hope the allocated buffer to be read by cpu or speculative execution, so we use DMA_ATTR_NO_KERNEL_MAPPING to get no kernel mapping in order to achieve this goal. Signed-off-by: Walter Wu Cc: Christoph Hellwig Cc: Marek Szyprowski Cc: Robin Murphy Cc: Matthias Brugger Cc: Andrew Morton Reported-by: kernel test robot --- kernel/dma/direct.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/kernel/dma/direct.c b/kernel/dma/direct.c index 4c6c5e0635e3..aa10b4c5d762 100644 --- a/kernel/dma/direct.c +++ b/kernel/dma/direct.c @@ -13,6 +13,7 @@ #include #include #include +#include #include "direct.h" =20 /* @@ -169,6 +170,9 @@ void *dma_direct_alloc(struct device *dev, size_t size, if (!PageHighMem(page)) arch_dma_prep_coherent(page, size); *dma_handle =3D phys_to_dma_direct(dev, page_to_phys(page)); + /* remove kernel mapping for pages */ + set_memory_valid((unsigned long)phys_to_virt(dma_to_phys(dev, *dma_handl= e)), + size >> PAGE_SHIFT, 0); /* return the page pointer as the opaque cookie */ return page; } @@ -278,6 +282,10 @@ void dma_direct_free(struct device *dev, size_t size, =20 if ((attrs & DMA_ATTR_NO_KERNEL_MAPPING) && !force_dma_unencrypted(dev) && !is_swiotlb_for_alloc(dev)) { + size =3D PAGE_ALIGN(size); + /* create kernel mapping for pages */ + set_memory_valid((unsigned long)phys_to_virt(dma_to_phys(dev, dma_addr)), + size >> PAGE_SHIFT, 1); /* cpu_addr is a struct page cookie, not a kernel address */ dma_free_contiguous(dev, cpu_addr, size); return; --=20 2.18.0