mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2026-05-22 02:27:36 +03:00
Add support for per dataset zil stats and use wmsum counters
ZIL kstats are reported in an inclusive way, i.e., same counters are shared to capture all the activities happening in zil. Added support to report zil stats for every datset individually by combining them with already exposed dataset kstats. Wmsum uses per cpu counters and provide less overhead as compared to atomic operations. Updated zil kstats to replace wmsum counters to avoid atomic operations. Reviewed-by: Christian Schwarz <christian.schwarz@nutanix.com> Reviewed-by: Ryan Moeller <ryan@iXsystems.com> Reviewed-by: Alexander Motin <mav@FreeBSD.org> Signed-off-by: Ameer Hamza <ahamza@ixsystems.com> Closes #13636
This commit is contained in:
@@ -1027,8 +1027,6 @@ zfsvfs_setup(zfsvfs_t *zfsvfs, boolean_t mounting)
|
||||
if (error)
|
||||
return (error);
|
||||
|
||||
zfsvfs->z_log = zil_open(zfsvfs->z_os, zfs_get_data);
|
||||
|
||||
/*
|
||||
* If we are not mounting (ie: online recv), then we don't
|
||||
* have to worry about replaying the log as we blocked all
|
||||
@@ -1038,7 +1036,11 @@ zfsvfs_setup(zfsvfs_t *zfsvfs, boolean_t mounting)
|
||||
boolean_t readonly;
|
||||
|
||||
ASSERT3P(zfsvfs->z_kstat.dk_kstats, ==, NULL);
|
||||
dataset_kstats_create(&zfsvfs->z_kstat, zfsvfs->z_os);
|
||||
error = dataset_kstats_create(&zfsvfs->z_kstat, zfsvfs->z_os);
|
||||
if (error)
|
||||
return (error);
|
||||
zfsvfs->z_log = zil_open(zfsvfs->z_os, zfs_get_data,
|
||||
&zfsvfs->z_kstat.dk_zil_sums);
|
||||
|
||||
/*
|
||||
* During replay we remove the read only flag to
|
||||
@@ -1109,6 +1111,10 @@ zfsvfs_setup(zfsvfs_t *zfsvfs, boolean_t mounting)
|
||||
/* restore readonly bit */
|
||||
if (readonly != 0)
|
||||
zfsvfs->z_vfs->vfs_flag |= VFS_RDONLY;
|
||||
} else {
|
||||
ASSERT3P(zfsvfs->z_kstat.dk_kstats, !=, NULL);
|
||||
zfsvfs->z_log = zil_open(zfsvfs->z_os, zfs_get_data,
|
||||
&zfsvfs->z_kstat.dk_zil_sums);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -1189,7 +1189,7 @@ zvol_ensure_zilog(zvol_state_t *zv)
|
||||
}
|
||||
if (zv->zv_zilog == NULL) {
|
||||
zv->zv_zilog = zil_open(zv->zv_objset,
|
||||
zvol_get_data);
|
||||
zvol_get_data, &zv->zv_kstat.dk_zil_sums);
|
||||
zv->zv_flags |= ZVOL_WRITTEN_TO;
|
||||
/* replay / destroy done in zvol_os_create_minor() */
|
||||
VERIFY0(zv->zv_zilog->zl_header->zh_flags &
|
||||
@@ -1422,8 +1422,12 @@ zvol_os_create_minor(const char *name)
|
||||
zv->zv_volsize = volsize;
|
||||
zv->zv_objset = os;
|
||||
|
||||
ASSERT3P(zv->zv_kstat.dk_kstats, ==, NULL);
|
||||
error = dataset_kstats_create(&zv->zv_kstat, zv->zv_objset);
|
||||
if (error)
|
||||
goto out_dmu_objset_disown;
|
||||
ASSERT3P(zv->zv_zilog, ==, NULL);
|
||||
zv->zv_zilog = zil_open(os, zvol_get_data);
|
||||
zv->zv_zilog = zil_open(os, zvol_get_data, &zv->zv_kstat.dk_zil_sums);
|
||||
if (spa_writeable(dmu_objset_spa(os))) {
|
||||
if (zil_replay_disable)
|
||||
zil_destroy(zv->zv_zilog, B_FALSE);
|
||||
@@ -1432,8 +1436,6 @@ zvol_os_create_minor(const char *name)
|
||||
}
|
||||
zil_close(zv->zv_zilog);
|
||||
zv->zv_zilog = NULL;
|
||||
ASSERT3P(zv->zv_kstat.dk_kstats, ==, NULL);
|
||||
dataset_kstats_create(&zv->zv_kstat, zv->zv_objset);
|
||||
|
||||
/* TODO: prefetch for geom tasting */
|
||||
|
||||
|
||||
@@ -848,8 +848,6 @@ zfsvfs_setup(zfsvfs_t *zfsvfs, boolean_t mounting)
|
||||
if (error)
|
||||
return (error);
|
||||
|
||||
zfsvfs->z_log = zil_open(zfsvfs->z_os, zfs_get_data);
|
||||
|
||||
/*
|
||||
* If we are not mounting (ie: online recv), then we don't
|
||||
* have to worry about replaying the log as we blocked all
|
||||
@@ -857,7 +855,11 @@ zfsvfs_setup(zfsvfs_t *zfsvfs, boolean_t mounting)
|
||||
*/
|
||||
if (mounting) {
|
||||
ASSERT3P(zfsvfs->z_kstat.dk_kstats, ==, NULL);
|
||||
dataset_kstats_create(&zfsvfs->z_kstat, zfsvfs->z_os);
|
||||
error = dataset_kstats_create(&zfsvfs->z_kstat, zfsvfs->z_os);
|
||||
if (error)
|
||||
return (error);
|
||||
zfsvfs->z_log = zil_open(zfsvfs->z_os, zfs_get_data,
|
||||
&zfsvfs->z_kstat.dk_zil_sums);
|
||||
|
||||
/*
|
||||
* During replay we remove the read only flag to
|
||||
@@ -921,6 +923,10 @@ zfsvfs_setup(zfsvfs_t *zfsvfs, boolean_t mounting)
|
||||
/* restore readonly bit */
|
||||
if (readonly != 0)
|
||||
readonly_changed_cb(zfsvfs, B_TRUE);
|
||||
} else {
|
||||
ASSERT3P(zfsvfs->z_kstat.dk_kstats, !=, NULL);
|
||||
zfsvfs->z_log = zil_open(zfsvfs->z_os, zfs_get_data,
|
||||
&zfsvfs->z_kstat.dk_zil_sums);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -558,7 +558,7 @@ zvol_request_impl(zvol_state_t *zv, struct bio *bio, struct request *rq,
|
||||
rw_enter(&zv->zv_suspend_lock, RW_WRITER);
|
||||
if (zv->zv_zilog == NULL) {
|
||||
zv->zv_zilog = zil_open(zv->zv_objset,
|
||||
zvol_get_data);
|
||||
zvol_get_data, &zv->zv_kstat.dk_zil_sums);
|
||||
zv->zv_flags |= ZVOL_WRITTEN_TO;
|
||||
/* replay / destroy done in zvol_create_minor */
|
||||
VERIFY0((zv->zv_zilog->zl_header->zh_flags &
|
||||
@@ -1408,8 +1408,12 @@ zvol_os_create_minor(const char *name)
|
||||
blk_queue_flag_set(QUEUE_FLAG_SCSI_PASSTHROUGH, zv->zv_zso->zvo_queue);
|
||||
#endif
|
||||
|
||||
ASSERT3P(zv->zv_kstat.dk_kstats, ==, NULL);
|
||||
error = dataset_kstats_create(&zv->zv_kstat, zv->zv_objset);
|
||||
if (error)
|
||||
goto out_dmu_objset_disown;
|
||||
ASSERT3P(zv->zv_zilog, ==, NULL);
|
||||
zv->zv_zilog = zil_open(os, zvol_get_data);
|
||||
zv->zv_zilog = zil_open(os, zvol_get_data, &zv->zv_kstat.dk_zil_sums);
|
||||
if (spa_writeable(dmu_objset_spa(os))) {
|
||||
if (zil_replay_disable)
|
||||
zil_destroy(zv->zv_zilog, B_FALSE);
|
||||
@@ -1418,8 +1422,6 @@ zvol_os_create_minor(const char *name)
|
||||
}
|
||||
zil_close(zv->zv_zilog);
|
||||
zv->zv_zilog = NULL;
|
||||
ASSERT3P(zv->zv_kstat.dk_kstats, ==, NULL);
|
||||
dataset_kstats_create(&zv->zv_kstat, zv->zv_objset);
|
||||
|
||||
/*
|
||||
* When udev detects the addition of the device it will immediately
|
||||
|
||||
Reference in New Issue
Block a user