Print this page
        
@@ -128,10 +128,19 @@
 #define TUNE_NVMU       "phys-mcap-no-vmusage"
 #define TUNE_NPAGE      "phys-mcap-no-pageout"
 #define TUNE_NPFTHROT   "phys-mcap-no-pf-throttle"
 
 /*
+ * The large mapping value was derived empirically by seeing that mappings
+ * much bigger than 16mb sometimes take a relatively long time to invalidate
+ * (significant fraction of a second).
+ */
+#define SEC_INTERIM     4       /* num secs to pause after stopped too long */
+#define MSEC_TOO_LONG   100     /* release proc. after stopped for 100ms */
+#define LARGE_MAPPING   16384   /* >= 16MB in KB - pageout in chunks */
+
+/*
  * These are only used in get_mem_info but global. We always need scale_rss and
  * prev_fast_rss to be persistent but we also have the other two global so we
  * can easily see these with mdb.
  */
 uint64_t        scale_rss = 0;
@@ -151,12 +160,10 @@
 static char     over_cmd[2 * BUFSIZ];   /* same size as zone_attr_value */
 static boolean_t skip_vmusage = B_FALSE;
 static boolean_t skip_pageout = B_FALSE;
 static boolean_t skip_pf_throttle = B_FALSE;
 
-static zlog_t   *logp;
-
 static int64_t check_suspend();
 static void get_mcap_tunables();
 
 /*
  * Structure to hold current state about a process address space that we're
@@ -377,11 +384,10 @@
 pageout_process(pid_t pid, int64_t excess)
 {
         int                     psfd;
         prmap_t                 *pmap;
         proc_map_t              cur;
-        int                     res;
         int64_t                 sum_d_rss, d_rss;
         int64_t                 old_rss;
         int                     map_cnt;
         psinfo_t                psinfo;
         char                    pathbuf[MAXPATHLEN];
@@ -429,13 +435,14 @@
          * Within the process's address space, attempt to page out mappings.
          */
         sum_d_rss = 0;
         while (excess > 0 && pmap != NULL && !shutting_down) {
                 /* invalidate the entire mapping */
-                if ((res = pageout_mapping(pid, pmap)) < 0)
+                if (pageout_mapping(pid, pmap) < 0)
                         debug("pid %ld: mapping 0x%p %ldkb unpageable (%d)\n",
-                            pid, pmap->pr_vaddr, pmap->pr_size / 1024, errno);
+                            pid, (void *)pmap->pr_vaddr,
+                            (long)pmap->pr_size / 1024L, errno);
 
                 map_cnt++;
 
                 /*
                  * Re-check the process rss and get the delta.
@@ -1145,11 +1152,10 @@
 {
         int             res;
 
         shutting_down = 0;
         zid = id;
-        logp = zlogp;
 
         /* all but the lx brand currently use /proc */
         if (strcmp(brand_name, "lx") == 0) {
                 (void) snprintf(zoneproc, sizeof (zoneproc),
                     "%s/root/native/proc", zonepath);