linux/drivers/staging/lustre/include/linux/libcfs/libcfs_time.h
<<
>>
Prefs
   1/*
   2 * GPL HEADER START
   3 *
   4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   5 *
   6 * This program is free software; you can redistribute it and/or modify
   7 * it under the terms of the GNU General Public License version 2 only,
   8 * as published by the Free Software Foundation.
   9 *
  10 * This program is distributed in the hope that it will be useful, but
  11 * WITHOUT ANY WARRANTY; without even the implied warranty of
  12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13 * General Public License version 2 for more details (a copy is included
  14 * in the LICENSE file that accompanied this code).
  15 *
  16 * You should have received a copy of the GNU General Public License
  17 * version 2 along with this program; If not, see
  18 * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
  19 *
  20 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  21 * CA 95054 USA or visit www.sun.com if you need additional information or
  22 * have any questions.
  23 *
  24 * GPL HEADER END
  25 */
  26/*
  27 * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
  28 * Use is subject to license terms.
  29 */
  30/*
  31 * This file is part of Lustre, http://www.lustre.org/
  32 * Lustre is a trademark of Sun Microsystems, Inc.
  33 *
  34 * libcfs/include/libcfs/libcfs_time.h
  35 *
  36 * Time functions.
  37 *
  38 */
  39
  40#ifndef __LIBCFS_TIME_H__
  41#define __LIBCFS_TIME_H__
  42/*
  43 * generic time manipulation functions.
  44 */
  45
  46static inline unsigned long cfs_time_add(unsigned long t, long d)
  47{
  48        return (unsigned long)(t + d);
  49}
  50
  51static inline unsigned long cfs_time_sub(unsigned long t1, unsigned long t2)
  52{
  53        return (unsigned long)(t1 - t2);
  54}
  55
  56static inline int cfs_time_after(unsigned long t1, unsigned long t2)
  57{
  58        return time_before(t2, t1);
  59}
  60
  61static inline int cfs_time_aftereq(unsigned long t1, unsigned long t2)
  62{
  63        return time_before_eq(t2, t1);
  64}
  65
  66static inline unsigned long cfs_time_shift(int seconds)
  67{
  68        return cfs_time_add(cfs_time_current(), cfs_time_seconds(seconds));
  69}
  70
  71static inline long cfs_timeval_sub(struct timeval *large, struct timeval *small,
  72                                   struct timeval *result)
  73{
  74        long r = (long)(
  75                (large->tv_sec - small->tv_sec) * ONE_MILLION +
  76                (large->tv_usec - small->tv_usec));
  77        if (result != NULL) {
  78                result->tv_usec = r % ONE_MILLION;
  79                result->tv_sec = r / ONE_MILLION;
  80        }
  81        return r;
  82}
  83
  84static inline void cfs_slow_warning(unsigned long now, int seconds, char *msg)
  85{
  86        if (cfs_time_after(cfs_time_current(),
  87                           cfs_time_add(now, cfs_time_seconds(15))))
  88                CERROR("slow %s "CFS_TIME_T" sec\n", msg,
  89                       cfs_duration_sec(cfs_time_sub(cfs_time_current(), now)));
  90}
  91
  92#define CFS_RATELIMIT(seconds)                            \
  93({                                                            \
  94        /*                                                    \
  95         * XXX nikita: non-portable initializer          \
  96         */                                                  \
  97        static time_t __next_message;                  \
  98        int result;                                          \
  99                                                                \
 100        if (cfs_time_after(cfs_time_current(), __next_message)) \
 101                result = 1;                                  \
 102        else {                                            \
 103                __next_message = cfs_time_shift(seconds);       \
 104                result = 0;                                  \
 105        }                                                      \
 106        result;                                          \
 107})
 108
 109/*
 110 * helper function similar to do_gettimeofday() of Linux kernel
 111 */
 112static inline void cfs_fs_timeval(struct timeval *tv)
 113{
 114        struct timespec time;
 115
 116        cfs_fs_time_current(&time);
 117        cfs_fs_time_usec(&time, tv);
 118}
 119
 120/*
 121 * return valid time-out based on user supplied one. Currently we only check
 122 * that time-out is not shorted than allowed.
 123 */
 124static inline long cfs_timeout_cap(long timeout)
 125{
 126        if (timeout < CFS_TICK)
 127                timeout = CFS_TICK;
 128        return timeout;
 129}
 130
 131#endif
 132