mirror of
https://sourceware.org/git/glibc.git
synced 2025-12-03 12:11:17 +03:00
linux: Use rseq area unconditionally in sched_getcpu (bug 31479)
Originally, nptl/descr.h included <sys/rseq.h>, but we removed that in commit2c6b4b272e("nptl: Unconditionally use a 32-byte rseq area"). After that, it was not ensured that the RSEQ_SIG macro was defined during sched_getcpu.c compilation that provided a definition. This commit always checks the rseq area for CPU number information before using the other approaches. This adds an unnecessary (but well-predictable) branch on architectures which do not define RSEQ_SIG, but its cost is small compared to the system call. Most architectures that have vDSO acceleration for getcpu also have rseq support. Fixes:2c6b4b272eFixes:1d350aa060Reviewed-by: Arjun Shankar <arjun@redhat.com>
This commit is contained in:
@@ -33,17 +33,9 @@ vsyscall_sched_getcpu (void)
|
|||||||
return r == -1 ? r : cpu;
|
return r == -1 ? r : cpu;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef RSEQ_SIG
|
|
||||||
int
|
int
|
||||||
sched_getcpu (void)
|
sched_getcpu (void)
|
||||||
{
|
{
|
||||||
int cpu_id = THREAD_GETMEM_VOLATILE (THREAD_SELF, rseq_area.cpu_id);
|
int cpu_id = THREAD_GETMEM_VOLATILE (THREAD_SELF, rseq_area.cpu_id);
|
||||||
return __glibc_likely (cpu_id >= 0) ? cpu_id : vsyscall_sched_getcpu ();
|
return __glibc_likely (cpu_id >= 0) ? cpu_id : vsyscall_sched_getcpu ();
|
||||||
}
|
}
|
||||||
#else /* RSEQ_SIG */
|
|
||||||
int
|
|
||||||
sched_getcpu (void)
|
|
||||||
{
|
|
||||||
return vsyscall_sched_getcpu ();
|
|
||||||
}
|
|
||||||
#endif /* RSEQ_SIG */
|
|
||||||
|
|||||||
Reference in New Issue
Block a user