Print this page
patch segpcache-maxwindow-is-useless

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/vm/vm_seg.c
          +++ new/usr/src/uts/common/vm/vm_seg.c
↓ open down ↓ 118 lines elided ↑ open up ↑
 119  119  /*
 120  120   * log2(fraction of pcache to reclaim at a time).
 121  121   */
 122  122  #define P_SHRINK_SHFT           (5)
 123  123  
 124  124  /*
 125  125   * The following variables can be tuned via /etc/system.
 126  126   */
 127  127  
 128  128  int     segpcache_enabled = 1;          /* if 1, shadow lists are cached */
 129      -pgcnt_t segpcache_maxwindow = 0;        /* max # of pages that can be cached */
 130  129  ulong_t segpcache_hashsize_win = 0;     /* # of non wired buckets */
 131  130  ulong_t segpcache_hashsize_wired = 0;   /* # of wired buckets */
 132  131  int     segpcache_reap_sec = 1;         /* reap check rate in secs */
 133  132  clock_t segpcache_reap_ticks = 0;       /* reap interval in ticks */
 134  133  int     segpcache_pcp_maxage_sec = 1;   /* pcp max age in secs */
 135  134  clock_t segpcache_pcp_maxage_ticks = 0; /* pcp max age in ticks */
 136  135  int     segpcache_shrink_shift = P_SHRINK_SHFT; /* log2 reap fraction */
 137  136  pgcnt_t segpcache_maxapurge_bytes = P_MAX_APURGE_BYTES; /* max purge bytes */
 138  137  
 139  138  static kmutex_t seg_pcache_mtx; /* protects seg_pdisabled counter */
↓ open down ↓ 2 lines elided ↑ open up ↑
 142  141  
 143  142  #pragma align 64(pctrl1)
 144  143  #pragma align 64(pctrl2)
 145  144  #pragma align 64(pctrl3)
 146  145  
 147  146  /*
 148  147   * Keep frequently used variables together in one cache line.
 149  148   */
 150  149  static struct p_ctrl1 {
 151  150          uint_t p_disabled;              /* if not 0, caching temporarily off */
 152      -        pgcnt_t p_maxwin;               /* max # of pages that can be cached */
 153  151          size_t p_hashwin_sz;            /* # of non wired buckets */
 154  152          struct seg_phash *p_htabwin;    /* hash table for non wired entries */
 155  153          size_t p_hashwired_sz;          /* # of wired buckets */
 156  154          struct seg_phash_wired *p_htabwired; /* hash table for wired entries */
 157  155          kmem_cache_t *p_kmcache;        /* kmem cache for seg_pcache structs */
 158  156  #ifdef _LP64
 159      -        ulong_t pad[1];
      157 +        ulong_t pad[2];
 160  158  #endif /* _LP64 */
 161  159  } pctrl1;
 162  160  
 163  161  static struct p_ctrl2 {
 164  162          kmutex_t p_mem_mtx;     /* protects window counter and p_halinks */
 165  163          pgcnt_t  p_locked_win;  /* # pages from window */
 166  164          pgcnt_t  p_locked;      /* # of pages cached by pagelock */
 167  165          uchar_t  p_ahcur;       /* current active links for insert/delete */
 168  166          uchar_t  p_athr_on;     /* async reclaim thread is running. */
 169  167          pcache_link_t p_ahhead[2]; /* active buckets linkages */
↓ open down ↓ 4 lines elided ↑ open up ↑
 174  172          ulong_t p_athr_empty_ahb;       /* athread walk stats */
 175  173          ulong_t p_athr_full_ahb;        /* athread walk stats */
 176  174          pgcnt_t p_maxapurge_npages;     /* max pages to purge at a time */
 177  175          int     p_shrink_shft;          /* reap shift factor */
 178  176  #ifdef _LP64
 179  177          ulong_t pad[3];
 180  178  #endif /* _LP64 */
 181  179  } pctrl3;
 182  180  
 183  181  #define seg_pdisabled                   pctrl1.p_disabled
 184      -#define seg_pmaxwindow                  pctrl1.p_maxwin
 185  182  #define seg_phashsize_win               pctrl1.p_hashwin_sz
 186  183  #define seg_phashtab_win                pctrl1.p_htabwin
 187  184  #define seg_phashsize_wired             pctrl1.p_hashwired_sz
 188  185  #define seg_phashtab_wired              pctrl1.p_htabwired
 189  186  #define seg_pkmcache                    pctrl1.p_kmcache
 190  187  #define seg_pmem_mtx                    pctrl2.p_mem_mtx
 191  188  #define seg_plocked_window              pctrl2.p_locked_win
 192  189  #define seg_plocked                     pctrl2.p_locked
 193  190  #define seg_pahcur                      pctrl2.p_ahcur
 194  191  #define seg_pathr_on                    pctrl2.p_athr_on
↓ open down ↓ 554 lines elided ↑ open up ↑
 749  746  
 750  747          if (seg_pdisabled) {
 751  748                  return (SEGP_FAIL);
 752  749          }
 753  750          ASSERT(seg_phashsize_win != 0);
 754  751  
 755  752          if (IS_PFLAGS_WIRED(flags)) {
 756  753                  return (SEGP_SUCCESS);
 757  754          }
 758  755  
 759      -        if (seg_plocked_window + btop(len) > seg_pmaxwindow) {
 760      -                return (SEGP_FAIL);
 761      -        }
 762      -
 763  756          if (freemem < desfree) {
 764  757                  return (SEGP_FAIL);
 765  758          }
 766  759  
 767  760          return (SEGP_SUCCESS);
 768  761  }
 769  762  
 770  763  #ifdef DEBUG
 771  764  static uint32_t p_insert_mtbf = 0;
 772  765  #endif
↓ open down ↓ 49 lines elided ↑ open up ↑
 822  815  
 823  816          if (seg_pdisabled) {
 824  817                  return (SEGP_FAIL);
 825  818          }
 826  819          ASSERT(seg_phashsize_win != 0);
 827  820  
 828  821          ASSERT((len & PAGEOFFSET) == 0);
 829  822          npages = btop(len);
 830  823          mutex_enter(&seg_pmem_mtx);
 831  824          if (!IS_PFLAGS_WIRED(flags)) {
 832      -                if (seg_plocked_window + npages > seg_pmaxwindow) {
 833      -                        mutex_exit(&seg_pmem_mtx);
 834      -                        return (SEGP_FAIL);
 835      -                }
 836  825                  seg_plocked_window += npages;
 837  826          }
 838  827          seg_plocked += npages;
 839  828          mutex_exit(&seg_pmem_mtx);
 840  829  
 841  830          pcp = kmem_cache_alloc(seg_pkmcache, KM_SLEEP);
 842  831          /*
 843  832           * If amp is not NULL set htag0 to amp otherwise set it to seg.
 844  833           */
 845  834          if (amp == NULL) {
↓ open down ↓ 95 lines elided ↑ open up ↑
 941  930          struct seg_phash *hp;
 942  931          pgcnt_t npages = 0;
 943  932          pgcnt_t npages_window = 0;
 944  933          pgcnt_t npgs_to_purge;
 945  934          pgcnt_t npgs_purged = 0;
 946  935          int hlinks = 0;
 947  936          int hlix;
 948  937          pcache_link_t *hlinkp;
 949  938          pcache_link_t *hlnextp = NULL;
 950  939          int lowmem;
 951      -        int trim;
 952  940  
 953  941          ASSERT(seg_phashsize_win != 0);
 954  942  
 955  943          /*
 956  944           * if the cache is off or empty, return
 957  945           */
 958  946          if (seg_plocked == 0 || (!force && seg_plocked_window == 0)) {
 959  947                  return;
 960  948          }
 961  949  
 962  950          if (!force) {
 963  951                  lowmem = 0;
 964      -                trim = 0;
 965  952                  if (freemem < lotsfree + needfree) {
 966  953                          spgcnt_t fmem = MAX((spgcnt_t)(freemem - needfree), 0);
 967  954                          if (fmem <= 5 * (desfree >> 2)) {
 968  955                                  lowmem = 1;
 969  956                          } else if (fmem <= 7 * (lotsfree >> 3)) {
 970  957                                  if (seg_plocked_window >=
 971  958                                      (availrmem_initial >> 1)) {
 972  959                                          lowmem = 1;
 973  960                                  }
 974  961                          } else if (fmem < lotsfree) {
 975  962                                  if (seg_plocked_window >=
 976  963                                      3 * (availrmem_initial >> 2)) {
 977  964                                          lowmem = 1;
 978  965                                  }
 979  966                          }
 980  967                  }
 981      -                if (seg_plocked_window >= 7 * (seg_pmaxwindow >> 3)) {
 982      -                        trim = 1;
 983      -                }
 984      -                if (!lowmem && !trim) {
      968 +                if (!lowmem) {
 985  969                          return;
 986  970                  }
 987  971                  npgs_to_purge = seg_plocked_window >>
 988  972                      seg_pshrink_shift;
 989  973                  if (lowmem) {
 990  974                          npgs_to_purge = MIN(npgs_to_purge,
 991  975                              MAX(seg_pmaxapurge_npages, desfree));
 992  976                  } else {
 993  977                          npgs_to_purge = MIN(npgs_to_purge,
 994  978                              seg_pmaxapurge_npages);
↓ open down ↓ 107 lines elided ↑ open up ↑
1102 1086                          seg_premove_abuck(hp, 1);
1103 1087                  }
1104 1088                  mutex_exit(&hp->p_hmutex);
1105 1089                  if (npgs_purged >= seg_plocked_window) {
1106 1090                          break;
1107 1091                  }
1108 1092                  if (!force) {
1109 1093                          if (npgs_purged >= npgs_to_purge) {
1110 1094                                  break;
1111 1095                          }
1112      -                        if (!trim && !(seg_pathr_full_ahb & 15)) {
     1096 +                        if (!(seg_pathr_full_ahb & 15)) {
1113 1097                                  ASSERT(lowmem);
1114 1098                                  if (freemem >= lotsfree + needfree) {
1115 1099                                          break;
1116 1100                                  }
1117 1101                          }
1118 1102                  }
1119 1103          }
1120 1104  
1121 1105          if (hlinkp == &seg_pahhead[hlix]) {
1122 1106                  /*
↓ open down ↓ 340 lines elided ↑ open up ↑
1463 1447          seg_phashsize_wired = segpcache_hashsize_wired;
1464 1448          seg_phashtab_wired = kmem_zalloc(
1465 1449              seg_phashsize_wired * sizeof (struct seg_phash_wired), KM_SLEEP);
1466 1450          for (i = 0; i < seg_phashsize_wired; i++) {
1467 1451                  hp = (struct seg_phash *)&seg_phashtab_wired[i];
1468 1452                  hp->p_hnext = (struct seg_pcache *)hp;
1469 1453                  hp->p_hprev = (struct seg_pcache *)hp;
1470 1454                  mutex_init(&hp->p_hmutex, NULL, MUTEX_DEFAULT, NULL);
1471 1455          }
1472 1456  
1473      -        if (segpcache_maxwindow == 0) {
1474      -                if (physmegs < 64) {
1475      -                        /* 3% of memory */
1476      -                        segpcache_maxwindow = availrmem >> 5;
1477      -                } else if (physmegs < 512) {
1478      -                        /* 12% of memory */
1479      -                        segpcache_maxwindow = availrmem >> 3;
1480      -                } else if (physmegs < 1024) {
1481      -                        /* 25% of memory */
1482      -                        segpcache_maxwindow = availrmem >> 2;
1483      -                } else if (physmegs < 2048) {
1484      -                        /* 50% of memory */
1485      -                        segpcache_maxwindow = availrmem >> 1;
1486      -                } else {
1487      -                        /* no limit */
1488      -                        segpcache_maxwindow = (pgcnt_t)-1;
1489      -                }
1490      -        }
1491      -        seg_pmaxwindow = segpcache_maxwindow;
1492 1457          seg_pinit_mem_config();
1493 1458  }
1494 1459  
1495 1460  /*
1496 1461   * called by pageout if memory is low
1497 1462   */
1498 1463  void
1499 1464  seg_preap(void)
1500 1465  {
1501 1466          /*
↓ open down ↓ 549 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX