| 164 | } |
| 165 | |
| 166 | PlainPacketPool::PlainPacketPool(size_t capacity, int socket_id) |
| 167 | : PacketPool(capacity, socket_id) { |
| 168 | pool_->flags |= MEMPOOL_F_NO_PHYS_CONTIG; |
| 169 | |
| 170 | size_t page_shift = __builtin_ffs(getpagesize()); |
| 171 | size_t element_size = |
| 172 | pool_->header_size + pool_->elt_size + pool_->trailer_size; |
| 173 | size_t size = rte_mempool_xmem_size(pool_->size, element_size, page_shift, |
| 174 | pool_->flags); |
| 175 | |
| 176 | void *addr = mmap(nullptr, size, PROT_READ | PROT_WRITE, |
| 177 | MAP_SHARED | MAP_ANONYMOUS, -1, 0); |
| 178 | if (addr == MAP_FAILED) { |
| 179 | PLOG(FATAL) << "mmap()"; |
| 180 | } |
| 181 | |
| 182 | // No error check, as we do not provide a guarantee that memory is pinned. |
| 183 | int ret = mlock(addr, size); |
| 184 | pinned_ = (ret == 0); // may fail as non-root users have mlock limit |
| 185 | |
| 186 | ret = rte_mempool_populate_iova(pool_, static_cast<char *>(addr), |
| 187 | RTE_BAD_IOVA, size, DoMunmap, nullptr); |
| 188 | if (ret < static_cast<ssize_t>(pool_->size)) { |
| 189 | LOG(WARNING) << "rte_mempool_populate_iova() returned " << ret |
| 190 | << " (rte_errno=" << rte_errno << ", " |
| 191 | << rte_strerror(rte_errno) << ")"; |
| 192 | } |
| 193 | |
| 194 | PostPopulate(); |
| 195 | } |
| 196 | |
| 197 | BessPacketPool::BessPacketPool(size_t capacity, int socket_id) |
| 198 | : PacketPool(capacity, socket_id), |
nothing calls this directly
no outgoing calls
no test coverage detected