Print this page
arc_get_data_buf should be more aggressive in eviction when memory is unavailable

@@ -219,10 +219,24 @@
 
         return (kmem_cache_alloc(zio_buf_cache[c], KM_PUSHPAGE));
 }
 
 /*
+ * Same as zio_buf_alloc, but won't sleep in case memory cannot be allocated
+ * and will instead return immediately with a failure.
+ */
+void *
+zio_buf_alloc_canfail(size_t size)
+{
+        size_t c = (size - 1) >> SPA_MINBLOCKSHIFT;
+
+        ASSERT(c < SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT);
+
+        return (kmem_cache_alloc(zio_buf_cache[c], KM_NOSLEEP | KM_NORMALPRI));
+}
+
+/*
  * Use zio_data_buf_alloc to allocate data.  The data will not appear in a
  * crashdump if the kernel panics.  This exists so that we will limit the amount
  * of ZFS data that shows up in a kernel crashdump.  (Thus reducing the amount
  * of kernel heap dumped to disk when the kernel panics)
  */

@@ -234,10 +248,25 @@
         ASSERT(c < SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT);
 
         return (kmem_cache_alloc(zio_data_buf_cache[c], KM_PUSHPAGE));
 }
 
+/*
+ * Same as zio_data_buf_alloc, but won't sleep in case memory cannot be
+ * allocated and will instead return immediately with a failure.
+ */
+void *
+zio_data_buf_alloc_canfail(size_t size)
+{
+        size_t c = (size - 1) >> SPA_MINBLOCKSHIFT;
+
+        ASSERT(c < SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT);
+
+        return (kmem_cache_alloc(zio_data_buf_cache[c],
+            KM_NOSLEEP | KM_NORMALPRI));
+}
+
 void
 zio_buf_free(void *buf, size_t size)
 {
         size_t c = (size - 1) >> SPA_MINBLOCKSHIFT;