mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +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
	 Ryan Moeller
						Ryan Moeller