- The balance_dirty_pages() logic is simply wrong. It goes:
if (value > threshold)
go_and_write(value - threshold);
which is just fine for a single process writing data. But
for many processes, they *all* go and bring things back into
balance, and too much data gets written out.
- The
go_and_write(this much)
logic is inoperative, because I turned off the ->writeback_mapping()
function in ext2. So a call to writeback_unlocked_inodes(this_much)
doesn't actually decrement and test *this_much. It will walk every
inode, all the time. Silly.
So quickly fixing the above things, the amount of dirty+writeback
memory in the machine nicely stabilises at 500 megabytes across
the run.