On 07/03/2013 01:34 AM, Joonsoo Kim wrote: > - if (page) > + do { > + page = buffered_rmqueue(preferred_zone, zone, order, > + gfp_mask, migratetype); > + if (!page) > + break; > + > + if (!nr_pages) { > + count++; > + break; > + } > + > + pages[count++] = page; > + if (count >= *nr_pages) > + break; > + > + mark = zone->watermark[alloc_flags & ALLOC_WMARK_MASK]; > + if (!zone_watermark_ok(zone, order, mark, > + classzone_idx, alloc_flags)) > + break; > + } while (1); I'm really surprised this works as well as it does. Calling buffered_rmqueue() a bunch of times enables/disables interrupts a bunch of times, and mucks with the percpu pages lists a whole bunch. buffered_rmqueue() is really meant for _single_ pages, not to be called a bunch of times in a row. Why not just do a single rmqueue_bulk() call? -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>