mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-12-25 18:59:33 +03:00
Restore FreeBSD resource usage accounting
Add zfs_racct_* interfaces for platform-dependent read/write accounting. Reviewed-by: Alexander Motin <mav@FreeBSD.org> Signed-off-by: Ryan Moeller <ryan@iXsystems.com> Closes #11613
This commit is contained in:
parent
03e02e5b56
commit
64e0fe14ff
@ -111,6 +111,7 @@ COMMON_H = \
|
|||||||
zfs_fuid.h \
|
zfs_fuid.h \
|
||||||
zfs_project.h \
|
zfs_project.h \
|
||||||
zfs_quota.h \
|
zfs_quota.h \
|
||||||
|
zfs_racct.h \
|
||||||
zfs_ratelimit.h \
|
zfs_ratelimit.h \
|
||||||
zfs_refcount.h \
|
zfs_refcount.h \
|
||||||
zfs_rlock.h \
|
zfs_rlock.h \
|
||||||
|
37
include/sys/zfs_racct.h
Normal file
37
include/sys/zfs_racct.h
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* CDDL HEADER START
|
||||||
|
*
|
||||||
|
* The contents of this file are subject to the terms of the
|
||||||
|
* Common Development and Distribution License (the "License").
|
||||||
|
* You may not use this file except in compliance with the License.
|
||||||
|
*
|
||||||
|
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||||||
|
* or http://www.opensolaris.org/os/licensing.
|
||||||
|
* See the License for the specific language governing permissions
|
||||||
|
* and limitations under the License.
|
||||||
|
*
|
||||||
|
* When distributing Covered Code, include this CDDL HEADER in each
|
||||||
|
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||||||
|
* If applicable, add the following below this CDDL HEADER, with the
|
||||||
|
* fields enclosed by brackets "[]" replaced with your own identifying
|
||||||
|
* information: Portions Copyright [yyyy] [name of copyright owner]
|
||||||
|
*
|
||||||
|
* CDDL HEADER END
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Portions Copyright 2021 iXsystems, Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _SYS_ZFS_RACCT_H
|
||||||
|
#define _SYS_ZFS_RACCT_H
|
||||||
|
|
||||||
|
#include <sys/zfs_context.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Platform-dependent resource accounting hooks
|
||||||
|
*/
|
||||||
|
void zfs_racct_read(uint64_t size, uint64_t iops);
|
||||||
|
void zfs_racct_write(uint64_t size, uint64_t iops);
|
||||||
|
|
||||||
|
#endif /* _SYS_ZFS_RACCT_H */
|
@ -163,6 +163,7 @@ KERNEL_C = \
|
|||||||
zfs_debug.c \
|
zfs_debug.c \
|
||||||
zfs_fm.c \
|
zfs_fm.c \
|
||||||
zfs_fuid.c \
|
zfs_fuid.c \
|
||||||
|
zfs_racct.c \
|
||||||
zfs_sa.c \
|
zfs_sa.c \
|
||||||
zfs_znode.c \
|
zfs_znode.c \
|
||||||
zfs_ratelimit.c \
|
zfs_ratelimit.c \
|
||||||
|
@ -153,6 +153,7 @@ SRCS+= abd_os.c \
|
|||||||
zfs_dir.c \
|
zfs_dir.c \
|
||||||
zfs_ioctl_compat.c \
|
zfs_ioctl_compat.c \
|
||||||
zfs_ioctl_os.c \
|
zfs_ioctl_os.c \
|
||||||
|
zfs_racct.c \
|
||||||
zfs_vfsops.c \
|
zfs_vfsops.c \
|
||||||
zfs_vnops_os.c \
|
zfs_vnops_os.c \
|
||||||
zfs_znode.c \
|
zfs_znode.c \
|
||||||
|
55
module/os/freebsd/zfs/zfs_racct.c
Normal file
55
module/os/freebsd/zfs/zfs_racct.c
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2021 iXsystems, Inc.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/zfs_racct.h>
|
||||||
|
#include <sys/racct.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
zfs_racct_read(uint64_t size, uint64_t iops)
|
||||||
|
{
|
||||||
|
curthread->td_ru.ru_inblock += iops;
|
||||||
|
#ifdef RACCT
|
||||||
|
if (racct_enable) {
|
||||||
|
PROC_LOCK(curproc);
|
||||||
|
racct_add_force(curproc, RACCT_READBPS, size);
|
||||||
|
racct_add_force(curproc, RACCT_READIOPS, iops);
|
||||||
|
PROC_UNLOCK(curproc);
|
||||||
|
}
|
||||||
|
#endif /* RACCT */
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
zfs_racct_write(uint64_t size, uint64_t iops)
|
||||||
|
{
|
||||||
|
curthread->td_ru.ru_oublock += iops;
|
||||||
|
#ifdef RACCT
|
||||||
|
if (racct_enable) {
|
||||||
|
PROC_LOCK(curproc);
|
||||||
|
racct_add_force(curproc, RACCT_WRITEBPS, size);
|
||||||
|
racct_add_force(curproc, RACCT_WRITEIOPS, iops);
|
||||||
|
PROC_UNLOCK(curproc);
|
||||||
|
}
|
||||||
|
#endif /* RACCT */
|
||||||
|
}
|
@ -22,6 +22,7 @@ $(MODULE)-objs += ../os/linux/zfs/zfs_debug.o
|
|||||||
$(MODULE)-objs += ../os/linux/zfs/zfs_dir.o
|
$(MODULE)-objs += ../os/linux/zfs/zfs_dir.o
|
||||||
$(MODULE)-objs += ../os/linux/zfs/zfs_file_os.o
|
$(MODULE)-objs += ../os/linux/zfs/zfs_file_os.o
|
||||||
$(MODULE)-objs += ../os/linux/zfs/zfs_ioctl_os.o
|
$(MODULE)-objs += ../os/linux/zfs/zfs_ioctl_os.o
|
||||||
|
$(MODULE)-objs += ../os/linux/zfs/zfs_racct.o
|
||||||
$(MODULE)-objs += ../os/linux/zfs/zfs_sysfs.o
|
$(MODULE)-objs += ../os/linux/zfs/zfs_sysfs.o
|
||||||
$(MODULE)-objs += ../os/linux/zfs/zfs_uio.o
|
$(MODULE)-objs += ../os/linux/zfs/zfs_uio.o
|
||||||
$(MODULE)-objs += ../os/linux/zfs/zfs_vfsops.o
|
$(MODULE)-objs += ../os/linux/zfs/zfs_vfsops.o
|
||||||
|
36
module/os/linux/zfs/zfs_racct.c
Normal file
36
module/os/linux/zfs/zfs_racct.c
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2021 iXsystems, Inc.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/zfs_racct.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
zfs_racct_read(uint64_t size, uint64_t iops)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
zfs_racct_write(uint64_t size, uint64_t iops)
|
||||||
|
{
|
||||||
|
}
|
@ -308,6 +308,7 @@
|
|||||||
#include <sys/aggsum.h>
|
#include <sys/aggsum.h>
|
||||||
#include <cityhash.h>
|
#include <cityhash.h>
|
||||||
#include <sys/vdev_trim.h>
|
#include <sys/vdev_trim.h>
|
||||||
|
#include <sys/zfs_racct.h>
|
||||||
#include <sys/zstd/zstd.h>
|
#include <sys/zstd/zstd.h>
|
||||||
|
|
||||||
#ifndef _KERNEL
|
#ifndef _KERNEL
|
||||||
@ -6302,6 +6303,7 @@ top:
|
|||||||
ARCSTAT_CONDSTAT(!HDR_PREFETCH(hdr),
|
ARCSTAT_CONDSTAT(!HDR_PREFETCH(hdr),
|
||||||
demand, prefetch, !HDR_ISTYPE_METADATA(hdr), data,
|
demand, prefetch, !HDR_ISTYPE_METADATA(hdr), data,
|
||||||
metadata, misses);
|
metadata, misses);
|
||||||
|
zfs_racct_read(size, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check if the spa even has l2 configured */
|
/* Check if the spa even has l2 configured */
|
||||||
|
@ -52,6 +52,7 @@
|
|||||||
#include <sys/zfeature.h>
|
#include <sys/zfeature.h>
|
||||||
#include <sys/abd.h>
|
#include <sys/abd.h>
|
||||||
#include <sys/trace_zfs.h>
|
#include <sys/trace_zfs.h>
|
||||||
|
#include <sys/zfs_racct.h>
|
||||||
#include <sys/zfs_rlock.h>
|
#include <sys/zfs_rlock.h>
|
||||||
#ifdef _KERNEL
|
#ifdef _KERNEL
|
||||||
#include <sys/vmsystm.h>
|
#include <sys/vmsystm.h>
|
||||||
@ -551,6 +552,9 @@ dmu_buf_hold_array_by_dnode(dnode_t *dn, uint64_t offset, uint64_t length,
|
|||||||
dbp[i] = &db->db;
|
dbp[i] = &db->db;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!read)
|
||||||
|
zfs_racct_write(length, nblks);
|
||||||
|
|
||||||
if ((flags & DMU_READ_NO_PREFETCH) == 0 &&
|
if ((flags & DMU_READ_NO_PREFETCH) == 0 &&
|
||||||
DNODE_META_IS_CACHEABLE(dn) && length <= zfetch_array_rd_sz) {
|
DNODE_META_IS_CACHEABLE(dn) && length <= zfetch_array_rd_sz) {
|
||||||
dmu_zfetch(&dn->dn_zfetch, blkid, nblks,
|
dmu_zfetch(&dn->dn_zfetch, blkid, nblks,
|
||||||
@ -1440,6 +1444,7 @@ dmu_assign_arcbuf_by_dnode(dnode_t *dn, uint64_t offset, arc_buf_t *buf,
|
|||||||
* same size as the dbuf.
|
* same size as the dbuf.
|
||||||
*/
|
*/
|
||||||
if (offset == db->db.db_offset && blksz == db->db.db_size) {
|
if (offset == db->db.db_offset && blksz == db->db.db_size) {
|
||||||
|
zfs_racct_write(blksz, 1);
|
||||||
dbuf_assign_arcbuf(db, buf, tx);
|
dbuf_assign_arcbuf(db, buf, tx);
|
||||||
dbuf_rele(db, FTAG);
|
dbuf_rele(db, FTAG);
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user