On Tue, Aug 11, 2015 at 10:39:20AM +0000, Alexander Motin wrote:
> Author: mav
> Date: Tue Aug 11 10:39:19 2015
> New Revision: 286625
> URL: https://svnweb.freebsd.org/changeset/base/286625
> 
> Log:
>   MFV r277425:
>   5376 arc_kmem_reap_now() should not result in clearing arc_no_grow
>   Reviewed by: Christopher Siden <christopher.si...@delphix.com>
>   Reviewed by: George Wilson <george.wil...@delphix.com>
>   Reviewed by: Steven Hartland <kill...@multiplay.co.uk>
>   Reviewed by: Richard Elling <richard.ell...@richardelling.com>
>   Approved by: Dan McDonald <dan...@omniti.com>
>   Author: Matthew Ahrens <mahr...@delphix.com>
>   
>   illumos/illumos-gate@2ec99e3e987d8aa273f1e9ba2b983557d058198c
> 
> Modified:
>   head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
> 
> Modified: head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
> ==============================================================================
> --- head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c Tue Aug 11 
> 09:26:11 2015        (r286624)
> +++ head/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c Tue Aug 11 
> 10:39:19 2015        (r286625)
> @@ -153,13 +153,7 @@ static kmutex_t          arc_reclaim_thr_lock;
>  static kcondvar_t    arc_reclaim_thr_cv;     /* used to signal reclaim thr */
>  static uint8_t               arc_thread_exit;
>  
> -#define      ARC_REDUCE_DNLC_PERCENT 3
> -uint_t arc_reduce_dnlc_percent = ARC_REDUCE_DNLC_PERCENT;
> -
> -typedef enum arc_reclaim_strategy {
> -     ARC_RECLAIM_AGGR,               /* Aggressive reclaim strategy */
> -     ARC_RECLAIM_CONS                /* Conservative reclaim strategy */
> -} arc_reclaim_strategy_t;
> +uint_t arc_reduce_dnlc_percent = 3;
>  
>  /*
>   * The number of iterations through arc_evict_*() before we
> @@ -174,7 +168,19 @@ static int               arc_grow_retry = 60;
>  static int           arc_p_min_shift = 4;
>  
>  /* log2(fraction of arc to reclaim) */
> -static int           arc_shrink_shift = 5;
> +static int           arc_shrink_shift = 7;
> +
> +/*
> + * log2(fraction of ARC which must be free to allow growing).
> + * I.e. If there is less than arc_c >> arc_no_grow_shift free memory,
> + * when reading a new block into the ARC, we will evict an equal-sized block
> + * from the ARC.
> + *
> + * This must be less than arc_shrink_shift, so that when we shrink the ARC,
> + * we will still not allow it to grow.
> + */
> +int                  arc_no_grow_shift = 5;
> +
>  
>  /*
>   * minimum lifespan of a prefetch block in clock ticks
> @@ -3055,13 +3061,10 @@ arc_flush(spa_t *spa)
>  }
>  
>  void
> -arc_shrink(void)
> +arc_shrink(int64_t to_free)
>  {
>  
>       if (arc_c > arc_c_min) {
> -             uint64_t to_free;
> -
> -             to_free = arc_c >> arc_shrink_shift;
>               DTRACE_PROBE4(arc__shrink, uint64_t, arc_c, uint64_t,
>                       arc_c_min, uint64_t, arc_p, uint64_t, to_free);
>               if (arc_c > arc_c_min + to_free)
> @@ -3089,44 +3092,76 @@ arc_shrink(void)
>       }
>  }
>  
> -static int needfree = 0;
> +static long needfree = 0;
>  
> -static int
> -arc_reclaim_needed(void)
> +typedef enum free_memory_reason_t {
> +     FMR_UNKNOWN,
> +     FMR_NEEDFREE,
> +     FMR_LOTSFREE,
> +     FMR_SWAPFS_MINFREE,
> +     FMR_PAGES_PP_MAXIMUM,
> +     FMR_HEAP_ARENA,
> +     FMR_ZIO_ARENA,
> +     FMR_ZIO_FRAG,
> +} free_memory_reason_t;
> +
> +int64_t last_free_memory;
> +free_memory_reason_t last_free_reason;
> +
> +/*
> + * Additional reserve of pages for pp_reserve.
> + */
> +int64_t arc_pages_pp_reserve = 64;
> +
> +/*
> + * Additional reserve of pages for swapfs.
> + */
> +int64_t arc_swapfs_reserve = 64;
> +
> +/*
> + * Return the amount of memory that can be consumed before reclaim will be
> + * needed.  Positive if there is sufficient free memory, negative indicates
> + * the amount of memory that needs to be freed up.
> + */
> +static int64_t
> +arc_available_memory(void)
>  {
> +     int64_t lowest = INT64_MAX;
> +     int64_t n;
> +     free_memory_reason_t r = FMR_UNKNOWN;
>  
>  #ifdef _KERNEL
> -
> -     if (needfree) {
> -             DTRACE_PROBE(arc__reclaim_needfree);
> -             return (1);
> +     if (needfree > 0) {
> +             n = PAGESIZE * (-needfree);
> +             if (n < lowest) {
> +                     lowest = n;
> +                     r = FMR_NEEDFREE;
> +             }
>       }
>  
>       /*
>        * Cooperate with pagedaemon when it's time for it to scan
>        * and reclaim some pages.
>        */
> -     if (freemem < zfs_arc_free_target) {
> -             DTRACE_PROBE2(arc__reclaim_freemem, uint64_t,
> -                 freemem, uint64_t, zfs_arc_free_target);
> -             return (1);
> +     n = PAGESIZE * (int64_t)(freemem - zfs_arc_free_target);
> +     if (n < lowest) {
> +             lowest = n;
> +             r = FMR_LOTSFREE;
>       }
>  
>  #ifdef illumos
>       /*
> -      * take 'desfree' extra pages, so we reclaim sooner, rather than later
> -      */
> -     extra = desfree;
> -
> -     /*
>        * check that we're out of range of the pageout scanner.  It starts to
>        * schedule paging if freemem is less than lotsfree and needfree.
>        * lotsfree is the high-water mark for pageout, and needfree is the
>        * number of needed free pages.  We add extra pages here to make sure
>        * the scanner doesn't start up while we're freeing memory.
>        */
> -     if (freemem < lotsfree + needfree + extra)
> -             return (1);
> +     n = PAGESIZE * (freemem - lotsfree - needfree - desfree);
> +     if (n < lowest) {
> +             lowest = n;
> +             r = FMR_LOTSFREE;
> +     }
>  
>       /*
>        * check to make sure that swapfs has enough space so that anon
> @@ -3135,8 +3170,13 @@ arc_reclaim_needed(void)
>        * swap pages.  We also add a bit of extra here just to prevent
>        * circumstances from getting really dire.
>        */
> -     if (availrmem < swapfs_minfree + swapfs_reserve + extra)
> -             return (1);
> +     n = PAGESIZE * (availrmem - swapfs_minfree - swapfs_reserve -
> +         desfree - arc_swapfs_reserve);
> +     if (n < lowest) {
> +             lowest = n;
> +             r = FMR_SWAPFS_MINFREE;
> +     }
> +
>  
>       /*
>        * Check that we have enough availrmem that memory locking (e.g., via
> @@ -3145,8 +3185,12 @@ arc_reclaim_needed(void)
>        * drops below pages_pp_maximum, page locking mechanisms such as
>        * page_pp_lock() will fail.)
>        */
> -     if (availrmem <= pages_pp_maximum)
> -             return (1);
> +     n = PAGESIZE * (availrmem - pages_pp_maximum -
> +         arc_pages_pp_reserve);
> +     if (n < lowest) {
> +             lowest = n;
> +             r = FMR_PAGES_PP_MAXIMUM;
> +     }
>  
>  #endif       /* illumos */
>  #if defined(__i386) || !defined(UMA_MD_SMALL_ALLOC)
> @@ -3161,12 +3205,11 @@ arc_reclaim_needed(void)
>        * heap is allocated.  (Or, in the calculation, if less than 1/4th is
>        * free)
>        */
> -     if (vmem_size(heap_arena, VMEM_FREE) <
> -         (vmem_size(heap_arena, VMEM_FREE | VMEM_ALLOC) >> 2)) {
> -             DTRACE_PROBE2(arc__reclaim_used, uint64_t,
> -                 vmem_size(heap_arena, VMEM_FREE), uint64_t,
> -                 (vmem_size(heap_arena, VMEM_FREE | VMEM_ALLOC)) >> 2);
> -             return (1);
> +     n = vmem_size(heap_arena, VMEM_FREE) -
> +         (vmem_size(heap_arena, VMEM_FREE | VMEM_ALLOC) >> 2)

Missing a ';' here

Best regards,
Bapt

Attachment: pgploXFzXuzuV.pgp
Description: PGP signature

Reply via email to