bug-hurd
[Top][All Lists]
Advanced

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

Re: [RFC PATCH 5/7] vm: Eagerly release deallocated pages


From: Samuel Thibault
Subject: Re: [RFC PATCH 5/7] vm: Eagerly release deallocated pages
Date: Mon, 3 Jul 2023 02:21:46 +0200
User-agent: NeoMutt/20170609 (1.8.3)

Applied, thanks!

Sergey Bugaev, le lun. 26 juin 2023 14:26:54 +0300, a ecrit:
> If a deallocated VM map entry refers to an object that only has a single
> reference and doesn't have a pager port, we can eagerly release any
> physical pages that were contained in the deallocated range.
> 
> This is not a 100% solution: it is still possible to "leak" physical
> pages that can never appear in virtual memory again by creating several
> references to a memory object (perhaps by forking a VM map with
> VM_INHERIT_SHARE) and deallocating the pages from all the maps referring
> to the object. That being said, it should help to release the pages in
> the common case sooner.
> ---
> 
> This is also probably fine to do if object->temporary, but let's stick
> with !object->pager_created as a more conservative check.
> 
>  vm/vm_map.c | 26 +++++++++++++++++++++-----
>  1 file changed, 21 insertions(+), 5 deletions(-)
> 
> diff --git a/vm/vm_map.c b/vm/vm_map.c
> index 0d3b11f2..97fc09ce 100644
> --- a/vm/vm_map.c
> +++ b/vm/vm_map.c
> @@ -1902,11 +1902,13 @@ void vm_map_entry_delete(
>       vm_map_entry_t  entry)
>  {
>       vm_offset_t             s, e;
> +     vm_size_t               size;
>       vm_object_t             object;
>       extern vm_object_t      kernel_object;
>  
>       s = entry->vme_start;
>       e = entry->vme_end;
> +     size = e - s;
>  
>       /*Check if projected buffer*/
>       if (map != kernel_map && entry->projected_on != 0) {
> @@ -1945,15 +1947,29 @@ void vm_map_entry_delete(
>           if (object == kernel_object) {
>               vm_object_lock(object);
>               vm_object_page_remove(object, entry->offset,
> -                             entry->offset + (e - s));
> +                             entry->offset + size);
>               vm_object_unlock(object);
>           } else if (entry->is_shared) {
>               vm_object_pmap_remove(object,
>                                entry->offset,
> -                              entry->offset + (e - s));
> -         }
> -         else {
> +                              entry->offset + size);
> +         } else {
>               pmap_remove(map->pmap, s, e);
> +             /*
> +              *      If this object has no pager and our
> +              *      reference to the object is the only
> +              *      one, we can release the deleted pages
> +              *      now.
> +              */
> +             vm_object_lock(object);
> +             if ((!object->pager_created) &&
> +                 (object->ref_count == 1) &&
> +                 (object->paging_in_progress == 0)) {
> +                     vm_object_page_remove(object,
> +                             entry->offset,
> +                             entry->offset + size);
> +             }
> +             vm_object_unlock(object);
>           }
>          }
>  
> @@ -1968,7 +1984,7 @@ void vm_map_entry_delete(
>               vm_object_deallocate(entry->object.vm_object);
>  
>       vm_map_entry_unlink(map, entry);
> -     map->size -= e - s;
> +     map->size -= size;
>  
>       vm_map_entry_dispose(map, entry);
>  }
> -- 
> 2.41.0
> 

-- 
Samuel
---
Pour une évaluation indépendante, transparente et rigoureuse !
Je soutiens la Commission d'Évaluation de l'Inria.



reply via email to

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