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 9*271171e0SMartin 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 extern unsigned long zfetch_array_rd_sz; 40eda14cbcSMatt Macy 41eda14cbcSMatt Macy struct dnode; /* so we can reference dnode */ 42eda14cbcSMatt Macy 437877fdebSMatt Macy typedef struct zfetch { 447877fdebSMatt Macy kmutex_t zf_lock; /* protects zfetch structure */ 457877fdebSMatt Macy list_t zf_stream; /* list of zstream_t's */ 467877fdebSMatt Macy struct dnode *zf_dnode; /* dnode that owns this zfetch */ 477877fdebSMatt Macy int zf_numstreams; /* number of zstream_t's */ 487877fdebSMatt Macy } zfetch_t; 497877fdebSMatt Macy 50eda14cbcSMatt Macy typedef struct zstream { 51eda14cbcSMatt Macy uint64_t zs_blkid; /* expect next access at this blkid */ 52e3aa18adSMartin Matuska unsigned int zs_pf_dist; /* data prefetch distance in bytes */ 53e3aa18adSMartin Matuska unsigned int zs_ipf_dist; /* L1 prefetch distance in bytes */ 54e3aa18adSMartin Matuska uint64_t zs_pf_start; /* first data block to prefetch */ 55e3aa18adSMartin Matuska uint64_t zs_pf_end; /* data block to prefetch up to */ 56e3aa18adSMartin Matuska uint64_t zs_ipf_start; /* first data block to prefetch L1 */ 57e3aa18adSMartin Matuska uint64_t zs_ipf_end; /* data block to prefetch L1 up to */ 58eda14cbcSMatt Macy 59eda14cbcSMatt Macy list_node_t zs_node; /* link for zf_stream */ 60f9693befSMartin Matuska hrtime_t zs_atime; /* time last prefetch issued */ 617877fdebSMatt Macy zfetch_t *zs_fetch; /* parent fetch */ 62f9693befSMartin Matuska boolean_t zs_missed; /* stream saw cache misses */ 63e3aa18adSMartin Matuska boolean_t zs_more; /* need more distant prefetch */ 64f9693befSMartin Matuska zfs_refcount_t zs_callers; /* number of pending callers */ 65f9693befSMartin Matuska /* 66f9693befSMartin Matuska * Number of stream references: dnode, callers and pending blocks. 67f9693befSMartin Matuska * The stream memory is freed when the number returns to zero. 68f9693befSMartin Matuska */ 69f9693befSMartin Matuska zfs_refcount_t zs_refs; 70eda14cbcSMatt Macy } zstream_t; 71eda14cbcSMatt Macy 72eda14cbcSMatt Macy void zfetch_init(void); 73eda14cbcSMatt Macy void zfetch_fini(void); 74eda14cbcSMatt Macy 75eda14cbcSMatt Macy void dmu_zfetch_init(zfetch_t *, struct dnode *); 76eda14cbcSMatt Macy void dmu_zfetch_fini(zfetch_t *); 77f9693befSMartin Matuska zstream_t *dmu_zfetch_prepare(zfetch_t *, uint64_t, uint64_t, boolean_t, 78f9693befSMartin Matuska boolean_t); 79f9693befSMartin Matuska void dmu_zfetch_run(zstream_t *, boolean_t, boolean_t); 80f9693befSMartin Matuska void dmu_zfetch(zfetch_t *, uint64_t, uint64_t, boolean_t, boolean_t, 81eda14cbcSMatt Macy boolean_t); 82eda14cbcSMatt Macy 83eda14cbcSMatt Macy 84eda14cbcSMatt Macy #ifdef __cplusplus 85eda14cbcSMatt Macy } 86eda14cbcSMatt Macy #endif 87eda14cbcSMatt Macy 88eda14cbcSMatt Macy #endif /* _DMU_ZFETCH_H */ 89