summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Bugaev <bugaevc@gmail.com>2021-05-06 15:56:31 +0300
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2021-05-07 00:13:54 +0200
commitec5632b9ba7fe4666307e7210245f3aa2f25de88 (patch)
tree08142ebf6362b7cb6297b18362cffe5ddbc84ac5
parent93023e79f28a85b5e3f2a05c95b49719b3f72bb1 (diff)
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>
-rw-r--r--libpager/object-terminate.c5
-rw-r--r--libpager/pagemap.c26
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;
}