--- linux-2.6.10.orig/fs/ext3/super.c 2004-12-24 22:35:28.000000000 +0100 +++ linux-2.6.10/fs/ext3/super.c 2005-01-18 12:27:51.896529310 +0100 @@ -1787,6 +1787,33 @@ return NULL; } +#ifdef CONFIG_NUMA +#include +#include + +static int journal_node_affinity = 0; +spinlock_t journal_node_affinity_lock = SPIN_LOCK_UNLOCKED; + +static void ext3_bind_journal_thread(journal_t *journal) { + int i, node; + + spin_lock(&journal_node_affinity_lock); + for (i = 0; i < MAX_NUMNODES; i++) { + node = (journal_node_affinity + i) % MAX_NUMNODES; + + if (!nr_cpus_node(node) || !node_online(node)) + continue; + + set_cpus_allowed(journal->j_task, node_to_cpumask(node)); + journal_node_affinity = (node + 1) % MAX_NUMNODES; + break; + } + spin_unlock(&journal_node_affinity_lock); +} +#else +#define ext3_bind_journal_thread(journal) do {} while (0) +#endif + static int ext3_load_journal(struct super_block * sb, struct ext3_super_block * es) { @@ -1852,6 +1875,7 @@ return err; } + ext3_bind_journal_thread(journal); EXT3_SB(sb)->s_journal = journal; ext3_clear_journal_err(sb, es); return 0; @@ -1881,6 +1908,7 @@ return -EIO; } + ext3_bind_journal_thread(journal); EXT3_SB(sb)->s_journal = journal; ext3_update_dynamic_rev(sb);