mirror of
git://sourceware.org/git/glibc.git
synced 2024-11-21 01:12:26 +08: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:2c6b4b272e
Fixes:1d350aa060
Reviewed-by: Arjun Shankar <arjun@redhat.com>
This commit is contained in:
parent
73c26018ed
commit
7a76f21867
@ -33,17 +33,9 @@ vsyscall_sched_getcpu (void)
|
||||
return r == -1 ? r : cpu;
|
||||
}
|
||||
|
||||
#ifdef RSEQ_SIG
|
||||
int
|
||||
sched_getcpu (void)
|
||||
{
|
||||
int cpu_id = THREAD_GETMEM_VOLATILE (THREAD_SELF, rseq_area.cpu_id);
|
||||
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 */
|
||||
|
Loading…
Reference in New Issue
Block a user