From patchwork Tue Jul 2 09:09:35 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Leon Romanovsky X-Patchwork-Id: 13719169 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 7826EC3064D for ; Tue, 2 Jul 2024 09:10:23 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 044386B00A0; Tue, 2 Jul 2024 05:10:23 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id F36206B00A1; Tue, 2 Jul 2024 05:10:22 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id DAF806B00A2; Tue, 2 Jul 2024 05:10:22 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id B89666B00A0 for ; Tue, 2 Jul 2024 05:10:22 -0400 (EDT) Received: from smtpin07.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 5565BA2F83 for ; Tue, 2 Jul 2024 09:10:22 +0000 (UTC) X-FDA: 82294241484.07.E91162E Received: from sin.source.kernel.org (sin.source.kernel.org [145.40.73.55]) by imf04.hostedemail.com (Postfix) with ESMTP id 1E90C40012 for ; Tue, 2 Jul 2024 09:10:19 +0000 (UTC) Authentication-Results: imf04.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=DERWykst; spf=pass (imf04.hostedemail.com: domain of leon@kernel.org designates 145.40.73.55 as permitted sender) smtp.mailfrom=leon@kernel.org; dmarc=pass (policy=none) header.from=kernel.org ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1719911390; 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-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=9l3RqBQ3wmhiS4Devu11UR9cNpL8lZMERvC1jOBPYeU=; b=2EK0nWsGXAAPt22JhMkBagBYlycxq2ZdbR3RzsV+UUWAahCqw92eeKg6ec0Y1ho2egkVzi HJNrQv5Vs734VFC8JiqfR9fmXBZI2nuKEPVMvvtLSDZDOSPnqvayHjuRIsqIqrEi5oqafE mtetU+x+ROxoy0wi9NQNw2XlVskZw9c= ARC-Authentication-Results: i=1; imf04.hostedemail.com; dkim=pass header.d=kernel.org header.s=k20201202 header.b=DERWykst; spf=pass (imf04.hostedemail.com: domain of leon@kernel.org designates 145.40.73.55 as permitted sender) smtp.mailfrom=leon@kernel.org; dmarc=pass (policy=none) header.from=kernel.org ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1719911390; a=rsa-sha256; cv=none; b=bEQwVRkwcdy+FFVrdPVAuQNmkhRSq7MfCd4hbq8WSMMPwIUivQN9ofOxbdukqMZ+AqghXO gVpDF8Cb6FKWeLS5FgFN3TZz1eQJCrh7i+5wgcxnwzTPgM4SYyaj5vfVqOFGDEGJWaaz1T X62K6g0r0BILrK8xaVBwF6Up9J3AO2E= Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sin.source.kernel.org (Postfix) with ESMTP id 1FC19CE1CF5; Tue, 2 Jul 2024 09:10:17 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id E8E09C4AF0E; Tue, 2 Jul 2024 09:10:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1719911416; bh=r8LbBOjlbH4F69KVmFsNaHjJ/rODIFYYIWRpcAsJOVI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DERWykstv7XxGRlK5d+9zV0EQM0MK52hTvvioFtFjlLgY6y7WByKUa78ayxSb4kv4 I+xUVII03CJetjfBvTMv9CMMhQJfzVzLz89kaGypwXqqSFHhbw4Gb2EbFJGDnfX17l 0aC4Byhh+gWLSP7xqntoErbx/0yPnHiKuF5CB/Xs9/iSM9GN7ebAkO6YOTDfK+Sr8y dJtkIzyXzi0gzX+IoPLVGBHI3F2b9pwZ+KO31UXjhbL9I3Iuq75SeGIsrKaVl1FT3q sHBmNAh3u7+dpLJB9+kZkDVxWvxbuHf4tfrlHP2fR8bQCt2MPqKJJkSIF05sdFYODC r+/wFzkIKdacg== From: Leon Romanovsky To: Jens Axboe , Jason Gunthorpe , Robin Murphy , Joerg Roedel , Will Deacon , Keith Busch , Christoph Hellwig , "Zeng, Oak" , Chaitanya Kulkarni Cc: Leon Romanovsky , Sagi Grimberg , Bjorn Helgaas , Logan Gunthorpe , Yishai Hadas , Shameer Kolothum , Kevin Tian , Alex Williamson , Marek Szyprowski , =?utf-8?b?SsOpcsO0bWUgR2xpc3Nl?= , Andrew Morton , linux-block@vger.kernel.org, linux-kernel@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 Subject: [RFC PATCH v1 05/18] mm/hmm: let users to tag specific PFN with DMA mapped bit Date: Tue, 2 Jul 2024 12:09:35 +0300 Message-ID: <769b6266d5e8638322f25550dd01a85515bf9d08.1719909395.git.leon@kernel.org> X-Mailer: git-send-email 2.45.2 In-Reply-To: References: MIME-Version: 1.0 X-Rspamd-Server: rspam06 X-Rspamd-Queue-Id: 1E90C40012 X-Stat-Signature: jmijq75ffp4iwo734a4bo7fqjjfcfpej X-Rspam-User: X-HE-Tag: 1719911419-360060 X-HE-Meta: U2FsdGVkX18pBdWrfJ76yAxlukYpflm6e36IiiI0v9JKBLCUJLp8CP2W5iAAvvFw3uDTYXpR3ece4C2S8ysgojX1jBFvCK5VHKvxBPL/eworGKQNkdo1ccpKda4nbHUB17UuScoUforw7nQW07MzlG9xrfQuR73uHL+qGdoqmpPagED41oaetOb6iVn+6iF8x2+kPhwgmKE1b6ESItczXE+O6C+6rSpdtsUdYj13o8KYdeqt5GMJvhZXmH59+l9BC/Ybr+McT2zt8maGs6nYl0DBUErmB17x1kT4igTEVTLp2KGPGLdBdTo7/BBPNTaqPjyuCq/jFR7swHJq4Z+qCahEZHxdQg/Z0DjVc9RIgpUMT/5GHHc0qg8aLJX789TzGxz1ckxyVcsoKxlTuX4GbRUnSTCSyAvkWEg/bm7+ogvaJd5qCHJW7ZC4T69bCRpv/5RKIHMIQLOjGVpot8PUi1tDi3Az84+0DgdEdzlIWinl7cj9QK0R4nR193b2g6nbJFugDMx0O7inxN+BNALpr6H5cic2ipz3MLxUi6PfDGUK6lCtj+CvEF4odOPypG3DUyWUZaBagRHZbG0/wiHDrprVJTkX6CFu2SlABbWn7dKSwjuzPZCHSVV2YqRkShsjoWgu2oCgMeIOvAjEP2GhELo2rK7+/IeeLAXCj+p+5zaQrDia1SlDj2zrE6vts69oUI0br74p+PJbQMEi4Hv04Ocb6XJTJpNP5QEEKvizw2HioWNA5DdcIco4MtbIptWq+CwTpgIPrZKdWei9sqS/VRilmei/dM7hAfcTBY/QaVYoDjCJ9mWmlK+nG/YmXgBUS5dG6L7ldPtT7/Xsq2zNaNrQx8MzqhLHXvnBYDbpu15A/MThm2AE0YJd3u8k0gQZG/4sxUxZdo3KvwyUWUUxmFPuh7tQJQ9ppuO14bH50b3pSTU6dXdehlE3c8vvwJvQ+xaSlxJV+7cw2fsZchN DFDCC/wE kzwocMl5g2tPab9knSdvBvLn9NgLVRGDhdNcjeM+rSl5qWEXwwP08id18M3wu9S6Z10mj4REUeYpOLjCV8QHdzrTDQEE7Ua11w06fKObLLNq2ye08fya0SP2K/QdgxLyI7HtkwQ98vwkPeMTLER17DonKn6RKgfwXR+R5Z8hoO0MG1NriJ9LiH5q1QnNqq7UYvu1Oc23LgzOaJ3k= 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: From: Leon Romanovsky Introduce new sticky flag (HMM_PFN_DMA_MAPPED), which isn't overwritten by HMM range fault. Such flag allows users to tag specific PFNs with information if this specific PFN was already DMA mapped. Signed-off-by: Leon Romanovsky --- include/linux/hmm.h | 4 ++++ mm/hmm.c | 34 +++++++++++++++++++++------------- 2 files changed, 25 insertions(+), 13 deletions(-) diff --git a/include/linux/hmm.h b/include/linux/hmm.h index 126a36571667..2999697db83a 100644 --- a/include/linux/hmm.h +++ b/include/linux/hmm.h @@ -23,6 +23,8 @@ struct mmu_interval_notifier; * HMM_PFN_WRITE - if the page memory can be written to (requires HMM_PFN_VALID) * HMM_PFN_ERROR - accessing the pfn is impossible and the device should * fail. ie poisoned memory, special pages, no vma, etc + * HMM_PFN_DMA_MAPPED - Flag preserved on input-to-output transformation + * to mark that page is already DMA mapped * * On input: * 0 - Return the current state of the page, do not fault it. @@ -36,6 +38,8 @@ enum hmm_pfn_flags { HMM_PFN_VALID = 1UL << (BITS_PER_LONG - 1), HMM_PFN_WRITE = 1UL << (BITS_PER_LONG - 2), HMM_PFN_ERROR = 1UL << (BITS_PER_LONG - 3), + /* Sticky lag, carried from Input to Output */ + HMM_PFN_DMA_MAPPED = 1UL << (BITS_PER_LONG - 7), HMM_PFN_ORDER_SHIFT = (BITS_PER_LONG - 8), /* Input flags */ diff --git a/mm/hmm.c b/mm/hmm.c index 93aebd9cc130..03aeb9929d9e 100644 --- a/mm/hmm.c +++ b/mm/hmm.c @@ -44,8 +44,10 @@ static int hmm_pfns_fill(unsigned long addr, unsigned long end, { unsigned long i = (addr - range->start) >> PAGE_SHIFT; - for (; addr < end; addr += PAGE_SIZE, i++) - range->hmm_pfns[i] = cpu_flags; + for (; addr < end; addr += PAGE_SIZE, i++) { + range->hmm_pfns[i] &= HMM_PFN_DMA_MAPPED; + range->hmm_pfns[i] |= cpu_flags; + } return 0; } @@ -202,8 +204,10 @@ static int hmm_vma_handle_pmd(struct mm_walk *walk, unsigned long addr, return hmm_vma_fault(addr, end, required_fault, walk); pfn = pmd_pfn(pmd) + ((addr & ~PMD_MASK) >> PAGE_SHIFT); - for (i = 0; addr < end; addr += PAGE_SIZE, i++, pfn++) - hmm_pfns[i] = pfn | cpu_flags; + for (i = 0; addr < end; addr += PAGE_SIZE, i++, pfn++) { + hmm_pfns[i] &= HMM_PFN_DMA_MAPPED; + hmm_pfns[i] |= pfn | cpu_flags; + } return 0; } #else /* CONFIG_TRANSPARENT_HUGEPAGE */ @@ -236,7 +240,7 @@ static int hmm_vma_handle_pte(struct mm_walk *walk, unsigned long addr, hmm_pte_need_fault(hmm_vma_walk, pfn_req_flags, 0); if (required_fault) goto fault; - *hmm_pfn = 0; + *hmm_pfn = *hmm_pfn & HMM_PFN_DMA_MAPPED; return 0; } @@ -253,14 +257,14 @@ static int hmm_vma_handle_pte(struct mm_walk *walk, unsigned long addr, cpu_flags = HMM_PFN_VALID; if (is_writable_device_private_entry(entry)) cpu_flags |= HMM_PFN_WRITE; - *hmm_pfn = swp_offset_pfn(entry) | cpu_flags; + *hmm_pfn = (*hmm_pfn & HMM_PFN_DMA_MAPPED) | swp_offset_pfn(entry) | cpu_flags; return 0; } required_fault = hmm_pte_need_fault(hmm_vma_walk, pfn_req_flags, 0); if (!required_fault) { - *hmm_pfn = 0; + *hmm_pfn = *hmm_pfn & HMM_PFN_DMA_MAPPED; return 0; } @@ -304,11 +308,11 @@ static int hmm_vma_handle_pte(struct mm_walk *walk, unsigned long addr, pte_unmap(ptep); return -EFAULT; } - *hmm_pfn = HMM_PFN_ERROR; + *hmm_pfn = (*hmm_pfn & HMM_PFN_DMA_MAPPED) | HMM_PFN_ERROR; return 0; } - *hmm_pfn = pte_pfn(pte) | cpu_flags; + *hmm_pfn = (*hmm_pfn & HMM_PFN_DMA_MAPPED) | pte_pfn(pte) | cpu_flags; return 0; fault: @@ -448,8 +452,10 @@ static int hmm_vma_walk_pud(pud_t *pudp, unsigned long start, unsigned long end, } pfn = pud_pfn(pud) + ((addr & ~PUD_MASK) >> PAGE_SHIFT); - for (i = 0; i < npages; ++i, ++pfn) - hmm_pfns[i] = pfn | cpu_flags; + for (i = 0; i < npages; ++i, ++pfn) { + hmm_pfns[i] &= HMM_PFN_DMA_MAPPED; + hmm_pfns[i] |= pfn | cpu_flags; + } goto out_unlock; } @@ -507,8 +513,10 @@ static int hmm_vma_walk_hugetlb_entry(pte_t *pte, unsigned long hmask, } pfn = pte_pfn(entry) + ((start & ~hmask) >> PAGE_SHIFT); - for (; addr < end; addr += PAGE_SIZE, i++, pfn++) - range->hmm_pfns[i] = pfn | cpu_flags; + for (; addr < end; addr += PAGE_SIZE, i++, pfn++) { + range->hmm_pfns[i] &= HMM_PFN_DMA_MAPPED; + range->hmm_pfns[i] |= pfn | cpu_flags; + } spin_unlock(ptl); return 0;