Re: [PATCH v3 08/26] x86/mm: move LDT remap into mm-local region
From: Yosry Ahmed
Date: Mon Aug 03 2026 - 18:38:28 EST
On Sun, Jul 26, 2026 at 10:22:41PM +0000, Brendan Jackman wrote:
> Now that x86 processes have a general mm-local region, the LDT-specific
> management of the higher-level pagetables can mostly be replaced by just
> using the generic mm-local API.
>
> Drop all management of pagetable allocation and freeing; that is now
> handled automatically by virtue of the pagetables being in the mm-local
> region.
>
> Drop explicit logic to map LDTs into the user pagetables under PTI; that
> also happens automatically for this region.
>
> Unify the sanity-checking logic between x86_64 and PAE: use the generic
> set_memory.c mechanism to walk pagetables. This means the
> sanity-checking is slightly more relaxed, since lookup_address_in_pgd()
> is more flexible than pgd_to_pmd_walk(), but this seems to be worth it
> for the simplified code. It means that ldt.c doesn't have to know about
> the exact structure of the mm-local region's pagetables.
>
> Signed-off-by: Brendan Jackman <jackmanb@xxxxxxxxxx>
> ---
[..]
> diff --git a/arch/x86/kernel/ldt.c b/arch/x86/kernel/ldt.c
> index 40c5bf97dd5cc..685664c1ee770 100644
> --- a/arch/x86/kernel/ldt.c
> +++ b/arch/x86/kernel/ldt.c
> @@ -186,10 +186,16 @@ static struct ldt_struct *alloc_ldt_struct(unsigned int num_entries)
>
> #ifdef CONFIG_MITIGATION_PAGE_TABLE_ISOLATION
>
> -static void do_sanity_check(struct mm_struct *mm,
> - bool had_kernel_mapping,
> - bool had_user_mapping)
> +static void sanity_check_ldt_mapping(struct mm_struct *mm)
> {
> + pgd_t *k_pgd = pgd_offset(mm, LDT_BASE_ADDR);
> + pgd_t *u_pgd = kernel_to_user_pgdp(k_pgd);
> + unsigned int k_level, u_level;
> + bool had_kernel_mapping, had_user_mapping;
> +
> + had_kernel_mapping = lookup_address_in_pgd(k_pgd, LDT_BASE_ADDR, &k_level);
> + had_user_mapping = lookup_address_in_pgd(u_pgd, LDT_BASE_ADDR, &u_level);
> +
As mentioned in the previous patch, this patch is difficult to review
with the current arrangement and patches 7 and 8 can probably be
structured in a better way.
The unification of sanity_check_ldt_mapping() by using
lookup_address_in_pgd() can also be done separately as part of that.
> if (mm->context.ldt) {
> /*
> * We already had an LDT. The top-level entry should already