aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/sched/core.c37
1 files changed, 30 insertions, 7 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index f3f08bf94355..44e00abece09 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -3195,17 +3195,40 @@ __getparam_dl(struct task_struct *p, struct sched_attr *attr)
3195 * We ask for the deadline not being zero, and greater or equal 3195 * We ask for the deadline not being zero, and greater or equal
3196 * than the runtime, as well as the period of being zero or 3196 * than the runtime, as well as the period of being zero or
3197 * greater than deadline. Furthermore, we have to be sure that 3197 * greater than deadline. Furthermore, we have to be sure that
3198 * user parameters are above the internal resolution (1us); we 3198 * user parameters are above the internal resolution of 1us (we
3199 * check sched_runtime only since it is always the smaller one. 3199 * check sched_runtime only since it is always the smaller one) and
3200 * below 2^63 ns (we have to check both sched_deadline and
3201 * sched_period, as the latter can be zero).
3200 */ 3202 */
3201static bool 3203static bool
3202__checkparam_dl(const struct sched_attr *attr) 3204__checkparam_dl(const struct sched_attr *attr)
3203{ 3205{
3204 return attr && attr->sched_deadline != 0 && 3206 /* deadline != 0 */
3205 (attr->sched_period == 0 || 3207 if (attr->sched_deadline == 0)
3206 (s64)(attr->sched_period - attr->sched_deadline) >= 0) && 3208 return false;
3207 (s64)(attr->sched_deadline - attr->sched_runtime ) >= 0 && 3209
3208 attr->sched_runtime >= (2 << (DL_SCALE - 1)); 3210 /*
3211 * Since we truncate DL_SCALE bits, make sure we're at least
3212 * that big.
3213 */
3214 if (attr->sched_runtime < (1ULL << DL_SCALE))
3215 return false;
3216
3217 /*
3218 * Since we use the MSB for wrap-around and sign issues, make
3219 * sure it's not set (mind that period can be equal to zero).
3220 */
3221 if (attr->sched_deadline & (1ULL << 63) ||
3222 attr->sched_period & (1ULL << 63))
3223 return false;
3224
3225 /* runtime <= deadline <= period (if period != 0) */
3226 if ((attr->sched_period != 0 &&
3227 attr->sched_period < attr->sched_deadline) ||
3228 attr->sched_deadline < attr->sched_runtime)
3229 return false;
3230
3231 return true;
3209} 3232}
3210 3233
3211/* 3234/*