This change adds an interface for allocating multiple pages
from a reservation. It is meant to be used instead of invoking
vm_reserv_alloc_page in a loop.
Details
Diff Detail
- Repository
 - rG FreeBSD src repository
 - Lint
 Lint Skipped - Unit
 Tests Skipped 
Event Timeline
| sys/vm/vm_reserv.c | ||
|---|---|---|
| 854 | How is it possible for the pages to not be physically contiguous? Don't they always come from a single reservation?  | |
| sys/vm/vm_reserv.c | ||
|---|---|---|
| 854 | You are right, after taking a closer look at the reservation lifecycle I see that this cannot happen. I've corrected the comment.  | |
| sys/vm/vm_reserv.c | ||
|---|---|---|
| 964 | Can this condition actually arise? That would mean that the page is already allocated, which is presumably due to a bug in the caller.  | |
| 966 | If you assume that the returned run of pages is always contiguous, then you don't need to return a pointer to each page. You can simply return a point to the first page in the run, and a count. Then, it's probably profitable to have a variant of vm_reserv_populate() which adjusts the reservation for count pages starting at index, e.g., using bit_nset() rather than a loop.  | |
| sys/vm/vm_reserv.c | ||
|---|---|---|
| 964 | Other than a caller bug or a vm_reserv bug I don't think so.  | |
| 966 | Right, I'll work that assumption into the code. Callers can "unpack" the returned run into individual 0-order pages if need be.  | |
| sys/vm/vm_reserv.c | ||
|---|---|---|
| 964 | It happens due to vm_page_rename()s by, for example, vm_fault(). (I'm incredibly busy this week, when my workload lightens next week, I will elaborate.)  | |
| sys/vm/vm_reserv.c | ||
|---|---|---|
| 964 | Ahh, right, I forgot that it's possible for a page to be allocated from a reservation without belonging to the object that "owns" the reservation. But, in this case I believe we have to terminate the loop, not continue.  | |
Update diff according to @markj 's suggestion - pages are now allocated using a combination of bit_nset and bit_ffs_at.