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

*** 219,228 **** --- 219,242 ---- 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,243 **** --- 248,272 ---- 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;