summaryrefslogtreecommitdiffstats
path: root/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
diff options
context:
space:
mode:
authoravg <avg@FreeBSD.org>2015-09-11 12:58:41 +0000
committeravg <avg@FreeBSD.org>2015-09-11 12:58:41 +0000
commitc83542f5e0a017bb1409d89d91de72feba2898b4 (patch)
treef66a8bedf65ef82a59a90ad5795defcc3f7b2cb8 /sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
parent9671a17dd92c3bb83a6dc86c6ffe6c38f29e63ad (diff)
downloadFreeBSD-src-c83542f5e0a017bb1409d89d91de72feba2898b4.zip
FreeBSD-src-c83542f5e0a017bb1409d89d91de72feba2898b4.tar.gz
MFC r287099: account for ashift when gathering buffers to be written to l2arc device
The change differs from that in head because of other changes that have not been MFC-ed yet.
Diffstat (limited to 'sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c')
-rw-r--r--sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c45
1 files changed, 33 insertions, 12 deletions
diff --git a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
index deb0dec..30aac16 100644
--- a/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
+++ b/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/arc.c
@@ -5062,8 +5062,7 @@ l2arc_write_buffers(spa_t *spa, l2arc_dev_t *dev, uint64_t target_sz,
{
arc_buf_hdr_t *hdr, *hdr_prev, *head;
list_t *list;
- uint64_t write_asize, write_psize, write_sz, headroom,
- buf_compress_minsz;
+ uint64_t write_asize, write_sz, headroom, buf_compress_minsz;
void *buf_data;
kmutex_t *list_lock;
boolean_t full;
@@ -5079,7 +5078,7 @@ l2arc_write_buffers(spa_t *spa, l2arc_dev_t *dev, uint64_t target_sz,
*headroom_boost = B_FALSE;
pio = NULL;
- write_sz = write_asize = write_psize = 0;
+ write_sz = write_asize = 0;
full = B_FALSE;
head = kmem_cache_alloc(hdr_cache, KM_PUSHPAGE);
head->b_flags |= ARC_FLAG_L2_WRITE_HEAD;
@@ -5122,6 +5121,7 @@ l2arc_write_buffers(spa_t *spa, l2arc_dev_t *dev, uint64_t target_sz,
l2arc_buf_hdr_t *l2hdr;
kmutex_t *hash_lock;
uint64_t buf_sz;
+ uint64_t buf_a_sz;
if (arc_warm == B_FALSE)
hdr_prev = list_next(list, hdr);
@@ -5153,7 +5153,15 @@ l2arc_write_buffers(spa_t *spa, l2arc_dev_t *dev, uint64_t target_sz,
continue;
}
- if ((write_sz + hdr->b_size) > target_sz) {
+ /*
+ * Assume that the buffer is not going to be compressed
+ * and could take more space on disk because of a larger
+ * disk block size.
+ */
+ buf_sz = hdr->b_size;
+ buf_a_sz = vdev_psize_to_asize(dev->l2ad_vdev, buf_sz);
+
+ if ((write_asize + buf_a_sz) > target_sz) {
full = B_TRUE;
mutex_exit(hash_lock);
ARCSTAT_BUMP(arcstat_l2_write_full);
@@ -5196,7 +5204,6 @@ l2arc_write_buffers(spa_t *spa, l2arc_dev_t *dev, uint64_t target_sz,
l2hdr->b_asize = hdr->b_size;
l2hdr->b_tmp_cdata = hdr->b_buf->b_data;
- buf_sz = hdr->b_size;
hdr->b_l2hdr = l2hdr;
list_insert_head(dev->l2ad_buflist, hdr);
@@ -5211,6 +5218,7 @@ l2arc_write_buffers(spa_t *spa, l2arc_dev_t *dev, uint64_t target_sz,
mutex_exit(hash_lock);
write_sz += buf_sz;
+ write_asize += buf_a_sz;
}
mutex_exit(list_lock);
@@ -5228,6 +5236,19 @@ l2arc_write_buffers(spa_t *spa, l2arc_dev_t *dev, uint64_t target_sz,
}
/*
+ * Note that elsewhere in this file arcstat_l2_asize
+ * and the used space on l2ad_vdev are updated using b_asize,
+ * which is not necessarily rounded up to the device block size.
+ * Too keep accounting consistent we do the same here as well:
+ * stats_size accumulates the sum of b_asize of the written buffers,
+ * while write_asize accumulates the sum of b_asize rounded up
+ * to the device block size.
+ * The latter sum is used only to validate the corectness of the code.
+ */
+ uint64_t stats_size = 0;
+ write_asize = 0;
+
+ /*
* Now start writing the buffers. We're starting at the write head
* and work backwards, retracing the course of the buffer selector
* loop above.
@@ -5275,7 +5296,7 @@ l2arc_write_buffers(spa_t *spa, l2arc_dev_t *dev, uint64_t target_sz,
/* Compression may have squashed the buffer to zero length. */
if (buf_sz != 0) {
- uint64_t buf_p_sz;
+ uint64_t buf_a_sz;
wzio = zio_write_phys(pio, dev->l2ad_vdev,
dev->l2ad_hand, buf_sz, buf_data, ZIO_CHECKSUM_OFF,
@@ -5286,13 +5307,13 @@ l2arc_write_buffers(spa_t *spa, l2arc_dev_t *dev, uint64_t target_sz,
zio_t *, wzio);
(void) zio_nowait(wzio);
- write_asize += buf_sz;
+ stats_size += buf_sz;
/*
* Keep the clock hand suitably device-aligned.
*/
- buf_p_sz = vdev_psize_to_asize(dev->l2ad_vdev, buf_sz);
- write_psize += buf_p_sz;
- dev->l2ad_hand += buf_p_sz;
+ buf_a_sz = vdev_psize_to_asize(dev->l2ad_vdev, buf_sz);
+ write_asize += buf_a_sz;
+ dev->l2ad_hand += buf_a_sz;
}
}
@@ -5302,8 +5323,8 @@ l2arc_write_buffers(spa_t *spa, l2arc_dev_t *dev, uint64_t target_sz,
ARCSTAT_BUMP(arcstat_l2_writes_sent);
ARCSTAT_INCR(arcstat_l2_write_bytes, write_asize);
ARCSTAT_INCR(arcstat_l2_size, write_sz);
- ARCSTAT_INCR(arcstat_l2_asize, write_asize);
- vdev_space_update(dev->l2ad_vdev, write_psize, 0, 0);
+ ARCSTAT_INCR(arcstat_l2_asize, stats_size);
+ vdev_space_update(dev->l2ad_vdev, stats_size, 0, 0);
/*
* Bump device hand to the device start if it is approaching the end.
OpenPOWER on IntegriCloud