From: Andrew Morton <akpm@linux-foundation.org>
To: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: LKML <linux-kernel@vger.kernel.org>,
linux-mm <linux-mm@kvack.org>,
Minchan Kim <minchan.kim@gmail.com>,
David Rientjes <rientjes@google.com>,
KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
Ingo Molnar <mingo@elte.hu>,
Peter Zijlstra <a.p.zijlstra@chello.nl>
Subject: Re: [PATCH 10/11] oom: give the dying task a higher priority
Date: Fri, 2 Jul 2010 14:49:41 -0700 [thread overview]
Message-ID: <20100702144941.8fa101c3.akpm@linux-foundation.org> (raw)
In-Reply-To: <20100630183243.AA65.A69D9226@jp.fujitsu.com>
On Wed, 30 Jun 2010 18:33:23 +0900 (JST)
KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> wrote:
> +static void boost_dying_task_prio(struct task_struct *p,
> + struct mem_cgroup *mem)
> +{
> + struct sched_param param = { .sched_priority = 1 };
> +
> + if (mem)
> + return;
> +
> + if (!rt_task(p))
> + sched_setscheduler_nocheck(p, SCHED_FIFO, ¶m);
> +}
We can actually make `param' static here. That saves a teeny bit of
code and a little bit of stack. The oom-killer can be called when
we're using a lot of stack.
But if we make that change we really should make the param arg to
sched_setscheduler_nocheck() be const. I did that (and was able to
convert lots of callers to use a static `param') but to complete the
job we'd need to chase through all the security goop, fixing up
security_task_setscheduler() and callees, and I got bored.
include/linux/sched.h | 2 +-
kernel/kthread.c | 2 +-
kernel/sched.c | 4 ++--
kernel/softirq.c | 4 +++-
kernel/stop_machine.c | 2 +-
kernel/workqueue.c | 2 +-
6 files changed, 9 insertions(+), 7 deletions(-)
diff -puN kernel/kthread.c~a kernel/kthread.c
--- a/kernel/kthread.c~a
+++ a/kernel/kthread.c
@@ -131,7 +131,7 @@ struct task_struct *kthread_create(int (
wait_for_completion(&create.done);
if (!IS_ERR(create.result)) {
- struct sched_param param = { .sched_priority = 0 };
+ static struct sched_param param = { .sched_priority = 0 };
va_list args;
va_start(args, namefmt);
diff -puN kernel/workqueue.c~a kernel/workqueue.c
--- a/kernel/workqueue.c~a
+++ a/kernel/workqueue.c
@@ -962,7 +962,7 @@ init_cpu_workqueue(struct workqueue_stru
static int create_workqueue_thread(struct cpu_workqueue_struct *cwq, int cpu)
{
- struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 };
+ static struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 };
struct workqueue_struct *wq = cwq->wq;
const char *fmt = is_wq_single_threaded(wq) ? "%s" : "%s/%d";
struct task_struct *p;
diff -puN kernel/stop_machine.c~a kernel/stop_machine.c
--- a/kernel/stop_machine.c~a
+++ a/kernel/stop_machine.c
@@ -291,7 +291,7 @@ repeat:
static int __cpuinit cpu_stop_cpu_callback(struct notifier_block *nfb,
unsigned long action, void *hcpu)
{
- struct sched_param param = { .sched_priority = MAX_RT_PRIO - 1 };
+ static struct sched_param param = { .sched_priority = MAX_RT_PRIO - 1 };
unsigned int cpu = (unsigned long)hcpu;
struct cpu_stopper *stopper = &per_cpu(cpu_stopper, cpu);
struct task_struct *p;
diff -puN kernel/sched.c~a kernel/sched.c
--- a/kernel/sched.c~a
+++ a/kernel/sched.c
@@ -4570,7 +4570,7 @@ static bool check_same_owner(struct task
}
static int __sched_setscheduler(struct task_struct *p, int policy,
- struct sched_param *param, bool user)
+ const struct sched_param *param, bool user)
{
int retval, oldprio, oldpolicy = -1, on_rq, running;
unsigned long flags;
@@ -4734,7 +4734,7 @@ EXPORT_SYMBOL_GPL(sched_setscheduler);
* but our caller might not have that capability.
*/
int sched_setscheduler_nocheck(struct task_struct *p, int policy,
- struct sched_param *param)
+ const struct sched_param *param)
{
return __sched_setscheduler(p, policy, param, false);
}
diff -puN kernel/softirq.c~a kernel/softirq.c
--- a/kernel/softirq.c~a
+++ a/kernel/softirq.c
@@ -827,7 +827,9 @@ static int __cpuinit cpu_callback(struct
cpumask_any(cpu_online_mask));
case CPU_DEAD:
case CPU_DEAD_FROZEN: {
- struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 };
+ static struct sched_param param = {
+ .sched_priority = MAX_RT_PRIO-1,
+ };
p = per_cpu(ksoftirqd, hotcpu);
per_cpu(ksoftirqd, hotcpu) = NULL;
diff -puN include/linux/sched.h~a include/linux/sched.h
--- a/include/linux/sched.h~a
+++ a/include/linux/sched.h
@@ -1924,7 +1924,7 @@ extern int task_curr(const struct task_s
extern int idle_cpu(int cpu);
extern int sched_setscheduler(struct task_struct *, int, struct sched_param *);
extern int sched_setscheduler_nocheck(struct task_struct *, int,
- struct sched_param *);
+ const struct sched_param *);
extern struct task_struct *idle_task(int cpu);
extern struct task_struct *curr_task(int cpu);
extern void set_curr_task(int cpu, struct task_struct *p);
_
WARNING: multiple messages have this Message-ID (diff)
From: Andrew Morton <akpm@linux-foundation.org>
To: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
Cc: LKML <linux-kernel@vger.kernel.org>,
linux-mm <linux-mm@kvack.org>,
Minchan Kim <minchan.kim@gmail.com>,
David Rientjes <rientjes@google.com>,
KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>,
Ingo Molnar <mingo@elte.hu>,
Peter Zijlstra <a.p.zijlstra@chello.nl>
Subject: Re: [PATCH 10/11] oom: give the dying task a higher priority
Date: Fri, 2 Jul 2010 14:49:41 -0700 [thread overview]
Message-ID: <20100702144941.8fa101c3.akpm@linux-foundation.org> (raw)
In-Reply-To: <20100630183243.AA65.A69D9226@jp.fujitsu.com>
On Wed, 30 Jun 2010 18:33:23 +0900 (JST)
KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> wrote:
> +static void boost_dying_task_prio(struct task_struct *p,
> + struct mem_cgroup *mem)
> +{
> + struct sched_param param = { .sched_priority = 1 };
> +
> + if (mem)
> + return;
> +
> + if (!rt_task(p))
> + sched_setscheduler_nocheck(p, SCHED_FIFO, ¶m);
> +}
We can actually make `param' static here. That saves a teeny bit of
code and a little bit of stack. The oom-killer can be called when
we're using a lot of stack.
But if we make that change we really should make the param arg to
sched_setscheduler_nocheck() be const. I did that (and was able to
convert lots of callers to use a static `param') but to complete the
job we'd need to chase through all the security goop, fixing up
security_task_setscheduler() and callees, and I got bored.
include/linux/sched.h | 2 +-
kernel/kthread.c | 2 +-
kernel/sched.c | 4 ++--
kernel/softirq.c | 4 +++-
kernel/stop_machine.c | 2 +-
kernel/workqueue.c | 2 +-
6 files changed, 9 insertions(+), 7 deletions(-)
diff -puN kernel/kthread.c~a kernel/kthread.c
--- a/kernel/kthread.c~a
+++ a/kernel/kthread.c
@@ -131,7 +131,7 @@ struct task_struct *kthread_create(int (
wait_for_completion(&create.done);
if (!IS_ERR(create.result)) {
- struct sched_param param = { .sched_priority = 0 };
+ static struct sched_param param = { .sched_priority = 0 };
va_list args;
va_start(args, namefmt);
diff -puN kernel/workqueue.c~a kernel/workqueue.c
--- a/kernel/workqueue.c~a
+++ a/kernel/workqueue.c
@@ -962,7 +962,7 @@ init_cpu_workqueue(struct workqueue_stru
static int create_workqueue_thread(struct cpu_workqueue_struct *cwq, int cpu)
{
- struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 };
+ static struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 };
struct workqueue_struct *wq = cwq->wq;
const char *fmt = is_wq_single_threaded(wq) ? "%s" : "%s/%d";
struct task_struct *p;
diff -puN kernel/stop_machine.c~a kernel/stop_machine.c
--- a/kernel/stop_machine.c~a
+++ a/kernel/stop_machine.c
@@ -291,7 +291,7 @@ repeat:
static int __cpuinit cpu_stop_cpu_callback(struct notifier_block *nfb,
unsigned long action, void *hcpu)
{
- struct sched_param param = { .sched_priority = MAX_RT_PRIO - 1 };
+ static struct sched_param param = { .sched_priority = MAX_RT_PRIO - 1 };
unsigned int cpu = (unsigned long)hcpu;
struct cpu_stopper *stopper = &per_cpu(cpu_stopper, cpu);
struct task_struct *p;
diff -puN kernel/sched.c~a kernel/sched.c
--- a/kernel/sched.c~a
+++ a/kernel/sched.c
@@ -4570,7 +4570,7 @@ static bool check_same_owner(struct task
}
static int __sched_setscheduler(struct task_struct *p, int policy,
- struct sched_param *param, bool user)
+ const struct sched_param *param, bool user)
{
int retval, oldprio, oldpolicy = -1, on_rq, running;
unsigned long flags;
@@ -4734,7 +4734,7 @@ EXPORT_SYMBOL_GPL(sched_setscheduler);
* but our caller might not have that capability.
*/
int sched_setscheduler_nocheck(struct task_struct *p, int policy,
- struct sched_param *param)
+ const struct sched_param *param)
{
return __sched_setscheduler(p, policy, param, false);
}
diff -puN kernel/softirq.c~a kernel/softirq.c
--- a/kernel/softirq.c~a
+++ a/kernel/softirq.c
@@ -827,7 +827,9 @@ static int __cpuinit cpu_callback(struct
cpumask_any(cpu_online_mask));
case CPU_DEAD:
case CPU_DEAD_FROZEN: {
- struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 };
+ static struct sched_param param = {
+ .sched_priority = MAX_RT_PRIO-1,
+ };
p = per_cpu(ksoftirqd, hotcpu);
per_cpu(ksoftirqd, hotcpu) = NULL;
diff -puN include/linux/sched.h~a include/linux/sched.h
--- a/include/linux/sched.h~a
+++ a/include/linux/sched.h
@@ -1924,7 +1924,7 @@ extern int task_curr(const struct task_s
extern int idle_cpu(int cpu);
extern int sched_setscheduler(struct task_struct *, int, struct sched_param *);
extern int sched_setscheduler_nocheck(struct task_struct *, int,
- struct sched_param *);
+ const struct sched_param *);
extern struct task_struct *idle_task(int cpu);
extern struct task_struct *curr_task(int cpu);
extern void set_curr_task(int cpu, struct task_struct *p);
_
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2010-07-02 21:50 UTC|newest]
Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-06-30 9:25 [mmotm 0611][PATCH 00/11] various OOM bugfixes v3 KOSAKI Motohiro
2010-06-30 9:25 ` KOSAKI Motohiro
2010-06-30 9:27 ` [PATCH 01/11] oom: don't try to kill oom_unkillable child KOSAKI Motohiro
2010-06-30 9:27 ` KOSAKI Motohiro
2010-06-30 9:27 ` [PATCH 02/11] oom: oom_kill_process() doesn't select kthread child KOSAKI Motohiro
2010-06-30 9:27 ` KOSAKI Motohiro
2010-06-30 13:55 ` Minchan Kim
2010-06-30 13:55 ` Minchan Kim
2010-07-01 0:07 ` KOSAKI Motohiro
2010-07-01 0:07 ` KOSAKI Motohiro
2010-07-01 13:38 ` Minchan Kim
2010-07-01 13:38 ` Minchan Kim
2010-06-30 9:28 ` [PATCH 03/11] oom: make oom_unkillable_task() helper function KOSAKI Motohiro
2010-06-30 9:28 ` KOSAKI Motohiro
2010-06-30 14:19 ` Minchan Kim
2010-06-30 14:19 ` Minchan Kim
2010-07-01 0:07 ` KOSAKI Motohiro
2010-07-01 0:07 ` KOSAKI Motohiro
2010-06-30 9:29 ` [PATCH 04/11] oom: oom_kill_process() need to check p is unkillable KOSAKI Motohiro
2010-06-30 9:29 ` KOSAKI Motohiro
2010-06-30 13:57 ` Minchan Kim
2010-06-30 13:57 ` Minchan Kim
2010-06-30 9:30 ` [PATCH 05/11] oom: /proc/<pid>/oom_score treat kernel thread honestly KOSAKI Motohiro
2010-06-30 9:30 ` KOSAKI Motohiro
2010-06-30 14:03 ` Minchan Kim
2010-06-30 14:03 ` Minchan Kim
2010-07-01 0:07 ` KOSAKI Motohiro
2010-07-01 0:07 ` KOSAKI Motohiro
2010-07-01 14:36 ` Minchan Kim
2010-07-01 14:36 ` Minchan Kim
2010-06-30 9:31 ` [PATCH 06/11] oom: kill duplicate OOM_DISABLE check KOSAKI Motohiro
2010-06-30 9:31 ` KOSAKI Motohiro
2010-06-30 14:10 ` Minchan Kim
2010-06-30 14:10 ` Minchan Kim
2010-06-30 9:31 ` [PATCH 07/11] oom: move OOM_DISABLE check from oom_kill_task to out_of_memory() KOSAKI Motohiro
2010-06-30 9:31 ` KOSAKI Motohiro
2010-06-30 14:20 ` Minchan Kim
2010-06-30 14:20 ` Minchan Kim
2010-07-01 0:07 ` KOSAKI Motohiro
2010-07-01 0:07 ` KOSAKI Motohiro
2010-06-30 9:32 ` [PATCH 08/11] oom: cleanup has_intersects_mems_allowed() KOSAKI Motohiro
2010-06-30 9:32 ` KOSAKI Motohiro
2010-06-30 9:32 ` [PATCH 09/11] oom: remove child->mm check from oom_kill_process() KOSAKI Motohiro
2010-06-30 9:32 ` KOSAKI Motohiro
2010-06-30 14:30 ` Minchan Kim
2010-06-30 14:30 ` Minchan Kim
2010-06-30 9:33 ` [PATCH 10/11] oom: give the dying task a higher priority KOSAKI Motohiro
2010-06-30 9:33 ` KOSAKI Motohiro
2010-06-30 9:35 ` KOSAKI Motohiro
2010-06-30 9:35 ` KOSAKI Motohiro
2010-06-30 14:40 ` Minchan Kim
2010-06-30 14:40 ` Minchan Kim
2010-07-02 21:49 ` Andrew Morton [this message]
2010-07-02 21:49 ` Andrew Morton
2010-07-06 0:49 ` KOSAKI Motohiro
2010-07-06 0:49 ` KOSAKI Motohiro
2010-07-06 0:50 ` [PATCH 1/2] security: add const to security_task_setscheduler() KOSAKI Motohiro
2010-07-06 0:50 ` KOSAKI Motohiro
2010-07-06 0:51 ` [PATCH 2/2] sched: make sched_param arugment static variables in some sched_setscheduler() caller KOSAKI Motohiro
2010-07-06 0:51 ` KOSAKI Motohiro
2010-07-06 22:13 ` Steven Rostedt
2010-07-06 22:13 ` Steven Rostedt
2010-07-06 23:12 ` Andrew Morton
2010-07-06 23:12 ` Andrew Morton
2010-07-06 23:49 ` Steven Rostedt
2010-07-06 23:49 ` Steven Rostedt
2010-07-07 0:02 ` Andrew Morton
2010-07-07 0:02 ` Andrew Morton
2010-07-07 19:43 ` Peter Zijlstra
2010-07-07 19:43 ` Peter Zijlstra
2010-06-30 9:34 ` [PATCH 11/11] oom: multi threaded process coredump don't make deadlock KOSAKI Motohiro
2010-06-30 9:34 ` KOSAKI Motohiro
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20100702144941.8fa101c3.akpm@linux-foundation.org \
--to=akpm@linux-foundation.org \
--cc=a.p.zijlstra@chello.nl \
--cc=kamezawa.hiroyu@jp.fujitsu.com \
--cc=kosaki.motohiro@jp.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=minchan.kim@gmail.com \
--cc=mingo@elte.hu \
--cc=rientjes@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.