we have a few places that use a uint64_t with the number of nanosecons
of uptime the machine has. this factors it out to make them a bit more
generally available.

i was going to add yet another one of these to pfsync, but thought it
might be a good idea to factor them out first.

ok?

Index: kern/kern_tc.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_tc.c,v
retrieving revision 1.72
diff -u -p -r1.72 kern_tc.c
--- kern/kern_tc.c      30 Apr 2021 13:52:48 -0000      1.72
+++ kern/kern_tc.c      4 Jun 2021 02:28:31 -0000
@@ -196,6 +196,21 @@ binuptime(struct bintime *bt)
 }
 
 void
+getbinuptime(struct bintime *bt)
+{
+       struct timehands *th;
+       u_int gen;
+
+       do {
+               th = timehands;
+               gen = th->th_generation;
+               membar_consumer();
+               *bt = th->th_offset;
+               membar_consumer();
+       } while (gen == 0 || gen != th->th_generation);
+}
+
+void
 nanouptime(struct timespec *tsp)
 {
        struct bintime bt;
@@ -233,6 +248,34 @@ getuptime(void)
 
        return now;
 #endif
+}
+
+uint64_t
+nsecuptime(void)
+{
+       struct bintime bt;
+       uint64_t nsec;
+
+       binuptime(&bt);
+
+       nsec = (1000000000ULL * (bt.frac >> 32)) >> 32;
+       nsec += bt.sec * 1000000000ULL;
+
+       return (nsec);
+}
+
+uint64_t
+getnsecuptime(void)
+{
+       struct bintime bt;
+       uint64_t nsec;
+
+       getbinuptime(&bt);
+
+       nsec = (1000000000ULL * (bt.frac >> 32)) >> 32;
+       nsec += bt.sec * 1000000000ULL;
+
+       return (nsec);
 }
 
 void
Index: kern/subr_pool.c
===================================================================
RCS file: /cvs/src/sys/kern/subr_pool.c,v
retrieving revision 1.233
diff -u -p -r1.233 subr_pool.c
--- kern/subr_pool.c    10 Mar 2021 10:21:47 -0000      1.233
+++ kern/subr_pool.c    4 Jun 2021 02:28:31 -0000
@@ -272,19 +272,6 @@ struct task pool_gc_task = TASK_INITIALI
 #define POOL_WAIT_FREE SEC_TO_NSEC(1)
 #define POOL_WAIT_GC   SEC_TO_NSEC(8)
 
-/*
- * TODO Move getnsecuptime() to kern_tc.c and document it when we
- * have callers in other modules.
- */
-static uint64_t
-getnsecuptime(void)
-{
-       struct timespec now;
-
-       getnanouptime(&now);
-       return TIMESPEC_TO_NSEC(&now);
-}
-
 RBT_PROTOTYPE(phtree, pool_page_header, ph_node, phtree_compare);
 
 static inline int
Index: kern/vfs_sync.c
===================================================================
RCS file: /cvs/src/sys/kern/vfs_sync.c,v
retrieving revision 1.65
diff -u -p -r1.65 vfs_sync.c
--- kern/vfs_sync.c     14 Jan 2021 03:32:01 -0000      1.65
+++ kern/vfs_sync.c     4 Jun 2021 02:28:31 -0000
@@ -132,19 +132,6 @@ vn_syncer_add_to_worklist(struct vnode *
 }
 
 /*
- * TODO Move getnsecuptime() to kern_tc.c and document it when we have
- * more users in the kernel.
- */
-static uint64_t
-getnsecuptime(void)
-{
-       struct timespec now;
-
-       getnanouptime(&now);
-       return TIMESPEC_TO_NSEC(&now);
-}
-
-/*
  * System filesystem synchronizer daemon.
  */
 void
Index: net/bpf.c
===================================================================
RCS file: /cvs/src/sys/net/bpf.c,v
retrieving revision 1.204
diff -u -p -r1.204 bpf.c
--- net/bpf.c   23 Apr 2021 03:43:19 -0000      1.204
+++ net/bpf.c   4 Jun 2021 02:28:31 -0000
@@ -421,19 +421,6 @@ bpfclose(dev_t dev, int flag, int mode, 
        (d)->bd_fbuf = NULL;
 
 /*
- * TODO Move nsecuptime() into kern_tc.c and document it when we have
- * more users elsewhere in the kernel.
- */
-static uint64_t
-nsecuptime(void)
-{
-       struct timespec now;
-
-       nanouptime(&now);
-       return TIMESPEC_TO_NSEC(&now);
-}
-
-/*
  *  bpfread - read next chunk of packets from buffers
  */
 int
Index: sys/time.h
===================================================================
RCS file: /cvs/src/sys/sys/time.h,v
retrieving revision 1.58
diff -u -p -r1.58 time.h
--- sys/time.h  13 Jan 2021 16:28:50 -0000      1.58
+++ sys/time.h  4 Jun 2021 02:28:31 -0000
@@ -290,6 +290,7 @@ void        binuptime(struct bintime *);
 void   nanouptime(struct timespec *);
 void   microuptime(struct timeval *);
 
+void   getbinuptime(struct bintime *);
 void   getnanouptime(struct timespec *);
 void   getmicrouptime(struct timeval *);
 
@@ -302,6 +303,9 @@ void        nanoruntime(struct timespec *);
 
 time_t gettime(void);
 time_t getuptime(void);
+
+uint64_t       nsecuptime(void);
+uint64_t       getnsecuptime(void);
 
 struct proc;
 int    clock_gettime(struct proc *, clockid_t, struct timespec *);

Reply via email to