]> granicus.if.org Git - zfs/commitdiff
Prevent reclaim in send_traverse_thread()
authorTim Chase <tim@chase2k.com>
Sun, 21 Aug 2016 13:22:32 +0000 (08:22 -0500)
committerBrian Behlendorf <behlendorf1@llnl.gov>
Mon, 22 Aug 2016 23:12:05 +0000 (16:12 -0700)
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

module/zfs/dmu_send.c

index 80f7dc1aae11a8e259b4fbbcea040ba323291f4e..56936cf235cbed885975633523749f426bab5cbf 100644 (file)
@@ -573,6 +573,7 @@ send_traverse_thread(void *arg)
        struct send_thread_arg *st_arg = arg;
        int err;
        struct send_block_record *data;
+       fstrans_cookie_t cookie = spl_fstrans_mark();
 
        if (st_arg->ds != NULL) {
                err = traverse_dataset_resume(st_arg->ds,
@@ -585,6 +586,7 @@ send_traverse_thread(void *arg)
        data = kmem_zalloc(sizeof (*data), KM_SLEEP);
        data->eos_marker = B_TRUE;
        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_record_arg *rrd;
+       fstrans_cookie_t cookie = spl_fstrans_mark();
+
        for (rrd = bqueue_dequeue(&rwa->q); !rrd->eos_marker;
            rrd = bqueue_dequeue(&rwa->q)) {
                /*
@@ -2761,6 +2765,7 @@ receive_writer_thread(void *arg)
        rwa->done = B_TRUE;
        cv_signal(&rwa->cv);
        mutex_exit(&rwa->mutex);
+       spl_fstrans_unmark(cookie);
 }
 
 static int