On Fri, Jun 15, 2018 at 09:50:05PM -0700, Matthew Wilcox wrote:
> I wonder if (to address Michael's concern), you shouldn't instead use
> the first free chunk of pages to return the addresses of all the pages.
> ie something like this:
> 
>       __le64 *ret = NULL;
>       unsigned int max = (PAGE_SIZE << order) / sizeof(__le64);
> 
>       for_each_populated_zone(zone) {
>               spin_lock_irq(&zone->lock);
>               for (mt = 0; mt < MIGRATE_TYPES; mt++) {
>                       list = &zone->free_area[order].free_list[mt];
>                       list_for_each_entry_safe(page, list, lru, ...) {
>                               if (index == size)
>                                       break;
>                               addr = page_to_pfn(page) << PAGE_SHIFT;
>                               if (!ret) {
>                                       list_del(...);
>                                       ret = addr;
>                               }
>                               ret[index++] = cpu_to_le64(addr);
>                       }
>               }
>               spin_unlock_irq(&zone->lock);
>       }
> 
>       return ret;
> }
> 
> You'll need to return the page to the freelist afterwards, but free_pages()
> should take care of that.

Yes Wei already came up with the idea to stick this data into a
MAX_ORDER allocation. Are you sure just taking an entry off
the list like that has no bad side effects?
I have a vague memory someone complained that everyone
most go through get free pages/kmalloc, but I can't
find that anymore.


-- 
MST
_______________________________________________
Virtualization mailing list
Virtualization@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/virtualization

Reply via email to