Prevent reclaim in send_traverse_thread()

As is the case with traverse_prefetch_thread(), the deep stacks caused
by traversal require disabling reclaim in the send traverse thread.

Also, do the same for receive_writer_thread() in which similar problems
have been observed.

Signed-off-by: Tim Chase <tim@chase2k.com>
Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov>
Closes #4912
Closes #4998
This commit is contained in:
Tim Chase 2016-08-21 08:22:32 -05:00 committed by Brian Behlendorf
parent 23827a4ca1
commit 3e635ac15c

View File

@ -573,6 +573,7 @@ send_traverse_thread(void *arg)
struct send_thread_arg *st_arg = arg; struct send_thread_arg *st_arg = arg;
int err; int err;
struct send_block_record *data; struct send_block_record *data;
fstrans_cookie_t cookie = spl_fstrans_mark();
if (st_arg->ds != NULL) { if (st_arg->ds != NULL) {
err = traverse_dataset_resume(st_arg->ds, err = traverse_dataset_resume(st_arg->ds,
@ -585,6 +586,7 @@ send_traverse_thread(void *arg)
data = kmem_zalloc(sizeof (*data), KM_SLEEP); data = kmem_zalloc(sizeof (*data), KM_SLEEP);
data->eos_marker = B_TRUE; data->eos_marker = B_TRUE;
bqueue_enqueue(&st_arg->q, data, 1); bqueue_enqueue(&st_arg->q, data, 1);
spl_fstrans_unmark(cookie);
} }
/* /*
@ -2737,6 +2739,8 @@ receive_writer_thread(void *arg)
{ {
struct receive_writer_arg *rwa = arg; struct receive_writer_arg *rwa = arg;
struct receive_record_arg *rrd; struct receive_record_arg *rrd;
fstrans_cookie_t cookie = spl_fstrans_mark();
for (rrd = bqueue_dequeue(&rwa->q); !rrd->eos_marker; for (rrd = bqueue_dequeue(&rwa->q); !rrd->eos_marker;
rrd = bqueue_dequeue(&rwa->q)) { rrd = bqueue_dequeue(&rwa->q)) {
/* /*
@ -2761,6 +2765,7 @@ receive_writer_thread(void *arg)
rwa->done = B_TRUE; rwa->done = B_TRUE;
cv_signal(&rwa->cv); cv_signal(&rwa->cv);
mutex_exit(&rwa->mutex); mutex_exit(&rwa->mutex);
spl_fstrans_unmark(cookie);
} }
static int static int