Example #1
0
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];
}
Example #2
0
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);
}
Example #3
0
/**
 * 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;
}