[PATCH 05/37] arm64: Add cpus_have_final_boot_cap()
Suzuki K Poulose
suzuki.poulose at arm.com
Fri Sep 22 03:26:21 PDT 2023
On 21/09/2023 17:36, Mark Rutland wrote:
> On Thu, Sep 21, 2023 at 10:13:31AM +0100, Suzuki K Poulose wrote:
>> Hi Mark
>>
>> On 19/09/2023 10:28, Mark Rutland wrote:
>>> The cpus_have_final_boot_cap() function can be used to test a cpucap
>>
>> nit: cpus_have_final_cap()
>
> Thanks; fixed now.
>
>>> while also verifying that we do not consume the cpucap until system
>>> capabilities have been finalized. It would be helpful if we could do
>>> likewise for boot cpucaps.
>>>
>>> This patch adds a new cpus_have_final_boot_cap() helper which can be
>>> used to test a cpucap while also verifying that boot capabilities have
>>> been finalized. Users will be added in subsequent patches.
>>>
>>> Signed-off-by: Mark Rutland <mark.rutland at arm.com>
>>> Cc: Catalin Marinas <catalin.marinas at arm.com>
>>> Cc: Mark Brown <broonie at kernel.org>
>>> Cc: Suzuki K Poulose <suzuki.poulose at arm.com>
>>> Cc: Will Deacon <will at kernel.org>
>>> ---
>>> arch/arm64/include/asm/cpufeature.h | 27 +++++++++++++++++++++++++--
>>> 1 file changed, 25 insertions(+), 2 deletions(-)
>>>
>>> diff --git a/arch/arm64/include/asm/cpufeature.h b/arch/arm64/include/asm/cpufeature.h
>>> index 7d5317bc2429f..e832b86c6b57f 100644
>>> --- a/arch/arm64/include/asm/cpufeature.h
>>> +++ b/arch/arm64/include/asm/cpufeature.h
>>> @@ -438,6 +438,11 @@ unsigned long cpu_get_elf_hwcap2(void);
>>> #define cpu_set_named_feature(name) cpu_set_feature(cpu_feature(name))
>>> #define cpu_have_named_feature(name) cpu_have_feature(cpu_feature(name))
>>> +static __always_inline bool boot_capabilities_finalized(void)
>>> +{
>>> + return alternative_has_cap_likely(ARM64_ALWAYS_BOOT);
>>> +}
>>> +
>>> static __always_inline bool system_capabilities_finalized(void)
>>> {
>>> return alternative_has_cap_likely(ARM64_ALWAYS_SYSTEM);
>>> @@ -473,8 +478,26 @@ static __always_inline bool __cpus_have_const_cap(int num)
>>> /*
>>> * Test for a capability without a runtime check.
>>> *
>>> - * Before capabilities are finalized, this will BUG().
>>> - * After capabilities are finalized, this is patched to avoid a runtime check.
>>> + * Before boot capabilities are finalized, this will BUG().
>>> + * After boot capabilities are finalized, this is patched to avoid a runtime
>>> + * check.
>>> + *
>>> + * @num must be a compile-time constant.
>>> + */
>>> +static __always_inline bool cpus_have_final_boot_cap(int num)
>>> +{
>>> + if (boot_capabilities_finalized())
>>
>> Does this need to make sure the cap is really a "BOOT" cap ? It is a bit of
>> an overkill, but prevents users from incorrectly assuming the cap is
>> finalised ?
>
> Do you have an idea in mind for how to do that?
>
> I had also wanted that, but we don't have the information available when
> compiling the callsites today since that's determined by the
> arm64_cpu_capabilities::type flags.
>
> We could us an alternative callback for boot_capabilities_finalized() that
> goes and checks the arm64_cpu_capabilities::type flags, but that doesn't seem
> very nice.
>
Thats what I had initially in mind, and is why I called it an
overkill.
But may be another option is to have a different alternative construct
for all capabilities, which defaults to BUG() and then patched to
"false" or "true" based on the real status ? This may be more
complicated.
> Otherwise, given this only has a few users, I could have those directly use:
>
> BUG_ON(!boot_capabilities_finalized());
>
> ... and remove cpus_have_final_boot_cap() for now?
I don't think that is necessary. We could keep your patch
as is, if we can't verify the boot capability easily.
Suzuki
>
> Thanks,
> Mark.
>
>>
>>
>> Suzuki
>>
>>> + return __cpus_have_const_cap(num);
>>> + else
>>> + BUG();
>>> +}
>>> +
>>> +/*
>>> + * Test for a capability without a runtime check.
>>> + *
>>> + * Before system capabilities are finalized, this will BUG().
>>> + * After system capabilities are finalized, this is patched to avoid a runtime
>>> + * check.
>>> *
>>> * @num must be a compile-time constant.
>>> */
>>
More information about the linux-arm-kernel
mailing list