| 195 | } |
| 196 | |
| 197 | BessPacketPool::BessPacketPool(size_t capacity, int socket_id) |
| 198 | : PacketPool(capacity, socket_id), |
| 199 | mem_(static_cast<size_t>(FLAGS_m) * 1024 * 1024, socket_id) { |
| 200 | size_t page_shift = __builtin_ffs(getpagesize()); |
| 201 | size_t element_size = |
| 202 | pool_->header_size + pool_->elt_size + pool_->trailer_size; |
| 203 | |
| 204 | while (pool_->populated_size < pool_->size) { |
| 205 | size_t deficit = pool_->size - pool_->populated_size; |
| 206 | size_t bytes = |
| 207 | rte_mempool_xmem_size(deficit, element_size, page_shift, pool_->flags); |
| 208 | |
| 209 | auto [addr, alloced_bytes] = mem_.AllocUpto(bytes); |
| 210 | if (addr == nullptr) { |
| 211 | LOG(WARNING) << "Node " << socket_id << ": " << capacity |
| 212 | << " packets requested, but only " << pool_->populated_size |
| 213 | << " allocated in total"; |
| 214 | break; |
| 215 | } |
| 216 | |
| 217 | int ret = rte_mempool_populate_iova(pool_, static_cast<char *>(addr), |
| 218 | Virt2Phy(addr), alloced_bytes, nullptr, |
| 219 | nullptr); |
| 220 | if (ret < 0) { |
| 221 | LOG(WARNING) << "Node " << socket_id |
| 222 | << ": rte_mempool_populate_iova() returned " << ret; |
| 223 | } else { |
| 224 | LOG(INFO) << "Node " << socket_id << ": " << ret << " packets added from " |
| 225 | << alloced_bytes << " bytes"; |
| 226 | } |
| 227 | } |
| 228 | |
| 229 | PostPopulate(); |
| 230 | } |
| 231 | |
| 232 | DpdkPacketPool::DpdkPacketPool(size_t capacity, int socket_id) |
| 233 | : PacketPool(capacity, socket_id) { |