[PATCH] LoongArch: Add fstat64 and fstatat64.

Miao Wang shankerwangmiao@gmail.com
Wed Sep 11 18:00:46 GMT 2024



> 2024年9月12日 00:50,Miao Wang <shankerwangmiao@gmail.com> 写道:
> 
>> 
>> 2024年9月11日 17:40,caiyinyu <caiyinyu@loongson.cn> 写道:
>> 
>> In Linux 6.11, the fstat (80) and newfstatat (79) syscalls have been
>> reintroduced. The definitions of these two syscalls have already been
>> backported to version 6.10.6 in the stable tree.
>> 
>> In this patch, we are adding dynamically probed implementations of
>> fstat64 and fstatat64 specifically for syscalls 79 and 80. This ensures
>> compatibility while maintaining relatively good performance on kernels
>> that both support and do not support syscalls 79 and 80.
>> 
>> By running an experiment where we invoke fstat64 and fstatat64 100
>> million times, we gathered the following efficiency statistics:
>> 
>> 1. On kernels that support syscalls 79 and 80 (tested on version
>>  6.10.6), fstat64 and fstatat64 can directly invoke these syscalls
>>  [1]. The time overhead of our dynamic probing implementation
>>  increased by 0.5%-2.5% compared to directly calling the syscalls.
>> 2. On kernels that support syscalls 79 and 80 (tested on version
>>  6.10.6), our dynamically probed implementation reduces the time
>>  overhead by more than 60% compared to directly invoking the statx
>>  (291) syscall.
>> 3. On kernels that do not support syscalls 79 and 80 (tested on version
>>  6.8.0), fstat64 and fstatat64 fall back to using the statx (291)
>>  syscall (as before). In this case, the overhead of our dynamic
>>  probing implementation increased by 0.1%-1.3% compared to directly
>>  invoking statx.
> 
> Hi, I tried to reproduce your test result, by invoking fstat(2) for 1M times,
> repeated by 100 times. The test was carried out on 3A6K, using 6.11-rc7 kernel.
> The result is:
> 
> fstat using statx(fd, "", AT_EMPTY_PATH) (current glibc implementation)
> mean: 210420528.100000(ns), sigma: 996145.440248(ns)
> 
> statx(fd, NULL, AT_EMPTY_PATH) (for comparison)
> mean: 199410620.600000(ns), sigma: 111561.012101(ns)
> 
> fstat using statx(fd, NULL, AT_EMPTY_PATH) (The implementation I proposed)
> mean: 208258640.700000(ns), sigma: 468451.704836(ns)
> 
> fstat using fstat(fd) (Your patch)
> mean: 192936673.800000(ns), sigma: 251927.136307(ns)
> 
> As we can see in the result, the implementation using fstat is 8.31% faster
> than the current implementation, instead of "reducing the time overhead by
> more than 60%".

I did another test on 6.10.7, using the current glibc implementation, i.e.
statx(fd, "", AT_EMPTY_PATH), and got the following result:

mean: 603344203.300000(ns), sigma: 715246.975336(ns)

If we use this as the baseline, we can get the following summary:

fstat(fd): 68.02% less time
statx(fd, NULL, AT_EMPTY_PATH): 65.48% less time
statx(fd, "", AT_EMPTY_PATH) (nothing is changed in glibc, only upgrade the
  kernel to 6.11): 65.12% less time

As a result, the performance gain is similar comparing using fstat(fd) and
statx(fd, NULL, AT_EMPTY_PATH).

> 
> I prefer introducing dynamic probing of statx(fd, NULL, AT_EMPTY_PATH), which
> can benefit all 32-bit platforms relying on statx for 64-bit timestamps[2], as
> well as 64-bit loongarch, not only for performance, but also for seccomp
> sandboxing. Furthermore, by doing so, we can eliminate the need of maintaining
> our own copy of fstat in loongarch.

To conclude, the question would be whether it is worthy to have a separately
maintained fstat in loongarch for the 2.54% performance difference.

> 
> [2]: [PATCH v5] linux: Add linux statx(fd, NULL, AT_EMPTY_PATH) support
> https://sourceware.org/pipermail/libc-alpha/2024-August/159499.html
> 
> 
> Cheers,
> 
> Miao Wang




More information about the Libc-alpha mailing list