Commit 46535130 authored by Kinsbursky Stanislav's avatar Kinsbursky Stanislav Committed by Cyrill Gorcunov

restore: UNIX sockets queue support

Based on xemul@ patches.
Signed-off-by: 's avatarStanislav Kinsbursky <skinsbursky@openvz.org>
Acked-by: 's avatarPavel Emelyanov <xemul@parallels.com>
Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
parent e518c44c
...@@ -99,7 +99,7 @@ static struct shmems *shmems; ...@@ -99,7 +99,7 @@ static struct shmems *shmems;
static struct pipe_info *pipes; static struct pipe_info *pipes;
static int nr_pipes; static int nr_pipes;
static pid_t pstree_pid; pid_t pstree_pid;
struct pstree_item *me; struct pstree_item *me;
static int restore_task_with_children(void *); static int restore_task_with_children(void *);
......
...@@ -157,6 +157,8 @@ struct pstree_item { ...@@ -157,6 +157,8 @@ struct pstree_item {
u32 *children; /* array of children */ u32 *children; /* array of children */
}; };
extern pid_t pstree_pid;
static inline int in_vma_area(struct vma_area *vma, unsigned long addr) static inline int in_vma_area(struct vma_area *vma, unsigned long addr)
{ {
return addr >= (unsigned long)vma->vma.start && return addr >= (unsigned long)vma->vma.start &&
......
...@@ -788,7 +788,7 @@ enum { ...@@ -788,7 +788,7 @@ enum {
static void unix_show_job(const char *type, int fd, int id) static void unix_show_job(const char *type, int fd, int id)
{ {
pr_debug("%s job fd %d id %d\n", type, fd, id); pr_info("%s job fd %d id %d\n", type, fd, id);
} }
static struct unix_conn_job *conn_jobs; static struct unix_conn_job *conn_jobs;
...@@ -814,7 +814,7 @@ static int schedule_conn_job(int type, const struct unix_sk_entry *ue) ...@@ -814,7 +814,7 @@ static int schedule_conn_job(int type, const struct unix_sk_entry *ue)
return 0; return 0;
} }
static int run_connect_jobs(void) static int run_connect_jobs(struct sk_packets_pool *pool)
{ {
struct unix_conn_job *cj, *next; struct unix_conn_job *cj, *next;
int i; int i;
...@@ -823,7 +823,7 @@ static int run_connect_jobs(void) ...@@ -823,7 +823,7 @@ static int run_connect_jobs(void)
while (cj) { while (cj) {
int attempts = 8; int attempts = 8;
struct sockaddr_un addr; struct sockaddr_un addr;
int addrlen; int addrlen, ret;
/* /*
* Might need to resolve in-flight connection name. * Might need to resolve in-flight connection name.
...@@ -848,7 +848,7 @@ static int run_connect_jobs(void) ...@@ -848,7 +848,7 @@ static int run_connect_jobs(void)
addrlen = e->addrlen; addrlen = e->addrlen;
} }
unix_show_job("Run conn", cj->fd, -1); unix_show_job("Run conn", cj->fd, cj->peer);
try_again: try_again:
if (connect(cj->fd, (struct sockaddr *)&addr, addrlen) < 0) { if (connect(cj->fd, (struct sockaddr *)&addr, addrlen) < 0) {
if (attempts) { if (attempts) {
...@@ -860,7 +860,12 @@ try_again: ...@@ -860,7 +860,12 @@ try_again:
return -1; return -1;
} }
unix_show_job("Fin conn", cj->fd, -1); unix_show_job("Fin conn", cj->fd, cj->peer);
ret = restore_socket_queue(pool, cj->fd, cj->peer);
if (ret < 0)
return -1;
next = cj->next; next = cj->next;
xfree(cj); xfree(cj);
cj = next; cj = next;
...@@ -885,6 +890,7 @@ try_again: ...@@ -885,6 +890,7 @@ try_again:
struct unix_accept_job { struct unix_accept_job {
int fd; int fd;
int peer;
struct unix_accept_job *next; struct unix_accept_job *next;
}; };
...@@ -912,6 +918,7 @@ static int schedule_acc_job(int sk, const struct unix_sk_entry *ue) ...@@ -912,6 +918,7 @@ static int schedule_acc_job(int sk, const struct unix_sk_entry *ue)
goto err; goto err;
aj->fd = ue->fd; aj->fd = ue->fd;
aj->peer = ue->peer;
aj->next = accept_jobs; aj->next = accept_jobs;
accept_jobs = aj; accept_jobs = aj;
unix_show_job("Sched acc", ue->fd, ue->id); unix_show_job("Sched acc", ue->fd, ue->id);
...@@ -920,13 +927,13 @@ err: ...@@ -920,13 +927,13 @@ err:
return -1; return -1;
} }
static int run_accept_jobs(void) static int run_accept_jobs(struct sk_packets_pool *pool)
{ {
struct unix_accept_job *aj, *next; struct unix_accept_job *aj, *next;
aj = accept_jobs; aj = accept_jobs;
while (aj) { while (aj) {
int fd; int fd, ret;
unix_show_job("Run acc", aj->fd, -1); unix_show_job("Run acc", aj->fd, -1);
fd = accept(aj->fd, NULL, NULL); fd = accept(aj->fd, NULL, NULL);
...@@ -938,6 +945,10 @@ static int run_accept_jobs(void) ...@@ -938,6 +945,10 @@ static int run_accept_jobs(void)
if (reopen_fd_as_nocheck(aj->fd, fd)) if (reopen_fd_as_nocheck(aj->fd, fd))
return -1; return -1;
ret = restore_socket_queue(pool, aj->fd, aj->peer);
if (ret < 0)
return -1;
unix_show_job("Fin acc", aj->fd, -1); unix_show_job("Fin acc", aj->fd, -1);
next = aj->next; next = aj->next;
xfree(aj); xfree(aj);
...@@ -1104,6 +1115,9 @@ err: ...@@ -1104,6 +1115,9 @@ err:
static int prepare_unix_sockets(int pid) static int prepare_unix_sockets(int pid)
{ {
int usk_fd, ret = -1; int usk_fd, ret = -1;
struct sk_packets_pool unix_pool = {
.packets_list = LIST_HEAD_INIT(unix_pool.packets_list),
};
usk_fd = open_image_ro(CR_FD_UNIXSK, pid); usk_fd = open_image_ro(CR_FD_UNIXSK, pid);
if (usk_fd < 0) if (usk_fd < 0)
...@@ -1123,11 +1137,21 @@ static int prepare_unix_sockets(int pid) ...@@ -1123,11 +1137,21 @@ static int prepare_unix_sockets(int pid)
err: err:
close(usk_fd); close(usk_fd);
if (ret)
return ret;
unix_pool.img_fd = open_image_ro(CR_FD_SK_QUEUES, pstree_pid);
if (unix_pool.img_fd < 0)
return -1;
ret = read_sockets_queues(&unix_pool);
if (ret < 0)
return ret;
ret = run_connect_jobs(&unix_pool);
if (!ret) if (!ret)
ret = run_connect_jobs(); ret = run_accept_jobs(&unix_pool);
if (!ret)
ret = run_accept_jobs();
close(unix_pool.img_fd);
return ret; return ret;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment