Le 17/05/2021 à 14:49, Anshuman Khandual a écrit :


On 5/17/21 11:25 AM, Aneesh Kumar K.V wrote:
On 5/17/21 11:17 AM, Christophe Leroy wrote:
+aneesh
+linuxppc-dev list

Le 17/05/2021 à 07:44, Anshuman Khandual a écrit :
Hello Christophe,

DEBUG_VM_PGTABLE has now been re-enabled on powerpc recently ? was not
aware about this. From the error log, it failed explicitly on 4K page
size hash config.

static inline pmd_t hash__pmd_mkhuge(pmd_t pmd)
{
          BUG();        ------> Failed
          return pmd;
}

static inline pmd_t __pmd_mkhuge(pmd_t pmd)
{
          if (radix_enabled())
                  return radix__pmd_mkhuge(pmd);
          return hash__pmd_mkhuge(pmd);
}

pmd_t pfn_pmd(unsigned long pfn, pgprot_t pgprot)
{
          unsigned long pmdv;

          pmdv = (pfn << PAGE_SHIFT) & PTE_RPN_MASK;

          return __pmd_mkhuge(pmd_set_protbits(__pmd(pmdv), pgprot));
}

It seems like on powerpc, where pfn_pmd() makes a huge page but which
is not supported on 4K hash config thus triggering the BUG(). But all
pfn_pmd() call sites inside the debug_vm_pgtable() test are protected
with CONFIG_TRANSPARENT_HUGEPAGE. IIUC unlike powerpc, pfn_pmd() does
not directly make a huge page on other platforms.

Looking at arch/powerpc/include/asm/book3s/64/hash-4k.h, all relevant
THP helpers has BUG() or 0 which indicates THP might not be supported
on 4K page size hash config ?

But looking at arch/powerpc/platforms/Kconfig.cputype, it seems like
HAVE_ARCH_TRANSPARENT_HUGEPAGE is invariably selected on PPC_BOOK3S_64
platforms which I assume includes 4K page size hash config as well.

Is THP some how getting enabled on this 4K page size hash config where
it should not be (thus triggering the BUG) ? OR am I missing something
here.



We should put those  pfn_pmd()  and pfn_pud() after

     if (!has_transparent_hugepage())
         return;

The following patch has been lightly tested on arm64 and x86 platforms.
Could you please verify if this solves the problem on powerpc 4K hash
config ? Thank you.

No need to update pmd_advanced_tests() and pud_advanced_tests() ?

Christophe

Reply via email to