Messages in this thread | | | Date | Wed, 10 Jul 2013 15:52:42 -0700 | From | Dave Hansen <> | Subject | Re: [RFC PATCH 1/5] mm, page_alloc: support multiple pages allocation |
| |
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?
| |