mirror of
https://git.proxmox.com/git/mirror_zfs.git
synced 2024-11-17 10:01:01 +03:00
e0ce98d57c
Previous code used 4 atomics to do aggsum_flush_bucket() and 2 more to re-borrow after the flush. But since asc_borrowed and asc_delta are accessed only while holding asc_lock, it makes no any sense to modify as_lower_bound and as_upper_bound in multiple steps. Instead of that the new code uses only 2 atomics in all the cases, one per as_*_bound variable. I think even that is overkill, simple atomic store and load could be used here, since all modifications are done under the as_lock, but there are no such primitives in ZFS code now. While there, make borrow code consider previous borrow value, so that on mixed request patterns reduce chance of needing to borrow again if much larger request follows tiny one that needed borrow. Also reduce as_numbuckets from uint64_t to u_int. It makes no sense to use so large division operation on every aggsum_add(). Reviewed-by: Brian Behlendorf <behlendorf1@llnl.gov> Reviewed-by: Paul Dagnelie <pcd@delphix.com> Signed-off-by: Alexander Motin <mav@FreeBSD.org> Sponsored-By: iXsystems, Inc. Closes #9930
60 lines
1.3 KiB
C
60 lines
1.3 KiB
C
/*
|
|
* CDDL HEADER START
|
|
*
|
|
* This file and its contents are supplied under the terms of the
|
|
* Common Development and Distribution License ("CDDL"), version 1.0.
|
|
* You may only use this file in accordance with the terms of version
|
|
* 1.0 of the CDDL.
|
|
*
|
|
* A full copy of the text of the CDDL should have accompanied this
|
|
* source. A copy of the CDDL is also available via the Internet at
|
|
* http://www.illumos.org/license/CDDL.
|
|
*
|
|
* CDDL HEADER END
|
|
*/
|
|
/*
|
|
* Copyright (c) 2017 by Delphix. All rights reserved.
|
|
*/
|
|
|
|
#ifndef _SYS_AGGSUM_H
|
|
#define _SYS_AGGSUM_H
|
|
|
|
#include <sys/zfs_context.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
typedef struct aggsum_bucket aggsum_bucket_t;
|
|
|
|
struct aggsum_bucket {
|
|
kmutex_t asc_lock;
|
|
int64_t asc_delta;
|
|
uint64_t asc_borrowed;
|
|
} ____cacheline_aligned;
|
|
|
|
/*
|
|
* Fan out over FANOUT cpus.
|
|
*/
|
|
typedef struct aggsum {
|
|
kmutex_t as_lock;
|
|
int64_t as_lower_bound;
|
|
int64_t as_upper_bound;
|
|
uint_t as_numbuckets;
|
|
aggsum_bucket_t *as_buckets;
|
|
} aggsum_t;
|
|
|
|
void aggsum_init(aggsum_t *, uint64_t);
|
|
void aggsum_fini(aggsum_t *);
|
|
int64_t aggsum_lower_bound(aggsum_t *);
|
|
int64_t aggsum_upper_bound(aggsum_t *);
|
|
int aggsum_compare(aggsum_t *, uint64_t);
|
|
uint64_t aggsum_value(aggsum_t *);
|
|
void aggsum_add(aggsum_t *, int64_t);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* _SYS_AGGSUM_H */
|