git://git.camperquake.de
/
zfs.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Use cv_wait_io() which will will account for iowait
[zfs.git]
/
module
/
zfs
/
zio.c
diff --git
a/module/zfs/zio.c
b/module/zfs/zio.c
index
fe2bdc8
..
bfb817b
100644
(file)
--- a/
module/zfs/zio.c
+++ b/
module/zfs/zio.c
@@
-259,7
+259,7
@@
zio_buf_alloc(size_t size)
ASSERT(c < SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT);
ASSERT(c < SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT);
- return (kmem_cache_alloc(zio_buf_cache[c], KM_PUSHPAGE));
+ return (kmem_cache_alloc(zio_buf_cache[c], KM_PUSHPAGE
| KM_NODEBUG
));
}
/*
}
/*
@@
-275,7
+275,8
@@
zio_data_buf_alloc(size_t size)
ASSERT(c < SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT);
ASSERT(c < SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT);
- return (kmem_cache_alloc(zio_data_buf_cache[c], KM_PUSHPAGE));
+ return (kmem_cache_alloc(zio_data_buf_cache[c],
+ KM_PUSHPAGE | KM_NODEBUG));
}
void
}
void
@@
-1315,7
+1316,7
@@
zio_wait(zio_t *zio)
mutex_enter(&zio->io_lock);
while (zio->io_executor != NULL)
mutex_enter(&zio->io_lock);
while (zio->io_executor != NULL)
- cv_wait(&zio->io_cv, &zio->io_lock);
+ cv_wait
_io
(&zio->io_cv, &zio->io_lock);
mutex_exit(&zio->io_lock);
error = zio->io_error;
mutex_exit(&zio->io_lock);
error = zio->io_error;
@@
-1860,6
+1861,11
@@
zio_write_gang_block(zio_t *pio)
*/
pio->io_pipeline = ZIO_INTERLOCK_PIPELINE;
*/
pio->io_pipeline = ZIO_INTERLOCK_PIPELINE;
+ /*
+ * We didn't allocate this bp, so make sure it doesn't get unmarked.
+ */
+ pio->io_flags &= ~ZIO_FLAG_FASTWRITE;
+
zio_nowait(zio);
return (ZIO_PIPELINE_CONTINUE);
zio_nowait(zio);
return (ZIO_PIPELINE_CONTINUE);
@@
-2269,6
+2275,7
@@
zio_dva_allocate(zio_t *zio)
flags |= (zio->io_flags & ZIO_FLAG_NODATA) ? METASLAB_GANG_AVOID : 0;
flags |= (zio->io_flags & ZIO_FLAG_GANG_CHILD) ?
METASLAB_GANG_CHILD : 0;
flags |= (zio->io_flags & ZIO_FLAG_NODATA) ? METASLAB_GANG_AVOID : 0;
flags |= (zio->io_flags & ZIO_FLAG_GANG_CHILD) ?
METASLAB_GANG_CHILD : 0;
+ flags |= (zio->io_flags & ZIO_FLAG_FASTWRITE) ? METASLAB_FASTWRITE : 0;
error = metaslab_alloc(spa, mc, zio->io_size, bp,
zio->io_prop.zp_copies, zio->io_txg, NULL, flags);
error = metaslab_alloc(spa, mc, zio->io_size, bp,
zio->io_prop.zp_copies, zio->io_txg, NULL, flags);
@@
-2332,8
+2339,8
@@
zio_dva_unallocate(zio_t *zio, zio_gang_node_t *gn, blkptr_t *bp)
* Try to allocate an intent log block. Return 0 on success, errno on failure.
*/
int
* Try to allocate an intent log block. Return 0 on success, errno on failure.
*/
int
-zio_alloc_zil(spa_t *spa, uint64_t txg, blkptr_t *new_bp,
blkptr_t *old_bp
,
-
uint64_t size,
boolean_t use_slog)
+zio_alloc_zil(spa_t *spa, uint64_t txg, blkptr_t *new_bp,
uint64_t size
,
+ boolean_t use_slog)
{
int error = 1;
{
int error = 1;
@@
-2346,14
+2353,14
@@
zio_alloc_zil(spa_t *spa, uint64_t txg, blkptr_t *new_bp, blkptr_t *old_bp,
*/
if (use_slog) {
error = metaslab_alloc(spa, spa_log_class(spa), size,
*/
if (use_slog) {
error = metaslab_alloc(spa, spa_log_class(spa), size,
- new_bp, 1, txg,
old_bp
,
- METASLAB_
HINTBP_AVOID
| METASLAB_GANG_AVOID);
+ new_bp, 1, txg,
NULL
,
+ METASLAB_
FASTWRITE
| METASLAB_GANG_AVOID);
}
if (error) {
error = metaslab_alloc(spa, spa_normal_class(spa), size,
}
if (error) {
error = metaslab_alloc(spa, spa_normal_class(spa), size,
- new_bp, 1, txg,
old_bp
,
- METASLAB_
HINTBP_AVOID
| METASLAB_GANG_AVOID);
+ new_bp, 1, txg,
NULL
,
+ METASLAB_
FASTWRITE
| METASLAB_GANG_AVOID);
}
if (error == 0) {
}
if (error == 0) {
@@
-3059,6
+3066,11
@@
zio_done(zio_t *zio)
zfs_ereport_free_checksum(zcr);
}
zfs_ereport_free_checksum(zcr);
}
+ if (zio->io_flags & ZIO_FLAG_FASTWRITE && zio->io_bp &&
+ !BP_IS_HOLE(zio->io_bp)) {
+ metaslab_fastwrite_unmark(zio->io_spa, zio->io_bp);
+ }
+
/*
* It is the responsibility of the done callback to ensure that this
* particular zio is no longer discoverable for adoption, and as
/*
* It is the responsibility of the done callback to ensure that this
* particular zio is no longer discoverable for adoption, and as