fix (again) MAX_USER_RT_PRIO and MAX_RT_PRIO (was: MAX_USER_RT_PRIO and MAX_RT_PRIO are wrong!)
PATCH 1/1 fix (again) MAX_USER_RT_PRIO and MAX_RT_PRIO (was: MAX_USER_RT_PRIO and MAX_RT_PRIO are wrong!)
Andrew,
As we discussed in OLS, here's the patch again to fix the code to handle if the values between MAX_USER_RT_PRIO and MAX_RT_PRIO are different. Without this patch, an SMP system will crash if the values are different. I've already submitted this patch and it made it to -mm, but never made it to mainline, so you told me to send it again and here it is.
Also, shouldn't these values (MAX_RT_PRIO, MAX_USER_RT_PRIO) be user configurable via a config parameter? If so, I can send a separate patch to do just that.
Ingo,
I've CC you just because you are the schedule maintainer. You already accepted this patch into your RT tree.
Dean,
I've CC you since it also has the change to linux-2.6.13-rc3/arch/ia64/sn/kernel/xpc_main.c in it. But I don't see this in -mm. I don't have a ia64 so I can't test it. You tested this for me before, so it should still work. This part should be at least acknowledged by you.
-- Steve
PS. I'm currently running this patched kernel with MAX_RT_USER set to 95 and MAX_RT_PRIO set to 100 on an SMP machine.
kernel/sched.c renamed from kernel/sched.c.orig +3 -2
@@ -3486,7 +3486,7 @@ static void __setscheduler(struct task_s p->policy = policy; p->rt_priority = prio;if (policy !=SCHED_NORMAL ) - p->prio =MAX_USER_RT_PRIO -1 - p->rt_priority; + p->prio =MAX_RT_PRIO -1 - p->rt_priority;else p->prio = p->static_prio; }
@@ -3518,7 +3518,8 @@ recheck:* 1..MAX_USER_RT_PRIO-1, valid priority for SCHED_NORMAL is 0. */ if (param->sched_priority <0 || - param->sched_priority >MAX_USER_RT_PRIO -1 ) + (p->mm && param->sched_priority >MAX_USER_RT_PRIO -1 ) || + (!p->mm && param->sched_priority >MAX_RT_PRIO -1 ))return -EINVAL ;if ((policy ==SCHED_NORMAL ) != (param->sched_priority ==0 ))return -EINVAL ;
arch/ia64/sn/kernel/xpc_main.c renamed from arch/ia64/sn/kernel/xpc_main.c.orig +1 -1
@@ -420,7 +420,7 @@ xpc_activating(void *__partid)partid_t partid = (u64 ) __partid;struct xpc_partition *part = &xpc_partitions[partid];unsigned long irq_flags; -struct sched_param param = { sched_priority:MAX_USER_RT_PRIO -1 }; +struct sched_param param = { sched_priority:MAX_RT_PRIO -1 };int ret;
Quoted 5 lines · Steven Rostedt
Ingo,
I've CC you just because you are the schedule maintainer. You already accepted this patch into your RT tree.
Please make sure to pick up this patch from Andreas Steinmetz too, otherwise the rlimits are broken:
kernel/sched.c 2005-07-22 19:45:42.000000000 +0200 renamed from kernel/sched.c 2005-07-22 19:45:05.000000000 +0200 +2 -1
@@ -3528,7 +3528,8 @@ */ if (!capable(CAP_SYS_NICE)) { /* can't change policy */ - if (policy != p->policy) + if (policy != p->policy && + !p->signal->rlim[RLIMIT_RTPRIO].rlim_cur) return -EPERM; /* can't increase priority */ if (policy != SCHED_NORMAL &&
Lee
Steve, your change to XPC looks good. Thanks, Dean
Quoted 48 lines · Steven Rostedt
Dean,
I've CC you since it also has the change to
linux-2.6.13-rc3/arch/ia64/sn/kernel/xpc_main.cin it. But I don't see this in -mm. I don't have a ia64 so I can't test it. You tested this for me before, so it should still work. This part should be at least acknowledged by you.-- Steve
PS. I'm currently running this patched kernel with
MAX_RT_USERset to 95 andMAX_RT_PRIOset to 100 on an SMP machine.Signed-off-by Steven Rostedt <[email protected]>kernel/sched.c renamed from kernel/sched.c.orig +3
-2@@ -3486,7 +3486,7 @@ static void __setscheduler(struct task_s p->policy = policy; p->rt_priority = prio;if (policy !=SCHED_NORMAL ) - p->prio =MAX_USER_RT_PRIO -1 - p->rt_priority; + p->prio =MAX_RT_PRIO -1 - p->rt_priority;else p->prio = p->static_prio; }@@ -3518,7 +3518,8 @@ recheck:* 1..MAX_USER_RT_PRIO-1, valid priority for SCHED_NORMAL is 0. */ if (param->sched_priority <0 || - param->sched_priority >MAX_USER_RT_PRIO -1 ) + (p->mm && param->sched_priority >MAX_USER_RT_PRIO -1 ) || + (!p->mm && param->sched_priority >MAX_RT_PRIO -1 ))return -EINVAL ;if ((policy ==SCHED_NORMAL ) != (param->sched_priority ==0 ))return -EINVAL ;arch/ia64/sn/kernel/xpc_main.c renamed from arch/ia64/sn/kernel/xpc_main.c.orig +1
-1@@ -420,7 +420,7 @@ xpc_activating(void *__partid)partid_t partid = (u64 ) __partid;struct xpc_partition *part = &xpc_partitions[partid];unsigned long irq_flags; -struct sched_param param = { sched_priority:MAX_USER_RT_PRIO -1 }; +struct sched_param param = { sched_priority:MAX_RT_PRIO -1 };int ret;