bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 6/6] libpager: Use libc heap for pagemap


From: Sergey Bugaev
Subject: [PATCH 6/6] libpager: Use libc heap for pagemap
Date: Thu, 6 May 2021 15:56:31 +0300

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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]