[<prev] [next>] [day] [month] [year] [list]
Message-ID: <20061017111634.GD13677@htj.dyndns.org>
Date: Tue, 17 Oct 2006 20:16:34 +0900
From: Tejun Heo <htejun@...il.com>
To: Andrew Morton <akpm@...l.org>
Cc: viro@...iv.linux.org.uk, dipankar@...ibm.com,
linux-kernel@...r.kernel.org
Subject: [PATCH] file: kill unnecessary timer in fdtable_defer
free_fdtable_rc() schedules timer to reschedule fddef->wq if
schedule_work() on it returns 0. However, schedule_work() guarantees
that the target work is executed at least once after the scheduling
regardless of its return value. 0 return simply means that the work
was already pending and thus no further action was required.
Another problem is that it used contant '5' as @expires argument to
mod_timer().
Kill unnecessary fddef->timer.
Signed-off-by: Tejun Heo <htejun@...il.com>
Cc: Dipankar Sarma <dipankar@...ibm.com>
---
This patch was first posted on August 20th. The original thread can
be seen at the following URL.
http://thread.gmane.org/gmane.linux.kernel/438712/focus=438712
Dipankar objected but the discussion was dropped in the middle.
Please read the thread for more info. I still think this patch is
correct.
Andrew, please push this patch through -mm if this looks correct.
Thanks.
file.c | 29 ++---------------------------
1 file changed, 2 insertions(+), 27 deletions(-)
diff --git a/fs/file.c b/fs/file.c
index 8e81775..d91db2c 100644
--- a/fs/file.c
+++ b/fs/file.c
@@ -21,7 +21,6 @@ #include <linux/workqueue.h>
struct fdtable_defer {
spinlock_t lock;
struct work_struct wq;
- struct timer_list timer;
struct fdtable *next;
};
@@ -75,22 +74,6 @@ static void __free_fdtable(struct fdtabl
kfree(fdt);
}
-static void fdtable_timer(unsigned long data)
-{
- struct fdtable_defer *fddef = (struct fdtable_defer *)data;
-
- spin_lock(&fddef->lock);
- /*
- * If someone already emptied the queue return.
- */
- if (!fddef->next)
- goto out;
- if (!schedule_work(&fddef->wq))
- mod_timer(&fddef->timer, 5);
-out:
- spin_unlock(&fddef->lock);
-}
-
static void free_fdtable_work(struct fdtable_defer *f)
{
struct fdtable *fdt;
@@ -142,13 +125,8 @@ static void free_fdtable_rcu(struct rcu_
spin_lock(&fddef->lock);
fdt->next = fddef->next;
fddef->next = fdt;
- /*
- * vmallocs are handled from the workqueue context.
- * If the per-cpu workqueue is running, then we
- * defer work scheduling through a timer.
- */
- if (!schedule_work(&fddef->wq))
- mod_timer(&fddef->timer, 5);
+ /* vmallocs are handled from the workqueue context */
+ schedule_work(&fddef->wq);
spin_unlock(&fddef->lock);
put_cpu_var(fdtable_defer_list);
}
@@ -352,9 +330,6 @@ static void __devinit fdtable_defer_list
struct fdtable_defer *fddef = &per_cpu(fdtable_defer_list, cpu);
spin_lock_init(&fddef->lock);
INIT_WORK(&fddef->wq, (void (*)(void *))free_fdtable_work, fddef);
- init_timer(&fddef->timer);
- fddef->timer.data = (unsigned long)fddef;
- fddef->timer.function = fdtable_timer;
fddef->next = NULL;
}
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists