mempool_t *mempool(size_t alloc_size) { uint32_t log2size = 31 - __builtin_clz((uint32_t)alloc_size); assert(log2size < GLOBAL_MEMPOOL_SIZELIM); if (!global_pools[log2size]) { // 32 MB size_t pool_size = (1 << 25) / alloc_size; global_pools[log2size] = create_mempool(alloc_size, pool_size); } return global_pools[log2size]; }
void *mempool_alloc(mempool_t *pool) { if (pool->free_spots_size > 0) { void *alloc = pool->free_spots[pool->free_spots_size -1]; pool->free_spots_size--; return alloc; } else if (pool->alloc_ptr != pool->mem_end) { /* N.B. since the size of the memory pool is a multiple * of the allocation size, if the alloc_ptr is not equal * to mem_end, it must be less, by at least alloc_size. */ assert(pool->alloc_ptr + pool->alloc_size <= pool->mem_end); void *alloc = pool->alloc_ptr; pool->alloc_ptr += pool->alloc_size; return alloc; } else if (!pool->next) { /* Pool's full, try to make a new one */ pool->next = create_mempool(pool->alloc_size, pool->pool_size); } // Try the next pool in the list return mempool_alloc(pool->next); }
/** * test main entrance for library sched */ static int test_sched(void) { struct rte_mempool *mp = NULL; struct rte_sched_port *port = NULL; uint32_t pipe; struct rte_mbuf *in_mbufs[10]; struct rte_mbuf *out_mbufs[10]; int i; int err; mp = create_mempool(); port_param.socket = 0; port_param.rate = (uint64_t) 10000 * 1000 * 1000 / 8; port = rte_sched_port_config(&port_param); VERIFY(port != NULL, "Error config sched port\n"); err = rte_sched_subport_config(port, SUBPORT, subport_param); VERIFY(err == 0, "Error config sched, err=%d\n", err); for (pipe = 0; pipe < port_param.n_pipes_per_subport; pipe ++) { err = rte_sched_pipe_config(port, SUBPORT, pipe, 0); VERIFY(err == 0, "Error config sched pipe %u, err=%d\n", pipe, err); } for (i = 0; i < 10; i++) { in_mbufs[i] = rte_pktmbuf_alloc(mp); prepare_pkt(in_mbufs[i]); } err = rte_sched_port_enqueue(port, in_mbufs, 10); VERIFY(err == 10, "Wrong enqueue, err=%d\n", err); err = rte_sched_port_dequeue(port, out_mbufs, 10); VERIFY(err == 10, "Wrong dequeue, err=%d\n", err); for (i = 0; i < 10; i++) { enum rte_meter_color color; uint32_t subport, traffic_class, queue; color = rte_sched_port_pkt_read_color(out_mbufs[i]); VERIFY(color == e_RTE_METER_YELLOW, "Wrong color\n"); rte_sched_port_pkt_read_tree_path(out_mbufs[i], &subport, &pipe, &traffic_class, &queue); VERIFY(subport == SUBPORT, "Wrong subport\n"); VERIFY(pipe == PIPE, "Wrong pipe\n"); VERIFY(traffic_class == TC, "Wrong traffic_class\n"); VERIFY(queue == QUEUE, "Wrong queue\n"); } struct rte_sched_subport_stats subport_stats; uint32_t tc_ov; rte_sched_subport_read_stats(port, SUBPORT, &subport_stats, &tc_ov); //VERIFY(subport_stats.n_pkts_tc[TC-1] == 10, "Wrong subport stats\n"); struct rte_sched_queue_stats queue_stats; uint16_t qlen; rte_sched_queue_read_stats(port, QUEUE, &queue_stats, &qlen); //VERIFY(queue_stats.n_pkts == 10, "Wrong queue stats\n"); rte_sched_port_free(port); return 0; }