diff options
-rw-r--r-- | kernel/hung_task.c | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/kernel/hung_task.c b/kernel/hung_task.c index 85af0cde7f46..4a9191617076 100644 --- a/kernel/hung_task.c +++ b/kernel/hung_task.c | |||
@@ -34,7 +34,7 @@ int __read_mostly sysctl_hung_task_check_count = PID_MAX_LIMIT; | |||
34 | * is disabled during the critical section. It also controls the size of | 34 | * is disabled during the critical section. It also controls the size of |
35 | * the RCU grace period. So it needs to be upper-bound. | 35 | * the RCU grace period. So it needs to be upper-bound. |
36 | */ | 36 | */ |
37 | #define HUNG_TASK_BATCHING 1024 | 37 | #define HUNG_TASK_LOCK_BREAK (HZ / 10) |
38 | 38 | ||
39 | /* | 39 | /* |
40 | * Zero means infinite timeout - no checking done: | 40 | * Zero means infinite timeout - no checking done: |
@@ -171,7 +171,7 @@ static bool rcu_lock_break(struct task_struct *g, struct task_struct *t) | |||
171 | static void check_hung_uninterruptible_tasks(unsigned long timeout) | 171 | static void check_hung_uninterruptible_tasks(unsigned long timeout) |
172 | { | 172 | { |
173 | int max_count = sysctl_hung_task_check_count; | 173 | int max_count = sysctl_hung_task_check_count; |
174 | int batch_count = HUNG_TASK_BATCHING; | 174 | unsigned long last_break = jiffies; |
175 | struct task_struct *g, *t; | 175 | struct task_struct *g, *t; |
176 | 176 | ||
177 | /* | 177 | /* |
@@ -186,10 +186,10 @@ static void check_hung_uninterruptible_tasks(unsigned long timeout) | |||
186 | for_each_process_thread(g, t) { | 186 | for_each_process_thread(g, t) { |
187 | if (!max_count--) | 187 | if (!max_count--) |
188 | goto unlock; | 188 | goto unlock; |
189 | if (!--batch_count) { | 189 | if (time_after(jiffies, last_break + HUNG_TASK_LOCK_BREAK)) { |
190 | batch_count = HUNG_TASK_BATCHING; | ||
191 | if (!rcu_lock_break(g, t)) | 190 | if (!rcu_lock_break(g, t)) |
192 | goto unlock; | 191 | goto unlock; |
192 | last_break = jiffies; | ||
193 | } | 193 | } |
194 | /* use "==" to skip the TASK_KILLABLE tasks waiting on NFS */ | 194 | /* use "==" to skip the TASK_KILLABLE tasks waiting on NFS */ |
195 | if (t->state == TASK_UNINTERRUPTIBLE) | 195 | if (t->state == TASK_UNINTERRUPTIBLE) |