eal: close multi-process socket during cleanup
When secondary process quit, the mp_socket* file still exist, that cause rte_mp_request_sync fail when try to send message on a floating socket. The patch fix the issue by introduce a function rte_mp_channel_cleanup. This function will be called by rte_eal_cleanup and it will close the mp socket and delete the mp_socket* file. Fixes: bacaa2754017 ("eal: add channel for multi-process communication") Cc: stable@dpdk.org Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
This commit is contained in:
parent
9d65053761
commit
85d6815fa6
@ -922,6 +922,7 @@ int __rte_experimental
|
||||
rte_eal_cleanup(void)
|
||||
{
|
||||
rte_service_finalize();
|
||||
rte_mp_channel_cleanup();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -37,6 +37,7 @@ static int mp_fd = -1;
|
||||
static char mp_filter[PATH_MAX]; /* Filter for secondary process sockets */
|
||||
static char mp_dir_path[PATH_MAX]; /* The directory path for all mp sockets */
|
||||
static pthread_mutex_t mp_mutex_action = PTHREAD_MUTEX_INITIALIZER;
|
||||
static char peer_name[PATH_MAX];
|
||||
|
||||
struct action_entry {
|
||||
TAILQ_ENTRY(action_entry) next;
|
||||
@ -511,9 +512,9 @@ async_reply_handle(void *arg)
|
||||
static int
|
||||
open_socket_fd(void)
|
||||
{
|
||||
char peer_name[PATH_MAX] = {0};
|
||||
struct sockaddr_un un;
|
||||
|
||||
peer_name[0] = '\0';
|
||||
if (rte_eal_process_type() == RTE_PROC_SECONDARY)
|
||||
snprintf(peer_name, sizeof(peer_name),
|
||||
"%d_%"PRIx64, getpid(), rte_rdtsc());
|
||||
@ -542,6 +543,19 @@ open_socket_fd(void)
|
||||
return mp_fd;
|
||||
}
|
||||
|
||||
static void
|
||||
close_socket_fd(void)
|
||||
{
|
||||
char path[PATH_MAX];
|
||||
|
||||
if (mp_fd < 0)
|
||||
return;
|
||||
|
||||
close(mp_fd);
|
||||
create_socket_path(peer_name, path, sizeof(path));
|
||||
unlink(path);
|
||||
}
|
||||
|
||||
int
|
||||
rte_mp_channel_init(void)
|
||||
{
|
||||
@ -602,6 +616,12 @@ rte_mp_channel_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
rte_mp_channel_cleanup(void)
|
||||
{
|
||||
close_socket_fd();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return -1, as fail to send message and it's caused by the local side.
|
||||
* Return 0, as fail to send message and it's caused by the remote side.
|
||||
|
@ -255,9 +255,13 @@ struct rte_bus *rte_bus_find_by_device_name(const char *str);
|
||||
* 0 on success;
|
||||
* (<0) on failure.
|
||||
*/
|
||||
|
||||
int rte_mp_channel_init(void);
|
||||
|
||||
/**
|
||||
* Primary/secondary communication cleanup.
|
||||
*/
|
||||
void rte_mp_channel_cleanup(void);
|
||||
|
||||
/**
|
||||
* @internal
|
||||
* Parse a device string and store its information in an
|
||||
|
@ -1237,6 +1237,7 @@ rte_eal_cleanup(void)
|
||||
if (rte_eal_process_type() == RTE_PROC_PRIMARY)
|
||||
rte_memseg_walk(mark_freeable, NULL);
|
||||
rte_service_finalize();
|
||||
rte_mp_channel_cleanup();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user