Debug patch Add some debug printk's to watch how the cpuset specific throttling code is doing. Signed-off-by: Christoph Lameter Index: linux-2.6.20-rc5/fs/fs-writeback.c =================================================================== --- linux-2.6.20-rc5.orig/fs/fs-writeback.c 2007-01-22 14:04:23.000000000 -0600 +++ linux-2.6.20-rc5/fs/fs-writeback.c 2007-01-22 15:10:57.541888415 -0600 @@ -354,7 +354,11 @@ sync_sb_inodes(struct super_block *sb, s /* No pages on the nodes under writeback */ list_move(&inode->i_list, &sb->s_dirty); continue; - } + } else + if (wbc->nodes) + printk(KERN_INFO "sync_sb_inodes mapping=%p dirty_map=%lx allowed=%lx\n", + mapping, mapping->dirty_nodes ? mapping->dirty_nodes->bits[0]: -1, + wbc->nodes->bits[0]); /* Was this inode dirtied after sync_sb_inodes was called? */ if (time_after(inode->dirtied_when, start)) @@ -385,6 +389,9 @@ sync_sb_inodes(struct super_block *sb, s * buffers. Skip this inode for now. */ list_move(&inode->i_list, &sb->s_dirty); + if (wbc->nodes) + printk(KERN_INFO "sync_sb_inodes: No writeout progress on mapping=%p map=%lx\n", + mapping, mapping->dirty_nodes ? mapping->dirty_nodes->bits[0]: -1); } spin_unlock(&inode_lock); iput(inode); Index: linux-2.6.20-rc5/mm/page-writeback.c =================================================================== --- linux-2.6.20-rc5.orig/mm/page-writeback.c 2007-01-22 15:10:52.000000000 -0600 +++ linux-2.6.20-rc5/mm/page-writeback.c 2007-01-22 15:10:57.579978052 -0600 @@ -271,6 +271,9 @@ static void balance_dirty_pages(struct a if (nr_reclaimable + dl.nr_writeback <= dl.thresh_dirty) break; pages_written += write_chunk - wbc.nr_to_write; + if (pages_written) + printk(KERN_INFO "Sync writeback nodes=%lx wrote %ld pages triggered by mapping %p\n", + cpuset_current_mems_allowed.bits[0], pages_written, mapping); if (pages_written >= write_chunk) break; /* We've done our duty */ } @@ -293,9 +296,12 @@ static void balance_dirty_pages(struct a * background_thresh, to keep the amount of dirty memory low. */ if ((laptop_mode && pages_written) || - (!laptop_mode && (nr_reclaimable > dl.thresh_background))) + (!laptop_mode && (nr_reclaimable > dl.thresh_background))) { + printk(KERN_INFO "Background writeback nodes=%lx triggered by mapping %p\n", + cpuset_current_mems_allowed.bits[0], mapping); pdflush_operation(background_writeout, 0, &cpuset_current_mems_allowed); + } } void set_page_dirty_balance(struct page *page) @@ -398,6 +404,9 @@ static void background_writeout(unsigned wbc.nr_to_write = MAX_WRITEBACK_PAGES; wbc.pages_skipped = 0; writeback_inodes(&wbc); + if (wbc.nodes) + printk(KERN_INFO "background_writeout: wrote %d pages.\n", MAX_WRITEBACK_PAGES - + wbc.nr_to_write); min_pages -= MAX_WRITEBACK_PAGES - wbc.nr_to_write; if (wbc.nr_to_write > 0 || wbc.pages_skipped > 0) { /* Wrote less than expected */ @@ -415,10 +424,15 @@ static void background_writeout(unsigned */ int wakeup_pdflush(long nr_pages, nodemask_t *nodes) { + int rc; + if (nr_pages == 0) nr_pages = global_page_state(NR_FILE_DIRTY) + global_page_state(NR_UNSTABLE_NFS); - return pdflush_operation(background_writeout, nr_pages, nodes); + rc = pdflush_operation(background_writeout, nr_pages, nodes); + printk(KERN_INFO "wakeup_pdflush(%ld,%lx) == %d\n",nr_pages, nodes ? nodes->bits[0]: 0, + rc); + return rc; } static void wb_timer_fn(unsigned long unused); Index: linux-2.6.20-rc5/kernel/cpuset.c =================================================================== --- linux-2.6.20-rc5.orig/kernel/cpuset.c 2007-01-22 15:10:52.000000000 -0600 +++ linux-2.6.20-rc5/kernel/cpuset.c 2007-01-22 15:15:47.355900028 -0600 @@ -2619,15 +2619,22 @@ void cpuset_update_dirty_nodes(struct ad if (!nodes) { nodes = kmalloc(sizeof(nodemask_t), GFP_ATOMIC); - if (!nodes) + if (!nodes) { + printk(KERN_INFO "cpuset_update_dirty_nodes: Cannot allocate nodemask for mapping=%p node=%d\n", + mapping, page_to_nid(page)); return; + } *nodes = NODE_MASK_NONE; mapping->dirty_nodes = nodes; } - if (!node_isset(node, *nodes)) + if (!node_isset(node, *nodes)) { + if (!node_isset(page_to_nid(page), *nodes)) + printk(KERN_INFO "cpuset_update__dirty_nodes: Dirty map update mapping=%p node=%d prior=%lx\n", + mapping, page_to_nid(page), nodes->bits[0]); node_set(node, *nodes); + } } void cpuset_clear_dirty_nodes(struct address_space *mapping)