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