place_entity(struct cfs_rq *cfs_rq, struct sched_entity *se, int initial)
 {
        u64 vruntime = cfs_rq->min_vruntime;
+       u64 sleep_time;
 
        /*
         * The 'current' period is already promised to the current tasks,
                vruntime -= thresh;
        }
 
-       /* ensure we never gain time by being placed backwards. */
-       se->vruntime = max_vruntime(se->vruntime, vruntime);
+       /*
+        * Pull vruntime of the entity being placed to the base level of
+        * cfs_rq, to prevent boosting it if placed backwards.  If the entity
+        * slept for a long time, don't even try to compare its vruntime with
+        * the base as it may be too far off and the comparison may get
+        * inversed due to s64 overflow.
+        */
+       sleep_time = rq_clock_task(rq_of(cfs_rq)) - se->exec_start;
+       if ((s64)sleep_time > 60LL * NSEC_PER_SEC)
+               se->vruntime = vruntime;
+       else
+               se->vruntime = max_vruntime(se->vruntime, vruntime);
 }
 
 static void check_enqueue_throttle(struct cfs_rq *cfs_rq);