• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /freebsd-13-stable/sys/contrib/openzfs/module/os/linux/zfs/

Lines Matching refs:abd

27  * See abd.c for a general overview of the arc buffered data (ABD).
135 #define abd_for_each_sg(abd, sg, n, i) \
136 for_each_sg(ABD_SCATTER(abd).abd_sgl, sg, n, i)
194 abd_t *abd = kmem_cache_alloc(abd_cache, KM_PUSHPAGE);
195 ASSERT3P(abd, !=, NULL);
198 return (abd);
202 abd_free_struct_impl(abd_t *abd)
204 kmem_cache_free(abd_cache, abd);
249 abd_alloc_chunks(abd_t *abd, size_t size)
320 ASSERT0(ABD_SCATTER(abd).abd_offset);
344 abd->abd_flags |= ABD_FLAG_LINEAR;
345 abd->abd_flags |= ABD_FLAG_LINEAR_PAGE;
346 abd->abd_u.abd_linear.abd_sgl = table.sgl;
347 ABD_LINEAR_BUF(abd) = page_address(sg_page(table.sgl));
350 abd->abd_flags |= ABD_FLAG_MULTI_CHUNK;
354 abd->abd_flags |= ABD_FLAG_MULTI_ZONE;
357 ABD_SCATTER(abd).abd_sgl = table.sgl;
358 ABD_SCATTER(abd).abd_nents = table.nents;
369 abd_alloc_chunks(abd_t *abd, size_t size)
384 ABD_SCATTER(abd).abd_sgl = table.sgl;
385 ABD_SCATTER(abd).abd_nents = nr_pages;
387 abd_for_each_sg(abd, sg, nr_pages, i) {
400 abd->abd_flags |= ABD_FLAG_MULTI_CHUNK;
410 abd_free_sg_table(abd_t *abd)
414 table.sgl = ABD_SCATTER(abd).abd_sgl;
415 table.nents = table.orig_nents = ABD_SCATTER(abd).abd_nents;
420 abd_free_chunks(abd_t *abd)
424 int nr_pages = ABD_SCATTER(abd).abd_nents;
427 if (abd->abd_flags & ABD_FLAG_MULTI_ZONE)
430 if (abd->abd_flags & ABD_FLAG_MULTI_CHUNK)
433 abd_for_each_sg(abd, sg, nr_pages, i) {
441 abd_free_sg_table(abd);
518 abd_free_sg_table(abd_t *abd)
520 int nents = ABD_SCATTER(abd).abd_nents;
521 vmem_free(ABD_SCATTER(abd).abd_sgl,
554 abd_alloc_chunks(abd_t *abd, size_t size)
560 ABD_SCATTER(abd).abd_sgl = vmem_alloc(nr_pages *
562 sg_init_table(ABD_SCATTER(abd).abd_sgl, nr_pages);
564 abd_for_each_sg(abd, sg, nr_pages, i) {
568 ABD_SCATTER(abd).abd_nents = nr_pages;
572 abd_free_chunks(abd_t *abd)
574 int i, n = ABD_SCATTER(abd).abd_nents;
577 abd_for_each_sg(abd, sg, n, i) {
583 abd_free_sg_table(abd);
625 abd_update_scatter_stats(abd_t *abd, abd_stats_op_t op)
628 int waste = P2ROUNDUP(abd->abd_size, PAGESIZE) - abd->abd_size;
631 ABDSTAT_INCR(abdstat_scatter_data_size, abd->abd_size);
636 ABDSTAT_INCR(abdstat_scatter_data_size, -(int)abd->abd_size);
643 abd_update_linear_stats(abd_t *abd, abd_stats_op_t op)
648 ABDSTAT_INCR(abdstat_linear_data_size, abd->abd_size);
651 ABDSTAT_INCR(abdstat_linear_data_size, -(int)abd->abd_size);
656 abd_verify_scatter(abd_t *abd)
662 ASSERT3U(ABD_SCATTER(abd).abd_nents, >, 0);
663 ASSERT3U(ABD_SCATTER(abd).abd_offset, <,
664 ABD_SCATTER(abd).abd_sgl->length);
665 n = ABD_SCATTER(abd).abd_nents;
666 abd_for_each_sg(abd, sg, n, i) {
731 abd_free_linear_page(abd_t *abd)
734 struct scatterlist *sg = abd->abd_u.abd_linear.abd_sgl;
735 abd->abd_flags &= ~ABD_FLAG_LINEAR;
736 abd->abd_flags &= ~ABD_FLAG_LINEAR_PAGE;
737 ABD_SCATTER(abd).abd_nents = 1;
738 ABD_SCATTER(abd).abd_offset = 0;
739 ABD_SCATTER(abd).abd_sgl = sg;
740 abd_free_chunks(abd);
742 abd_update_scatter_stats(abd, ABDSTAT_DECR);
763 abd_get_offset_scatter(abd_t *abd, abd_t *sabd, size_t off)
773 if (abd == NULL)
774 abd = abd_alloc_struct(0);
788 ABD_SCATTER(abd).abd_sgl = sg;
789 ABD_SCATTER(abd).abd_offset = new_offset;
790 ABD_SCATTER(abd).abd_nents = ABD_SCATTER(sabd).abd_nents - i;
792 return (abd);
799 abd_iter_init(struct abd_iter *aiter, abd_t *abd)
801 ASSERT(!abd_is_gang(abd));
802 abd_verify(abd);
803 aiter->iter_abd = abd;
807 if (abd_is_linear(abd)) {
811 aiter->iter_offset = ABD_SCATTER(abd).abd_offset;
812 aiter->iter_sg = ABD_SCATTER(abd).abd_sgl;
919 * @off is the offset in @abd
922 abd_nr_pages_off(abd_t *abd, unsigned int size, size_t off)
926 if (abd_is_gang(abd)) {
929 for (abd_t *cabd = abd_gang_get_offset(abd, &off);
931 cabd = list_next(&ABD_GANG(abd).abd_gang_chain, cabd)) {
941 if (abd_is_linear(abd))
942 pos = (unsigned long)abd_to_buf(abd) + off;
944 pos = ABD_SCATTER(abd).abd_offset + off;
993 abd_gang_bio_map_off(struct bio *bio, abd_t *abd,
996 ASSERT(abd_is_gang(abd));
998 for (abd_t *cabd = abd_gang_get_offset(abd, &off);
1000 cabd = list_next(&ABD_GANG(abd).abd_gang_chain, cabd)) {
1015 * @off is the offset in @abd
1019 abd_bio_map_off(struct bio *bio, abd_t *abd,
1024 ASSERT3U(io_size, <=, abd->abd_size - off);
1025 if (abd_is_linear(abd))
1026 return (bio_map(bio, ((char *)abd_to_buf(abd)) + off, io_size));
1028 ASSERT(!abd_is_linear(abd));
1029 if (abd_is_gang(abd))
1030 return (abd_gang_bio_map_off(bio, abd, io_size, off));
1032 abd_iter_init(&aiter, abd);