| 99 | } |
| 100 | |
| 101 | static int |
| 102 | bucket_enqueue_single(struct bucket_data *bd, void *obj) |
| 103 | { |
| 104 | int rc = 0; |
| 105 | uintptr_t addr = (uintptr_t)obj; |
| 106 | struct bucket_header *hdr; |
| 107 | unsigned int lcore_id = rte_lcore_id(); |
| 108 | |
| 109 | addr &= bd->bucket_page_mask; |
| 110 | hdr = (struct bucket_header *)addr; |
| 111 | |
| 112 | if (likely(hdr->lcore_id == lcore_id)) { |
| 113 | if (hdr->fill_cnt < bd->obj_per_bucket - 1) { |
| 114 | hdr->fill_cnt++; |
| 115 | } else { |
| 116 | hdr->fill_cnt = 0; |
| 117 | /* Stack is big enough to put all buckets */ |
| 118 | bucket_stack_push(bd->buckets[lcore_id], hdr); |
| 119 | } |
| 120 | } else if (hdr->lcore_id != LCORE_ID_ANY) { |
| 121 | struct rte_ring *adopt_ring = |
| 122 | bd->adoption_buffer_rings[hdr->lcore_id]; |
| 123 | |
| 124 | rc = rte_ring_enqueue(adopt_ring, obj); |
| 125 | /* Ring is big enough to put all objects */ |
| 126 | RTE_ASSERT(rc == 0); |
| 127 | } else if (hdr->fill_cnt < bd->obj_per_bucket - 1) { |
| 128 | hdr->fill_cnt++; |
| 129 | } else { |
| 130 | hdr->fill_cnt = 0; |
| 131 | rc = rte_ring_enqueue(bd->shared_bucket_ring, hdr); |
| 132 | /* Ring is big enough to put all buckets */ |
| 133 | RTE_ASSERT(rc == 0); |
| 134 | } |
| 135 | |
| 136 | return rc; |
| 137 | } |
| 138 | |
| 139 | static int |
| 140 | bucket_enqueue(struct rte_mempool *mp, void * const *obj_table, |
no test coverage detected