Received: by 2002:ab2:7041:0:b0:1f4:bcc8:f211 with SMTP id x1csp50472lql; Fri, 12 Apr 2024 03:30:02 -0700 (PDT) X-Forwarded-Encrypted: i=3; AJvYcCVEuSjSQj5v0Tcd9OnvWWuC8dy34KYJ5ufIA2si/wiKJtK/uZfa/iaKN6vUcwPRMQcXHlyQE7o0gDVwXk5ETEIXh+qPED4vZ846RmOAFA== X-Google-Smtp-Source: AGHT+IFYS4CTn91auVjb9elw1uljLmti5JKE47HFKKf8YNhqapk+IJDUItUd9OxhXcmMwOuS2fY6 X-Received: by 2002:a05:6a21:4987:b0:1a7:8127:c919 with SMTP id ax7-20020a056a21498700b001a78127c919mr2511311pzc.43.1712917801838; Fri, 12 Apr 2024 03:30:01 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1712917801; cv=pass; d=google.com; s=arc-20160816; b=RtyofgOxreCw4oV+4+W0PkEjKQ32jjo4Ts8jRS/+4ZVxYmv+PEaSPVutEHrcf9MXx9 vqGodmQkEyGtLSLYnBCcjaR70wQBtHxaQcQ2ykiLp8xmyb2II+Klw8ajFI05Qn0ZiibA OVPi7njXruEQTlRNuFPakQU4dricfxHYVaVXxwxwicUv4v30jzEjmyoPBCR2+y6JmMYu 6hMDz1LT0yOEBN5lAZUiIDDiza3AeinkG89wNas2coT0r/Fyg1+9Nr4q8ToBM3xQfMa+ BmWitiFHGbwqlIMWujMjsIj6T3XaLFtgs+pTEPsQVGxJaWfyoxJFh2qNIAFYdz/Fha2h ut2A== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:list-unsubscribe:list-subscribe :list-id:precedence:dkim-signature; bh=RDA9Fsvooy18fjo8cTSK3tEnpx1k9+s98KjFedtdKvs=; fh=uoU29uHN+PKFsCj7YO8RCCj3PzeYiYQ2TAMlTvLrslc=; b=QjwXk5S8LdMadUu8OXzhBt17VNA8sotf7ZQlUDygggoRJu5ffIXObK9y3NfdfKJ4vv UF1gil/MSU99xVLh9W4rUsfUFmZsrFHnJFeP2pI8Q14JmfCAlN/2R1DcPwths9Y8do/O Y1+KpDsovGSC+PWnVhQCdN/lJOx94y9+jy58XyOVwghLCTt2eKB9o1/xZDS8aZy0piZa qHN0v9Qt8hcYlvAxt4AELOdky0+LBlefSSDSgbBly2Zkv0V95OsHXW7QLpFBrYGbBO78 g7xa7OcZEOnNl9NNoaAHgdVhYMz/HFj/+W836R8pZlP4PJUq4NAJ3/sOeWxaFd8SdPc3 FMKg==; dara=google.com ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=anq5eotS; arc=pass (i=1 spf=pass spfdomain=gmail.com dkim=pass dkdomain=gmail.com dmarc=pass fromdomain=gmail.com); spf=pass (google.com: domain of linux-kernel+bounces-142499-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-142499-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id go17-20020a17090b03d100b002a23cda1a8esi2431690pjb.19.2024.04.12.03.30.01 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 12 Apr 2024 03:30:01 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel+bounces-142499-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20230601 header.b=anq5eotS; arc=pass (i=1 spf=pass spfdomain=gmail.com dkim=pass dkdomain=gmail.com dmarc=pass fromdomain=gmail.com); spf=pass (google.com: domain of linux-kernel+bounces-142499-linux.lists.archive=gmail.com@vger.kernel.org designates 139.178.88.99 as permitted sender) smtp.mailfrom="linux-kernel+bounces-142499-linux.lists.archive=gmail.com@vger.kernel.org"; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sv.mirrors.kernel.org (Postfix) with ESMTPS id 7D5B4282F26 for ; Fri, 12 Apr 2024 10:30:01 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id CBD7053E18; Fri, 12 Apr 2024 10:29:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="anq5eotS" Received: from mail-ua1-f45.google.com (mail-ua1-f45.google.com [209.85.222.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C74B252F92 for ; Fri, 12 Apr 2024 10:29:53 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.45 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712917795; cv=none; b=ZxJKN7BgxcIyKPM/8Xoc9w8FGE0TmlobAA/Q1KLw+QV8v5VXX7vaOMgoD4VZHc0VzwlhB0d96iYTWYriSRgIOucXRJ3UHqGie27rR8n/kEJlBCXVh5QBorwdKoWAsm5pwRCPkoSSdVHydGoAfXF0/Z6Xu3fkoeskhtt/IVfD85w= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1712917795; c=relaxed/simple; bh=9CxLOFppIB/13rEqFSiPkicRCToQUVuaX1AOaFj0Aj8=; h=MIME-Version:References:In-Reply-To:From:Date:Message-ID:Subject: To:Cc:Content-Type; b=jARwkkdXPkSuW8pSCtwIxJPVGX5uBRB7JpXAyOTjh83vpKapQUhJOSfaEQBS1ntOvNQj+Z+KcEoF242JVsi7o87g3Au02vNNa+spwQe1v8MyU84jPUnaEQX3CEAqGyH1MGW+WbykU2MEpYQiaV1sW0xY83HvqQaKoHOewBr6VL4= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=anq5eotS; arc=none smtp.client-ip=209.85.222.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-ua1-f45.google.com with SMTP id a1e0cc1a2514c-7e3b3e33ae3so217638241.0 for ; Fri, 12 Apr 2024 03:29:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1712917792; x=1713522592; darn=vger.kernel.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=RDA9Fsvooy18fjo8cTSK3tEnpx1k9+s98KjFedtdKvs=; b=anq5eotSJx6NDULuVnTVnAk5xRTIJHmS1eElikT1FM0cBqQkXPnW6fAY3u8sVYNs8y iOf9VlqSOCPgiLbVQ67VDHyxX0ZYt81Qy1/m5GnyfYk6jQ9qWiNv61j97uxSeGsleUSt PpqYN2fthGPpoVknC39iRbJapdbyFwQCcIl3jCeHvdtxsWox901XT8IpKK4zgp0eQPKe 3S/0vWw7TE36H9ECoGGjIh7ca+OLAtUODQTQk8tUQkIDA7byP1GzgAcJVhxGKp588F0E uuaXlSAxbTtXeowke+P+Bt2YGUnRqp5FV0Ju6dMjqkTore7xckL5ISauS3aZ4F1FsvSX HLsQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712917792; x=1713522592; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=RDA9Fsvooy18fjo8cTSK3tEnpx1k9+s98KjFedtdKvs=; b=IpagKZr6BMd7bZtUprZgMxL+mkJXERDFokvYi0aLCLU0ryfT/dWJxgH7iC9DztwI8x jL6QE7I76TCLXTSwYus++E/dFiYB3tewjQQHH6G2rjETamSwBNgphjGm4M/uCqFrj672 jQgfB3ACECYkaRy5ZCa+ZafcdVlOG9L4hW0//G/Mp0lFWP8onI4NNI8L2ZqPOHBVGWwO P2x7mnsslyb6MyH0/DP4htZMeaEkRGU9jgPBV+leK4aC2nISqOrikJmPLxaKqnuja8q0 D82HN28GR8eauVCASBCWnX2E1ClTzJ99+bhYH3Mir3BasNmS1c8LZXhOhlZr923Q68rA 75fA== X-Forwarded-Encrypted: i=1; AJvYcCXEPFdJTJ/bPG2mXv7FMl9OqK+CVymBtPxcdiwHCvIk91er4aj/GaM+THqY0hxBwg1wsV23EL/x5qvM6zK6rjob6BVA8P500eBX13Ih X-Gm-Message-State: AOJu0Yy3wVl7Hy0jfbp5ZEVfIF6vefkMJL/5pJD/ZHozIuIimd2mx3o4 pouiX/85bRkwqUEAD8ysmlWHdYx6GG8yJrjNgzNXYPXPba4XCYbV1wPTfOpOEaSp4aeCip35RMH IAjjw6ijSaKv4W6SPXqKSlhgI3Vc= X-Received: by 2002:a05:6122:3c54:b0:4d8:4a7f:c166 with SMTP id fv20-20020a0561223c5400b004d84a7fc166mr2487170vkb.12.1712917792571; Fri, 12 Apr 2024 03:29:52 -0700 (PDT) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 References: <20240412101756.296971-1-21cnbao@gmail.com> <744fc49e-d91b-4f5a-9a27-1a25c50c2154@arm.com> In-Reply-To: <744fc49e-d91b-4f5a-9a27-1a25c50c2154@arm.com> From: Barry Song <21cnbao@gmail.com> Date: Fri, 12 Apr 2024 22:29:41 +1200 Message-ID: Subject: Re: [PATCH v5 1/4] mm: add per-order mTHP anon_fault_alloc and anon_fault_fallback counters To: Ryan Roberts Cc: akpm@linux-foundation.org, cerasuolodomenico@gmail.com, chrisl@kernel.org, corbet@lwn.net, david@redhat.com, kasong@tencent.com, linux-kernel@vger.kernel.org, linux-mm@kvack.org, peterx@redhat.com, surenb@google.com, v-songbaohua@oppo.com, willy@infradead.org, yosryahmed@google.com, yuzhao@google.com Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Fri, Apr 12, 2024 at 10:25=E2=80=AFPM Ryan Roberts wrote: > > On 12/04/2024 11:17, Barry Song wrote: > > On Fri, Apr 12, 2024 at 9:56=E2=80=AFPM Ryan Roberts wrote: > >> > >> On 12/04/2024 10:43, Barry Song wrote: > >>> On Fri, Apr 12, 2024 at 9:27=E2=80=AFPM Ryan Roberts wrote: > >>>> > >>>> Hi Barry, > >>>> > >>>> 2 remaining comments - otherwise looks good. (same comments I just m= ade in the > >>>> v4 conversation). > >>>> > >>>> On 12/04/2024 08:37, Barry Song wrote: > >>>>> From: Barry Song > >>>>> > >>>>> Profiling a system blindly with mTHP has become challenging due to = the > >>>>> lack of visibility into its operations. Presenting the success rat= e of > >>>>> mTHP allocations appears to be pressing need. > >>>>> > >>>>> Recently, I've been experiencing significant difficulty debugging > >>>>> performance improvements and regressions without these figures. It= 's > >>>>> crucial for us to understand the true effectiveness of mTHP in real= -world > >>>>> scenarios, especially in systems with fragmented memory. > >>>>> > >>>>> This patch establishes the framework for per-order mTHP > >>>>> counters. It begins by introducing the anon_fault_alloc and > >>>>> anon_fault_fallback counters. Additionally, to maintain consistency > >>>>> with thp_fault_fallback_charge in /proc/vmstat, this patch also tra= cks > >>>>> anon_fault_fallback_charge when mem_cgroup_charge fails for mTHP. > >>>>> Incorporating additional counters should now be straightforward as = well. > >>>>> > >>>>> Signed-off-by: Barry Song > >>>>> Cc: Chris Li > >>>>> Cc: David Hildenbrand > >>>>> Cc: Domenico Cerasuolo > >>>>> Cc: Kairui Song > >>>>> Cc: Matthew Wilcox (Oracle) > >>>>> Cc: Peter Xu > >>>>> Cc: Ryan Roberts > >>>>> Cc: Suren Baghdasaryan > >>>>> Cc: Yosry Ahmed > >>>>> Cc: Yu Zhao > >>>>> --- > >>>>> include/linux/huge_mm.h | 51 ++++++++++++++++++++++++++++++++++ > >>>>> mm/huge_memory.c | 61 +++++++++++++++++++++++++++++++++++++= ++++ > >>>>> mm/memory.c | 3 ++ > >>>>> mm/page_alloc.c | 4 +++ > >>>>> 4 files changed, 119 insertions(+) > >>>>> > >>>>> diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h > >>>>> index e896ca4760f6..c5beb54b97cb 100644 > >>>>> --- a/include/linux/huge_mm.h > >>>>> +++ b/include/linux/huge_mm.h > >>>>> @@ -264,6 +264,57 @@ unsigned long thp_vma_allowable_orders(struct = vm_area_struct *vma, > >>>>> enforce_sysfs, orders); > >>>>> } > >>>>> > >>>>> +enum mthp_stat_item { > >>>>> + MTHP_STAT_ANON_FAULT_ALLOC, > >>>>> + MTHP_STAT_ANON_FAULT_FALLBACK, > >>>>> + MTHP_STAT_ANON_FAULT_FALLBACK_CHARGE, > >>>>> + __MTHP_STAT_COUNT > >>>>> +}; > >>>>> + > >>>>> +struct mthp_stat { > >>>>> + unsigned long stats[0][__MTHP_STAT_COUNT]; > >>>>> +}; > >>>>> + > >>>>> +extern struct mthp_stat __percpu *mthp_stats; > >>>>> + > >>>>> +static inline void count_mthp_stat(int order, enum mthp_stat_item = item) > >>>>> +{ > >>>>> + if (order <=3D 0 || order > PMD_ORDER || !mthp_stats) > >>>>> + return; > >>>>> + > >>>>> + this_cpu_inc(mthp_stats->stats[order][item]); > >>>>> +} > >>>>> + > >>>>> +static inline void count_mthp_stats(int order, enum mthp_stat_item= item, long delta) > >>>>> +{ > >>>>> + if (order <=3D 0 || order > PMD_ORDER || !mthp_stats) > >>>>> + return; > >>>>> + > >>>>> + this_cpu_add(mthp_stats->stats[order][item], delta); > >>>>> +} > >>>>> + > >>>>> +/* > >>>>> + * Fold the foreign cpu mthp stats into our own. > >>>>> + * > >>>>> + * This is adding to the stats on one processor > >>>>> + * but keeps the global counts constant. > >>>>> + */ > >>>>> +static inline void mthp_stats_fold_cpu(int cpu) > >>>>> +{ > >>>>> + struct mthp_stat *fold_stat; > >>>>> + int i, j; > >>>>> + > >>>>> + if (!mthp_stats) > >>>>> + return; > >>>>> + fold_stat =3D per_cpu_ptr(mthp_stats, cpu); > >>>>> + for (i =3D 1; i <=3D PMD_ORDER; i++) { > >>>>> + for (j =3D 0; j < __MTHP_STAT_COUNT; j++) { > >>>>> + count_mthp_stats(i, j, fold_stat->stats[i][j]= ); > >>>>> + fold_stat->stats[i][j] =3D 0; > >>>>> + } > >>>>> + } > >>>>> +} > >>>> > >>>> This is a pretty horrible hack; I'm pretty sure just summing for all= *possible* > >>>> cpus should work. > >>>> > >>>>> + > >>>>> #define transparent_hugepage_use_zero_page() = \ > >>>>> (transparent_hugepage_flags & = \ > >>>>> (1< >>>>> diff --git a/mm/huge_memory.c b/mm/huge_memory.c > >>>>> index dc30139590e6..21c4ac74b484 100644 > >>>>> --- a/mm/huge_memory.c > >>>>> +++ b/mm/huge_memory.c > >>>>> @@ -526,6 +526,50 @@ static const struct kobj_type thpsize_ktype = =3D { > >>>>> .sysfs_ops =3D &kobj_sysfs_ops, > >>>>> }; > >>>>> > >>>>> +struct mthp_stat __percpu *mthp_stats; > >>>>> + > >>>>> +static unsigned long sum_mthp_stat(int order, enum mthp_stat_item = item) > >>>>> +{ > >>>>> + unsigned long sum =3D 0; > >>>>> + int cpu; > >>>>> + > >>>>> + cpus_read_lock(); > >>>>> + for_each_online_cpu(cpu) { > >>>>> + struct mthp_stat *this =3D per_cpu_ptr(mthp_stats, cp= u); > >>>>> + > >>>>> + sum +=3D this->stats[order][item]; > >>>>> + } > >>>>> + cpus_read_unlock(); > >>>>> + > >>>>> + return sum; > >>>>> +} > >>>>> + > >>>>> +#define DEFINE_MTHP_STAT_ATTR(_name, _index) = \ > >>>>> +static ssize_t _name##_show(struct kobject *kobj, = \ > >>>>> + struct kobj_attribute *attr, char *buf) = \ > >>>>> +{ = \ > >>>>> + int order =3D to_thpsize(kobj)->order; = \ > >>>>> + = \ > >>>>> + return sysfs_emit(buf, "%lu\n", sum_mthp_stat(order, _index))= ; \ > >>>>> +} = \ > >>>>> +static struct kobj_attribute _name##_attr =3D __ATTR_RO(_name) > >>>>> + > >>>>> +DEFINE_MTHP_STAT_ATTR(anon_fault_alloc, MTHP_STAT_ANON_FAULT_ALLOC= ); > >>>>> +DEFINE_MTHP_STAT_ATTR(anon_fault_fallback, MTHP_STAT_ANON_FAULT_FA= LLBACK); > >>>>> +DEFINE_MTHP_STAT_ATTR(anon_fault_fallback_charge, MTHP_STAT_ANON_F= AULT_FALLBACK_CHARGE); > >>>>> + > >>>>> +static struct attribute *stats_attrs[] =3D { > >>>>> + &anon_fault_alloc_attr.attr, > >>>>> + &anon_fault_fallback_attr.attr, > >>>>> + &anon_fault_fallback_charge_attr.attr, > >>>>> + NULL, > >>>>> +}; > >>>>> + > >>>>> +static struct attribute_group stats_attr_group =3D { > >>>>> + .name =3D "stats", > >>>>> + .attrs =3D stats_attrs, > >>>>> +}; > >>>>> + > >>>>> static struct thpsize *thpsize_create(int order, struct kobject *p= arent) > >>>>> { > >>>>> unsigned long size =3D (PAGE_SIZE << order) / SZ_1K; > >>>>> @@ -549,6 +593,12 @@ static struct thpsize *thpsize_create(int orde= r, struct kobject *parent) > >>>>> return ERR_PTR(ret); > >>>>> } > >>>>> > >>>>> + ret =3D sysfs_create_group(&thpsize->kobj, &stats_attr_group)= ; > >>>>> + if (ret) { > >>>>> + kobject_put(&thpsize->kobj); > >>>>> + return ERR_PTR(ret); > >>>>> + } > >>>>> + > >>>>> thpsize->order =3D order; > >>>>> return thpsize; > >>>>> } > >>>>> @@ -691,6 +741,11 @@ static int __init hugepage_init(void) > >>>>> */ > >>>>> MAYBE_BUILD_BUG_ON(HPAGE_PMD_ORDER < 2); > >>>>> > >>>>> + mthp_stats =3D __alloc_percpu((PMD_ORDER + 1) * sizeof(mthp_s= tats->stats[0]), > >>>>> + sizeof(unsigned long)); > >>>> > >>>> Personally I think it would be cleaner to allocate statically using > >>>> ilog2(MAX_PTRS_PER_PTE) instead of PMD_ORDER. > >>> > >>> Hi Ryan, > >>> > >>> I don't understand why MAX_PTRS_PER_PTE is the correct size. For ARM6= 4, > >>> > >>> #define PMD_ORDER (PMD_SHIFT - PAGE_SHIFT) > >>> > >>> #define MAX_PTRS_PER_PTE PTRS_PER_PTE > >>> > >>> #define PTRS_PER_PTE (1 << (PAGE_SHIFT - 3)) > >>> > >>> while PAGE_SIZE is 16KiB or 64KiB, PTRS_PER_PTE can be a huge number? > >>> > >>> > >>> Am I missing something? > >> > >> PTRS_PER_PTE is the number of PTE entries in a PTE table. On arm64 its= as follows: > >> > >> PAGE_SIZE PAGE_SHIFT PTRS_PER_PTE > >> 4K 12 512 > >> 16K 14 2048 > >> 64K 16 8192 > >> > >> So (PTRS_PER_PTE * PAGE_SIZE) =3D PMD_SIZE > >> > >> PMD_ORDER is ilog2(PMD_SIZE / PAGE_SIZE) =3D ilog2(PTRS_PER_PTE) > >> > >> MAX_PTRS_PER_PTE is just the maximum value that PTRS_PER_PTE will ever= have, > >> (and its equal to PTRS_PER_PTE except for powerpc). > >> > >> Pretty sure the math is correct? > > > > I am not convinced the math is correct :-) > > > > while page size is 64KiB, the page table is as below, > > PMD_ORDER =3D L2 index bits =3D [41:29] =3D 13 !=3D ilog2(8192) > > 1 << 13 =3D 8192 > > Right? So: > > ilog2(8192) =3D 13 > > What's wrong with that? > > I even checked in Python to make sure I'm not going mad: > > >>> import math > >>> math.log2(8192) > 13.0 You're correct. My mind fixated on the '16' in the line '64K 16 8192'. I mistakenly thought ilog2(8192) equals 16. Apologies for the confusion. > > > > > > > +--------+--------+--------+--------+--------+--------+--------+-------= -+ > > |63 56|55 48|47 40|39 32|31 24|23 16|15 8|7 = 0| > > +--------+--------+--------+--------+--------+--------+--------+-------= -+ > > | | | | | > > | | | | v > > | | | | [15:0] in-page of= fset > > | | | +----------> [28:16] L3 index > > | | +--------------------------> [41:29] L2 index > > | +-------------------------------> [47:42] L1 index (= 48-bit) > > | [51:42] L1 index (= 52-bit) > > +-------------------------------------------------> [63] TTBR0/1 > > > > while page size is 4KiB, the page table is as below, > > > > +--------+--------+--------+--------+--------+--------+--------+-------= -+ > > |63 56|55 48|47 40|39 32|31 24|23 16|15 8|7 = 0| > > +--------+--------+--------+--------+--------+--------+--------+-------= -+ > > | | | | | | > > | | | | | v > > | | | | | [11:0] in-page of= fset > > | | | | +-> [20:12] L3 index > > | | | +-----------> [29:21] L2 index > > | | +---------------------> [38:30] L1 index > > | +-------------------------------> [47:39] L0 index > > +-------------------------------------------------> [63] TTBR0/1 > > > > PMD_ORDER =3D L2 index bits =3D [29:21] =3D 9 =3D ilog2(512). > > > > You are only correct while page size =3D 4KiB. > > > > > > > > >