net/memif: enable loopback
PATCH 1/1 net/memif: enable loopback
With this patch it is possible to connect 2 DPDK memifs into loopback, i.e. when they have the same id and different roles, as for example:
"--vdev=net_memif0,role=master,id=0" "--vdev=net_memif1,role=slave,id=0"
--- drivers/net/memif/memif_socket.c | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-)
drivers/net/memif/memif_socket.c +4 -13
@@ -203,7 +203,7 @@ memif_msg_receive_init(struct memif_control_channel *cc, memif_msg_t *msg) dev = elt->dev; pmd = dev->data->dev_private;if (((pmd->flags Ð_MEMIF_FLAG_DISABLED ) ==0 ) && - pmd->id == i->id) { + (pmd->id == i->id) && (pmd->role ==MEMIF_ROLE_MASTER )) {/* assign control channel to device */ cc->dev = dev; pmd->cc = cc;
@@ -965,20 +965,11 @@ memif_socket_init(struct rte_eth_dev *dev, const char *socket_filename) } pmd->socket_filename = socket->filename; -if (socket->listener !=0 && pmd->role ==MEMIF_ROLE_SLAVE ) { -MIF_LOG (ERR ,"Socket is a listener." ); -return -1 ; - }else if ((socket->listener ==0 ) && (pmd->role ==MEMIF_ROLE_MASTER )) { -MIF_LOG (ERR ,"Socket is not a listener." ); -return -1 ; - } - TAILQ_FOREACH(elt, &socket->dev_queue, next) { tmp_pmd = elt->dev->data->dev_private; -if (tmp_pmd->id == pmd->id) { -MIF_LOG (ERR ,"Memif device with id %d already " -"exists on socket %s" , - pmd->id, socket->filename); +if (tmp_pmd->id == pmd->id && tmp_pmd->role == pmd->role) { +MIF_LOG (ERR ,"Two interfaces with the same id (%d) can " +"not have the same role." , pmd->id);return -1 ; } }
Signature · 1 line
2.17.1
Quoted 4 lines · Július Milan
With this patch it is possible to connect 2 DPDK memifs into loopback, i.e. when they have the same id and different roles, as for example:
"--vdev=net_memif0,role=master,id=0" "--vdev=net_memif1,role=slave,id=0"
Overall looks good idea but this cause a crash in testpmd on exit, can you please check?
Quoted 46 lines
Fixes 09c7e63a71 ("net/memif: introduce memory interface PMD")Signed-off-by Július Milan <[email protected]>--- drivers/net/memif/memif_socket.c | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-)drivers/net/memif/memif_socket.c +4
-13@@ -203,7 +203,7 @@ memif_msg_receive_init(struct memif_control_channel *cc, memif_msg_t *msg) dev = elt->dev; pmd = dev->data->dev_private;if (((pmd->flags Ð_MEMIF_FLAG_DISABLED ) ==0 ) && - pmd->id == i->id) { + (pmd->id == i->id) && (pmd->role ==MEMIF_ROLE_MASTER )) {/* assign control channel to device */ cc->dev = dev; pmd->cc = cc;@@ -965,20 +965,11 @@ memif_socket_init(struct rte_eth_dev *dev, const char *socket_filename) } pmd->socket_filename = socket->filename; -if (socket->listener !=0 && pmd->role ==MEMIF_ROLE_SLAVE ) { -MIF_LOG (ERR ,"Socket is a listener." ); -return -1 ; - }else if ((socket->listener ==0 ) && (pmd->role ==MEMIF_ROLE_MASTER )) { -MIF_LOG (ERR ,"Socket is not a listener." ); -return -1 ; - } - TAILQ_FOREACH(elt, &socket->dev_queue, next) { tmp_pmd = elt->dev->data->dev_private; -if (tmp_pmd->id == pmd->id) { -MIF_LOG (ERR ,"Memif device with id %d already " -"exists on socket %s" , - pmd->id, socket->filename); +if (tmp_pmd->id == pmd->id && tmp_pmd->role == pmd->role) { +MIF_LOG (ERR ,"Two interfaces with the same id (%d) can " +"not have the same role." , pmd->id);return -1 ; } }
Quoted 9 lines · Ferruh Yigit
Quoted 4 lines · Július Milan
With this patch it is possible to connect 2 DPDK memifs into loopback, i.e. when they have the same id and different roles, as for example:
"--vdev=net_memif0,role=master,id=0" "--vdev=net_memif1,role=slave,id=0"Overall looks good idea but this cause a crash in testpmd on exit, can you please check?
Thank you,
Do you mean this message?
"EAL: Error: Invalid memory"
If not, how can I reproduce it?
Quoted 47 lines
Quoted 46 lines
Fixes 09c7e63a71 ("net/memif: introduce memory interface PMD")Signed-off-by Július Milan <[email protected]>--- drivers/net/memif/memif_socket.c | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-)drivers/net/memif/memif_socket.c +4
-13@@ -203,7 +203,7 @@ memif_msg_receive_init(struct memif_control_channel *cc, memif_msg_t *msg) dev = elt->dev; pmd = dev->data->dev_private;if (((pmd->flags Ð_MEMIF_FLAG_DISABLED ) ==0 ) && - pmd->id == i->id) { + (pmd->id == i->id) && (pmd->role ==MEMIF_ROLE_MASTER )) {/* assign control channel to device */ cc->dev = dev; pmd->cc = cc;@@ -965,20 +965,11 @@ memif_socket_init(struct rte_eth_dev *dev, const char *socket_filename) } pmd->socket_filename = socket->filename; -if (socket->listener !=0 && pmd->role ==MEMIF_ROLE_SLAVE ) { -MIF_LOG (ERR ,"Socket is a listener." ); -return -1 ; - }else if ((socket->listener ==0 ) && (pmd->role ==MEMIF_ROLE_MASTER )) { -MIF_LOG (ERR ,"Socket is not a listener." ); -return -1 ; - } - TAILQ_FOREACH(elt, &socket->dev_queue, next) { tmp_pmd = elt->dev->data->dev_private; -if (tmp_pmd->id == pmd->id) { -MIF_LOG (ERR ,"Memif device with id %d already " -"exists on socket %s" , - pmd->id, socket->filename); +if (tmp_pmd->id == pmd->id && tmp_pmd->role == pmd->role) { +MIF_LOG (ERR ,"Two interfaces with the same id (%d) can " +"not have the same role." , pmd->id);return -1 ; } }
Quoted 7 lines · Július Milan
Quoted 6 lines · Ferruh Yigit
Quoted 4 lines · Július Milan
With this patch it is possible to connect 2 DPDK memifs into loopback, i.e. when they have the same id and different roles, as for example:
"--vdev=net_memif0,role=master,id=0" "--vdev=net_memif1,role=slave,id=0"
Quoted 6 lines
Quoted 3 lines
Overall looks good idea but this cause a crash in testpmd on exit, can you please check?
Thank you,
Do you mean this message?
"EAL: Error: Invalid memory"
No.
Quoted 1 line
If not, how can I reproduce it?
Start testpmd [1], quit it [2], and will get a crash [3]. Full log in [4].
[1]
./build/app/testpmd --no-pci --vdev=net_memif0,role=master,id=0 --vdev=net_memif1,role=slave,id=0 --vdev=net_memif1,role=slave,id=1 --log-level "pmd*:debug" -- --no-mlockall -i
[2]
testpmd> quit
[3]
Segmentation fault (core dumped)
[4]
$ ./build/app/testpmd --no-pci --vdev=net_memif0,role=master,id=0 --vdev=net_memif1,role=slave,id=0 --vdev=net_memif1,role=slave,id=1 --log-level "pmd*:debug" -- --no-mlockall -i EAL: Detected 96 lcore(s) EAL: Detected 2 NUMA nodes EAL: Multi-process socket /var/run/dpdk/rte/mp_socket EAL: Selected IOVA mode 'PA' EAL: Probing VFIO support... EAL: VFIO support initialized rte_pmd_memif_probe(): Initialize MEMIF: net_memif0. memif_socket_create(): Memif listener socket /run/memif.sock created. rte_pmd_memif_probe(): Initialize MEMIF: net_memif1. Interactive-mode selected Warning: NUMA should be configured manually by using --port-numa-config and --ring-numa-config parameters along with --numa. testpmd: create a new mbuf pool <mbuf_pool_socket_0>: n=779456, size=2176, socket=0 testpmd: preferred mempool ops selected: ring_mp_mc testpmd: create a new mbuf pool <mbuf_pool_socket_1>: n=779456, size=2176, socket=1 testpmd: preferred mempool ops selected: ring_mp_mc Configuring Port 0 (socket 0) Port 0: 3A:45:AA:E6:9A:93 Configuring Port 1 (socket 0) memif_listener_handler(): /run/memif.sock: Connection request accepted. memif_msg_send_from_queue(): Sent msg type 2. memif_connect_slave(): Memif socket: /run/memif.sock connected. memif_msg_receive(): Received msg type: 2. memif_msg_receive_hello(): Connecting to DPDK 20.02.0-rc1. memif_msg_send_from_queue(): Sent msg type 3. memif_msg_receive(): Received msg type: 3. memif_msg_send_from_queue(): Sent msg type 1. memif_msg_receive(): Received msg type: 1. memif_msg_send_from_queue(): Sent msg type 4. memif_msg_receive(): Received msg type: 4. memif_msg_send_from_queue(): Sent msg type 1. memif_msg_receive(): Received msg type: 1. memif_msg_send_from_queue(): Sent msg type 5. memif_msg_receive(): Received msg type: 5. memif_msg_send_from_queue(): Sent msg type 1. memif_msg_receive(): Received msg type: 1. memif_msg_send_from_queue(): Sent msg type 5. memif_msg_receive(): Received msg type: 5. memif_msg_send_from_queue(): Sent msg type 1. memif_msg_receive(): Received msg type: 1. memif_msg_send_from_queue(): Sent msg type 6. memif_msg_receive(): Received msg type: 6. memif_connect(): Connected. memif_msg_receive_connect(): Remote interface net_memif1 connected. memif_msg_send_from_queue(): Sent msg type 7. memif_msg_receive(): Received msg type: 7. memif_connect(): Connected. memif_msg_receive_connected(): Remote interface net_memif0 connected. Port 1: BA:50:9A:75:5E:9F Checking link statuses... Done Error during enabling promiscuous mode for port 0: Operation not supported - ignore Error during enabling promiscuous mode for port 1: Operation not supported - ignore testpmd> quit
Stopping port 0...
Stopping ports...
Done
Stopping port 1...
Stopping ports...
Done
Shutting down port 0...
Closing ports...memif_msg_receive(): Received msg type: 8. memif_msg_receive_disconnect(): Disconnect received: Device closed memif_disconnect(): Disconnected.memif_msg_receive(): Invalid message size. memif_msg_send_from_queue(): sendmsg fail: Broken pipe. memif_disconnect(): Unexpected message(s) in message queue. memif_disconnect(): Disconnected. memif_msg_send_from_queue(): Sent msg type 0. Segmentation fault (core dumped)
Quoted 48 lines
Quoted 48 lines
Quoted 47 lines
Fixes 09c7e63a71 ("net/memif: introduce memory interface PMD")Signed-off-by Július Milan <[email protected]>--- drivers/net/memif/memif_socket.c | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-)drivers/net/memif/memif_socket.c +4
-13@@ -203,7 +203,7 @@ memif_msg_receive_init(struct memif_control_channel *cc, memif_msg_t *msg) dev = elt->dev; pmd = dev->data->dev_private;if (((pmd->flags Ð_MEMIF_FLAG_DISABLED ) ==0 ) && - pmd->id == i->id) { + (pmd->id == i->id) && (pmd->role ==MEMIF_ROLE_MASTER )) {/* assign control channel to device */ cc->dev = dev; pmd->cc = cc;@@ -965,20 +965,11 @@ memif_socket_init(struct rte_eth_dev *dev, const char *socket_filename) } pmd->socket_filename = socket->filename; -if (socket->listener !=0 && pmd->role ==MEMIF_ROLE_SLAVE ) { -MIF_LOG (ERR ,"Socket is a listener." ); -return -1 ; - }else if ((socket->listener ==0 ) && (pmd->role ==MEMIF_ROLE_MASTER )) { -MIF_LOG (ERR ,"Socket is not a listener." ); -return -1 ; - } - TAILQ_FOREACH(elt, &socket->dev_queue, next) { tmp_pmd = elt->dev->data->dev_private; -if (tmp_pmd->id == pmd->id) { -MIF_LOG (ERR ,"Memif device with id %d already " -"exists on socket %s" , - pmd->id, socket->filename); +if (tmp_pmd->id == pmd->id && tmp_pmd->role == pmd->role) { +MIF_LOG (ERR ,"Two interfaces with the same id (%d) can " +"not have the same role." , pmd->id);return -1 ; } }