From ec5632b9ba7fe4666307e7210245f3aa2f25de88 Mon Sep 17 00:00:00 2001 From: Sergey Bugaev Date: Thu, 6 May 2021 15:56:31 +0300 Subject: libpager: Use libc heap for pagemap 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. Message-Id: <20210506125631.79117-7-bugaevc@gmail.com> --- libpager/object-terminate.c | 5 +++-- libpager/pagemap.c | 26 +++++++++----------------- 2 files changed, 12 insertions(+), 19 deletions(-) (limited to 'libpager') 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 #include /* 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 #include /* 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; } -- cgit v1.2.3