afs: Always define our own osi_timeval32_t 38/14238/5 master
authorAndrew Deason <adeason@sinenomine.net>
Tue, 2 Jun 2020 18:37:00 +0000 (13:37 -0500)
committerBenjamin Kaduk <kaduk@mit.edu>
Fri, 7 Aug 2020 16:10:44 +0000 (12:10 -0400)
Since OpenAFS 1.0, osi_GetTime has taken a timeval-like pointer, which
contains 32-bit fields (the actual type has been called either
osi_timeval_t or osi_timeval32_t over time). For platforms that have a
native timeval-like type with 32-bit fields, we just define
osi_timeval32_t to that type, and elsewhere we define our own struct
to be osi_timeval32_t. For platforms that use the native timeval, we
can then define osi_GetTime() to just be, e.g., microtime().

This approach is difficult to maintain, though, because we must keep
track of whether 'struct timeval' contains 32-bit fields on each
platform, which can depend on many factors. It's easy to make mistakes
(the current tree already contains mistakes), and there's not much
benefit.

To avoid all of this, just always define osi_timeval32_t to be our own
struct with afs_int32 fields, and provide definitions for osi_GetTime
that convert from the native time struct to our osi_timeval32_t. This
does mean that for some platforms we do an unnecessary type
conversion, but this is a small price to pay for more straightforward
and maintainable code.

To be a little more sure that our types are correct, change
osi_GetTime to be defined as an inline function instead of a macro.

At the same time, do a similar conversion for the KERNEL
implementation of the rx clock_GetTime function. Get rid of
platform-specific mess, and do a straightforward type conversion
between osi_timeval32_t and struct clock in an inline function.

Change-Id: I18819acb556a2a7f1b6da6994db9783c48108934
Reviewed-on: https://gerrit.openafs.org/14238
Reviewed-by: Michael Meffie <mmeffie@sinenomine.net>
Reviewed-by: Benjamin Kaduk <kaduk@mit.edu>
Tested-by: BuildBot <buildbot@rampaginggeek.com>

15 files changed:
src/afs/AIX/osi_machdep.h
src/afs/DARWIN/osi_machdep.h
src/afs/DFBSD/osi_machdep.h
src/afs/FBSD/osi_machdep.h
src/afs/HPUX/osi_machdep.h
src/afs/IRIX/osi_machdep.h
src/afs/LINUX/osi_machdep.h
src/afs/NBSD/osi_machdep.h
src/afs/OBSD/osi_machdep.h
src/afs/SOLARIS/osi_machdep.h
src/afs/UKERNEL/afs_usrops.c
src/afs/UKERNEL/osi_machdep.h
src/afs/afs_osi.h
src/afs/afs_prototypes.h
src/rx/rx_clock.h

index 23060fd..0c79c03 100644 (file)
@@ -84,6 +84,13 @@ extern simple_lock_data afs_global_lock;
  * src/afs/AIX/osi_gcpags.c for how to look at the process list */
 #define osi_procname(procname, size) strncpy(procname, "", size)
 
-#define osi_GetTime(x)          do {curtime(x); (x)->tv_usec = (x)->tv_usec/1000;} while (0)
+static_inline void
+osi_GetTime(osi_timeval32_t *atv)
+{
+    struct timestruc_t now;
+    curtime(&now);
+    atv->tv_sec = now.tv_sec;
+    atv->tv_usec = now.tv_nsec / 1000;
+}
 
 #endif /* _OSI_MACHDEP_H_ */
index a5e34f0..b360970 100644 (file)
@@ -235,6 +235,13 @@ extern int (**afs_vnodeop_p) ();
 #define osi_procname(procname, size) strncpy(procname, curproc->p_comm, size)
 #endif
 
-#define osi_GetTime(x) microtime(x)
+static_inline void
+osi_GetTime(osi_timeval32_t *atv)
+{
+    struct timeval now;
+    microtime(&now);
+    atv->tv_sec = now.tv_sec;
+    atv->tv_usec = now.tv_usec;
+}
 
 #endif /* _OSI_MACHDEP_H_ */
index d2dfc1c..4c6a80d 100644 (file)
 #ifndef _OSI_MACHDEP_H_
 #define _OSI_MACHDEP_H_
 
-#define osi_GetTime(x) microtime(x)
+static_inline void
+osi_GetTime(osi_timeval32_t *atv)
+{
+    struct timeval now;
+    microtime(&now);
+    atv->tv_sec = now.tv_sec;
+    atv->tv_usec = now.tv_usec;
+}
 
 #endif /* _OSI_MACHDEP_H_ */
index 17baaa6..d9d39f0 100644 (file)
@@ -133,6 +133,13 @@ extern struct thread *afs_global_owner;
 
 #define osi_procname(procname, size) strncpy(procname, curproc->p_comm, size)
 
-#define osi_GetTime(x) microtime(x)
+static_inline void
+osi_GetTime(osi_timeval32_t *atv)
+{
+    struct timeval now;
+    microtime(&now);
+    atv->tv_sec = now.tv_sec;
+    atv->tv_usec = now.tv_usec;
+}
 
 #endif /* _OSI_MACHDEP_H_ */
index ef4a1d6..f2afe21 100644 (file)
@@ -121,6 +121,13 @@ extern caddr_t kmem_alloc();
 
 #define osi_procname(procname, size) strncpy(procname, "", size)
 
-#define        osi_GetTime(x)  do { struct timeval osi_GetTimeVar; uniqtime(&osi_GetTimeVar); (x)->tv_sec = osi_GetTimeVar.tv_sec; (x)->tv_usec = osi_GetTimeVar.tv_usec; } while(0)
+static_inline void
+osi_GetTime(osi_timeval32_t *atv)
+{
+    struct timeval now;
+    uniqtime(&now);
+    atv->tv_sec = now.tv_sec;
+    atv->tv_usec = now.tv_usec;
+}
 
 #endif /* _OSI_MACHDEP_H_ */
index a5ba80e..56defec 100644 (file)
@@ -387,10 +387,18 @@ extern long afs_global_owner;
 
 #define osi_procname(procname, size) strncpy(procname, proc_name(curproc()), size)
 
+static_inline void
+osi_GetTime(osi_timeval32_t *atv)
+{
 #ifdef _K64U64
-# define osi_GetTime(x) irix5_microtime((struct __irix5_timeval*)(x))
+    struct __irix5_timeval now;
+    irix5_microtime(&now);
 #else
-# define osi_GetTime(x) microtime(x)
+    struct timeval now;
+    microtime(&now);
 #endif
+    atv->tv_sec = now.tv_sec;
+    atv->tv_usec = now.tv_usec;
+}
 
 #endif /* _OSI_MACHDEP_H_ */
index dc7c344..4053ac7 100644 (file)
@@ -97,23 +97,23 @@ static inline time_t osi_Time(void) {
 #endif
 
 #if defined(HAVE_LINUX_KTIME_GET_REAL_TS64)
-# define osi_GetTime(V)                                      \
-    do {                                                     \
-       struct timespec64 __afs_tv;                          \
-       ktime_get_real_ts64(&__afs_tv);                      \
-       (V)->tv_sec = (afs_int32)__afs_tv.tv_sec;            \
-       (V)->tv_usec = (afs_int32)__afs_tv.tv_nsec / 1000;   \
-    } while(0)
-#elif defined(AFS_LINUX_64BIT_KERNEL) || !defined(HAVE_LINUX_TIME_T)
-# define osi_GetTime(V)                                 \
-    do {                                               \
-       struct timeval __afs_tv;                              \
-       do_gettimeofday(&__afs_tv);                           \
-       (V)->tv_sec = (afs_int32)__afs_tv.tv_sec;             \
-       (V)->tv_usec = (afs_int32)__afs_tv.tv_usec;           \
-    } while (0)
+static inline void
+osi_GetTime(osi_timeval32_t *atv)
+{
+    struct timespec64 now;
+    ktime_get_real_ts64(&now);
+    atv->tv_sec = now.tv_sec;
+    atv->tv_usec = now.tv_nsec / 1000;
+}
 #else
-# define osi_GetTime(V) do_gettimeofday((V))
+static inline void
+osi_GetTime(osi_timeval32_t *atv)
+{
+    struct timeval now;
+    do_gettimeofday(&now);
+    atv->tv_sec = now.tv_sec;
+    atv->tv_usec = now.tv_usec;
+}
 #endif
 
 #undef gop_lookupname
index 2ded63d..43aa621 100644 (file)
@@ -96,7 +96,6 @@ typedef struct kauth_cred afs_ucred_t;
 
 /* time */
 #define        afs_hz          hz
-#define osi_GetTime(x) getmicrotime(x)
 #define osi_Time()      time_second
 
 /* str */
@@ -207,4 +206,13 @@ extern int afs_debug;
 
 #define AFS_USE_NBSD_NAMECACHE 0
 
+static_inline void
+osi_GetTime(osi_timeval32_t *atv)
+{
+    struct timeval now;
+    getmicrotime(&now);
+    atv->tv_sec = now.tv_sec;
+    atv->tv_usec = now.tv_usec;
+}
+
 #endif /* _OSI_MACHDEP_H_ */
index aec0f69..1179e27 100644 (file)
@@ -97,7 +97,6 @@ typedef struct ucred afs_ucred_t;
 
 /* time */
 #define        afs_hz          hz
-#define osi_GetTime(x) microtime(x)
 extern time_t osi_Time();
 
 /* str */
@@ -243,4 +242,13 @@ extern int (**afs_vnodeop_p) ();
 
 #define osi_procname(procname, size) strncpy(procname, curproc->p_comm, size)
 
+static_inline void
+osi_GetTime(osi_timeval32_t *atv)
+{
+    struct timeval now;
+    microtime(&now);
+    atv->tv_sec = now.tv_sec;
+    atv->tv_usec = now.tv_usec;
+}
+
 #endif /* _OSI_MACHDEP_H_ */
index a9bb4c5..45ee8de 100644 (file)
@@ -125,6 +125,13 @@ struct afs_ifinfo {
 
 #define osi_procname(procname, size) strncpy(procname, PTOU(ttoproc(curthread))->u_comm, size)
 
-#define        osi_GetTime(x) uniqtime32(x)
+static_inline void
+osi_GetTime(osi_timeval32_t *atv)
+{
+    struct timeval32 now;
+    uniqtime32(&now);
+    atv->tv_sec = now.tv_sec;
+    atv->tv_usec = now.tv_usec;
+}
 
 #endif /* _OSI_MACHDEP_H_ */
index b5b3a0f..8fbc109 100644 (file)
@@ -936,13 +936,6 @@ afs_osi_Visible(void)
 }
 
 int
-osi_GetTime(struct timeval *tv)
-{
-    gettimeofday(tv, NULL);
-    return 0;
-}
-
-int
 osi_Active(struct vcache *avc)
 {
     AFS_STATCNT(osi_Active);
index 96e8cb5..27667eb 100644 (file)
@@ -83,4 +83,14 @@ extern int afs_suser(afs_ucred_t *credp);
 #define osi_curcred()    get_user_struct()->u_cred
 
 #define osi_procname(procname, size) strncpy(procname, "(unknown)", size)
+
+static_inline void
+osi_GetTime(osi_timeval32_t *atv)
+{
+    struct timeval now;
+    gettimeofday(&now, NULL);
+    atv->tv_sec = now.tv_sec;
+    atv->tv_usec = now.tv_usec;
+}
+
 #endif /* _OSI_MACHDEP_H_ */
index 2b0a841..b28b4a7 100644 (file)
@@ -178,16 +178,10 @@ extern int osi_vnhold(struct vcache *);
  * different platforms.  We require a fixed size timeval, at least for the
  * xstats.
  */
-#if defined(AFS_HPUX_ENV) || defined(AFS_LINUX_64BIT_KERNEL) || (defined(AFS_LINUX26_ENV) && !defined(HAVE_LINUX_TIME_T)) || (defined(AFS_SGI61_ENV) && defined(KERNEL) && defined(_K64U64))
 typedef struct {
     afs_int32 tv_sec;
     afs_int32 tv_usec;
 } osi_timeval32_t;
-#elif defined(AFS_SUN5_ENV)
-typedef struct timeval32 osi_timeval32_t;
-#else
-typedef struct timeval osi_timeval32_t;
-#endif /* AFS_SGI61_ENV */
 
 #ifndef UKERNEL
 #define osi_getpid()           getpid()
index 6a95be1..c0b00c6 100644 (file)
@@ -957,7 +957,6 @@ extern int afs_ExtractTokensForPioctl(struct tokenJar *, time_t,
 extern void uafs_Shutdown(void);
 extern void osi_ReleaseVM(struct vcache *avc, int len,
                          afs_ucred_t *credp);
-extern int osi_GetTime(struct timeval *tv);
 extern int iodone(struct usr_buf *bp);
 extern int usr_ioctl(void);
 extern int lookupname(char *fnamep, int segflg, int followlink,
index f2359a1..c1184e9 100644 (file)
@@ -94,21 +94,14 @@ extern void clock_UpdateTime(void);
 #endif /* AFS_USE_GETTIMEOFDAY || AFS_PTHREAD_ENV */
 #else /* KERNEL */
 #define clock_Init()
-#if defined(AFS_SGI61_ENV) || defined(AFS_HPUX_ENV) || defined(AFS_LINUX_64BIT_KERNEL)
-#define clock_GetTime(cv) osi_GetTime((osi_timeval32_t *)cv)
-#else
-#if (defined(AFS_AIX51_ENV) && defined(AFS_64BIT_KERNEL)) || (defined(AFS_DARWIN100_ENV) && defined(__amd64__)) || defined(AFS_XBSD_ENV)
-#define        clock_GetTime(cv)                               \
-    BEGIN                                              \
-       struct timeval tv;                              \
-       osi_GetTime(&tv);                        \
-       (cv)->sec = (afs_int32)tv.tv_sec;               \
-       (cv)->usec = (afs_int32)tv.tv_usec;             \
-    END
-#else /* defined(AFS_AIX51_ENV) && defined(AFS_64BIT_KERNEL) */
-#define clock_GetTime(cv) osi_GetTime((osi_timeval32_t *)(cv))
-#endif /* defined(AFS_AIX51_ENV) && defined(AFS_64BIT_KERNEL) */
-#endif
+static_inline void
+clock_GetTime(struct clock *cv)
+{
+    osi_timeval32_t now;
+    osi_GetTime(&now);
+    cv->sec = now.tv_sec;
+    cv->usec = now.tv_usec;
+}
 #define clock_Sec() osi_Time()
 #define        clock_NewTime()         /* don't do anything; clock is fast enough in kernel */
 #endif /* KERNEL */