* vtime_account().
   */
  #ifndef __ARCH_HAS_VTIME_ACCOUNT
- void vtime_account(struct task_struct *tsk)
+ void vtime_account_irq_enter(struct task_struct *tsk)
  {
-       if (in_interrupt() || !is_idle_task(tsk))
-               vtime_account_system(tsk);
-       else
-               vtime_account_idle(tsk);
+       if (!vtime_accounting_enabled())
+               return;
+ 
+       if (!in_interrupt()) {
+               /*
+                * If we interrupted user, context_tracking_in_user()
+                * is 1 because the context tracking don't hook
+                * on irq entry/exit. This way we know if
+                * we need to flush user time on kernel entry.
+                */
+               if (context_tracking_in_user()) {
+                       vtime_account_user(tsk);
+                       return;
+               }
+ 
+               if (is_idle_task(tsk)) {
+                       vtime_account_idle(tsk);
+                       return;
+               }
+       }
+       vtime_account_system(tsk);
  }
- EXPORT_SYMBOL_GPL(vtime_account);
+ EXPORT_SYMBOL_GPL(vtime_account_irq_enter);
  #endif /* __ARCH_HAS_VTIME_ACCOUNT */
  
- #else
- 
- #ifndef nsecs_to_cputime
- # define nsecs_to_cputime(__nsecs)    nsecs_to_jiffies(__nsecs)
- #endif
+ #else /* !CONFIG_VIRT_CPU_ACCOUNTING */
  
 -static cputime_t scale_utime(cputime_t utime, cputime_t rtime, cputime_t total)
 +static cputime_t scale_stime(cputime_t stime, cputime_t rtime, cputime_t total)
  {
        u64 temp = (__force u64) rtime;