| 725 | } |
| 726 | |
| 727 | void |
| 728 | mlx5_ipool_flush_cache(struct mlx5_indexed_pool *pool) |
| 729 | { |
| 730 | uint32_t i, j; |
| 731 | struct mlx5_indexed_cache *gc; |
| 732 | struct rte_bitmap *ibmp; |
| 733 | uint32_t bmp_num, mem_size; |
| 734 | |
| 735 | if (!pool->cfg.per_core_cache) |
| 736 | return; |
| 737 | gc = pool->gc; |
| 738 | if (!gc) |
| 739 | return; |
| 740 | /* Reset bmp. */ |
| 741 | bmp_num = mlx5_trunk_idx_offset_get(pool, gc->n_trunk_valid); |
| 742 | mem_size = rte_bitmap_get_memory_footprint(bmp_num); |
| 743 | pool->bmp_mem = pool->cfg.malloc(MLX5_MEM_ZERO, mem_size, |
| 744 | RTE_CACHE_LINE_SIZE, rte_socket_id()); |
| 745 | if (!pool->bmp_mem) { |
| 746 | DRV_LOG(ERR, "Ipool bitmap mem allocate failed.\n"); |
| 747 | return; |
| 748 | } |
| 749 | ibmp = rte_bitmap_init_with_all_set(bmp_num, pool->bmp_mem, mem_size); |
| 750 | if (!ibmp) { |
| 751 | pool->cfg.free(pool->bmp_mem); |
| 752 | pool->bmp_mem = NULL; |
| 753 | DRV_LOG(ERR, "Ipool bitmap create failed.\n"); |
| 754 | return; |
| 755 | } |
| 756 | pool->ibmp = ibmp; |
| 757 | /* Clear global cache. */ |
| 758 | for (i = 0; i < gc->len; i++) |
| 759 | rte_bitmap_clear(ibmp, gc->idx[i] - 1); |
| 760 | /* Clear core cache. */ |
| 761 | for (i = 0; i < RTE_MAX_LCORE + 1; i++) { |
| 762 | struct mlx5_ipool_per_lcore *ilc = pool->cache[i]; |
| 763 | |
| 764 | if (!ilc) |
| 765 | continue; |
| 766 | for (j = 0; j < ilc->len; j++) |
| 767 | rte_bitmap_clear(ibmp, ilc->idx[j] - 1); |
| 768 | } |
| 769 | } |
| 770 | |
| 771 | static void * |
| 772 | mlx5_ipool_get_next_cache(struct mlx5_indexed_pool *pool, uint32_t *pos) |
no test coverage detected