02/03/2022 03:33, Chengwen Feng: > Start main and secondary process: > ./dpdk-testpmd -a BDF0 -a BDF1 --proc-type=auto -- -i --rxq=8 --txq=8 > --num-procs=2 --proc-id=0 > ./dpdk-testpmd -a BDF0 -a BDF1 --proc-type=auto -- -i --rxq=8 --txq=8 > --num-procs=2 --proc-id=1 > Execute following command in main process: > port stop 0 > port detach 0 > Execute following command in secondary process: > set fwd mac > start > The secondary process will display: > Invalid port_id=0 > telcore 19 called rx_pkt_burst for not ready port 0 > stpmd> 8: [/lib64/libc.so.6(+0xdf600) [0xffff9e1dc600]] > 7: [/lib64/libpthread.so.0(+0x7c48) [0xffff9e28ac48]] > 6: [/usr/app/testpmd(eal_thread_loop+0x2c4) [0xb23574]] > 5: [/usr/app/testpmd() [0x9c21d8]] > 4: [/usr/app/testpmd() [0x9c2108]] > 3: [/usr/app/testpmd() [0x9b6cf0]] > 2: [/usr/app/testpmd() [0xad8620]] > 1: [/usr/app/testpmd(rte_dump_stack+0x20) [0xb1a130]] > > The root cause it that the secondary process has not removed invalid > ports when it processes RTE_ETH_EVENT_DESTROY event.
Why the ports are not removed? > This patch adds a delay remove invalid ports invoke when process the > RTE_ETH_EVENT_DESTROY event. Why do we need this delay? [...] > +static void > +remove_invalid_ports_callback(void *arg) > +{ > + RTE_SET_USED(arg); > + remove_invalid_ports(); > +} [...] > case RTE_ETH_EVENT_DESTROY: > ports[port_id].port_status = RTE_PORT_CLOSED; > printf("Port %u is closed\n", port_id); > + if (rte_eal_alarm_set(100000, remove_invalid_ports_callback, > + (void *)(intptr_t)port_id)) > + fprintf(stderr, > + "Could not set up deferred device released\n"); > break;