From 2517c8ee08ef21ba112c00a94070302cdca04a58 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Tue, 5 Nov 2013 10:32:39 -0800 Subject: [PATCH] Switch allocations from KM_SLEEP to KM_PUSHPAGE A couple of kmem_alloc() allocations were using KM_SLEEP in the sync thread context. These were accidentally introduced by the recent set of Illumos patches. The solution is to switch to KM_PUSHPAGE. dsl_dataset_promote_sync() -> promote_hold() -> snaplist_make() -> kmem_alloc(sizeof (*snap), KM_SLEEP); dsl_dataset_user_hold_sync() -> dsl_onexit_hold_cleanup() -> kmem_alloc(sizeof (*ca), KM_SLEEP) Signed-off-by: Richard Yao Signed-off-by: Brian Behlendorf Issue #1775 --- module/zfs/dsl_dataset.c | 2 +- module/zfs/dsl_userhold.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/module/zfs/dsl_dataset.c b/module/zfs/dsl_dataset.c index 7c8995eba..9ee9508bf 100644 --- a/module/zfs/dsl_dataset.c +++ b/module/zfs/dsl_dataset.c @@ -2196,7 +2196,7 @@ snaplist_make(dsl_pool_t *dp, if (first_obj == 0) first_obj = ds->ds_dir->dd_phys->dd_origin_obj; - snap = kmem_alloc(sizeof (*snap), KM_SLEEP); + snap = kmem_alloc(sizeof (*snap), KM_PUSHPAGE); snap->ds = ds; list_insert_tail(l, snap); obj = ds->ds_phys->ds_prev_snap_obj; diff --git a/module/zfs/dsl_userhold.c b/module/zfs/dsl_userhold.c index db9540d13..6f0470477 100644 --- a/module/zfs/dsl_userhold.c +++ b/module/zfs/dsl_userhold.c @@ -225,7 +225,7 @@ dsl_onexit_hold_cleanup(spa_t *spa, nvlist_t *holds, minor_t minor) } ASSERT(spa != NULL); - ca = kmem_alloc(sizeof (*ca), KM_SLEEP); + ca = kmem_alloc(sizeof (*ca), KM_PUSHPAGE); (void) strlcpy(ca->zhca_spaname, spa_name(spa), sizeof (ca->zhca_spaname));