The services don't have a method to break the infinite loop, and this will cause the DPDK app can't end normally.
Fixes: a36634e87e16 ("net/nfp: add flower ctrl VNIC Rx/Tx") Signed-off-by: Chaoyong He <chaoyong...@corigine.com> --- drivers/net/nfp/flower/nfp_flower.c | 1 + drivers/net/nfp/flower/nfp_flower.h | 3 +++ drivers/net/nfp/flower/nfp_flower_ctrl.c | 3 ++- drivers/net/nfp/nfp_common.h | 3 +++ drivers/net/nfp/nfp_cpp_bridge.c | 12 ++++++++---- drivers/net/nfp/nfp_cpp_bridge.h | 2 +- drivers/net/nfp/nfp_ethdev.c | 2 +- 7 files changed, 19 insertions(+), 7 deletions(-) diff --git a/drivers/net/nfp/flower/nfp_flower.c b/drivers/net/nfp/flower/nfp_flower.c index 3e97f5c..1db085e 100644 --- a/drivers/net/nfp/flower/nfp_flower.c +++ b/drivers/net/nfp/flower/nfp_flower.c @@ -1056,6 +1056,7 @@ return -EINVAL; } + app_fw_flower->ctrl_vnic_id = service_id; PMD_INIT_LOG(INFO, "%s registered", flower_service.name); /* Map them to available service cores*/ diff --git a/drivers/net/nfp/flower/nfp_flower.h b/drivers/net/nfp/flower/nfp_flower.h index 48f597a..8521ae4 100644 --- a/drivers/net/nfp/flower/nfp_flower.h +++ b/drivers/net/nfp/flower/nfp_flower.h @@ -51,6 +51,9 @@ struct nfp_app_fw_flower { /* PF representor */ struct nfp_flower_representor *pf_repr; + + /* service id of ctrl vnic service */ + uint32_t ctrl_vnic_id; }; int nfp_init_app_fw_flower(struct nfp_pf_dev *pf_dev); diff --git a/drivers/net/nfp/flower/nfp_flower_ctrl.c b/drivers/net/nfp/flower/nfp_flower_ctrl.c index df908ef..53ca710 100644 --- a/drivers/net/nfp/flower/nfp_flower_ctrl.c +++ b/drivers/net/nfp/flower/nfp_flower_ctrl.c @@ -4,6 +4,7 @@ */ #include <rte_common.h> +#include <rte_service.h> #include <ethdev_pci.h> #include "../nfp_common.h" @@ -238,7 +239,7 @@ /* ctrl vNIC only has a single Rx queue */ rxq = ctrl_eth_dev->data->rx_queues[0]; - while (true) { + while (rte_service_runstate_get(app_fw_flower->ctrl_vnic_id) != 0) { count = nfp_flower_ctrl_vnic_recv(rxq, pkts_burst, MAX_PKT_BURST); if (count != 0) { app_fw_flower->ctrl_vnic_rx_count += count; diff --git a/drivers/net/nfp/nfp_common.h b/drivers/net/nfp/nfp_common.h index d7861a2..36c19b4 100644 --- a/drivers/net/nfp/nfp_common.h +++ b/drivers/net/nfp/nfp_common.h @@ -171,6 +171,9 @@ struct nfp_pf_dev { struct nfp_hwinfo *hwinfo; struct nfp_rtsym_table *sym_tbl; + + /* service id of cpp bridge service */ + uint32_t cpp_bridge_id; }; struct nfp_app_fw_nic { diff --git a/drivers/net/nfp/nfp_cpp_bridge.c b/drivers/net/nfp/nfp_cpp_bridge.c index 155628d..db4b781 100644 --- a/drivers/net/nfp/nfp_cpp_bridge.c +++ b/drivers/net/nfp/nfp_cpp_bridge.c @@ -80,7 +80,7 @@ } int -nfp_enable_cpp_service(struct nfp_cpp *cpp) +nfp_enable_cpp_service(struct nfp_pf_dev *pf_dev) { int ret; uint32_t service_id = 0; @@ -89,7 +89,7 @@ .callback = nfp_cpp_bridge_service_func, }; - cpp_service.callback_userdata = (void *)cpp; + cpp_service.callback_userdata = (void *)pf_dev; /* Register the cpp service */ ret = rte_service_component_register(&cpp_service, &service_id); @@ -98,6 +98,7 @@ return -EINVAL; } + pf_dev->cpp_bridge_id = service_id; PMD_INIT_LOG(INFO, "NFP cpp service registered"); /* Map it to available service core*/ @@ -375,7 +376,8 @@ nfp_cpp_bridge_service_func(void *args) { struct sockaddr address; - struct nfp_cpp *cpp = args; + struct nfp_cpp *cpp; + struct nfp_pf_dev *pf_dev; int sockfd, datafd, op, ret; unlink("/tmp/nfp_cpp"); @@ -408,7 +410,9 @@ return ret; } - for (;;) { + pf_dev = args; + cpp = pf_dev->cpp; + while (rte_service_runstate_get(pf_dev->cpp_bridge_id) != 0) { datafd = accept(sockfd, NULL, NULL); if (datafd < 0) { RTE_LOG(ERR, PMD, "%s: accept call error (%d)\n", diff --git a/drivers/net/nfp/nfp_cpp_bridge.h b/drivers/net/nfp/nfp_cpp_bridge.h index 7fee3a9..8ff7a22 100644 --- a/drivers/net/nfp/nfp_cpp_bridge.h +++ b/drivers/net/nfp/nfp_cpp_bridge.h @@ -26,7 +26,7 @@ #define NFP_IOCTL 'n' #define NFP_IOCTL_CPP_IDENTIFICATION _IOW(NFP_IOCTL, 0x8f, uint32_t) -int nfp_enable_cpp_service(struct nfp_cpp *cpp); +int nfp_enable_cpp_service(struct nfp_pf_dev *pf_dev); int nfp_map_service(uint32_t service_id); #endif /* _NFP_CPP_BRIDGE_H_ */ diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c index f25d6a1..77aac2e 100644 --- a/drivers/net/nfp/nfp_ethdev.c +++ b/drivers/net/nfp/nfp_ethdev.c @@ -1065,7 +1065,7 @@ } /* register the CPP bridge service here for primary use */ - ret = nfp_enable_cpp_service(pf_dev->cpp); + ret = nfp_enable_cpp_service(pf_dev); if (ret != 0) PMD_INIT_LOG(INFO, "Enable cpp service failed."); -- 1.8.3.1