Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/external/cddl/osnet/dist/uts/common/fs/zfs reduce stack usag...



details:   https://anonhg.NetBSD.org/src/rev/b7f7c94d1670
branches:  trunk
changeset: 973226:b7f7c94d1670
user:      jdolecek <jdolecek%NetBSD.org@localhost>
date:      Wed Jun 24 16:16:01 2020 +0000

description:
reduce stack usage in vdev_queue_io_to_issue() - zio_t is about 1KB, and
the function potentially recurses into itself

part of fix for PR kern/55402 by Frank Kardel

diffstat:

 external/cddl/osnet/dist/uts/common/fs/zfs/vdev_queue.c |  16 +++++++++++-----
 1 files changed, 11 insertions(+), 5 deletions(-)

diffs (33 lines):

diff -r f038eb06e328 -r b7f7c94d1670 external/cddl/osnet/dist/uts/common/fs/zfs/vdev_queue.c
--- a/external/cddl/osnet/dist/uts/common/fs/zfs/vdev_queue.c   Wed Jun 24 15:05:45 2020 +0000
+++ b/external/cddl/osnet/dist/uts/common/fs/zfs/vdev_queue.c   Wed Jun 24 16:16:01 2020 +0000
@@ -798,7 +798,7 @@
        zio_priority_t p;
        avl_index_t idx;
        avl_tree_t *tree;
-       zio_t search;
+       zio_t *search;
 
 again:
        ASSERT(MUTEX_HELD(&vq->vq_lock));
@@ -817,10 +817,16 @@
         * For FIFO queues (sync), issue the i/o with the lowest timestamp.
         */
        tree = vdev_queue_class_tree(vq, p);
-       search.io_timestamp = 0;
-       search.io_offset = vq->vq_last_offset + 1;
-       VERIFY3P(avl_find(tree, &search, &idx), ==, NULL);
-       zio = avl_nearest(tree, idx, AVL_AFTER);
+       search = kmem_zalloc(sizeof (*search), KM_NOSLEEP);
+       if (search) {
+               search->io_offset = vq->vq_last_offset + 1;
+               VERIFY3P(avl_find(tree, &search, &idx), ==, NULL);
+               kmem_free(search, sizeof (*search));
+               zio = avl_nearest(tree, idx, AVL_AFTER);
+       } else {
+               /* Can't find nearest, fallback to first */
+               zio = NULL;
+       }
        if (zio == NULL)
                zio = avl_first(tree);
        ASSERT3U(zio->io_priority, ==, p);



Home | Main Index | Thread Index | Old Index