Lines Matching defs:mempool

36  * Will resize mempool up to %num_allocate value.
39 __hal_mempool_grow(xge_hal_mempool_t *mempool, int num_allocate,
42 int i, first_time = mempool->memblocks_allocated == 0 ? 1 : 0;
43 int n_items = mempool->items_per_memblock;
47 if ((mempool->memblocks_allocated + num_allocate) >
48 mempool->memblocks_max) {
54 for (i = mempool->memblocks_allocated;
55 i < mempool->memblocks_allocated + num_allocate; i++) {
58 ((mempool->memblocks_allocated+num_allocate-1) == i);
60 mempool->memblocks_dma_arr + i;
72 mempool->memblocks_arr[i] = xge_os_dma_malloc(mempool->pdev,
73 mempool->memblock_size,
77 if (mempool->memblocks_arr[i] == NULL) {
82 xge_os_memzero(mempool->memblocks_arr[i],
83 mempool->memblock_size);
84 the_memblock = mempool->memblocks_arr[i];
88 * mempool's user request. Each time mempool grows, it will
91 mempool->memblocks_priv_arr[i] = xge_os_malloc(mempool->pdev,
92 mempool->items_priv_size * n_items);
93 if (mempool->memblocks_priv_arr[i] == NULL) {
94 xge_os_dma_free(mempool->pdev,
96 mempool->memblock_size,
102 mempool->items_priv_size * n_items,
103 mempool->items_priv_size, n_items);
106 xge_os_memzero(mempool->memblocks_priv_arr[i],
107 mempool->items_priv_size * n_items);
110 dma_object->addr = xge_os_dma_map(mempool->pdev,
113 mempool->memblock_size,
122 xge_os_free(mempool->pdev, mempool->memblocks_priv_arr[i],
123 mempool->items_priv_size *
125 xge_os_dma_free(mempool->pdev,
127 mempool->memblock_size,
137 if (first_time && index >= mempool->items_initial) {
141 mempool->items_arr[index] =
142 ((char *)the_memblock + j*mempool->item_size);
145 if (mempool->item_func_alloc != NULL) {
148 if ((status = mempool->item_func_alloc(
149 mempool,
153 mempool->items_arr[index],
156 mempool->userdata)) != XGE_HAL_OK) {
158 if (mempool->item_func_free != NULL) {
165 (void)mempool->item_func_free(
166 mempool, the_memblock,
168 mempool->items_arr[index],
170 mempool->userdata);
174 xge_os_free(mempool->pdev,
175 mempool->memblocks_priv_arr[i],
176 mempool->items_priv_size *
178 xge_os_dma_unmap(mempool->pdev,
181 mempool->memblock_size,
183 xge_os_dma_free(mempool->pdev,
185 mempool->memblock_size,
192 mempool->items_current = index + 1;
197 "dma_addr 0x"XGE_OS_LLXFMT, i, mempool->memblock_size / 1024,
198 (unsigned long long)(ulong_t)mempool->memblocks_arr[i],
203 if (first_time && mempool->items_current ==
204 mempool->items_initial) {
210 mempool->memblocks_allocated += *num_allocated;
237 xge_hal_mempool_t *mempool;
247 mempool = (xge_hal_mempool_t *) \
249 if (mempool == NULL) {
250 xge_debug_mm(XGE_ERR, "mempool allocation failure");
253 xge_os_memzero(mempool, sizeof(xge_hal_mempool_t));
255 mempool->pdev = pdev;
256 mempool->memblock_size = memblock_size;
257 mempool->items_max = items_max;
258 mempool->items_initial = items_initial;
259 mempool->item_size = item_size;
260 mempool->items_priv_size = items_priv_size;
261 mempool->item_func_alloc = item_func_alloc;
262 mempool->item_func_free = item_func_free;
263 mempool->userdata = userdata;
265 mempool->memblocks_allocated = 0;
267 mempool->items_per_memblock = memblock_size / item_size;
269 mempool->memblocks_max = (items_max + mempool->items_per_memblock - 1) /
270 mempool->items_per_memblock;
273 mempool->memblocks_arr = (void ** ) xge_os_malloc(mempool->pdev,
274 sizeof(void*) * mempool->memblocks_max);
275 if (mempool->memblocks_arr == NULL) {
277 __hal_mempool_destroy(mempool);
280 xge_os_memzero(mempool->memblocks_arr,
281 sizeof(void*) * mempool->memblocks_max);
284 mempool->memblocks_priv_arr = (void **) xge_os_malloc(mempool->pdev,
285 sizeof(void*) * mempool->memblocks_max);
286 if (mempool->memblocks_priv_arr == NULL) {
288 __hal_mempool_destroy(mempool);
291 xge_os_memzero(mempool->memblocks_priv_arr,
292 sizeof(void*) * mempool->memblocks_max);
295 mempool->memblocks_dma_arr =
296 (xge_hal_mempool_dma_t *) xge_os_malloc(mempool->pdev,
297 sizeof(xge_hal_mempool_dma_t) * mempool->memblocks_max);
299 if (mempool->memblocks_dma_arr == NULL) {
301 __hal_mempool_destroy(mempool);
304 xge_os_memzero(mempool->memblocks_dma_arr,
305 sizeof(xge_hal_mempool_dma_t) * mempool->memblocks_max);
308 mempool->items_arr = (void **) xge_os_malloc(mempool->pdev,
309 sizeof(void*) * mempool->items_max);
310 if (mempool->items_arr == NULL) {
312 __hal_mempool_destroy(mempool);
315 xge_os_memzero(mempool->items_arr, sizeof(void *) * mempool->items_max);
317 mempool->shadow_items_arr = (void **) xge_os_malloc(mempool->pdev,
318 sizeof(void*) * mempool->items_max);
319 if (mempool->shadow_items_arr == NULL) {
321 __hal_mempool_destroy(mempool);
324 xge_os_memzero(mempool->shadow_items_arr,
325 sizeof(void *) * mempool->items_max);
328 memblocks_to_allocate = (mempool->items_initial +
329 mempool->items_per_memblock - 1) /
330 mempool->items_per_memblock;
334 mempool->items_per_memblock);
336 /* pre-allocate the mempool */
337 status = __hal_mempool_grow(mempool, memblocks_to_allocate, &allocated);
338 xge_os_memcpy(mempool->shadow_items_arr, mempool->items_arr,
339 sizeof(void*) * mempool->items_max);
342 __hal_mempool_destroy(mempool);
348 mempool->memblock_size * allocated / 1024);
350 return mempool;
357 __hal_mempool_destroy(xge_hal_mempool_t *mempool)
361 for (i=0; i<mempool->memblocks_allocated; i++) {
364 xge_assert(mempool->memblocks_arr[i]);
365 xge_assert(mempool->memblocks_dma_arr + i);
367 dma_object = mempool->memblocks_dma_arr + i;
369 for (j=0; j<mempool->items_per_memblock; j++) {
370 int index = i*mempool->items_per_memblock + j;
373 if (index >= mempool->items_current) {
378 if (mempool->item_func_free != NULL) {
380 mempool->item_func_free(mempool,
381 mempool->memblocks_arr[i],
383 mempool->shadow_items_arr[index],
385 mempool->userdata);
389 xge_os_dma_unmap(mempool->pdev,
391 mempool->memblock_size, XGE_OS_DMA_DIR_BIDIRECTIONAL);
393 xge_os_free(mempool->pdev, mempool->memblocks_priv_arr[i],
394 mempool->items_priv_size * mempool->items_per_memblock);
396 xge_os_dma_free(mempool->pdev, mempool->memblocks_arr[i],
397 mempool->memblock_size, &dma_object->acc_handle,
401 if (mempool->items_arr) {
402 xge_os_free(mempool->pdev, mempool->items_arr, sizeof(void*) *
403 mempool->items_max);
406 if (mempool->shadow_items_arr) {
407 xge_os_free(mempool->pdev, mempool->shadow_items_arr,
408 sizeof(void*) * mempool->items_max);
411 if (mempool->memblocks_dma_arr) {
412 xge_os_free(mempool->pdev, mempool->memblocks_dma_arr,
414 mempool->memblocks_max);
417 if (mempool->memblocks_priv_arr) {
418 xge_os_free(mempool->pdev, mempool->memblocks_priv_arr,
419 sizeof(void*) * mempool->memblocks_max);
422 if (mempool->memblocks_arr) {
423 xge_os_free(mempool->pdev, mempool->memblocks_arr,
424 sizeof(void*) * mempool->memblocks_max);
427 xge_os_free(mempool->pdev, mempool, sizeof(xge_hal_mempool_t));