Richard Sandiford <richard.sandif...@arm.com> writes:
> Victor Do Nascimento <victor.donascime...@arm.com> writes:
>> At present, Evaluation of both `has_lse2(hwcap)' and
>> `has_lse128(hwcap)' may require issuing an `mrs' instruction to query
>> a system register.  This instruction, when issued from user-space
>> results in a trap by the kernel which then returns the value read in
>> by the system register.  Given the undesirable nature of the
>> computational expense associated with the context switch, it is
>> important to implement mechanisms to, wherever possible, forgo the
>> operation.
>>
>> In light of this, given how other architectural requirements serving
>> as prerequisites have long been assigned HWCAP bits by the kernel, we
>> can inexpensively query for their availability before attempting to
>> read any system registers.  Where one of these early tests fail, we
>> can assert that the main feature of interest (be it LSE2 or LSE128)
>> cannot be present, allowing us to return from the function early and
>> skip the unnecessary expensive kernel-mediated access to system
>> registers.
>>
>> libatomic/ChangeLog:
>>
>>      * config/linux/aarch64/host-config.h (has_lse2): Add test for LSE.
>>      (has_lse128): Add test for LSE2.
>> ---
>>  libatomic/config/linux/aarch64/host-config.h | 13 ++++++++++---
>>  1 file changed, 10 insertions(+), 3 deletions(-)
>>
>> diff --git a/libatomic/config/linux/aarch64/host-config.h 
>> b/libatomic/config/linux/aarch64/host-config.h
>> index c5485d63855..3be4db6e5f8 100644
>> --- a/libatomic/config/linux/aarch64/host-config.h
>> +++ b/libatomic/config/linux/aarch64/host-config.h
>> @@ -53,8 +53,13 @@
>>  static inline bool
>>  has_lse2 (unsigned long hwcap)
>>  {
>> +  /* Check for LSE2.  */
>>    if (hwcap & HWCAP_USCAT)
>>      return true;
>> +  /* No point checking further for atomic 128-bit load/store if LSE
>> +     prerequisite not met.  */
>> +  if (!(hwcap & HWCAP_ATOMICS))
>> +    return false;
>
> This part is OK.
>
>>    if (!(hwcap & HWCAP_CPUID))
>>      return false;
>>  
>> @@ -76,12 +81,14 @@ has_lse2 (unsigned long hwcap)
>>  static inline bool
>>  has_lse128 (unsigned long hwcap)
>>  {
>> -  if (!(hwcap & HWCAP_CPUID))
>> -    return false;
>> +  /* In the absence of HWCAP_CPUID, we are unable to check for LSE128, 
>> return.
>> +     If feature check available, check LSE2 prerequisite before proceeding. 
>>  */
>> +  if (!(hwcap & HWCAP_CPUID) || !(hwcap & HWCAP_USCAT))
>> +     return false;
>
> The inconsistency feels wrong here.  If we're saying that HWCAP_USCAT
> is now so old that we don't need to fall back on CPUID, then it feels
> like we should have the courage of our convictions and do the same for
> has_lse2.  If instead we still want to support libcs that predate
> HWCAP_USCAT, we should do the same here too.

Sorry, scratch that, I'd misread has_lse2.  The CPUID fallback there is
only for Neoverse N1, which we know doesn't support LSE128.

So the patch is OK with the formatting fixed: the returns should be
indented by their original amount.

Thanks,
Richard

>>    unsigned long isar0;
>>    asm volatile ("mrs %0, ID_AA64ISAR0_EL1" : "=r" (isar0));
>>    if (AT_FEAT_FIELD (isar0) >= 3)
>> -    return true;
>> +      return true;
>
> The original formatting was correct.
>
> Thanks,
> Richard
>
>>    return false;
>>  }

Reply via email to