Skip to contentSkip to conversation

fix (again) MAX_USER_RT_PRIO and MAX_RT_PRIO (was: MAX_USER_RT_PRIO and MAX_RT_PRIO are wrong!)

PATCH In review Steven Rostedt 3 participants 3 messages Jul 25, 2005 – Jul 26, 2005

lore
Share & tools
lore
#0 lore raw

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;
 
 
#1 lore raw
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

#2 lore raw
In reply to Steven Rostedt

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.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;