Skip to content

Commit

Permalink
eal: close multi-process socket during cleanup
Browse files Browse the repository at this point in the history
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: bacaa27 ("eal: add channel for multi-process communication")
Cc: stable@dpdk.org

Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
  • Loading branch information
qzhan16 authored and tmonjalo committed Dec 21, 2018
1 parent 9d65053 commit 85d6815
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 2 deletions.
1 change: 1 addition & 0 deletions lib/librte_eal/bsdapp/eal/eal.c
Expand Up @@ -922,6 +922,7 @@ int __rte_experimental
rte_eal_cleanup(void)
{
rte_service_finalize();
rte_mp_channel_cleanup();
return 0;
}

Expand Down
22 changes: 21 additions & 1 deletion lib/librte_eal/common/eal_common_proc.c
Expand Up @@ -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;
Expand Down Expand Up @@ -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());
Expand Down Expand Up @@ -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)
{
Expand Down Expand Up @@ -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.
Expand Down
6 changes: 5 additions & 1 deletion lib/librte_eal/common/eal_private.h
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions lib/librte_eal/linuxapp/eal/eal.c
Expand Up @@ -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;
}

Expand Down

0 comments on commit 85d6815

Please sign in to comment.