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 from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/