Received: by 2002:a05:6a10:5bc5:0:0:0:0 with SMTP id os5csp799301pxb; Wed, 3 Nov 2021 12:35:35 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxqCQdqit0oM3ozB1KsTf7QVA5eS76L1WpC8oP9pJ+92PV7qlnWcA0n2C0eApO3DyJE7Rbd X-Received: by 2002:a05:6638:35a4:: with SMTP id v36mr359849jal.61.1635968135440; Wed, 03 Nov 2021 12:35:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1635968135; cv=none; d=google.com; s=arc-20160816; b=EIshqrsRx2rx+M78cWJUqHMO/fOUQY4w3CdaNQTq+U26aedllPwXL+hkvHyIbXLIWB wChosykPMB8IvW3TwJAygs7X9ebUwwhluXECCcNtZ5CZN9lrwGruLuAjN2I4LdLxT+I+ zJTPfWU1EeD8/bZ9/ceGwYCcZGkrAX2CQsPGX20vZEOHEjwF1Snw4kffrDmRnq6K2C8l 89a8z5Ixb2sKPOCJ9CQTLfKra/lhqI8oeE1/CmIPBYvr4Mh8oLOuaWgPTmou2X+n86Uc qED5KKYEgBE2w79rgtlO4GUZVajXd0zTttCiYohWJ92FEXndBWC+tCWp6ekACV62AzML zZZA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:content-language :in-reply-to:mime-version:user-agent:date:message-id:references:cc :to:from:subject:dkim-signature; bh=kvJARQBgxQBuanY2lBgiTblXV67ARfNybrCEeUkG2MM=; b=gfT/AeJ69IKoutp1he5y2zwSmeci1dRksOFBvwtgPka5sWxlQLFnilwOyYc/FbuloH dFjmynJ3sukastCsPrCtkJnK/dvLyIFSuOgPp5QYJJ+p+bt1iQV58HX6sgyIHL0pHIBO HfjT5/FnCVX8BD07cyfk+0ZRKQN5ZAGFFfzJC9EwlPqTk30C9NiYexy6s2ziKyT1qm2Z uAwdhNAllb4bkOXFGh7Hw996b8GwJS2ntcpOG8gKJIiZ9qAkS3r35AfRkeZT/waL5RYk dDPtvD3pd73QdmhrQqBGaUaHOfZA6lTLEwVuvszGuf//LVMEYR20xorv1PdXP6GioU1A S4sw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@vt-edu.20210112.gappssmtp.com header.s=20210112 header.b=vICOmJrX; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=vt.edu Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id s22si6052095jaj.128.2021.11.03.12.35.21; Wed, 03 Nov 2021 12:35:35 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@vt-edu.20210112.gappssmtp.com header.s=20210112 header.b=vICOmJrX; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=vt.edu Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231340AbhKCTgd (ORCPT + 99 others); Wed, 3 Nov 2021 15:36:33 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43722 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231295AbhKCTgb (ORCPT ); Wed, 3 Nov 2021 15:36:31 -0400 Received: from mail-qk1-x72d.google.com (mail-qk1-x72d.google.com [IPv6:2607:f8b0:4864:20::72d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B6245C061205 for ; Wed, 3 Nov 2021 12:33:54 -0700 (PDT) Received: by mail-qk1-x72d.google.com with SMTP id bk22so3438266qkb.6 for ; Wed, 03 Nov 2021 12:33:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=vt-edu.20210112.gappssmtp.com; s=20210112; h=subject:from:to:cc:references:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=kvJARQBgxQBuanY2lBgiTblXV67ARfNybrCEeUkG2MM=; b=vICOmJrXa+l5wsSd5+ENhjBTHdoC2U/98el5c/EBKE/ooHldG3Dh+X+YHoMFzsiO3V KrlukERdV9OQkYzbpzqwRht1S8e4MpsZ5qVKrbiWeTWKnnysdZ3dnYsnCm3KC9ueuZpa 9DbRgrrRuHGjwVrSVeMoRY+wEhIDZgSn8xtod0azUeHszuBANdt3903wSeem+WRCI+uw X5KCBv+NOb0JQLZWCiqK/eD4atO+DdLsIyU3PMFGH3rsOWrK4WapkPZf96oDKJ9x92vX RuhhomVAvPM/cYr4UJBBQyQXcDXHoEBiH+iGCFgnyR3HQ1MKZHCXbxM2AFRj7j3KVpN+ JeOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:subject:from:to:cc:references:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=kvJARQBgxQBuanY2lBgiTblXV67ARfNybrCEeUkG2MM=; b=6KXTQU/5qyNQvZTOkUM+fDXd+TAHTZ9zz13nMlLrDuDgecN6AeGrYgqsz6BUW7KkFl 4UzBcZrA6TYoly+J1FMj9uPkeyxPHpGAOlOOIBBqwEtmkGiSuJlmeHyHzDGnfnkS5+Ow tUtY+6P1VPbq7lI9LcH+uwA13tFvfbE4k3gCXkGCgNQsdLz2EF0ZRBc4PBAZ0/920gsu 3Sw2rYjiJGj/8BzJx4dqbnKlIV84sx3Z5SoS3GZbHsIqfg8J2+S3trECHo8nMv8G/q73 Gi3na9dVFZW12a9FsfUB9jzJQqherAgq0ahQ9Z91zzx7zDzUppXTrcY8OHorR19jL6Bn 7XoQ== X-Gm-Message-State: AOAM5324ZhI0/VH//lfD82N1u4oTTRphcTrYERhC2ozg/8AZ8ERMYcin oUmO1KS4wMO2cQGGG/EHYDlCb+BCjcW0YRRw X-Received: by 2002:a37:54d:: with SMTP id 74mr7335988qkf.209.1635968033653; Wed, 03 Nov 2021 12:33:53 -0700 (PDT) Received: from [192.168.0.104] ([66.199.72.44]) by smtp.gmail.com with ESMTPSA id k2sm2097853qtg.35.2021.11.03.12.33.52 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 03 Nov 2021 12:33:53 -0700 (PDT) Subject: Re: [PATCH v5] include: linux: Reorganize timekeeping and ktime headers From: Carlos Bilbao To: Greg KH Cc: Linux Kernel Mailing List , Catalin Marinas , Thomas Gleixner , Matthew Wilcox , Arnd Bergmann , kbuild test robot , Linux ARM References: <095645cd-ce53-a803-cb99-522545a409b8@vt.edu> <1c156aca-d0ad-e7e8-2238-5c3d904d171c@vt.edu> <327f5c2f-b996-8aa1-cbbf-3354e01ee1f3@vt.edu> Message-ID: Date: Wed, 3 Nov 2021 15:33:52 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.13.0 MIME-Version: 1.0 In-Reply-To: <327f5c2f-b996-8aa1-cbbf-3354e01ee1f3@vt.edu> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hello everyone, Some time ago I sent a small patch to avoid implicit function declaration. In particular, timekeeping.h was using ktime_to_ns(), a static function defined in a header it does no include, ktime.h. Some maintainers saw this as an opportunity to reorganize ktime, and so I did and tested for all architectures. Now, this patch has fallen into the "limbo of patches", so the original problem remains unsolved. Please, either take a look at this or check the original patch for the header dependencies. Thanks!! Carlos. On 9/12/21 11:33 AM, Carlos Bilbao wrote: > Reorganize and separate the headers by making ktime.h take care of the > ktime_get() family of functions, and reserve timekeeping.h for the actual > timekeeping. This also helps to avoid implicit function errors and strengthens > the header dependencies, since timekeeping.h was using ktime_to_ns(), a static > function defined in a header it does no include, ktime.h. Include the header > timekeeping.h wherever it is necessary for a successful compilation after the > header code reorganization. > > Signed-off-by: Carlos Bilbao > Acked-by: Geert Uytterhoeven > Reported-by: kernel test robot > --- > Changelog: > - v2: Add three more files that also needed a header update for x86: > pps_kernel.h, posix-timers.c and hda_controller.c > - v3: Cover build tests for other architectures than x86. To compile arm64, > update arch/arm64/kvm/hypercalls.c, include/linux/stmmac.h, and > drivers/rtc/class.c. No other arch/ seems to need fixes but to be on the safe > side compiled arm, mips, powerpc, sparc, s390, riscv and i386. > - v4: Fix kernel test robot warnings for ia64 and x86. > - v5: Fix kernel test robot warnings for m68k and powerpc. > --- > arch/arm64/kvm/hypercalls.c | 1 + > arch/ia64/kernel/time.c | 1 + > arch/m68k/atari/time.c | 1 + > arch/m68k/hp300/time.c | 2 + > arch/m68k/mac/via.c | 1 + > arch/m68k/mvme16x/config.c | 1 + > arch/m68k/sun3/sun3ints.c | 1 + > arch/powerpc/kernel/time.c | 1 + > arch/x86/kernel/rtc.c | 1 + > arch/x86/kernel/tsc.c | 1 + > drivers/rtc/class.c | 1 + > include/linux/ktime.h | 196 +++++++++++++++++++++++++++++++- > include/linux/pps_kernel.h | 1 + > include/linux/sched_clock.h | 2 + > include/linux/stmmac.h | 1 + > include/linux/timekeeping.h | 197 +-------------------------------- > init/main.c | 1 + > kernel/time/ntp.c | 1 + > kernel/time/posix-timers.c | 1 + > kernel/time/tick-legacy.c | 1 + > kernel/time/time.c | 1 + > kernel/time/timekeeping.c | 1 + > sound/pci/hda/hda_controller.c | 1 + > 23 files changed, 218 insertions(+), 198 deletions(-) > > diff --git a/arch/arm64/kvm/hypercalls.c b/arch/arm64/kvm/hypercalls.c > index 30da78f72b3b..41499c1d7379 100644 > --- a/arch/arm64/kvm/hypercalls.c > +++ b/arch/arm64/kvm/hypercalls.c > @@ -3,6 +3,7 @@ > > #include > #include > +#include > > #include > > diff --git a/arch/ia64/kernel/time.c b/arch/ia64/kernel/time.c > index fa9c0ab8c6fc..85e79ff3c98e 100644 > --- a/arch/ia64/kernel/time.c > +++ b/arch/ia64/kernel/time.c > @@ -22,6 +22,7 @@ > #include > #include > #include > +#include > #include > #include > > diff --git a/arch/m68k/atari/time.c b/arch/m68k/atari/time.c > index 7e44d0e9d0f8..b09d3ff40b36 100644 > --- a/arch/m68k/atari/time.c > +++ b/arch/m68k/atari/time.c > @@ -19,6 +19,7 @@ > #include > #include > #include > +#include > > #include > #include > diff --git a/arch/m68k/hp300/time.c b/arch/m68k/hp300/time.c > index 1d1b7b3b5dd4..56c575096bcb 100644 > --- a/arch/m68k/hp300/time.c > +++ b/arch/m68k/hp300/time.c > @@ -14,6 +14,8 @@ > #include > #include > #include > +#include > + > #include > #include > #include > diff --git a/arch/m68k/mac/via.c b/arch/m68k/mac/via.c > index 3d11d6219cdd..6dd8f85288e4 100644 > --- a/arch/m68k/mac/via.c > +++ b/arch/m68k/mac/via.c > @@ -31,6 +31,7 @@ > #include > #include > #include > +#include > > #include > #include > diff --git a/arch/m68k/mvme16x/config.c b/arch/m68k/mvme16x/config.c > index b59593c7cfb9..bb2ae926bb17 100644 > --- a/arch/m68k/mvme16x/config.c > +++ b/arch/m68k/mvme16x/config.c > @@ -28,6 +28,7 @@ > #include > #include > #include > +#include > > #include > #include > diff --git a/arch/m68k/sun3/sun3ints.c b/arch/m68k/sun3/sun3ints.c > index 41ae422119d3..3834a172be47 100644 > --- a/arch/m68k/sun3/sun3ints.c > +++ b/arch/m68k/sun3/sun3ints.c > @@ -11,6 +11,7 @@ > #include > #include > #include > +#include > #include > #include > #include > diff --git a/arch/powerpc/kernel/time.c b/arch/powerpc/kernel/time.c > index e45ce427bffb..4b6952165a0a 100644 > --- a/arch/powerpc/kernel/time.c > +++ b/arch/powerpc/kernel/time.c > @@ -55,6 +55,7 @@ > #include > #include > #include > +#include > #include > > #include > diff --git a/arch/x86/kernel/rtc.c b/arch/x86/kernel/rtc.c > index 586f718b8e95..98ea05cc6aeb 100644 > --- a/arch/x86/kernel/rtc.c > +++ b/arch/x86/kernel/rtc.c > @@ -9,6 +9,7 @@ > #include > #include > #include > +#include > > #include > #include > diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c > index 2e076a459a0c..b730cb20f5fd 100644 > --- a/arch/x86/kernel/tsc.c > +++ b/arch/x86/kernel/tsc.c > @@ -15,6 +15,7 @@ > #include > #include > #include > +#include > > #include > #include > diff --git a/drivers/rtc/class.c b/drivers/rtc/class.c > index f77bc089eb6b..1bdf1f790beb 100644 > --- a/drivers/rtc/class.c > +++ b/drivers/rtc/class.c > @@ -16,6 +16,7 @@ > #include > #include > #include > +#include > #include > > #include "rtc-core.h" > diff --git a/include/linux/ktime.h b/include/linux/ktime.h > index 73f20deb497d..37955d6664dd 100644 > --- a/include/linux/ktime.h > +++ b/include/linux/ktime.h > @@ -229,6 +229,198 @@ static inline ktime_t ms_to_ktime(u64 ms) > return ms * NSEC_PER_MSEC; > } > > -# include > +/* > + * ktime_get() family: read the current time in a multitude of ways, > + * > + * The default time reference is CLOCK_MONOTONIC, starting at > + * boot time but not counting the time spent in suspend. > + * For other references, use the functions with "real", "clocktai", > + * "boottime" and "raw" suffixes. > + * > + * To get the time in a different format, use the ones wit > + * "ns", "ts64" and "seconds" suffix. > + * > + * See Documentation/core-api/timekeeping.rst for more details. > + */ > > -#endif > + > +/* > + * timespec64 based interfaces > + */ > +extern void ktime_get_raw_ts64(struct timespec64 *ts); > +extern void ktime_get_ts64(struct timespec64 *ts); > +extern void ktime_get_real_ts64(struct timespec64 *tv); > +extern void ktime_get_coarse_ts64(struct timespec64 *ts); > +extern void ktime_get_coarse_real_ts64(struct timespec64 *ts); > + > +void getboottime64(struct timespec64 *ts); > + > +/* > + * time64_t base interfaces > + */ > +extern time64_t ktime_get_seconds(void); > +extern time64_t __ktime_get_real_seconds(void); > +extern time64_t ktime_get_real_seconds(void); > + > +/* > + * ktime_t based interfaces > + */ > + > +enum tk_offsets { > + TK_OFFS_REAL, > + TK_OFFS_BOOT, > + TK_OFFS_TAI, > + TK_OFFS_MAX, > +}; > + > +extern ktime_t ktime_get(void); > +extern ktime_t ktime_get_with_offset(enum tk_offsets offs); > +extern ktime_t ktime_get_coarse_with_offset(enum tk_offsets offs); > +extern ktime_t ktime_mono_to_any(ktime_t tmono, enum tk_offsets offs); > +extern ktime_t ktime_get_raw(void); > +extern u32 ktime_get_resolution_ns(void); > + > +/** > + * ktime_get_real - get the real (wall-) time in ktime_t format > + */ > +static inline ktime_t ktime_get_real(void) > +{ > + return ktime_get_with_offset(TK_OFFS_REAL); > +} > + > +static inline ktime_t ktime_get_coarse_real(void) > +{ > + return ktime_get_coarse_with_offset(TK_OFFS_REAL); > +} > + > +/** > + * ktime_get_boottime - Returns monotonic time since boot in ktime_t format > + * > + * This is similar to CLOCK_MONTONIC/ktime_get, but also includes the > + * time spent in suspend. > + */ > +static inline ktime_t ktime_get_boottime(void) > +{ > + return ktime_get_with_offset(TK_OFFS_BOOT); > +} > + > +static inline ktime_t ktime_get_coarse_boottime(void) > +{ > + return ktime_get_coarse_with_offset(TK_OFFS_BOOT); > +} > + > +/** > + * ktime_get_clocktai - Returns the TAI time of day in ktime_t format > + */ > +static inline ktime_t ktime_get_clocktai(void) > +{ > + return ktime_get_with_offset(TK_OFFS_TAI); > +} > + > +static inline ktime_t ktime_get_coarse_clocktai(void) > +{ > + return ktime_get_coarse_with_offset(TK_OFFS_TAI); > +} > + > +static inline ktime_t ktime_get_coarse(void) > +{ > + struct timespec64 ts; > + > + ktime_get_coarse_ts64(&ts); > + return timespec64_to_ktime(ts); > +} > + > +static inline u64 ktime_get_coarse_ns(void) > +{ > + return ktime_to_ns(ktime_get_coarse()); > +} > + > +static inline u64 ktime_get_coarse_real_ns(void) > +{ > + return ktime_to_ns(ktime_get_coarse_real()); > +} > + > +static inline u64 ktime_get_coarse_boottime_ns(void) > +{ > + return ktime_to_ns(ktime_get_coarse_boottime()); > +} > + > +static inline u64 ktime_get_coarse_clocktai_ns(void) > +{ > + return ktime_to_ns(ktime_get_coarse_clocktai()); > +} > + > +/** > + * ktime_mono_to_real - Convert monotonic time to clock realtime > + */ > +static inline ktime_t ktime_mono_to_real(ktime_t mono) > +{ > + return ktime_mono_to_any(mono, TK_OFFS_REAL); > +} > + > +static inline u64 ktime_get_ns(void) > +{ > + return ktime_to_ns(ktime_get()); > +} > + > +static inline u64 ktime_get_real_ns(void) > +{ > + return ktime_to_ns(ktime_get_real()); > +} > + > +static inline u64 ktime_get_boottime_ns(void) > +{ > + return ktime_to_ns(ktime_get_boottime()); > +} > + > +static inline u64 ktime_get_clocktai_ns(void) > +{ > + return ktime_to_ns(ktime_get_clocktai()); > +} > + > +static inline u64 ktime_get_raw_ns(void) > +{ > + return ktime_to_ns(ktime_get_raw()); > +} > + > +extern u64 ktime_get_mono_fast_ns(void); > +extern u64 ktime_get_raw_fast_ns(void); > +extern u64 ktime_get_boot_fast_ns(void); > +extern u64 ktime_get_real_fast_ns(void); > + > +/* > + * timespec64/time64_t interfaces utilizing the ktime based ones > + * for API completeness, these could be implemented more efficiently > + * if needed. > + */ > +static inline void ktime_get_boottime_ts64(struct timespec64 *ts) > +{ > + *ts = ktime_to_timespec64(ktime_get_boottime()); > +} > + > +static inline void ktime_get_coarse_boottime_ts64(struct timespec64 *ts) > +{ > + *ts = ktime_to_timespec64(ktime_get_coarse_boottime()); > +} > + > +static inline time64_t ktime_get_boottime_seconds(void) > +{ > + return ktime_divns(ktime_get_coarse_boottime(), NSEC_PER_SEC); > +} > + > +static inline void ktime_get_clocktai_ts64(struct timespec64 *ts) > +{ > + *ts = ktime_to_timespec64(ktime_get_clocktai()); > +} > + > +static inline void ktime_get_coarse_clocktai_ts64(struct timespec64 *ts) > +{ > + *ts = ktime_to_timespec64(ktime_get_coarse_clocktai()); > +} > + > +static inline time64_t ktime_get_clocktai_seconds(void) > +{ > + return ktime_divns(ktime_get_coarse_clocktai(), NSEC_PER_SEC); > +} > + > +#endif /* _LINUX_KTIME_H */ > diff --git a/include/linux/pps_kernel.h b/include/linux/pps_kernel.h > index 78c8ac4951b5..24970c202ac6 100644 > --- a/include/linux/pps_kernel.h > +++ b/include/linux/pps_kernel.h > @@ -12,6 +12,7 @@ > #include > #include > #include > +#include > > /* > * Global defines > diff --git a/include/linux/sched_clock.h b/include/linux/sched_clock.h > index 835ee87ed792..f0fa287710da 100644 > --- a/include/linux/sched_clock.h > +++ b/include/linux/sched_clock.h > @@ -5,6 +5,8 @@ > #ifndef LINUX_SCHED_CLOCK > #define LINUX_SCHED_CLOCK > > +#include > + > #ifdef CONFIG_GENERIC_SCHED_CLOCK > /** > * struct clock_read_data - data required to read from sched_clock() > diff --git a/include/linux/stmmac.h b/include/linux/stmmac.h > index a6f03b36fc4f..bf235ff101d5 100644 > --- a/include/linux/stmmac.h > +++ b/include/linux/stmmac.h > @@ -14,6 +14,7 @@ > > #include > #include > +#include > > #define MTL_MAX_RX_QUEUES 8 > #define MTL_MAX_TX_QUEUES 8 > diff --git a/include/linux/timekeeping.h b/include/linux/timekeeping.h > index 78a98bdff76d..b1c54f5ff91e 100644 > --- a/include/linux/timekeeping.h > +++ b/include/linux/timekeeping.h > @@ -19,201 +19,6 @@ extern void legacy_timer_tick(unsigned long ticks); > extern int do_settimeofday64(const struct timespec64 *ts); > extern int do_sys_settimeofday64(const struct timespec64 *tv, > const struct timezone *tz); > - > -/* > - * ktime_get() family: read the current time in a multitude of ways, > - * > - * The default time reference is CLOCK_MONOTONIC, starting at > - * boot time but not counting the time spent in suspend. > - * For other references, use the functions with "real", "clocktai", > - * "boottime" and "raw" suffixes. > - * > - * To get the time in a different format, use the ones wit > - * "ns", "ts64" and "seconds" suffix. > - * > - * See Documentation/core-api/timekeeping.rst for more details. > - */ > - > - > -/* > - * timespec64 based interfaces > - */ > -extern void ktime_get_raw_ts64(struct timespec64 *ts); > -extern void ktime_get_ts64(struct timespec64 *ts); > -extern void ktime_get_real_ts64(struct timespec64 *tv); > -extern void ktime_get_coarse_ts64(struct timespec64 *ts); > -extern void ktime_get_coarse_real_ts64(struct timespec64 *ts); > - > -void getboottime64(struct timespec64 *ts); > - > -/* > - * time64_t base interfaces > - */ > -extern time64_t ktime_get_seconds(void); > -extern time64_t __ktime_get_real_seconds(void); > -extern time64_t ktime_get_real_seconds(void); > - > -/* > - * ktime_t based interfaces > - */ > - > -enum tk_offsets { > - TK_OFFS_REAL, > - TK_OFFS_BOOT, > - TK_OFFS_TAI, > - TK_OFFS_MAX, > -}; > - > -extern ktime_t ktime_get(void); > -extern ktime_t ktime_get_with_offset(enum tk_offsets offs); > -extern ktime_t ktime_get_coarse_with_offset(enum tk_offsets offs); > -extern ktime_t ktime_mono_to_any(ktime_t tmono, enum tk_offsets offs); > -extern ktime_t ktime_get_raw(void); > -extern u32 ktime_get_resolution_ns(void); > - > -/** > - * ktime_get_real - get the real (wall-) time in ktime_t format > - */ > -static inline ktime_t ktime_get_real(void) > -{ > - return ktime_get_with_offset(TK_OFFS_REAL); > -} > - > -static inline ktime_t ktime_get_coarse_real(void) > -{ > - return ktime_get_coarse_with_offset(TK_OFFS_REAL); > -} > - > -/** > - * ktime_get_boottime - Returns monotonic time since boot in ktime_t format > - * > - * This is similar to CLOCK_MONTONIC/ktime_get, but also includes the > - * time spent in suspend. > - */ > -static inline ktime_t ktime_get_boottime(void) > -{ > - return ktime_get_with_offset(TK_OFFS_BOOT); > -} > - > -static inline ktime_t ktime_get_coarse_boottime(void) > -{ > - return ktime_get_coarse_with_offset(TK_OFFS_BOOT); > -} > - > -/** > - * ktime_get_clocktai - Returns the TAI time of day in ktime_t format > - */ > -static inline ktime_t ktime_get_clocktai(void) > -{ > - return ktime_get_with_offset(TK_OFFS_TAI); > -} > - > -static inline ktime_t ktime_get_coarse_clocktai(void) > -{ > - return ktime_get_coarse_with_offset(TK_OFFS_TAI); > -} > - > -static inline ktime_t ktime_get_coarse(void) > -{ > - struct timespec64 ts; > - > - ktime_get_coarse_ts64(&ts); > - return timespec64_to_ktime(ts); > -} > - > -static inline u64 ktime_get_coarse_ns(void) > -{ > - return ktime_to_ns(ktime_get_coarse()); > -} > - > -static inline u64 ktime_get_coarse_real_ns(void) > -{ > - return ktime_to_ns(ktime_get_coarse_real()); > -} > - > -static inline u64 ktime_get_coarse_boottime_ns(void) > -{ > - return ktime_to_ns(ktime_get_coarse_boottime()); > -} > - > -static inline u64 ktime_get_coarse_clocktai_ns(void) > -{ > - return ktime_to_ns(ktime_get_coarse_clocktai()); > -} > - > -/** > - * ktime_mono_to_real - Convert monotonic time to clock realtime > - */ > -static inline ktime_t ktime_mono_to_real(ktime_t mono) > -{ > - return ktime_mono_to_any(mono, TK_OFFS_REAL); > -} > - > -static inline u64 ktime_get_ns(void) > -{ > - return ktime_to_ns(ktime_get()); > -} > - > -static inline u64 ktime_get_real_ns(void) > -{ > - return ktime_to_ns(ktime_get_real()); > -} > - > -static inline u64 ktime_get_boottime_ns(void) > -{ > - return ktime_to_ns(ktime_get_boottime()); > -} > - > -static inline u64 ktime_get_clocktai_ns(void) > -{ > - return ktime_to_ns(ktime_get_clocktai()); > -} > - > -static inline u64 ktime_get_raw_ns(void) > -{ > - return ktime_to_ns(ktime_get_raw()); > -} > - > -extern u64 ktime_get_mono_fast_ns(void); > -extern u64 ktime_get_raw_fast_ns(void); > -extern u64 ktime_get_boot_fast_ns(void); > -extern u64 ktime_get_real_fast_ns(void); > - > -/* > - * timespec64/time64_t interfaces utilizing the ktime based ones > - * for API completeness, these could be implemented more efficiently > - * if needed. > - */ > -static inline void ktime_get_boottime_ts64(struct timespec64 *ts) > -{ > - *ts = ktime_to_timespec64(ktime_get_boottime()); > -} > - > -static inline void ktime_get_coarse_boottime_ts64(struct timespec64 *ts) > -{ > - *ts = ktime_to_timespec64(ktime_get_coarse_boottime()); > -} > - > -static inline time64_t ktime_get_boottime_seconds(void) > -{ > - return ktime_divns(ktime_get_coarse_boottime(), NSEC_PER_SEC); > -} > - > -static inline void ktime_get_clocktai_ts64(struct timespec64 *ts) > -{ > - *ts = ktime_to_timespec64(ktime_get_clocktai()); > -} > - > -static inline void ktime_get_coarse_clocktai_ts64(struct timespec64 *ts) > -{ > - *ts = ktime_to_timespec64(ktime_get_coarse_clocktai()); > -} > - > -static inline time64_t ktime_get_clocktai_seconds(void) > -{ > - return ktime_divns(ktime_get_coarse_clocktai(), NSEC_PER_SEC); > -} > - > /* > * RTC specific > */ > @@ -308,4 +113,4 @@ void read_persistent_wall_and_boot_offset(struct timespec64 *wall_clock, > extern int update_persistent_clock64(struct timespec64 now); > #endif > > -#endif > +#endif /* _LINUX_TIMEKEEPING_H */ > diff --git a/init/main.c b/init/main.c > index f5b8246e8aa1..a8db3a136d6a 100644 > --- a/init/main.c > +++ b/init/main.c > @@ -100,6 +100,7 @@ > #include > #include > #include > +#include > > #include > #include > diff --git a/kernel/time/ntp.c b/kernel/time/ntp.c > index 406dccb79c2b..804f06801737 100644 > --- a/kernel/time/ntp.c > +++ b/kernel/time/ntp.c > @@ -18,6 +18,7 @@ > #include > #include > #include > +#include > > #include "ntp_internal.h" > #include "timekeeping_internal.h" > diff --git a/kernel/time/posix-timers.c b/kernel/time/posix-timers.c > index dd5697d7347b..14f82cd95d10 100644 > --- a/kernel/time/posix-timers.c > +++ b/kernel/time/posix-timers.c > @@ -13,6 +13,7 @@ > #include > #include > #include > +#include > #include > #include > > diff --git a/kernel/time/tick-legacy.c b/kernel/time/tick-legacy.c > index af225b32f5b3..9a534f716462 100644 > --- a/kernel/time/tick-legacy.c > +++ b/kernel/time/tick-legacy.c > @@ -7,6 +7,7 @@ > #include > #include > #include > +#include > > #include "tick-internal.h" > > diff --git a/kernel/time/time.c b/kernel/time/time.c > index 29923b20e0e4..7292ed074742 100644 > --- a/kernel/time/time.c > +++ b/kernel/time/time.c > @@ -29,6 +29,7 @@ > #include > #include > #include > +#include > #include > #include > #include > diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c > index 8a364aa9881a..4dfee925adc8 100644 > --- a/kernel/time/timekeeping.c > +++ b/kernel/time/timekeeping.c > @@ -22,6 +22,7 @@ > #include > #include > #include > +#include > > #include "tick-internal.h" > #include "ntp_internal.h" > diff --git a/sound/pci/hda/hda_controller.c b/sound/pci/hda/hda_controller.c > index ca2f2ecd1488..efbbe624d81d 100644 > --- a/sound/pci/hda/hda_controller.c > +++ b/sound/pci/hda/hda_controller.c > @@ -16,6 +16,7 @@ > #include > #include > #include > +#include > > #ifdef CONFIG_X86 > /* for art-tsc conversion */ >