]> git.proxmox.com Git - mirror_zfs.git/commitdiff
Add hdr_recl() reclaim callback
authorBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 29 Jun 2015 17:34:47 +0000 (10:34 -0700)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Thu, 23 Jul 2015 16:42:40 +0000 (09:42 -0700)
Originally removed because it wasn't required under Linux.  However,
there may still be some utility in signaling the arc reclaim thread
under Linux via reclaim.  This should already have happened by other
means but it's not harmless and reduces another point of divergence
with upstream.

Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Issue #3533

module/zfs/arc.c

index 2661bc8a78b073bab8cb457a8d0f58c4189e6009..e37d9d881ca728e1b35b263df5e67cbffd822034 100644 (file)
@@ -1054,6 +1054,22 @@ buf_dest(void *vbuf, void *unused)
        arc_space_return(sizeof (arc_buf_t), ARC_SPACE_HDRS);
 }
 
+/*
+ * Reclaim callback -- invoked when memory is low.
+ */
+/* ARGSUSED */
+static void
+hdr_recl(void *unused)
+{
+       dprintf("hdr_recl called\n");
+       /*
+        * umem calls the reclaim func when we destroy the buf cache,
+        * which is after we do arc_fini().
+        */
+       if (!arc_dead)
+               cv_signal(&arc_reclaim_thread_cv);
+}
+
 static void
 buf_init(void)
 {
@@ -1089,9 +1105,9 @@ retry:
        }
 
        hdr_full_cache = kmem_cache_create("arc_buf_hdr_t_full", HDR_FULL_SIZE,
-           0, hdr_full_cons, hdr_full_dest, NULL, NULL, NULL, 0);
+           0, hdr_full_cons, hdr_full_dest, hdr_recl, NULL, NULL, 0);
        hdr_l2only_cache = kmem_cache_create("arc_buf_hdr_t_l2only",
-           HDR_L2ONLY_SIZE, 0, hdr_l2only_cons, hdr_l2only_dest, NULL,
+           HDR_L2ONLY_SIZE, 0, hdr_l2only_cons, hdr_l2only_dest, hdr_recl,
            NULL, NULL, 0);
        buf_cache = kmem_cache_create("arc_buf_t", sizeof (arc_buf_t),
            0, buf_cons, buf_dest, NULL, NULL, NULL, 0);