Fix bugs introduced with the amap rework
authorstefan <stefan@openbsd.org>
Sat, 9 Jul 2016 17:13:05 +0000 (17:13 +0000)
committerstefan <stefan@openbsd.org>
Sat, 9 Jul 2016 17:13:05 +0000 (17:13 +0000)
commit4ca6b4a313a964b84e78dbcca59a65adae0757a1
tree4ac68e5830726e962972253754ca548562f7bff4
parentc5b6983d20fbf42bdb6f9134381d57c9d6857d65
Fix bugs introduced with the amap rework

- The number of slots must be initialized in the chunk of a small amap,
  otherwise unmapping() part of a mmap()'d range would delay freeing
  of vm_anons for small amaps
- If the first chunk of a bucket is freed, check if the next chunk in
  the list has to become the new first chunk
- Use a separate loop for each type of traversal (small amap, by bucket
  by list) in amap_wiperange(). This makes the code easier to follow and
  also fixes a bug where too many chunks were wiped out when traversing
  by list

However, the last two bugs should happen only when turning a previously
private mapping into a shared one, then forking, and then having
both processes unmap a part of the mapping.

snap and ports build tested by krw@, review by kettenis@
sys/uvm/uvm_amap.c