All of lore.kernel.org
 help / color / mirror / Atom feed
* [patch] use pdflush for unused inode writeback
@ 2002-04-10  6:52 Andrew Morton
  0 siblings, 0 replies; only message in thread
From: Andrew Morton @ 2002-04-10  6:52 UTC (permalink / raw)
  To: lkml

This is pdflush's first application!  The writeback of
the unused inodes list by keventd is removed, and a
pdflush thread is dispatched instead.
 
There is a need for exclusion - to prevent all the
pdflush threads from working against the same request
queue.  This is implemented locally.  And this is a 
problem, because other pdflush threads can be dispatched
to writeback other filesystem objects, and they don't
know that there's already a pdflush thread working that
request queue.

So moving the exclusion into the request queue itself
is on my things-to-do-list.  But the code as-is works
OK - under a `dbench 100' load the number of pdflush
instances can grow as high as four or five.  Some fine
tuning is needed...

Patch is against 2.5.8-pre3+ratcache+readahead+pageprivate+pdflush


--- 2.5.8-pre3/fs/inode.c~dallocbase-45-pdflush_inodes	Tue Apr  9 22:53:11 2002
+++ 2.5.8-pre3-akpm/fs/inode.c	Tue Apr  9 22:53:11 2002
@@ -433,7 +433,7 @@ void sync_inodes(void)
 	}
 }
 
-static void try_to_sync_unused_inodes(void * arg)
+static void try_to_sync_unused_inodes(unsigned long pexclusive)
 {
 	struct super_block * sb;
 	int nr_inodes = inodes_stat.nr_unused;
@@ -450,10 +450,9 @@ static void try_to_sync_unused_inodes(vo
 	}
 	spin_unlock(&sb_lock);
 	spin_unlock(&inode_lock);
+	clear_bit(0, (unsigned long *)pexclusive);
 }
 
-static struct tq_struct unused_inodes_flush_task;
-
 /**
  *	write_inode_now	-	write an inode to disk
  *	@inode: inode to write to disk
@@ -746,8 +745,15 @@ void prune_icache(int goal)
 	 * from here or we're either synchronously dogslow
 	 * or we deadlock with oom.
 	 */
-	if (goal)
-		schedule_task(&unused_inodes_flush_task);
+	if (goal) {
+		static unsigned long exclusive;
+
+		if (!test_and_set_bit(0, &exclusive)) {
+			if (pdflush_operation(try_to_sync_unused_inodes,
+						(unsigned long)&exclusive))
+				clear_bit(0, &exclusive);
+		}
+	}
 }
 /*
  * This is called from kswapd when we think we need some
@@ -1173,8 +1179,6 @@ void __init inode_init(unsigned long mem
 					 NULL);
 	if (!inode_cachep)
 		panic("cannot create inode slab cache");
-
-	unused_inodes_flush_task.routine = try_to_sync_unused_inodes;
 }
 
 static inline void do_atime_update(struct inode *inode)

-

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2002-04-10  6:52 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2002-04-10  6:52 [patch] use pdflush for unused inode writeback Andrew Morton

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.