libc already implements the functionality for allocating and managing memory blocks like the pagemap. Using libc functions gives us some additional niceties like overflow checking in reallocarray (). it also means that we will not allocate a whole page of memory if we need to store just a few integers. --- libpager/object-terminate.c | 5 +++-- libpager/pagemap.c | 26 +++++++++----------------- 2 files changed, 12 insertions(+), 19 deletions(-)
diff --git a/libpager/object-terminate.c b/libpager/object-terminate.c index 95298217..3e7df167 100644 --- a/libpager/object-terminate.c +++ b/libpager/object-terminate.c @@ -17,6 +17,7 @@ #include "priv.h" #include "memory_object_S.h" +#include <stdlib.h> #include <stdio.h> /* Implement the object termination call from the kernel as described @@ -118,10 +119,10 @@ _pager_free_structure (struct pager *p) /* Free the pagemap */ if (p->pagemapsize) { - munmap (p->pagemap, p->pagemapsize * sizeof (* p->pagemap)); + free (p->pagemap); p->pagemapsize = 0; p->pagemap = 0; } - + p->pager_state = NOTINIT; } diff --git a/libpager/pagemap.c b/libpager/pagemap.c index 1570c75b..7bbb8c56 100644 --- a/libpager/pagemap.c +++ b/libpager/pagemap.c @@ -16,33 +16,25 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "priv.h" +#include <stdlib.h> #include <string.h> /* Grow the pagemap of pager P as necessary to deal with address OFF */ error_t _pager_pagemap_resize (struct pager *p, vm_address_t off) { - error_t err = 0; - off /= __vm_page_size; if (p->pagemapsize < off) { - void *newaddr; - vm_size_t newsize = round_page (off * sizeof (*p->pagemap)) - / sizeof (*p->pagemap); - - newaddr = mmap (0, newsize * sizeof (*p->pagemap), - PROT_READ|PROT_WRITE, MAP_ANON, 0, 0); - err = (newaddr == (void *) -1) ? errno : 0; - if (! err) - { - memcpy (newaddr, p->pagemap, p->pagemapsize * sizeof (*p->pagemap)); - munmap (p->pagemap, p->pagemapsize * sizeof (*p->pagemap)); - p->pagemap = newaddr; - p->pagemapsize = newsize; - } + void *newaddr = reallocarray (p->pagemap, off, + sizeof (*p->pagemap)); + if (!newaddr) + return errno; + + p->pagemap = newaddr; + p->pagemapsize = off; } - return err; + return 0; } -- 2.31.1