bug-hurd
[Top][All Lists]
Advanced

[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 -+-



reply via email to

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