mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 18:40:43 +03:00
Illumos #734: Use taskq_dispatch_ent() interface
It has been observed that some of the hottest locks are those of the zio taskqs. Contention on these locks can limit the rate at which zios are dispatched which limits performance. This upstream change from Illumos uses new interface to the taskqs which allow them to utilize a prealloc'ed taskq_ent_t. This removes the need to perform an allocation at dispatch time while holding the contended lock. This has the effect of improving system performance. Reviewed by: Albert Lee <trisk@nexenta.com> Reviewed by: Richard Lowe <richlowe@richlowe.net> Reviewed by: Alexey Zaytsev <alexey.zaytsev@nexenta.com> Reviewed by: Jason Brian King <jason.brian.king@gmail.com> Reviewed by: George Wilson <gwilson@zfsmail.com> Reviewed by: Adam Leventhal <ahl@delphix.com> Approved by: Gordon Ross <gwr@nexenta.com> References to Illumos issue: https://www.illumos.org/issues/734 Ported-by: Prakash Surya <surya1@llnl.gov> Signed-off-by: Brian Behlendorf <behlendorf1@llnl.gov> Closes #482
This commit is contained in:
committed by
Brian Behlendorf
parent
30a9524e45
commit
a38718a63d
+4
-1
@@ -22,6 +22,9 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
*/
|
||||
/*
|
||||
* Copyright 2011 Nexenta Systems, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file contains all the routines used when modifying on-disk SPA state.
|
||||
@@ -665,7 +668,7 @@ spa_create_zio_taskqs(spa_t *spa)
|
||||
const zio_taskq_info_t *ztip = &zio_taskqs[t][q];
|
||||
enum zti_modes mode = ztip->zti_mode;
|
||||
uint_t value = ztip->zti_value;
|
||||
uint_t flags = TASKQ_PREPOPULATE;
|
||||
uint_t flags = 0;
|
||||
char name[32];
|
||||
|
||||
if (t == ZIO_TYPE_WRITE)
|
||||
|
||||
+16
-5
@@ -21,6 +21,7 @@
|
||||
/*
|
||||
* Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2011 by Delphix. All rights reserved.
|
||||
* Copyright (c) 2011 Nexenta Systems, Inc. All rights reserved.
|
||||
*/
|
||||
|
||||
#include <sys/zfs_context.h>
|
||||
@@ -570,6 +571,8 @@ zio_create(zio_t *pio, spa_t *spa, uint64_t txg, const blkptr_t *bp,
|
||||
zio_add_child(pio, zio);
|
||||
}
|
||||
|
||||
taskq_init_ent(&zio->io_tqent);
|
||||
|
||||
return (zio);
|
||||
}
|
||||
|
||||
@@ -1073,7 +1076,7 @@ zio_taskq_dispatch(zio_t *zio, enum zio_taskq_type q, boolean_t cutinline)
|
||||
{
|
||||
spa_t *spa = zio->io_spa;
|
||||
zio_type_t t = zio->io_type;
|
||||
int flags = TQ_NOSLEEP | (cutinline ? TQ_FRONT : 0);
|
||||
int flags = (cutinline ? TQ_FRONT : 0);
|
||||
|
||||
/*
|
||||
* If we're a config writer or a probe, the normal issue and
|
||||
@@ -1098,8 +1101,14 @@ zio_taskq_dispatch(zio_t *zio, enum zio_taskq_type q, boolean_t cutinline)
|
||||
|
||||
ASSERT3U(q, <, ZIO_TASKQ_TYPES);
|
||||
|
||||
while (taskq_dispatch(spa->spa_zio_taskq[t][q],
|
||||
(task_func_t *)zio_execute, zio, flags) == 0); /* do nothing */
|
||||
/*
|
||||
* NB: We are assuming that the zio can only be dispatched
|
||||
* to a single taskq at a time. It would be a grievous error
|
||||
* to dispatch the zio to another taskq at the same time.
|
||||
*/
|
||||
ASSERT(taskq_empty_ent(&zio->io_tqent));
|
||||
taskq_dispatch_ent(spa->spa_zio_taskq[t][q],
|
||||
(task_func_t *)zio_execute, zio, flags, &zio->io_tqent);
|
||||
}
|
||||
|
||||
static boolean_t
|
||||
@@ -2947,9 +2956,11 @@ zio_done(zio_t *zio)
|
||||
* Reexecution is potentially a huge amount of work.
|
||||
* Hand it off to the otherwise-unused claim taskq.
|
||||
*/
|
||||
(void) taskq_dispatch(
|
||||
ASSERT(taskq_empty_ent(&zio->io_tqent));
|
||||
(void) taskq_dispatch_ent(
|
||||
zio->io_spa->spa_zio_taskq[ZIO_TYPE_CLAIM][ZIO_TASKQ_ISSUE],
|
||||
(task_func_t *)zio_reexecute, zio, TQ_SLEEP);
|
||||
(task_func_t *)zio_reexecute, zio, 0,
|
||||
&zio->io_tqent);
|
||||
}
|
||||
return (ZIO_PIPELINE_STOP);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user