From 8701a8bfa6592fd2f251f77e3988d809578ecac4 Mon Sep 17 00:00:00 2001 From: Shashank Kumar <75466339+datacore-skumar@users.noreply.github.com> Date: Tue, 17 May 2022 16:59:23 +0530 Subject: [PATCH] l2_arc alloc details in ioctl --- include/sys/zfs_ioctl.h | 1 + module/os/windows/spl/spl-kstat.c | 5 +++++ module/os/windows/zfs/zfs_ioctl_os.c | 8 ++++++++ 3 files changed, 14 insertions(+) diff --git a/include/sys/zfs_ioctl.h b/include/sys/zfs_ioctl.h index 30dfd1b3818d..e8b25e779a2e 100644 --- a/include/sys/zfs_ioctl.h +++ b/include/sys/zfs_ioctl.h @@ -594,6 +594,7 @@ typedef struct { char zpoolHealthState[MAXNAMELEN]; char name[MAXNAMELEN]; + unsigned __int64 l2arc_alloc_size; }zpool_zfs_metrics; typedef struct { diff --git a/module/os/windows/spl/spl-kstat.c b/module/os/windows/spl/spl-kstat.c index 5463100c663e..acf95b424289 100644 --- a/module/os/windows/spl/spl-kstat.c +++ b/module/os/windows/spl/spl-kstat.c @@ -2261,6 +2261,11 @@ int spl_kstat_write(PDEVICE_OBJECT DiskDevice, PIRP Irp, return (0); } +uint64_t +l2_arc_alloc(arc_stats_t* arc_ptr) { + return arc_ptr->arcstat_l2_psize.value.ui64; +} + // Added comments inline referring to perl arcstat.pl void arc_cache_counters_perfmon(cache_counters* perf, arc_stats_t* arc_ptr) diff --git a/module/os/windows/zfs/zfs_ioctl_os.c b/module/os/windows/zfs/zfs_ioctl_os.c index b46a08f53c9c..688c9fd33a2d 100644 --- a/module/os/windows/zfs/zfs_ioctl_os.c +++ b/module/os/windows/zfs/zfs_ioctl_os.c @@ -88,6 +88,7 @@ zfs_vfs_ref(zfsvfs_t **zfvp) return (error); } +extern kstat_t* perf_arc_ksp; NTSTATUS zpool_zfs_get_metrics(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp) { Irp->IoStatus.Information = 0; @@ -112,6 +113,7 @@ NTSTATUS zpool_zfs_get_metrics(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_ perf->zpool_size = 0; perf->zfs_volSize = 0; strncpy(perf->zpoolHealthState, "", sizeof(perf->zpoolHealthState)); + perf->l2arc_alloc_size = 0; perf->used = getUsedData(perf->name); perf->compress_ratio = getCompressRatio(perf->name); @@ -141,6 +143,12 @@ NTSTATUS zpool_zfs_get_metrics(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_ else perf->zfs_volSize = getZvolSize(perf->name); + KSTAT_ENTER(perf_arc_ksp); + int error = KSTAT_UPDATE(perf_arc_ksp, KSTAT_READ); + if (!error) + perf->l2arc_alloc_size = l2_arc_alloc(perf_arc_ksp->ks_data); + KSTAT_EXIT(perf_arc_ksp); + Irp->IoStatus.Information = sizeof(zpool_zfs_metrics); return STATUS_SUCCESS; }