Merge branch 'sched-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[sfrench/cifs-2.6.git] / kernel / time / posix-cpu-timers.c
index ec9f5da6f163d40d3b2df9f4b9f76e783b304543..2541bd89f20eb95f96d435d21f4eb7c4d1a0cda6 100644 (file)
@@ -14,6 +14,7 @@
 #include <linux/tick.h>
 #include <linux/workqueue.h>
 #include <linux/compat.h>
 #include <linux/tick.h>
 #include <linux/workqueue.h>
 #include <linux/compat.h>
+#include <linux/sched/deadline.h>
 
 #include "posix-timers.h"
 
 
 #include "posix-timers.h"
 
@@ -791,6 +792,14 @@ check_timers_list(struct list_head *timers,
        return 0;
 }
 
        return 0;
 }
 
+static inline void check_dl_overrun(struct task_struct *tsk)
+{
+       if (tsk->dl.dl_overrun) {
+               tsk->dl.dl_overrun = 0;
+               __group_send_sig_info(SIGXCPU, SEND_SIG_PRIV, tsk);
+       }
+}
+
 /*
  * Check for any per-thread CPU timers that have fired and move them off
  * the tsk->cpu_timers[N] list onto the firing list.  Here we update the
 /*
  * Check for any per-thread CPU timers that have fired and move them off
  * the tsk->cpu_timers[N] list onto the firing list.  Here we update the
@@ -804,6 +813,9 @@ static void check_thread_timers(struct task_struct *tsk,
        u64 expires;
        unsigned long soft;
 
        u64 expires;
        unsigned long soft;
 
+       if (dl_task(tsk))
+               check_dl_overrun(tsk);
+
        /*
         * If cputime_expires is zero, then there are no active
         * per thread CPU timers.
        /*
         * If cputime_expires is zero, then there are no active
         * per thread CPU timers.
@@ -906,6 +918,9 @@ static void check_process_timers(struct task_struct *tsk,
        struct task_cputime cputime;
        unsigned long soft;
 
        struct task_cputime cputime;
        unsigned long soft;
 
+       if (dl_task(tsk))
+               check_dl_overrun(tsk);
+
        /*
         * If cputimer is not running, then there are no active
         * process wide timers (POSIX 1.b, itimers, RLIMIT_CPU).
        /*
         * If cputimer is not running, then there are no active
         * process wide timers (POSIX 1.b, itimers, RLIMIT_CPU).
@@ -1111,6 +1126,9 @@ static inline int fastpath_timer_check(struct task_struct *tsk)
                        return 1;
        }
 
                        return 1;
        }
 
+       if (dl_task(tsk) && tsk->dl.dl_overrun)
+               return 1;
+
        return 0;
 }
 
        return 0;
 }