[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
- [PATCH 0/6] Various libpager fixes, Sergey Bugaev, 2021/05/06
- [PATCH 1/6] libpager: Fix mixing up success and error, Sergey Bugaev, 2021/05/06
- [PATCH 2/6] libpager: Do not flush in-core pages on offer, Sergey Bugaev, 2021/05/06
- [PATCH 4/6] libpager: Store pagemapsize as vm_size_t, Sergey Bugaev, 2021/05/06
- [PATCH 6/6] libpager: Use libc heap for pagemap,
Sergey Bugaev <=
- [PATCH 3/6] libpager: Add error handling to various functions, Sergey Bugaev, 2021/05/06
- [PATCH 5/6] libpager: Fix overallocating pagemap, Sergey Bugaev, 2021/05/06
- And another patch..., Sergey Bugaev, 2021/05/06