mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 10:37:35 +03:00
ZIL: Make allocations more flexible
When ZIL allocates space for new LWBs without knowing how much it will require, it can use new metaslab_alloc_range() function to allocate slightly more or less than it predicted. It allows to improve space efficiency by allocating bigger LWBs on RAIDZ/dRAID instead of padding and possibly packing more ZIL records there. It may also allow to reduce ganging in some cases by allowing to allocate smaller LWBs when we are not sure we'll need bigger. On the opposite side, when we allocate space for already closed LWBs, when we precisely know how much space we need, we may just allocate what we need instead of relying on writing less than allocated, that does not work for RAIDZ. Space for LWBs in open state (still being filled) is allocated same as before. Reviewed-by: Rob Norris <robn@despairlabs.com> Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Signed-off-by: Alexander Motin <alexander.motin@TrueNAS.com> Closes #17613
This commit is contained in:
@@ -41,8 +41,8 @@ extern "C" {
|
||||
*
|
||||
* An lwb will start out in the "new" state, and transition to the "opened"
|
||||
* state via a call to zil_lwb_write_open() on first itx assignment. When
|
||||
* transitioning from "new" to "opened" the zilog's "zl_issuer_lock" must be
|
||||
* held.
|
||||
* transitioning from "new" to "opened" the zilog's "zl_issuer_lock" and
|
||||
* LWB's "lwb_lock" must be held.
|
||||
*
|
||||
* After the lwb is "opened", it can be assigned number of itxs and transition
|
||||
* into the "closed" state via zil_lwb_write_close() when full or on timeout.
|
||||
@@ -115,6 +115,7 @@ typedef struct lwb {
|
||||
int lwb_nused; /* # used bytes in buffer */
|
||||
int lwb_nfilled; /* # filled bytes in buffer */
|
||||
int lwb_sz; /* size of block and buffer */
|
||||
int lwb_min_sz; /* min size for range allocation */
|
||||
lwb_state_t lwb_state; /* the state of this lwb */
|
||||
char *lwb_buf; /* log write buffer */
|
||||
zio_t *lwb_child_zio; /* parent zio for children */
|
||||
@@ -129,7 +130,7 @@ typedef struct lwb {
|
||||
list_t lwb_itxs; /* list of itx's */
|
||||
list_t lwb_waiters; /* list of zil_commit_waiter's */
|
||||
avl_tree_t lwb_vdev_tree; /* vdevs to flush after lwb write */
|
||||
kmutex_t lwb_vdev_lock; /* protects lwb_vdev_tree */
|
||||
kmutex_t lwb_lock; /* protects lwb_vdev_tree and size */
|
||||
} lwb_t;
|
||||
|
||||
/*
|
||||
|
||||
+2
-1
@@ -622,7 +622,8 @@ extern zio_t *zio_free_sync(zio_t *pio, spa_t *spa, uint64_t txg,
|
||||
const blkptr_t *bp, zio_flag_t flags);
|
||||
|
||||
extern int zio_alloc_zil(spa_t *spa, objset_t *os, uint64_t txg,
|
||||
blkptr_t *new_bp, uint64_t size, boolean_t *slog);
|
||||
blkptr_t *new_bp, uint64_t min_size, uint64_t max_size, boolean_t *slog,
|
||||
boolean_t allow_larger);
|
||||
extern void zio_flush(zio_t *zio, vdev_t *vd);
|
||||
extern void zio_shrink(zio_t *zio, uint64_t size);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user