static void app_init_rings_tx(void) { unsigned lcore; /* Initialize the rings for the TX side */ for (lcore = 0; lcore < APP_MAX_LCORES; lcore ++) { struct app_lcore_params_worker *lp_worker = &app.lcore_params[lcore].worker; unsigned port; if (app.lcore_params[lcore].type != e_APP_LCORE_WORKER) { continue; } for (port = 0; port < APP_MAX_NIC_PORTS; port ++) { char name[32]; struct app_lcore_params_io *lp_io = NULL; struct rte_ring *ring; uint32_t socket_io, lcore_io; if (app.nic_tx_port_mask[port] == 0) { continue; } if (app_get_lcore_for_nic_tx(port, &lcore_io) < 0) { rte_panic("Algorithmic error (no I/O core to handle TX of port %u)\n", port); } lp_io = &app.lcore_params[lcore_io].io; socket_io = rte_lcore_to_socket_id(lcore_io); printf("Creating ring to connect worker lcore %u with TX port %u (through I/O lcore %u) (socket %u) ...\n", lcore, port, (unsigned)lcore_io, (unsigned)socket_io); snprintf(name, sizeof(name), "app_ring_tx_s%u_w%u_p%u", socket_io, lcore, port); ring = rte_ring_create( name, app.ring_tx_size, socket_io, RING_F_SP_ENQ | RING_F_SC_DEQ); if (ring == NULL) { rte_panic("Cannot create ring to connect worker core %u with TX port %u\n", lcore, port); } lp_worker->rings_out[port] = ring; lp_io->tx.rings[port][lp_worker->worker_id] = ring; } } for (lcore = 0; lcore < APP_MAX_LCORES; lcore ++) { struct app_lcore_params_io *lp_io = &app.lcore_params[lcore].io; unsigned i; if ((app.lcore_params[lcore].type != e_APP_LCORE_IO) || (lp_io->tx.n_nic_ports == 0)) { continue; } for (i = 0; i < lp_io->tx.n_nic_ports; i ++){ unsigned port, j; port = lp_io->tx.nic_ports[i]; for (j = 0; j < app_get_lcores_worker(); j ++) { if (lp_io->tx.rings[port][j] == NULL) { rte_panic("Algorithmic error (I/O TX rings)\n"); } } } } }
static void app_init_rings_rx(void) { unsigned lcore; /* Initialize the rings for the RX side */ for (lcore = 0; lcore < APP_MAX_LCORES; lcore ++) { struct app_lcore_params_io *lp_io = &app.lcore_params[lcore].io; unsigned socket_io, lcore_worker; if ((app.lcore_params[lcore].type != e_APP_LCORE_IO) || (lp_io->rx.n_nic_queues == 0)) { continue; } socket_io = rte_lcore_to_socket_id(lcore); for (lcore_worker = 0; lcore_worker < APP_MAX_LCORES; lcore_worker ++) { char name[32]; struct app_lcore_params_worker *lp_worker = &app.lcore_params[lcore_worker].worker; struct rte_ring *ring = NULL; if (app.lcore_params[lcore_worker].type != e_APP_LCORE_WORKER) { continue; } printf("Creating ring to connect I/O lcore %u (socket %u) with worker lcore %u ...\n", lcore, socket_io, lcore_worker); snprintf(name, sizeof(name), "app_ring_rx_s%u_io%u_w%u", socket_io, lcore, lcore_worker); ring = rte_ring_create( name, app.ring_rx_size, socket_io, RING_F_SP_ENQ | RING_F_SC_DEQ); if (ring == NULL) { rte_panic("Cannot create ring to connect I/O core %u with worker core %u\n", lcore, lcore_worker); } lp_io->rx.rings[lp_io->rx.n_rings] = ring; lp_io->rx.n_rings ++; lp_worker->rings_in[lp_worker->n_rings_in] = ring; lp_worker->n_rings_in ++; } } for (lcore = 0; lcore < APP_MAX_LCORES; lcore ++) { struct app_lcore_params_io *lp_io = &app.lcore_params[lcore].io; if ((app.lcore_params[lcore].type != e_APP_LCORE_IO) || (lp_io->rx.n_nic_queues == 0)) { continue; } if (lp_io->rx.n_rings != app_get_lcores_worker()) { rte_panic("Algorithmic error (I/O RX rings)\n"); } } for (lcore = 0; lcore < APP_MAX_LCORES; lcore ++) { struct app_lcore_params_worker *lp_worker = &app.lcore_params[lcore].worker; if (app.lcore_params[lcore].type != e_APP_LCORE_WORKER) { continue; } if (lp_worker->n_rings_in != app_get_lcores_io_rx()) { rte_panic("Algorithmic error (worker input rings)\n"); } } }
void app_print_params(void) { unsigned port, queue, lcore, i, j; /* Print NIC RX configuration */ printf("NIC RX ports: "); for (port = 0; port < APP_MAX_NIC_PORTS; port ++) { uint32_t n_rx_queues = app_get_nic_rx_queues_per_port((uint8_t) port); if (n_rx_queues == 0) { continue; } printf("%u (", port); for (queue = 0; queue < APP_MAX_RX_QUEUES_PER_NIC_PORT; queue ++) { if (app.nic_rx_queue_mask[port][queue] == 1) { printf("%u ", queue); } } printf(") "); } printf(";\n"); /* Print I/O lcore RX params */ for (lcore = 0; lcore < APP_MAX_LCORES; lcore ++) { struct app_lcore_params_io *lp = &app.lcore_params[lcore].io; if ((app.lcore_params[lcore].type != e_APP_LCORE_IO) || (lp->rx.n_nic_queues == 0)) { continue; } printf("I/O lcore %u (socket %u): ", lcore, rte_lcore_to_socket_id(lcore)); printf("RX ports "); for (i = 0; i < lp->rx.n_nic_queues; i ++) { printf("(%u, %u) ", (unsigned) lp->rx.nic_queues[i].port, (unsigned) lp->rx.nic_queues[i].queue); } printf("; "); printf("Output rings "); for (i = 0; i < lp->rx.n_rings; i ++) { printf("%p ", lp->rx.rings[i]); } printf(";\n"); } /* Print worker lcore RX params */ for (lcore = 0; lcore < APP_MAX_LCORES; lcore ++) { struct app_lcore_params_worker *lp = &app.lcore_params[lcore].worker; if (app.lcore_params[lcore].type != e_APP_LCORE_WORKER) { continue; } printf("Worker lcore %u (socket %u) ID %u: ", lcore, rte_lcore_to_socket_id(lcore), (unsigned)lp->worker_id); printf("Input rings "); for (i = 0; i < lp->n_rings_in; i ++) { printf("%p ", lp->rings_in[i]); } printf(";\n"); } printf("\n"); /* Print NIC TX configuration */ printf("NIC TX ports: "); for (port = 0; port < APP_MAX_NIC_PORTS; port ++) { if (app.nic_tx_port_mask[port] == 1) { printf("%u ", port); } } printf(";\n"); /* Print I/O TX lcore params */ for (lcore = 0; lcore < APP_MAX_LCORES; lcore ++) { struct app_lcore_params_io *lp = &app.lcore_params[lcore].io; uint32_t n_workers = app_get_lcores_worker(); if ((app.lcore_params[lcore].type != e_APP_LCORE_IO) || (lp->tx.n_nic_ports == 0)) { continue; } printf("I/O lcore %u (socket %u): ", lcore, rte_lcore_to_socket_id(lcore)); printf("Input rings per TX port "); for (i = 0; i < lp->tx.n_nic_ports; i ++) { port = lp->tx.nic_ports[i]; printf("%u (", port); for (j = 0; j < n_workers; j ++) { printf("%p ", lp->tx.rings[port][j]); } printf(") "); } printf(";\n"); } /* Print worker lcore TX params */ for (lcore = 0; lcore < APP_MAX_LCORES; lcore ++) { struct app_lcore_params_worker *lp = &app.lcore_params[lcore].worker; if (app.lcore_params[lcore].type != e_APP_LCORE_WORKER) { continue; } printf("Worker lcore %u (socket %u) ID %u: \n", lcore, rte_lcore_to_socket_id(lcore), (unsigned)lp->worker_id); printf("Output rings per TX port "); for (port = 0; port < APP_MAX_NIC_PORTS; port ++) { if (lp->rings_out[port] != NULL) { printf("%u (%p) ", port, lp->rings_out[port]); } } printf(";\n"); } /* Rings */ printf("Ring sizes: NIC RX = %u; Worker in = %u; Worker out = %u; NIC TX = %u;\n", (unsigned) app.nic_rx_ring_size, (unsigned) app.ring_rx_size, (unsigned) app.ring_tx_size, (unsigned) app.nic_tx_ring_size); /* Bursts */ printf("Burst sizes: I/O RX (rd = %u, wr = %u); Worker (rd = %u, wr = %u); I/O TX (rd = %u, wr = %u)\n", (unsigned) app.burst_size_io_rx_read, (unsigned) app.burst_size_io_rx_write, (unsigned) app.burst_size_worker_read, (unsigned) app.burst_size_worker_write, (unsigned) app.burst_size_io_tx_read, (unsigned) app.burst_size_io_tx_write); }
void app_lcore_main_loop_io(void *arg) { uint32_t lcore = rte_lcore_id(); struct app_lcore_params_io *lp = &app.lcore_params[lcore].io; uint32_t n_workers = app_get_lcores_worker(); uint64_t i = 0; uint32_t bsz_rx_rd = app.burst_size_io_rx_read; uint32_t bsz_rx_wr = app.burst_size_io_rx_write; uint32_t bsz_tx_rd = app.burst_size_io_tx_read; uint32_t bsz_tx_wr = app.burst_size_io_tx_write; if (lp->rx.n_nic_queues > 0 && lp->tx.n_nic_ports == 0) { /* receive loop */ for (;;) { if (APP_LCORE_IO_FLUSH && (unlikely(i == APP_LCORE_IO_FLUSH))) { if (rte_atomic32_read(&dpdk_stop) != 0) { break; } app_lcore_io_rx_flush(lp, n_workers); i = 0; } app_lcore_io_rx(lp, n_workers, bsz_rx_rd, bsz_rx_wr); i++; } } else if (lp->rx.n_nic_queues == 0 && lp->tx.n_nic_ports > 0) { /* transimit loop */ for (;;) { if (APP_LCORE_IO_FLUSH && (unlikely(i == APP_LCORE_IO_FLUSH))) { if (rte_atomic32_read(&dpdk_stop) != 0) { break; } app_lcore_io_tx_flush(lp, arg); i = 0; } app_lcore_io_tx(lp, n_workers, bsz_tx_rd, bsz_tx_wr); #ifdef __linux__ app_lcore_io_tx_kni(lp, bsz_tx_wr); #endif /* __linux__ */ i++; } } else { for (;;) { if (APP_LCORE_IO_FLUSH && (unlikely(i == APP_LCORE_IO_FLUSH))) { if (rte_atomic32_read(&dpdk_stop) != 0) { break; } app_lcore_io_rx_flush(lp, n_workers); app_lcore_io_tx_flush(lp, arg); i = 0; } app_lcore_io_rx(lp, n_workers, bsz_rx_rd, bsz_rx_wr); app_lcore_io_tx(lp, n_workers, bsz_tx_rd, bsz_tx_wr); #ifdef __linux__ app_lcore_io_tx_kni(lp, bsz_tx_wr); #endif /* __linux__ */ i++; } } /* cleanup */ if (likely(lp->tx.n_nic_ports > 0)) { app_lcore_io_tx_cleanup(lp); } }
static void app_init_rings_rx(void) { unsigned lcore; char record_File_tmp [512]; /* Initialize the rings for the RX side */ for (lcore = 0; lcore < APP_MAX_LCORES; lcore ++) { struct app_lcore_params_io *lp_io = &app.lcore_params[lcore].io; unsigned socket_io, lcore_worker; if ((app.lcore_params[lcore].type != e_APP_LCORE_IO) || (lp_io->rx.n_nic_queues == 0)) { continue; } if(record_File[0]) { gettimeofday(&lp_io->rx.end_ewr, NULL); sprintf(record_File_tmp,"%s/TimeSeries_Port%d_%lu.txt",record_File,lp_io->rx.nic_queues[0].port,lp_io->rx.end_ewr.tv_sec); lp_io->rx.record=fopen(record_File_tmp,"w+"); if(lp_io->rx.record==NULL) { perror("record file"); exit(-1); } }else { lp_io->rx.record=NULL; } socket_io = rte_lcore_to_socket_id(lcore); for (lcore_worker = 0; lcore_worker < APP_MAX_LCORES; lcore_worker ++) { char name[32]; struct app_lcore_params_worker *lp_worker = &app.lcore_params[lcore_worker].worker; struct rte_ring *ring = NULL; if (app.lcore_params[lcore_worker].type != e_APP_LCORE_WORKER) { continue; } printf("Creating ring to connect I/O lcore %u (socket %u) with worker lcore %u ...\n", lcore, socket_io, lcore_worker); rte_snprintf(name, sizeof(name), "app_ring_rx_s%u_io%u_w%u", socket_io, lcore, lcore_worker); ring = rte_ring_create( name, app.ring_rx_size, socket_io, RING_F_SP_ENQ | RING_F_SC_DEQ); if (ring == NULL) { rte_panic("Cannot create ring to connect I/O core %u with worker core %u\n", lcore, lcore_worker); } lp_io->rx.rings[lp_io->rx.n_rings] = ring; lp_io->rx.n_rings ++; lp_worker->rings_in[lp_worker->n_rings_in] = ring; lp_worker->n_rings_in ++; } } for (lcore = 0; lcore < APP_MAX_LCORES; lcore ++) { struct app_lcore_params_io *lp_io = &app.lcore_params[lcore].io; if ((app.lcore_params[lcore].type != e_APP_LCORE_IO) || (lp_io->rx.n_nic_queues == 0)) { continue; } if (lp_io->rx.n_rings != app_get_lcores_worker()) { rte_panic("Algorithmic error (I/O RX rings)\n"); } } for (lcore = 0; lcore < APP_MAX_LCORES; lcore ++) { struct app_lcore_params_worker *lp_worker = &app.lcore_params[lcore].worker; if (app.lcore_params[lcore].type != e_APP_LCORE_WORKER) { continue; } if (lp_worker->n_rings_in != app_get_lcores_io_rx()) { rte_panic("Algorithmic error (worker input rings)\n"); } } }