It's awful. I have a v6 in the works which fixes a number of problems in v5, but
there are about ten Kconfig options which the x86 code depends on. And then ... yes,
there's this bad definition of pud_t on ARM. Arnd has a patch to fix that problem,
Subject: [PATCH v2] [RFC] ARM: modify pgd_t definition for TRANSPARENT_HUGEPAGE_PUD.
But 0day is still pointing out other problems with the current patchset, so I'd hold
off on it until I get v6 posted if I were you. Thanks for picking up
From: Andrew Morton [mailto:email@example.com]
Sent: Tuesday, March 29, 2016 3:17 PM
To: Wilcox, Matthew R
Cc: Matthew Wilcox; linux-mm(a)kvack.org; linux-nvdimm(a)ml01.01.org;
linux-fsdevel(a)vger.kernel.org; linux-kernel(a)vger.kernel.org; x86(a)kernel.org
Subject: Re: [PATCH v4 3/8] mm: Add support for PUD-sized transparent hugepages
On Sun, 31 Jan 2016 23:09:30 +1100 Matthew Wilcox <matthew.r.wilcox(a)intel.com>
From: Matthew Wilcox <willy(a)linux.intel.com>
The current transparent hugepage code only supports PMDs. This patch
adds support for transparent use of PUDs with DAX. It does not include
support for anonymous pages.
Most of this patch simply parallels the work that was done for huge PMDs.
The only major difference is how the new ->pud_entry method in mm_walk
works. The ->pmd_entry method replaces the ->pte_entry method, whereas
the ->pud_entry method works along with either ->pmd_entry or ->pte_entry.
The pagewalk code takes care of locking the PUD before calling ->pud_walk,
so handlers do not need to worry whether the PUD is stable.
Why is this patchset always so hard to compile :(
@@ -82,6 +82,13 @@ static inline pmd_t pfn_t_pmd(pfn_t pfn, pgprot_t pgprot)
return pfn_pmd(pfn_t_to_pfn(pfn), pgprot);
+static inline pud_t pfn_t_pud(pfn_t pfn, pgprot_t pgprot)
+ return pfn_pud(pfn_t_to_pfn(pfn), pgprot);
@@ -98,5 +105,6 @@ static inline bool pfn_t_devmap(pfn_t pfn)
pte_t pte_mkdevmap(pte_t pte);
pmd_t pmd_mkdevmap(pmd_t pmd);
+pud_t pud_mkdevmap(pud_t pud);
In file included from kernel/memremap.c:17:
include/linux/pfn_t.h:107: error: 'pud_mkdevmap' declared as function returning an
because it expands to
pgd_t pud_mkdevmap(pgd_t pud);
typedef unsigned long pgd_t;
Also the patch provides no implementation of pud_mkdevmap() so it's
obviously going to break bisection.