local_t         cnt;
        local_t         top;
        local_t         bottom;
+       local_t         msb;
 };
 #else
 #include <asm/local64.h>
  * For the ring buffer, 64 bit required operations for the time is
  * the following:
  *
- *  - Only need 59 bits (uses 60 to make it even).
  *  - Reads may fail if it interrupted a modification of the time stamp.
  *      It will succeed if it did not interrupt another write even if
  *      the read itself is interrupted by a write.
  */
 #define RB_TIME_SHIFT  30
 #define RB_TIME_VAL_MASK ((1 << RB_TIME_SHIFT) - 1)
+#define RB_TIME_MSB_SHIFT       60
 
 static inline int rb_time_cnt(unsigned long val)
 {
 
 static inline bool __rb_time_read(rb_time_t *t, u64 *ret, unsigned long *cnt)
 {
-       unsigned long top, bottom;
+       unsigned long top, bottom, msb;
        unsigned long c;
 
        /*
                c = local_read(&t->cnt);
                top = local_read(&t->top);
                bottom = local_read(&t->bottom);
+               msb = local_read(&t->msb);
        } while (c != local_read(&t->cnt));
 
        *cnt = rb_time_cnt(top);
        if (*cnt != rb_time_cnt(bottom))
                return false;
 
-       *ret = rb_time_val(top, bottom);
+       /* The shift to msb will lose its cnt bits */
+       *ret = rb_time_val(top, bottom) | ((u64)msb << RB_TIME_MSB_SHIFT);
        return true;
 }
 
        return (val & RB_TIME_VAL_MASK) | ((cnt & 3) << RB_TIME_SHIFT);
 }
 
-static inline void rb_time_split(u64 val, unsigned long *top, unsigned long *bottom)
+static inline void rb_time_split(u64 val, unsigned long *top, unsigned long *bottom,
+                                unsigned long *msb)
 {
        *top = (unsigned long)((val >> RB_TIME_SHIFT) & RB_TIME_VAL_MASK);
        *bottom = (unsigned long)(val & RB_TIME_VAL_MASK);
+       *msb = (unsigned long)(val >> RB_TIME_MSB_SHIFT);
 }
 
 static inline void rb_time_val_set(local_t *t, unsigned long val, unsigned long cnt)
 
 static void rb_time_set(rb_time_t *t, u64 val)
 {
-       unsigned long cnt, top, bottom;
+       unsigned long cnt, top, bottom, msb;
 
-       rb_time_split(val, &top, &bottom);
+       rb_time_split(val, &top, &bottom, &msb);
 
        /* Writes always succeed with a valid number even if it gets interrupted. */
        do {
                cnt = local_inc_return(&t->cnt);
                rb_time_val_set(&t->top, top, cnt);
                rb_time_val_set(&t->bottom, bottom, cnt);
+               rb_time_val_set(&t->msb, val >> RB_TIME_MSB_SHIFT, cnt);
        } while (cnt != local_read(&t->cnt));
 }
 
 
 static int rb_time_cmpxchg(rb_time_t *t, u64 expect, u64 set)
 {
-       unsigned long cnt, top, bottom;
-       unsigned long cnt2, top2, bottom2;
+       unsigned long cnt, top, bottom, msb;
+       unsigned long cnt2, top2, bottom2, msb2;
        u64 val;
 
        /* The cmpxchg always fails if it interrupted an update */
 
         cnt2 = cnt + 1;
 
-        rb_time_split(val, &top, &bottom);
+        rb_time_split(val, &top, &bottom, &msb);
         top = rb_time_val_cnt(top, cnt);
         bottom = rb_time_val_cnt(bottom, cnt);
 
-        rb_time_split(set, &top2, &bottom2);
+        rb_time_split(set, &top2, &bottom2, &msb2);
         top2 = rb_time_val_cnt(top2, cnt2);
         bottom2 = rb_time_val_cnt(bottom2, cnt2);
 
        if (!rb_time_read_cmpxchg(&t->cnt, cnt, cnt2))
                return false;
+       if (!rb_time_read_cmpxchg(&t->msb, msb, msb2))
+               return false;
        if (!rb_time_read_cmpxchg(&t->top, top, top2))
                return false;
        if (!rb_time_read_cmpxchg(&t->bottom, bottom, bottom2))