1 /*
   2  * This file and its contents are supplied under the terms of the
   3  * Common Development and Distribution License ("CDDL"), version 1.0.
   4  * You may only use this file in accordance with the terms of version
   5  * 1.0 of the CDDL.
   6  *
   7  * A full copy of the text of the CDDL should have accompanied this
   8  * source.  A copy of the CDDL is also available via the Internet at
   9  * http://www.illumos.org/license/CDDL.
  10  */
  11 
  12 /*
  13  * Copyright 2016 Nexenta Systems, Inc.  All rights reserved.
  14  */
  15 
  16 #ifndef _KRRP_DBLK_H
  17 #define _KRRP_DBLK_H
  18 
  19 #include <sys/types.h>
  20 #include <sys/ddi.h>
  21 #include <sys/sunddi.h>
  22 #include <sys/time.h>
  23 #include <sys/sysmacros.h>
  24 #include <sys/kmem.h>
  25 #include <sys/modctl.h>
  26 #include <sys/class.h>
  27 #include <sys/cmn_err.h>
  28 
  29 #include <krrp_error.h>
  30 
  31 #ifdef __cplusplus
  32 extern "C" {
  33 #endif
  34 
  35 typedef struct krrp_dblk_engine_s krrp_dblk_engine_t;
  36 typedef struct krrp_dblk_s krrp_dblk_t;
  37 
  38 typedef void (krrp_dblk_free_notify_cb_t)(void *);
  39 typedef void (krrp_dblk_alloc_func_t)(krrp_dblk_engine_t *,
  40     krrp_dblk_t **, size_t);
  41 
  42 
  43 typedef enum {
  44         KRRP_DET_KMEM_ALLOC,
  45         KRRP_DET_KMEM_CACHE,
  46 } krrp_dblk_engine_type_t;
  47 
  48 typedef struct krrp_dblk_list_s {
  49         krrp_dblk_t     *head;
  50         krrp_dblk_t     *tail;
  51         size_t          cnt;
  52 } krrp_dblk_list_t;
  53 
  54 struct krrp_dblk_engine_s {
  55         krrp_dblk_engine_type_t type;
  56 
  57         kmutex_t                                mtx;
  58         kcondvar_t                              cv;
  59 
  60         boolean_t                               destroying;
  61         krrp_dblk_alloc_func_t  *alloc_func;
  62 
  63         kmem_cache_t                    *dblk_cache;
  64 
  65         krrp_dblk_list_t                free_dblks;
  66 
  67         size_t                                  cur_dblk_cnt;
  68         size_t                                  max_dblk_cnt;
  69 
  70         size_t                                  dblk_head_sz;
  71         size_t                                  dblk_data_sz;
  72         size_t                                  dblk_tail_sz;
  73 
  74         struct {
  75                 krrp_dblk_free_notify_cb_t      *cb;
  76                 void                                            *cb_arg;
  77                 size_t                                          init_value;
  78                 size_t                                          cnt;
  79         } notify_free;
  80 };
  81 
  82 struct krrp_dblk_s {
  83         /* These fields are common for krrp_dblk_t and kreplication_buffer_t */
  84         void                    *data;
  85         size_t                  max_data_sz;
  86         size_t                  cur_data_sz;
  87         krrp_dblk_t             *next;
  88 
  89         /* Private dblk's fields */
  90         krrp_dblk_engine_t      *engine;
  91         size_t                          total_sz;
  92         frtn_t                          free_rtns;
  93 
  94         /* This field is used by TCP/IP stack as part of mblk_t */
  95         void                            *head;
  96 };
  97 
  98 int krrp_dblk_engine_create(krrp_dblk_engine_t **result_engine,
  99     boolean_t prealloc, size_t max_dblk_cnt, size_t dblk_head_sz,
 100     size_t dblk_data_sz, size_t notify_free_value,
 101     krrp_dblk_free_notify_cb_t *notify_free_cb, void *notify_free_cb_arg,
 102     krrp_error_t *error);
 103 void krrp_dblk_engine_destroy(krrp_dblk_engine_t *engine);
 104 
 105 void krrp_dblk_alloc(krrp_dblk_engine_t *, krrp_dblk_t **, size_t);
 106 void krrp_dblk_rele(krrp_dblk_t *);
 107 
 108 int krrp_dblk_get_data(krrp_dblk_t *dblk, void *buf, size_t buf_sz);
 109 
 110 #ifdef __cplusplus
 111 }
 112 #endif
 113 
 114 #endif /* _KRRP_DBLK_H */