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 (c) 2014 by Chunwei Chen. All rights reserved. 23eda14cbcSMatt Macy * Copyright (c) 2016, 2019 by Delphix. All rights reserved. 24*783d3ff6SMartin Matuska * Copyright (c) 2023, 2024, Klara Inc. 25eda14cbcSMatt Macy */ 26eda14cbcSMatt Macy 27eda14cbcSMatt Macy #ifndef _ABD_IMPL_H 28eda14cbcSMatt Macy #define _ABD_IMPL_H 29eda14cbcSMatt Macy 30eda14cbcSMatt Macy #include <sys/abd.h> 310d8fe237SMartin Matuska #include <sys/wmsum.h> 32eda14cbcSMatt Macy 33eda14cbcSMatt Macy #ifdef __cplusplus 34eda14cbcSMatt Macy extern "C" { 35eda14cbcSMatt Macy #endif 36eda14cbcSMatt Macy 37eda14cbcSMatt Macy typedef enum abd_stats_op { 38eda14cbcSMatt Macy ABDSTAT_INCR, /* Increase abdstat values */ 39eda14cbcSMatt Macy ABDSTAT_DECR /* Decrease abdstat values */ 40eda14cbcSMatt Macy } abd_stats_op_t; 41eda14cbcSMatt Macy 42*783d3ff6SMartin Matuska /* forward declarations */ 43*783d3ff6SMartin Matuska struct scatterlist; 44*783d3ff6SMartin Matuska struct page; 45eda14cbcSMatt Macy 46eda14cbcSMatt Macy struct abd_iter { 47eda14cbcSMatt Macy /* public interface */ 48*783d3ff6SMartin Matuska union { 49*783d3ff6SMartin Matuska /* for abd_iter_map()/abd_iter_unmap() */ 50*783d3ff6SMartin Matuska struct { 51*783d3ff6SMartin Matuska /* addr corresponding to iter_pos */ 52*783d3ff6SMartin Matuska void *iter_mapaddr; 53*783d3ff6SMartin Matuska /* length of data valid at mapaddr */ 54*783d3ff6SMartin Matuska size_t iter_mapsize; 55*783d3ff6SMartin Matuska }; 56*783d3ff6SMartin Matuska /* for abd_iter_page() */ 57*783d3ff6SMartin Matuska struct { 58*783d3ff6SMartin Matuska /* current page */ 59*783d3ff6SMartin Matuska struct page *iter_page; 60*783d3ff6SMartin Matuska /* offset of data in page */ 61*783d3ff6SMartin Matuska size_t iter_page_doff; 62*783d3ff6SMartin Matuska /* size of data in page */ 63*783d3ff6SMartin Matuska size_t iter_page_dsize; 64*783d3ff6SMartin Matuska }; 65*783d3ff6SMartin Matuska }; 66eda14cbcSMatt Macy 67eda14cbcSMatt Macy /* private */ 68eda14cbcSMatt Macy abd_t *iter_abd; /* ABD being iterated through */ 69eda14cbcSMatt Macy size_t iter_pos; 70eda14cbcSMatt Macy size_t iter_offset; /* offset in current sg/abd_buf, */ 71eda14cbcSMatt Macy /* abd_offset included */ 72eda14cbcSMatt Macy struct scatterlist *iter_sg; /* current sg */ 73eda14cbcSMatt Macy }; 74eda14cbcSMatt Macy 75eda14cbcSMatt Macy extern abd_t *abd_zero_scatter; 76eda14cbcSMatt Macy 77eda14cbcSMatt Macy abd_t *abd_gang_get_offset(abd_t *, size_t *); 78184c1b94SMartin Matuska abd_t *abd_alloc_struct(size_t); 79184c1b94SMartin Matuska void abd_free_struct(abd_t *); 80eda14cbcSMatt Macy 81eda14cbcSMatt Macy /* 82eda14cbcSMatt Macy * OS specific functions 83eda14cbcSMatt Macy */ 84eda14cbcSMatt Macy 85184c1b94SMartin Matuska abd_t *abd_alloc_struct_impl(size_t); 867cd22ac4SMartin Matuska abd_t *abd_get_offset_scatter(abd_t *, abd_t *, size_t, size_t); 87184c1b94SMartin Matuska void abd_free_struct_impl(abd_t *); 88eda14cbcSMatt Macy void abd_alloc_chunks(abd_t *, size_t); 89eda14cbcSMatt Macy void abd_free_chunks(abd_t *); 90eda14cbcSMatt Macy void abd_update_scatter_stats(abd_t *, abd_stats_op_t); 91eda14cbcSMatt Macy void abd_update_linear_stats(abd_t *, abd_stats_op_t); 92eda14cbcSMatt Macy void abd_verify_scatter(abd_t *); 93eda14cbcSMatt Macy void abd_free_linear_page(abd_t *); 94eda14cbcSMatt Macy /* OS specific abd_iter functions */ 95eda14cbcSMatt Macy void abd_iter_init(struct abd_iter *, abd_t *); 96eda14cbcSMatt Macy boolean_t abd_iter_at_end(struct abd_iter *); 97eda14cbcSMatt Macy void abd_iter_advance(struct abd_iter *, size_t); 98eda14cbcSMatt Macy void abd_iter_map(struct abd_iter *); 99eda14cbcSMatt Macy void abd_iter_unmap(struct abd_iter *); 100*783d3ff6SMartin Matuska void abd_iter_page(struct abd_iter *); 101eda14cbcSMatt Macy 102eda14cbcSMatt Macy /* 103eda14cbcSMatt Macy * Helper macros 104eda14cbcSMatt Macy */ 105eda14cbcSMatt Macy #define ABDSTAT_INCR(stat, val) \ 1060d8fe237SMartin Matuska wmsum_add(&abd_sums.stat, (val)) 107eda14cbcSMatt Macy #define ABDSTAT_BUMP(stat) ABDSTAT_INCR(stat, 1) 108eda14cbcSMatt Macy #define ABDSTAT_BUMPDOWN(stat) ABDSTAT_INCR(stat, -1) 109eda14cbcSMatt Macy 110eda14cbcSMatt Macy #define ABD_SCATTER(abd) (abd->abd_u.abd_scatter) 111eda14cbcSMatt Macy #define ABD_LINEAR_BUF(abd) (abd->abd_u.abd_linear.abd_buf) 112eda14cbcSMatt Macy #define ABD_GANG(abd) (abd->abd_u.abd_gang) 113eda14cbcSMatt Macy 114eda14cbcSMatt Macy #if defined(_KERNEL) 115eda14cbcSMatt Macy #if defined(__FreeBSD__) 116eda14cbcSMatt Macy #define abd_enter_critical(flags) critical_enter() 117eda14cbcSMatt Macy #define abd_exit_critical(flags) critical_exit() 118eda14cbcSMatt Macy #else 119eda14cbcSMatt Macy #define abd_enter_critical(flags) local_irq_save(flags) 120eda14cbcSMatt Macy #define abd_exit_critical(flags) local_irq_restore(flags) 121eda14cbcSMatt Macy #endif 122eda14cbcSMatt Macy #else /* !_KERNEL */ 123eda14cbcSMatt Macy #define abd_enter_critical(flags) ((void)0) 124eda14cbcSMatt Macy #define abd_exit_critical(flags) ((void)0) 125eda14cbcSMatt Macy #endif 126eda14cbcSMatt Macy 127eda14cbcSMatt Macy #ifdef __cplusplus 128eda14cbcSMatt Macy } 129eda14cbcSMatt Macy #endif 130eda14cbcSMatt Macy 131eda14cbcSMatt Macy #endif /* _ABD_IMPL_H */ 132