1eda14cbcSMatt Macy /* 2eda14cbcSMatt Macy * CDDL HEADER START 3eda14cbcSMatt Macy * 4eda14cbcSMatt Macy * The contents of this file are subject to the terms of the 5eda14cbcSMatt Macy * Common Development and Distribution License (the "License"). 6eda14cbcSMatt Macy * You may not use this file except in compliance with the License. 7eda14cbcSMatt Macy * 8eda14cbcSMatt Macy * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9271171e0SMartin Matuska * or https://opensource.org/licenses/CDDL-1.0. 10eda14cbcSMatt Macy * See the License for the specific language governing permissions 11eda14cbcSMatt Macy * and limitations under the License. 12eda14cbcSMatt Macy * 13eda14cbcSMatt Macy * When distributing Covered Code, include this CDDL HEADER in each 14eda14cbcSMatt Macy * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15eda14cbcSMatt Macy * If applicable, add the following below this CDDL HEADER, with the 16eda14cbcSMatt Macy * fields enclosed by brackets "[]" replaced with your own identifying 17eda14cbcSMatt Macy * information: Portions Copyright [yyyy] [name of copyright owner] 18eda14cbcSMatt Macy * 19eda14cbcSMatt Macy * CDDL HEADER END 20eda14cbcSMatt Macy */ 21eda14cbcSMatt Macy /* 22eda14cbcSMatt Macy * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 23eda14cbcSMatt Macy * Use is subject to license terms. 24eda14cbcSMatt Macy */ 25eda14cbcSMatt Macy 26eda14cbcSMatt Macy /* 27eda14cbcSMatt Macy * Copyright (c) 2014, 2017 by Delphix. All rights reserved. 28eda14cbcSMatt Macy */ 29eda14cbcSMatt Macy 30eda14cbcSMatt Macy #ifndef _DMU_ZFETCH_H 31eda14cbcSMatt Macy #define _DMU_ZFETCH_H 32eda14cbcSMatt Macy 33eda14cbcSMatt Macy #include <sys/zfs_context.h> 34eda14cbcSMatt Macy 35eda14cbcSMatt Macy #ifdef __cplusplus 36eda14cbcSMatt Macy extern "C" { 37eda14cbcSMatt Macy #endif 38eda14cbcSMatt Macy 39eda14cbcSMatt Macy struct dnode; /* so we can reference dnode */ 40eda14cbcSMatt Macy 417877fdebSMatt Macy typedef struct zfetch { 427877fdebSMatt Macy kmutex_t zf_lock; /* protects zfetch structure */ 437877fdebSMatt Macy list_t zf_stream; /* list of zstream_t's */ 447877fdebSMatt Macy struct dnode *zf_dnode; /* dnode that owns this zfetch */ 457877fdebSMatt Macy int zf_numstreams; /* number of zstream_t's */ 467877fdebSMatt Macy } zfetch_t; 477877fdebSMatt Macy 48*1719886fSMartin Matuska typedef struct zsrange { 49*1719886fSMartin Matuska uint16_t start; 50*1719886fSMartin Matuska uint16_t end; 51*1719886fSMartin Matuska } zsrange_t; 52*1719886fSMartin Matuska 53*1719886fSMartin Matuska #define ZFETCH_RANGES 9 /* Fits zstream_t into 128 bytes */ 54*1719886fSMartin Matuska 55eda14cbcSMatt Macy typedef struct zstream { 56*1719886fSMartin Matuska list_node_t zs_node; /* link for zf_stream */ 57eda14cbcSMatt Macy uint64_t zs_blkid; /* expect next access at this blkid */ 58*1719886fSMartin Matuska uint_t zs_atime; /* time last prefetch issued */ 59*1719886fSMartin Matuska zsrange_t zs_ranges[ZFETCH_RANGES]; /* ranges from future */ 60e3aa18adSMartin Matuska unsigned int zs_pf_dist; /* data prefetch distance in bytes */ 61e3aa18adSMartin Matuska unsigned int zs_ipf_dist; /* L1 prefetch distance in bytes */ 62e3aa18adSMartin Matuska uint64_t zs_pf_start; /* first data block to prefetch */ 63e3aa18adSMartin Matuska uint64_t zs_pf_end; /* data block to prefetch up to */ 64e3aa18adSMartin Matuska uint64_t zs_ipf_start; /* first data block to prefetch L1 */ 65e3aa18adSMartin Matuska uint64_t zs_ipf_end; /* data block to prefetch L1 up to */ 66f9693befSMartin Matuska boolean_t zs_missed; /* stream saw cache misses */ 67e3aa18adSMartin Matuska boolean_t zs_more; /* need more distant prefetch */ 68f9693befSMartin Matuska zfs_refcount_t zs_callers; /* number of pending callers */ 69f9693befSMartin Matuska /* 70f9693befSMartin Matuska * Number of stream references: dnode, callers and pending blocks. 71f9693befSMartin Matuska * The stream memory is freed when the number returns to zero. 72f9693befSMartin Matuska */ 73f9693befSMartin Matuska zfs_refcount_t zs_refs; 74eda14cbcSMatt Macy } zstream_t; 75eda14cbcSMatt Macy 76eda14cbcSMatt Macy void zfetch_init(void); 77eda14cbcSMatt Macy void zfetch_fini(void); 78eda14cbcSMatt Macy 79eda14cbcSMatt Macy void dmu_zfetch_init(zfetch_t *, struct dnode *); 80eda14cbcSMatt Macy void dmu_zfetch_fini(zfetch_t *); 81f9693befSMartin Matuska zstream_t *dmu_zfetch_prepare(zfetch_t *, uint64_t, uint64_t, boolean_t, 82f9693befSMartin Matuska boolean_t); 83*1719886fSMartin Matuska void dmu_zfetch_run(zfetch_t *, zstream_t *, boolean_t, boolean_t); 84f9693befSMartin Matuska void dmu_zfetch(zfetch_t *, uint64_t, uint64_t, boolean_t, boolean_t, 85eda14cbcSMatt Macy boolean_t); 86eda14cbcSMatt Macy 87eda14cbcSMatt Macy 88eda14cbcSMatt Macy #ifdef __cplusplus 89eda14cbcSMatt Macy } 90eda14cbcSMatt Macy #endif 91eda14cbcSMatt Macy 92eda14cbcSMatt Macy #endif /* _DMU_ZFETCH_H */ 93