Thread (25 messages) 25 messages, 5 authors, 2026-01-28

Re: [v5 PATCH] arm64: mm: show direct mapping use in /proc/meminfo

From: Yang Shi <hidden>
Date: 2026-01-26 17:59:45
Also in: lkml


On 1/26/26 6:18 AM, Will Deacon wrote:
On Tue, Jan 13, 2026 at 04:36:06PM -0800, Yang Shi wrote:
quoted
On 1/13/26 6:36 AM, Will Deacon wrote:
quoted
On Tue, Jan 06, 2026 at 04:29:44PM -0800, Yang Shi wrote:
quoted
+#if defined(CONFIG_ARM64_4K_PAGES)
+	size[PTE] = "4k";
+	size[CONT_PTE] = "64k";
+	size[PMD] = "2M";
+	size[CONT_PMD] = "32M";
+	size[PUD] = "1G";
+#elif defined(CONFIG_ARM64_16K_PAGES)
+	size[PTE] = "16k";
+	size[CONT_PTE] = "2M";
+	size[PMD] = "32M";
+	size[CONT_PMD] = "1G";
+#elif defined(CONFIG_ARM64_64K_PAGES)
+	size[PTE] = "64k";
+	size[CONT_PTE] = "2M";
+	size[PMD] = "512M";
+	size[CONT_PMD] = "16G";
+#endif
+
+	seq_printf(m, "DirectMap%s:	%8lu kB\n",
+			size[PTE], dm_meminfo[PTE] >> 10);
+	seq_printf(m, "DirectMap%s:	%8lu kB\n",
+			size[CONT_PTE],
+			dm_meminfo[CONT_PTE] >> 10);
+	seq_printf(m, "DirectMap%s:	%8lu kB\n",
+			size[PMD], dm_meminfo[PMD] >> 10);
+	seq_printf(m, "DirectMap%s:	%8lu kB\n",
+			size[CONT_PMD],
+			dm_meminfo[CONT_PMD] >> 10);
+	if (pud_sect_supported())
+		seq_printf(m, "DirectMap%s:	%8lu kB\n",
+			size[PUD], dm_meminfo[PUD] >> 10);
This seems a bit brittle to me. If somebody adds support for l1 block
mappings for !4k pages in future, they will forget to update this and
we'll end up returning kernel stack in /proc/meminfo afaict.
I can initialize size[PUD] to "NON_SUPPORT" by default. If the case happens,
/proc/meminfo just shows "DirectMapNON_SUPPORT", then we will notice
something is missed, but no kernel stack data will be leak.
Or just add the PUD sizes for all the page sizes...
Fine to me.
quoted
quoted
quoted
@@ -266,6 +351,17 @@ static int init_pmd(pmd_t *pmdp, unsigned long addr, unsigned long end,
   		    (flags & NO_BLOCK_MAPPINGS) == 0) {
   			pmd_set_huge(pmdp, phys, prot);
+			/*
+			 * It is possible to have mappings allow cont mapping
+			 * but disallow block mapping. For example,
+			 * map_entry_trampoline().
+			 * So we have to increase CONT_PMD and PMD size here
+			 * to avoid double counting.
+			 */
+			if (pgprot_val(prot) & PTE_CONT)
+				dm_meminfo_add(addr, (next - addr), CONT_PMD);
+			else
+				dm_meminfo_add(addr, (next - addr), PMD);
I don't understand the comment you're adding here. If somebody passes
NO_BLOCK_MAPPINGS then that also prevents contiguous entries except at
level 3.
The comment may be misleading. I meant if we have the accounting code for
CONT_PMD in alloc_init_cont_pmd(), for example,
I think I'd just drop the comment. The code is clear enough once you
actually read what's going on.
Sure.
quoted
@@ -433,6 +433,11 @@ static int alloc_init_cont_pmd(pud_t *pudp, unsigned
long addr,
                 if (ret)
                         goto out;

+               if (pgprot_val(prot) & PTE_CONT)
+                       dm_meminfo_add(addr, (next - addr), CONT_PMD);

                 pmdp += pmd_index(next) - pmd_index(addr);
                 phys += next - addr;
         } while (addr = next, addr != end);

If the described case happens, we actually miscount CONT_PMD. So I need to
check whether it is CONT in init_pmd() instead. If the comment is confusing,
I can just remove it.
quoted
It also doesn't look you handle the error case properly when the mapping
fails.
I don't quite get what fail do you mean? pmd_set_huge() doesn't fail. Or you
meant hotplug fails? If so the hot unplug will decrease the counters, which
is called in the error handling path.
Sorry, I got confused here and thought that we could end up with a
partially-formed contiguous region but that's not the case. So you can
ignore this comment :)
No problem. Thanks for taking time to review the patch.

I will prepare a new revision once we figure out the potential 
contiguous bit misprogramming issue.

Thanks,
Yang
Will
  
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help