[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH 6/6] libpager: Use libc heap for pagemap
From: |
Samuel Thibault |
Subject: |
Re: [PATCH 6/6] libpager: Use libc heap for pagemap |
Date: |
Fri, 7 May 2021 00:14:13 +0200 |
User-agent: |
NeoMutt/20170609 (1.8.3) |
Sergey Bugaev, le jeu. 06 mai 2021 15:56:31 +0300, a ecrit:
> 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.
Applied, thanks!
> ---
> 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
>
>
--
Samuel
*** s has joined channel #ens-mim
<N> re
<s> pfff
<s> mare de la pfp.
<s> pas commencer et j'en ai deja marre.
<s> bon ct juste un cou de gueule ++
*** s has left channel #ens-mim (s)
-+- #ens-mim et la peufeupeu -+-
- [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, 2021/05/06
- [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
- Re: And another patch..., Samuel Thibault, 2021/05/08
- Re: And another patch..., Sergey Bugaev, 2021/05/08
- [PATCH 0/4] _pager_do_write_request fixes, Sergey Bugaev, 2021/05/08
- [PATCH 3/4] libpager: Track which pages are precious, Sergey Bugaev, 2021/05/08
- [PATCH 4/4] libpager: Do not throw away precious pages, Sergey Bugaev, 2021/05/08
- [PATCH 2/4] libpager: Store omit_data in an array, Sergey Bugaev, 2021/05/08