summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Behlendorf <[email protected]>2010-08-13 11:04:09 -0700
committerBrian Behlendorf <[email protected]>2010-08-13 11:04:09 -0700
commit130331e1bcf141723de593425d21215870a29713 (patch)
tree9d23f020a2e0730f1bc603413bbce3efdbf0dcf5
parent7a24d8cf5697e8922e80a5d515b9f17df75d33b4 (diff)
parent94dcc71ea69f29d911876f93734bf744ff0d4843 (diff)
Merge commit 'refs/top-bases/linux-configure-branch' into linux-configure-branch
-rw-r--r--module/zfs/zio.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/module/zfs/zio.c b/module/zfs/zio.c
index d74eb84d8..3541b3413 100644
--- a/module/zfs/zio.c
+++ b/module/zfs/zio.c
@@ -94,6 +94,8 @@ int zio_buf_debug_limit = 16384;
int zio_buf_debug_limit = 0;
#endif
+static inline void __zio_execute(zio_t *zio);
+
void
zio_init(void)
{
@@ -454,7 +456,7 @@ zio_notify_parent(zio_t *pio, zio_t *zio, enum zio_wait_type wait)
if (--*countp == 0 && pio->io_stall == countp) {
pio->io_stall = NULL;
mutex_exit(&pio->io_lock);
- zio_execute(pio);
+ __zio_execute(pio);
} else {
mutex_exit(&pio->io_lock);
}
@@ -1125,9 +1127,24 @@ zio_interrupt(zio_t *zio)
*/
static zio_pipe_stage_t *zio_pipeline[];
+/*
+ * zio_execute() is a wrapper around the static function
+ * __zio_execute() so that we can force __zio_execute() to be
+ * inlined. This reduces stack overhead which is important
+ * because __zio_execute() is called recursively in several zio
+ * code paths. zio_execute() itself cannot be inlined because
+ * it is externally visible.
+ */
void
zio_execute(zio_t *zio)
{
+ __zio_execute(zio);
+}
+
+__attribute__((always_inline))
+static inline void
+__zio_execute(zio_t *zio)
+{
zio->io_executor = curthread;
while (zio->io_stage < ZIO_STAGE_DONE) {
@@ -1172,6 +1189,7 @@ zio_execute(zio_t *zio)
}
}
+
/*
* ==========================================================================
* Initiate I/O, either sync or async
@@ -1187,7 +1205,7 @@ zio_wait(zio_t *zio)
zio->io_waiter = curthread;
- zio_execute(zio);
+ __zio_execute(zio);
mutex_enter(&zio->io_lock);
while (zio->io_executor != NULL)
@@ -1217,7 +1235,7 @@ zio_nowait(zio_t *zio)
zio_add_child(spa->spa_async_zio_root, zio);
}
- zio_execute(zio);
+ __zio_execute(zio);
}
/*
@@ -1272,7 +1290,7 @@ zio_reexecute(zio_t *pio)
* responsibility of the caller to wait on him.
*/
if (!(pio->io_flags & ZIO_FLAG_GODFATHER))
- zio_execute(pio);
+ __zio_execute(pio);
}
void