Treat jiffies as msec since boot
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 16 Nov 2017 17:17:56 +0000 (12:17 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 16 Nov 2017 17:19:59 +0000 (12:19 -0500)
We had been treating jiffies as 0, and then using relative time in
mod_timer.  This is nasty, and breaks things that want to use jiffies for
other stuff, like mlx4 stats.

Instead, we'll pretend like we're a Linux machine with HZ = 1000 and a
jiffie being a millisecond.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/linux/compat_todo.h
kern/include/linux_compat.h

index 13b76dc..2969971 100644 (file)
@@ -295,10 +295,7 @@ static inline unsigned long wait_for_completion_timeout(struct completion *x,
        return timeout;
 }
 
-/* The timer functions (e.g. mod_timer) expect to set an actual time.  These
- * hacks do relative time.  Hopefully some users will use jiffies + rel_time
- * when using mod_timer (like r8169 does). */
-#define jiffies 0
+#define jiffies tsc2msec(read_tsc())
 
 struct timer_list {
        spinlock_t lock;
@@ -346,10 +343,14 @@ static inline void add_timer(struct timer_list *timer)
                            KMSG_ROUTINE);
 }
 
-static inline void mod_timer(struct timer_list *timer, unsigned long delay)
+static inline void mod_timer(struct timer_list *timer, unsigned long abs_msec)
 {
        spin_lock_irqsave(&timer->lock);
-       timer->delay = delay;
+       /* Our callers often use jiffies + rel_time.  This jiffies may be slightly
+        * more than the previous jiffies */
+       timer->delay = abs_msec - jiffies;
+       if ((long)timer->delay < 0)
+               timer->delay = 0;
        if (timer->scheduled) {
                spin_unlock_irqsave(&timer->lock);
                return;
index 68e3655..f8c5067 100644 (file)
@@ -601,7 +601,7 @@ typedef enum netdev_tx netdev_tx_t;
 #define ASSERT_RTNL(...)
 
 #define synchronize_irq(x) warn_once("Asked to sync IRQ %d, unsupported", x)
-#define HZ 100
+#define HZ 1000
 
 /* Linux has a PCI device id struct.  Drivers make tables of their supported
  * devices, and this table is handled by higher level systems.  We don't have