我想要有 2 个
DPDK
进程,主要进程和次要进程。rte_ring_create()
打开一个 ring,名称为
myring
。ring
打开该rte_ring_lookup()
的另一侧,如此处26.1.2.2. How the Application Works
if (rte_eal_process_type() == RTE_PROC_PRIMARY){
send_ring = rte_ring_create(_PRI_2_SEC, ring_size, rte_socket_id(), flags);
recv_ring = rte_ring_create(_SEC_2_PRI, ring_size, rte_socket_id(), flags);
message_pool = rte_mempool_create(_MSG_POOL, pool_size,
STR_TOKEN_SIZE, pool_cache, priv_data_sz,
NULL, NULL, NULL, NULL,
rte_socket_id(), flags);
} else {
recv_ring = rte_ring_lookup(_PRI_2_SEC);
send_ring = rte_ring_lookup(_SEC_2_PRI);
message_pool = rte_mempool_lookup(_MSG_POOL);
}
但是,我希望能够使辅助进程使用
ring
,就像它是常规接口设备一样。vdev
和 -a
定义物理端口和 --vdev=...
端口。
我想将
ring
myring
作为 DPDK
参数,如here:
./dpdk-testpmd -l 1-3 -n 4 --vdev=net_ring0 --vdev=net_ring1 -- -i
只是,使用
--vdev=net_ringmyring
。net_ring_myring
。
似乎没有任何作用。
在辅助过程中,我收到如下错误:
Device net_ring_myring is not driven by the primary process
rte_pmd_ring_probe(): Failed to probe net_ring_myring
vdev_probe(): failed to initialize net_ring_myring device
EAL: Bus (vdev) probe failed.
rte_eth_dev_attach_secondary
,这表明在辅助进程中创建环形设备可能不正确:它只能附加到 ethdev 在第一个创建。
此外,假设
--vdev=net_ringmyring
可用于传递一些实际的环名称来代替 myring
部分,这很可能是错误的:这是一个不可分割的名称,已分配给辅助进程正在尝试的设备附加到。
作为一个快速建议,也许值得在主进程中创建环形设备,如下所示
struct rte_ring *r_0, *r_1;
unsigned int flags = 0;
unsigned int sz = 1024;
r_0 = rte_ring_create("r_0", sz, rte_socket_id(), flags);
r_1 = rte_ring_create("r_1", sz, rte_socket_id(), flags);
(void)rte_eth_from_rings("net_ring0", &r_0, 1, &r_1, 1, rte_socket_id());
并且,也在主进程中,根据 OP 的判断,实现与环直接交互的所有逻辑,同时在辅助进程中
,附加到设备并利用常规 ethdev API(例如如 rte_eth_rx_burst
或
rte_eth_tx_burst
)进行交互交通:
uint16_t port_id;
(void)rte_eal_hotplug_add("vdev", "net_ring0", "");
(void)rte_eth_dev_get_port_by_name("net_ring0", &port_id);
/* (set up the port) */
/* (interact with packet receive and transmit APIs, etc) */
对于辅助流程,也可以使用一些现有工具(如test-pmd
)并通过传递 EAL 参数进行附加(--vdev
,如 OP 中已描述)。这也值得检查。