As of now, there is no interface exposed for converting pid/fd into clockid and vice versa; linuxptp, for example, has been carrying these definitions in missing.h header for quite some time[1].
[1] https://sourceforge.net/p/linuxptp/code/ci/af380e86/tree/missing.h Signed-off-by: Eugene Syromiatnikov <e...@redhat.com> --- Changes since v1[1]: * Actually tried to build with the patch and fixed the build error reported by kbuild test robot[2]. [1] https://lkml.org/lkml/2019/9/20/698 [2] https://lkml.org/lkml/2019/9/22/13 --- include/linux/posix-timers.h | 47 +------------------------------------------ include/uapi/linux/time.h | 48 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 46 deletions(-) diff --git a/include/linux/posix-timers.h b/include/linux/posix-timers.h index 3d10c84..ddc7e6e6 100644 --- a/include/linux/posix-timers.h +++ b/include/linux/posix-timers.h @@ -4,58 +4,13 @@ #include <linux/spinlock.h> #include <linux/list.h> +#include <linux/time.h> #include <linux/alarmtimer.h> #include <linux/timerqueue.h> struct kernel_siginfo; struct task_struct; -/* - * Bit fields within a clockid: - * - * The most significant 29 bits hold either a pid or a file descriptor. - * - * Bit 2 indicates whether a cpu clock refers to a thread or a process. - * - * Bits 1 and 0 give the type: PROF=0, VIRT=1, SCHED=2, or FD=3. - * - * A clockid is invalid if bits 2, 1, and 0 are all set. - */ -#define CPUCLOCK_PID(clock) ((pid_t) ~((clock) >> 3)) -#define CPUCLOCK_PERTHREAD(clock) \ - (((clock) & (clockid_t) CPUCLOCK_PERTHREAD_MASK) != 0) - -#define CPUCLOCK_PERTHREAD_MASK 4 -#define CPUCLOCK_WHICH(clock) ((clock) & (clockid_t) CPUCLOCK_CLOCK_MASK) -#define CPUCLOCK_CLOCK_MASK 3 -#define CPUCLOCK_PROF 0 -#define CPUCLOCK_VIRT 1 -#define CPUCLOCK_SCHED 2 -#define CPUCLOCK_MAX 3 -#define CLOCKFD CPUCLOCK_MAX -#define CLOCKFD_MASK (CPUCLOCK_PERTHREAD_MASK|CPUCLOCK_CLOCK_MASK) - -static inline clockid_t make_process_cpuclock(const unsigned int pid, - const clockid_t clock) -{ - return ((~pid) << 3) | clock; -} -static inline clockid_t make_thread_cpuclock(const unsigned int tid, - const clockid_t clock) -{ - return make_process_cpuclock(tid, clock | CPUCLOCK_PERTHREAD_MASK); -} - -static inline clockid_t fd_to_clockid(const int fd) -{ - return make_process_cpuclock((unsigned int) fd, CLOCKFD); -} - -static inline int clockid_to_fd(const clockid_t clk) -{ - return ~(clk >> 3); -} - #ifdef CONFIG_POSIX_TIMERS /** diff --git a/include/uapi/linux/time.h b/include/uapi/linux/time.h index 958932e..58a78a7 100644 --- a/include/uapi/linux/time.h +++ b/include/uapi/linux/time.h @@ -70,4 +70,52 @@ struct itimerval { */ #define TIMER_ABSTIME 0x01 +/* + * Bit fields within a clockid: + * + * The most significant 29 bits hold either a pid or a file descriptor. + * + * Bit 2 indicates whether a cpu clock refers to a thread or a process. + * + * Bits 1 and 0 give the type: PROF=0, VIRT=1, SCHED=2, or FD=3. + * + * A clockid is invalid if bits 2, 1, and 0 are all set. + */ +#define CPUCLOCK_PID(clock) ((pid_t) ~((clock) >> 3)) +#define CPUCLOCK_PERTHREAD(clock) \ + (((clock) & (__kernel_clockid_t) CPUCLOCK_PERTHREAD_MASK) != 0) + +#define CPUCLOCK_PERTHREAD_MASK 4 +#define CPUCLOCK_WHICH(clock) \ + ((clock) & (__kernel_clockid_t) CPUCLOCK_CLOCK_MASK) +#define CPUCLOCK_CLOCK_MASK 3 +#define CPUCLOCK_PROF 0 +#define CPUCLOCK_VIRT 1 +#define CPUCLOCK_SCHED 2 +#define CPUCLOCK_MAX 3 +#define CLOCKFD CPUCLOCK_MAX +#define CLOCKFD_MASK (CPUCLOCK_PERTHREAD_MASK|CPUCLOCK_CLOCK_MASK) + +static inline __kernel_clockid_t make_process_cpuclock(const unsigned int pid, + const clockid_t clock) +{ + return ((~pid) << 3) | clock; +} +static inline __kernel_clockid_t make_thread_cpuclock(const unsigned int tid, + const clockid_t clock) +{ + return make_process_cpuclock(tid, clock | CPUCLOCK_PERTHREAD_MASK); +} + +static inline __kernel_clockid_t fd_to_clockid(const int fd) +{ + return make_process_cpuclock((unsigned int) fd, CLOCKFD); +} + +static inline int clockid_to_fd(const __kernel_clockid_t clk) +{ + return ~(clk >> 3); +} + + #endif /* _UAPI_LINUX_TIME_H */ -- 2.1.4