1*df58e8b1SMartin Matuska // SPDX-License-Identifier: CDDL-1.0 2*df58e8b1SMartin Matuska /* 3*df58e8b1SMartin Matuska * CDDL HEADER START 4*df58e8b1SMartin Matuska * 5*df58e8b1SMartin Matuska * The contents of this file are subject to the terms of the 6*df58e8b1SMartin Matuska * Common Development and Distribution License (the "License"). 7*df58e8b1SMartin Matuska * You may not use this file except in compliance with the License. 8*df58e8b1SMartin Matuska * 9*df58e8b1SMartin Matuska * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10*df58e8b1SMartin Matuska * or https://opensource.org/licenses/CDDL-1.0. 11*df58e8b1SMartin Matuska * See the License for the specific language governing permissions 12*df58e8b1SMartin Matuska * and limitations under the License. 13*df58e8b1SMartin Matuska * 14*df58e8b1SMartin Matuska * When distributing Covered Code, include this CDDL HEADER in each 15*df58e8b1SMartin Matuska * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16*df58e8b1SMartin Matuska * If applicable, add the following below this CDDL HEADER, with the 17*df58e8b1SMartin Matuska * fields enclosed by brackets "[]" replaced with your own identifying 18*df58e8b1SMartin Matuska * information: Portions Copyright [yyyy] [name of copyright owner] 19*df58e8b1SMartin Matuska * 20*df58e8b1SMartin Matuska * CDDL HEADER END 21*df58e8b1SMartin Matuska */ 22*df58e8b1SMartin Matuska /* 23*df58e8b1SMartin Matuska * Copyright (c) 2024 Klara Inc. 24*df58e8b1SMartin Matuska * 25*df58e8b1SMartin Matuska * This software was developed by 26*df58e8b1SMartin Matuska * Mariusz Zaborski <mariusz.zaborski@klarasystems.com> 27*df58e8b1SMartin Matuska * Fred Weigel <fred.weigel@klarasystems.com> 28*df58e8b1SMartin Matuska * under sponsorship from Wasabi Technology, Inc. and Klara Inc. 29*df58e8b1SMartin Matuska */ 30*df58e8b1SMartin Matuska 31*df58e8b1SMartin Matuska #ifndef _CRRD_H_ 32*df58e8b1SMartin Matuska #define _CRRD_H_ 33*df58e8b1SMartin Matuska 34*df58e8b1SMartin Matuska #define RRD_MAX_ENTRIES 256 35*df58e8b1SMartin Matuska 36*df58e8b1SMartin Matuska #define RRD_ENTRY_SIZE sizeof (uint64_t) 37*df58e8b1SMartin Matuska #define RRD_STRUCT_ELEM (sizeof (rrd_t) / RRD_ENTRY_SIZE) 38*df58e8b1SMartin Matuska 39*df58e8b1SMartin Matuska typedef enum { 40*df58e8b1SMartin Matuska DBRRD_FLOOR, 41*df58e8b1SMartin Matuska DBRRD_CEILING 42*df58e8b1SMartin Matuska } dbrrd_rounding_t; 43*df58e8b1SMartin Matuska 44*df58e8b1SMartin Matuska typedef struct { 45*df58e8b1SMartin Matuska uint64_t rrdd_time; 46*df58e8b1SMartin Matuska uint64_t rrdd_txg; 47*df58e8b1SMartin Matuska } rrd_data_t; 48*df58e8b1SMartin Matuska 49*df58e8b1SMartin Matuska typedef struct { 50*df58e8b1SMartin Matuska uint64_t rrd_head; /* head (beginning) */ 51*df58e8b1SMartin Matuska uint64_t rrd_tail; /* tail (end) */ 52*df58e8b1SMartin Matuska uint64_t rrd_length; 53*df58e8b1SMartin Matuska 54*df58e8b1SMartin Matuska rrd_data_t rrd_entries[RRD_MAX_ENTRIES]; 55*df58e8b1SMartin Matuska } rrd_t; 56*df58e8b1SMartin Matuska 57*df58e8b1SMartin Matuska typedef struct { 58*df58e8b1SMartin Matuska rrd_t dbr_minutes; 59*df58e8b1SMartin Matuska rrd_t dbr_days; 60*df58e8b1SMartin Matuska rrd_t dbr_months; 61*df58e8b1SMartin Matuska } dbrrd_t; 62*df58e8b1SMartin Matuska 63*df58e8b1SMartin Matuska size_t rrd_len(rrd_t *rrd); 64*df58e8b1SMartin Matuska 65*df58e8b1SMartin Matuska const rrd_data_t *rrd_entry(rrd_t *r, size_t i); 66*df58e8b1SMartin Matuska rrd_data_t *rrd_tail_entry(rrd_t *rrd); 67*df58e8b1SMartin Matuska uint64_t rrd_tail(rrd_t *rrd); 68*df58e8b1SMartin Matuska uint64_t rrd_get(rrd_t *rrd, size_t i); 69*df58e8b1SMartin Matuska 70*df58e8b1SMartin Matuska void rrd_add(rrd_t *rrd, hrtime_t time, uint64_t txg); 71*df58e8b1SMartin Matuska 72*df58e8b1SMartin Matuska void dbrrd_add(dbrrd_t *db, hrtime_t time, uint64_t txg); 73*df58e8b1SMartin Matuska uint64_t dbrrd_query(dbrrd_t *r, hrtime_t tv, dbrrd_rounding_t rouding); 74*df58e8b1SMartin Matuska 75*df58e8b1SMartin Matuska #endif 76