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 9eda14cbcSMatt Macy * or http://www.opensolaris.org/os/licensing. 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 */ 52*f9693befSMartin Matuska uint64_t zs_pf_blkid1; /* first block to prefetch */ 53*f9693befSMartin Matuska uint64_t zs_pf_blkid; /* block to prefetch up to */ 54eda14cbcSMatt Macy 55eda14cbcSMatt Macy /* 56eda14cbcSMatt Macy * We will next prefetch the L1 indirect block of this level-0 57eda14cbcSMatt Macy * block id. 58eda14cbcSMatt Macy */ 59*f9693befSMartin Matuska uint64_t zs_ipf_blkid1; /* first block to prefetch */ 60*f9693befSMartin Matuska uint64_t zs_ipf_blkid; /* block to prefetch up to */ 61eda14cbcSMatt Macy 62eda14cbcSMatt Macy list_node_t zs_node; /* link for zf_stream */ 63*f9693befSMartin Matuska hrtime_t zs_atime; /* time last prefetch issued */ 647877fdebSMatt Macy zfetch_t *zs_fetch; /* parent fetch */ 65*f9693befSMartin Matuska boolean_t zs_missed; /* stream saw cache misses */ 66*f9693befSMartin Matuska zfs_refcount_t zs_callers; /* number of pending callers */ 67*f9693befSMartin Matuska /* 68*f9693befSMartin Matuska * Number of stream references: dnode, callers and pending blocks. 69*f9693befSMartin Matuska * The stream memory is freed when the number returns to zero. 70*f9693befSMartin Matuska */ 71*f9693befSMartin Matuska zfs_refcount_t zs_refs; 72eda14cbcSMatt Macy } zstream_t; 73eda14cbcSMatt Macy 74eda14cbcSMatt Macy void zfetch_init(void); 75eda14cbcSMatt Macy void zfetch_fini(void); 76eda14cbcSMatt Macy 77eda14cbcSMatt Macy void dmu_zfetch_init(zfetch_t *, struct dnode *); 78eda14cbcSMatt Macy void dmu_zfetch_fini(zfetch_t *); 79*f9693befSMartin Matuska zstream_t *dmu_zfetch_prepare(zfetch_t *, uint64_t, uint64_t, boolean_t, 80*f9693befSMartin Matuska boolean_t); 81*f9693befSMartin Matuska void dmu_zfetch_run(zstream_t *, boolean_t, boolean_t); 82*f9693befSMartin Matuska void dmu_zfetch(zfetch_t *, uint64_t, uint64_t, boolean_t, boolean_t, 83eda14cbcSMatt Macy boolean_t); 84eda14cbcSMatt Macy 85eda14cbcSMatt Macy 86eda14cbcSMatt Macy #ifdef __cplusplus 87eda14cbcSMatt Macy } 88eda14cbcSMatt Macy #endif 89eda14cbcSMatt Macy 90eda14cbcSMatt Macy #endif /* _DMU_ZFETCH_H */ 91