| 191 | #define CL RTE_CACHE_LINE_ROUNDUP |
| 192 | |
| 193 | static int |
| 194 | __table_create(struct table **table, |
| 195 | uint64_t *memory_footprint, |
| 196 | struct rte_swx_table_params *params, |
| 197 | const char *args __rte_unused, |
| 198 | int numa_node) |
| 199 | { |
| 200 | struct table *t; |
| 201 | uint8_t *memory; |
| 202 | size_t table_meta_sz, bucket_sz, bucket_ext_sz, key_sz, |
| 203 | key_stack_sz, bkt_ext_stack_sz, data_sz, total_size; |
| 204 | size_t bucket_offset, bucket_ext_offset, key_offset, |
| 205 | key_stack_offset, bkt_ext_stack_offset, data_offset; |
| 206 | uint32_t key_size, key_data_size, n_buckets, n_buckets_ext, i; |
| 207 | |
| 208 | /* Check input arguments. */ |
| 209 | CHECK(params, EINVAL); |
| 210 | CHECK(params->match_type == RTE_SWX_TABLE_MATCH_EXACT, EINVAL); |
| 211 | CHECK(params->key_size, EINVAL); |
| 212 | |
| 213 | if (params->key_mask0) { |
| 214 | for (i = 0; i < params->key_size; i++) |
| 215 | if (params->key_mask0[i] != 0xFF) |
| 216 | break; |
| 217 | |
| 218 | CHECK(i == params->key_size, EINVAL); |
| 219 | } |
| 220 | |
| 221 | CHECK(params->n_keys_max, EINVAL); |
| 222 | |
| 223 | /* Memory allocation. */ |
| 224 | key_size = rte_align64pow2(params->key_size); |
| 225 | key_data_size = rte_align64pow2(params->action_data_size + 8); |
| 226 | n_buckets = rte_align64pow2((params->n_keys_max + KEYS_PER_BUCKET - 1) / KEYS_PER_BUCKET); |
| 227 | n_buckets_ext = n_buckets; |
| 228 | |
| 229 | table_meta_sz = CL(sizeof(struct table)); |
| 230 | bucket_sz = CL(n_buckets * sizeof(struct bucket_extension)); |
| 231 | bucket_ext_sz = CL(n_buckets_ext * sizeof(struct bucket_extension)); |
| 232 | key_sz = CL(params->n_keys_max * key_size); |
| 233 | key_stack_sz = CL(params->n_keys_max * sizeof(uint32_t)); |
| 234 | bkt_ext_stack_sz = CL(n_buckets_ext * sizeof(uint32_t)); |
| 235 | data_sz = CL(params->n_keys_max * key_data_size); |
| 236 | total_size = table_meta_sz + bucket_sz + bucket_ext_sz + |
| 237 | key_sz + key_stack_sz + bkt_ext_stack_sz + data_sz; |
| 238 | |
| 239 | bucket_offset = table_meta_sz; |
| 240 | bucket_ext_offset = bucket_offset + bucket_sz; |
| 241 | key_offset = bucket_ext_offset + bucket_ext_sz; |
| 242 | key_stack_offset = key_offset + key_sz; |
| 243 | bkt_ext_stack_offset = key_stack_offset + key_stack_sz; |
| 244 | data_offset = bkt_ext_stack_offset + bkt_ext_stack_sz; |
| 245 | |
| 246 | if (!table) { |
| 247 | if (memory_footprint) |
| 248 | *memory_footprint = total_size; |
| 249 | return 0; |
| 250 | } |
no test coverage detected