> -----Original Message----- > From: dev [mailto:dev-bounces at dpdk.org] On Behalf Of Marcin Kerlin > Sent: Friday, September 30, 2016 3:01 PM > To: dev at dpdk.org > Cc: De Lara Guarch, Pablo <pablo.de.lara.guarch at intel.com>; > thomas.monjalon at 6wind.com; Kerlin, MarcinX <marcinx.kerlin at intel.com> > Subject: [dpdk-dev] [PATCH v5 0/2] app/testpmd: improve multiprocess support > > This patch ensure not overwrite device data in the multiprocess application. > > 1)Changes in the library introduces continuity in array rte_eth_dev_data[] > shared > between all processes. Secondary process adds new entries in free space > instead > of overwriting existing entries. > > 2)Changes in application testpmd allow secondary process to attach the > mempool created by primary process rather than create new and in the case of > quit or force quit to free devices data from shared array rte_eth_dev_data[]. > > ------------------------- > How to reproduce the bug: > > 1) Run primary process: > ./testpmd -c 0xf -n 4 --socket-mem='512,0' -w 03:00.1 -w 03:00.0 --proc- > type=primary --file-prefix=xz1 -- -i > > (gdb) print rte_eth_devices[0].data.name > $52 = "3:0.1" > (gdb) print rte_eth_devices[1].data.name > $53 = "3:0.0" > > 2) Run secondary process: > ./testpmd -c 0xf0 --socket-mem='512,0' -n 4 -v -b 03:00.1 -b 03:00.0 --vdev > 'eth_pcap0,rx_pcap=/var/log/device1.pcap, tx_pcap=/var/log/device2.pcap' > --proc-type=secondary --file-prefix=xz1 -- -i > > (gdb) print rte_eth_devices[0].data.name > $52 = "eth_pcap0" > (gdb) print rte_eth_devices[1].data.name > $53 = "eth_pcap1" > > 3) Go back to the primary and re-check: > (gdb) print rte_eth_devices[0].data.name > $54 = "eth_pcap0" > (gdb) print rte_eth_devices[1].data.name > $55 = "eth_pcap1" > > It means that secondary process overwrite data of primary process. > > This patch fix it and now if we go back to the primary and re-check then > everything is fine: > (gdb) print rte_eth_devices[0].data.name > $56 = "3:0.1" > (gdb) print rte_eth_devices[1].data.name > $57 = "3:0.0" > > So after this fix structure rte_eth_dev_data[] will keep all data one after > the > other instead of overwriting: > (gdb) print rte_eth_dev_data[0].name > $52 = "3:0.1" > (gdb) print rte_eth_dev_data[1].name > $53 = "3:0.0" > (gdb) print rte_eth_dev_data[2].name > $54 = "eth_pcap0" > (gdb) print rte_eth_dev_data[3].name > $55 = "eth_pcap1" > and so on will be append in the next indexes > > If secondary process will be turned off then also will be deleted from array: > (gdb) print rte_eth_dev_data[0].name > $52 = "3:0.1" > (gdb) print rte_eth_dev_data[1].name > $53 = "3:0.0" > (gdb) print rte_eth_dev_data[2].name > $54 = "" > (gdb) print rte_eth_dev_data[3].name > $55 = "" > this also allows re-use index 2 and 3 for next another process > ------------------------- > > Breaking ABI: > Changes in the library librte_ether causes extending existing structure > rte_eth_dev_data with a new field lock. The reason is that this structure is > sharing between all the processes so it should be protected against attempting > to write from two different processes. > > Tomasz Kulasek sent announce ABI change in librte_ether on 21 July 2016. > I would like to join to this breaking ABI, if it is possible. > > v2: > * fix syntax error in version script > v3: > * changed scope of function > * improved description > v4: > * fix syntax error in version script > v5: > * fix header file > > Marcin Kerlin (2): > librte_ether: add protection against overwrite device data > app/testpmd: improve handling of multiprocess > > app/test-pmd/testpmd.c | 37 +++++++++++++- > app/test-pmd/testpmd.h | 1 + > lib/librte_ether/rte_ethdev.c | 90 > +++++++++++++++++++++++++++++++--- > lib/librte_ether/rte_ethdev.h | 12 +++++ > lib/librte_ether/rte_ether_version.map | 6 +++ > 5 files changed, 136 insertions(+), 10 deletions(-) > > -- > 1.9.1
Acked-by: Reshma Pattan <reshma.pattan at intel.com>