zil: Free lwb_buf after write completion.
There is no sense to keep that memory allocated during the flush. Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Prakash Surya <prakash.surya@delphix.com> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored by: iXsystems, Inc. Closes #14855
This commit is contained in:
parent
895e03135e
commit
7381ddf1ab
|
@ -1376,20 +1376,10 @@ zil_lwb_flush_vdevs_done(zio_t *zio)
|
||||||
|
|
||||||
spa_config_exit(zilog->zl_spa, SCL_STATE, lwb);
|
spa_config_exit(zilog->zl_spa, SCL_STATE, lwb);
|
||||||
|
|
||||||
zio_buf_free(lwb->lwb_buf, lwb->lwb_sz);
|
|
||||||
hrtime_t t = gethrtime() - lwb->lwb_issued_timestamp;
|
hrtime_t t = gethrtime() - lwb->lwb_issued_timestamp;
|
||||||
|
|
||||||
mutex_enter(&zilog->zl_lock);
|
mutex_enter(&zilog->zl_lock);
|
||||||
|
|
||||||
/*
|
|
||||||
* If we have had an allocation failure and the txg is
|
|
||||||
* waiting to sync then we want zil_sync() to remove the lwb so
|
|
||||||
* that it's not picked up as the next new one in
|
|
||||||
* zil_process_commit_list(). zil_sync() will only remove the
|
|
||||||
* lwb if lwb_buf is null.
|
|
||||||
*/
|
|
||||||
lwb->lwb_buf = NULL;
|
|
||||||
|
|
||||||
zilog->zl_last_lwb_latency = (zilog->zl_last_lwb_latency * 7 + t) / 8;
|
zilog->zl_last_lwb_latency = (zilog->zl_last_lwb_latency * 7 + t) / 8;
|
||||||
|
|
||||||
lwb->lwb_root_zio = NULL;
|
lwb->lwb_root_zio = NULL;
|
||||||
|
@ -1475,7 +1465,8 @@ zil_lwb_flush_wait_all(zilog_t *zilog, uint64_t txg)
|
||||||
IMPLY(lwb->lwb_issued_txg > 0,
|
IMPLY(lwb->lwb_issued_txg > 0,
|
||||||
lwb->lwb_state == LWB_STATE_FLUSH_DONE);
|
lwb->lwb_state == LWB_STATE_FLUSH_DONE);
|
||||||
}
|
}
|
||||||
IMPLY(lwb->lwb_state == LWB_STATE_FLUSH_DONE,
|
IMPLY(lwb->lwb_state == LWB_STATE_WRITE_DONE ||
|
||||||
|
lwb->lwb_state == LWB_STATE_FLUSH_DONE,
|
||||||
lwb->lwb_buf == NULL);
|
lwb->lwb_buf == NULL);
|
||||||
lwb = list_next(&zilog->zl_lwb_list, lwb);
|
lwb = list_next(&zilog->zl_lwb_list, lwb);
|
||||||
}
|
}
|
||||||
|
@ -1519,6 +1510,8 @@ zil_lwb_write_done(zio_t *zio)
|
||||||
ASSERT(BP_GET_FILL(zio->io_bp) == 0);
|
ASSERT(BP_GET_FILL(zio->io_bp) == 0);
|
||||||
|
|
||||||
abd_free(zio->io_abd);
|
abd_free(zio->io_abd);
|
||||||
|
zio_buf_free(lwb->lwb_buf, lwb->lwb_sz);
|
||||||
|
lwb->lwb_buf = NULL;
|
||||||
|
|
||||||
mutex_enter(&zilog->zl_lock);
|
mutex_enter(&zilog->zl_lock);
|
||||||
ASSERT3S(lwb->lwb_state, ==, LWB_STATE_ISSUED);
|
ASSERT3S(lwb->lwb_state, ==, LWB_STATE_ISSUED);
|
||||||
|
@ -3433,7 +3426,8 @@ zil_sync(zilog_t *zilog, dmu_tx_t *tx)
|
||||||
|
|
||||||
while ((lwb = list_head(&zilog->zl_lwb_list)) != NULL) {
|
while ((lwb = list_head(&zilog->zl_lwb_list)) != NULL) {
|
||||||
zh->zh_log = lwb->lwb_blk;
|
zh->zh_log = lwb->lwb_blk;
|
||||||
if (lwb->lwb_buf != NULL || lwb->lwb_max_txg > txg)
|
if (lwb->lwb_state != LWB_STATE_FLUSH_DONE ||
|
||||||
|
lwb->lwb_max_txg > txg)
|
||||||
break;
|
break;
|
||||||
list_remove(&zilog->zl_lwb_list, lwb);
|
list_remove(&zilog->zl_lwb_list, lwb);
|
||||||
zio_free(spa, txg, &lwb->lwb_blk);
|
zio_free(spa, txg, &lwb->lwb_blk);
|
||||||
|
|
Loading…
Reference in New Issue