From 341a26fac9b39496a724375a0714eed4d5c362fa Mon Sep 17 00:00:00 2001 From: Al Viro Date: Wed, 27 Jun 2012 11:33:29 +0400 Subject: [PATCH] --- yaml --- r: 312948 b: refs/heads/master c: a2d4c71d1559426155e5da8db3265bfa0d8d398d h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/kernel/task_work.c | 26 ++++++++++++++------------ 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/[refs] b/[refs] index 2cb693b38644..114540002ff4 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: ed3e694d78cc75fa79bf29698631b146fd27aa35 +refs/heads/master: a2d4c71d1559426155e5da8db3265bfa0d8d398d diff --git a/trunk/kernel/task_work.c b/trunk/kernel/task_work.c index fb396089f66a..91d4e1742a0c 100644 --- a/trunk/kernel/task_work.c +++ b/trunk/kernel/task_work.c @@ -60,19 +60,21 @@ void task_work_run(void) struct task_struct *task = current; struct callback_head *p, *q; - raw_spin_lock_irq(&task->pi_lock); - p = task->task_works; - task->task_works = NULL; - raw_spin_unlock_irq(&task->pi_lock); + while (1) { + raw_spin_lock_irq(&task->pi_lock); + p = task->task_works; + task->task_works = NULL; + raw_spin_unlock_irq(&task->pi_lock); - if (unlikely(!p)) - return; + if (unlikely(!p)) + return; - q = p->next; /* head */ - p->next = NULL; /* cut it */ - while (q) { - p = q->next; - q->func(q); - q = p; + q = p->next; /* head */ + p->next = NULL; /* cut it */ + while (q) { + p = q->next; + q->func(q); + q = p; + } } }