Re: can I bring Linux down by running "renice -20 cpu_intensive_process"?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Mike Galbraith <[email protected]> writes:

> On Thu, 2006-03-16 at 22:51 +0000, Måns Rullgård wrote:
>> Bill Davidsen <[email protected]> writes:
>> 
>> > Måns Rullgård wrote:
>> >> Maybe extending sysrq+n to lower the priority of -20 tasks would be a
>> >> good idea.
>> >>
>> > If it runs before the keyboard thread it doesn't matter...
>> 
>> Of course not, but that's not generally the case.
>> 
>> > But why should this hang anything, when there should be enough i/o
>> > to get out of the user process. There's a good fix for this, don't
>> > give this guy root any more ;-)
>> 
>> Ever heard of bugs?  Anyone developing a program can make a mistake.
>> If the program runs with realtime scheduling a bug that makes it enter
>> an infinite loop (or do something else that hogs the CPU) can be
>> difficult to find since it rather efficiently locks you out.
>
> Given that someone has already determined that installing a safety valve
> for RT tasks was worth while, and given that there is practically no
> difference between a nice -20 and the lowest RT priority, seems to me
> that extending that safety valve to cover reniced tasks is the
> obviously-correct thing to do.  I think you should submit a patch.

Something like this ought to do it (untested):

--- kernel/sched.c.orig 2006-02-09 23:41:57.000000000 +0000
+++ kernel/sched.c      2006-03-17 22:16:46.257298014 +0000
@@ -5681,21 +5681,22 @@
 
        read_lock_irq(&tasklist_lock);
        for_each_process (p) {
-               if (!rt_task(p))
-                       continue;
+               if (rt_task(p)) {
+                       rq = task_rq_lock(p, &flags);
 
-               rq = task_rq_lock(p, &flags);
-
-               array = p->array;
-               if (array)
-                       deactivate_task(p, task_rq(p));
-               __setscheduler(p, SCHED_NORMAL, 0);
-               if (array) {
-                       __activate_task(p, task_rq(p));
-                       resched_task(rq->curr);
+                       array = p->array;
+                       if (array)
+                               deactivate_task(p, task_rq(p));
+                       __setscheduler(p, SCHED_NORMAL, 0);
+                       if (array) {
+                               __activate_task(p, task_rq(p));
+                               resched_task(rq->curr);
+                       }
+
+                       task_rq_unlock(rq, &flags);
+               } else if (TASK_NICE(p) == -20) {
+                       set_user_nice(p, 0);
                }
-
-               task_rq_unlock(rq, &flags);
        }
        read_unlock_irq(&tasklist_lock);
 }


-- 
Måns Rullgård
[email protected]
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux