linux/include/linux/sched_clock.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * sched_clock.h: support for extending counters to full 64-bit ns counter
   4 */
   5#ifndef LINUX_SCHED_CLOCK
   6#define LINUX_SCHED_CLOCK
   7
   8#ifdef CONFIG_GENERIC_SCHED_CLOCK
   9/**
  10 * struct clock_read_data - data required to read from sched_clock()
  11 *
  12 * @epoch_ns:           sched_clock() value at last update
  13 * @epoch_cyc:          Clock cycle value at last update.
  14 * @sched_clock_mask:   Bitmask for two's complement subtraction of non 64bit
  15 *                      clocks.
  16 * @read_sched_clock:   Current clock source (or dummy source when suspended).
  17 * @mult:               Multiplier for scaled math conversion.
  18 * @shift:              Shift value for scaled math conversion.
  19 *
  20 * Care must be taken when updating this structure; it is read by
  21 * some very hot code paths. It occupies <=40 bytes and, when combined
  22 * with the seqcount used to synchronize access, comfortably fits into
  23 * a 64 byte cache line.
  24 */
  25struct clock_read_data {
  26        u64 epoch_ns;
  27        u64 epoch_cyc;
  28        u64 sched_clock_mask;
  29        u64 (*read_sched_clock)(void);
  30        u32 mult;
  31        u32 shift;
  32};
  33
  34extern struct clock_read_data *sched_clock_read_begin(unsigned int *seq);
  35extern int sched_clock_read_retry(unsigned int seq);
  36
  37extern void generic_sched_clock_init(void);
  38
  39extern void sched_clock_register(u64 (*read)(void), int bits,
  40                                 unsigned long rate);
  41#else
  42static inline void generic_sched_clock_init(void) { }
  43
  44static inline void sched_clock_register(u64 (*read)(void), int bits,
  45                                        unsigned long rate)
  46{
  47}
  48#endif
  49
  50#endif
  51