Commit 9abd515a authored by Jean-Philippe Brucker's avatar Jean-Philippe Brucker Committed by Will Deacon

arm64: context: Fix ASID limit in boot messages

Since commit f88f42f8 ("arm64: context: Free up kernel ASIDs if KPTI
is not in use"), the NUM_USER_ASIDS macro doesn't correspond to the
effective number of ASIDs when KPTI is enabled. Get an accurate number
of available ASIDs in an arch_initcall, once we've discovered all CPUs'
capabilities and know if we still need to halve the ASID space for KPTI.

Fixes: f88f42f8 ("arm64: context: Free up kernel ASIDs if KPTI is not in use")
Reviewed-by: default avatarVladimir Murzin <vladimir.murzin@arm.com>
Signed-off-by: default avatarJean-Philippe Brucker <jean-philippe@linaro.org>
Signed-off-by: default avatarWill Deacon <will@kernel.org>
parent 3ba52ad5
...@@ -260,14 +260,26 @@ asmlinkage void post_ttbr_update_workaround(void) ...@@ -260,14 +260,26 @@ asmlinkage void post_ttbr_update_workaround(void)
CONFIG_CAVIUM_ERRATUM_27456)); CONFIG_CAVIUM_ERRATUM_27456));
} }
static int asids_init(void) static int asids_update_limit(void)
{ {
asid_bits = get_cpu_asid_bits(); unsigned long num_available_asids = NUM_USER_ASIDS;
if (arm64_kernel_unmapped_at_el0())
num_available_asids /= 2;
/* /*
* Expect allocation after rollover to fail if we don't have at least * Expect allocation after rollover to fail if we don't have at least
* one more ASID than CPUs. ASID #0 is reserved for init_mm. * one more ASID than CPUs. ASID #0 is reserved for init_mm.
*/ */
WARN_ON(NUM_USER_ASIDS - 1 <= num_possible_cpus()); WARN_ON(num_available_asids - 1 <= num_possible_cpus());
pr_info("ASID allocator initialised with %lu entries\n",
num_available_asids);
return 0;
}
arch_initcall(asids_update_limit);
static int asids_init(void)
{
asid_bits = get_cpu_asid_bits();
atomic64_set(&asid_generation, ASID_FIRST_VERSION); atomic64_set(&asid_generation, ASID_FIRST_VERSION);
asid_map = kcalloc(BITS_TO_LONGS(NUM_USER_ASIDS), sizeof(*asid_map), asid_map = kcalloc(BITS_TO_LONGS(NUM_USER_ASIDS), sizeof(*asid_map),
GFP_KERNEL); GFP_KERNEL);
...@@ -282,8 +294,6 @@ static int asids_init(void) ...@@ -282,8 +294,6 @@ static int asids_init(void)
*/ */
if (IS_ENABLED(CONFIG_UNMAP_KERNEL_AT_EL0)) if (IS_ENABLED(CONFIG_UNMAP_KERNEL_AT_EL0))
set_kpti_asid_bits(); set_kpti_asid_bits();
pr_info("ASID allocator initialised with %lu entries\n", NUM_USER_ASIDS);
return 0; return 0;
} }
early_initcall(asids_init); early_initcall(asids_init);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment