Commit 98759c76 authored by Pavel Emelyanov's avatar Pavel Emelyanov

unix: Don't poll-wait on unix peer to be bound

Long time ago the conn jobs were implemented in a bad
manner -- they tried to connect to peer until it succeeds
sleeping in the middle.

Time to stop doing so and switch to proper futex-based
waiting for bound event.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent c2bb8404
...@@ -431,6 +431,7 @@ struct unix_sk_info { ...@@ -431,6 +431,7 @@ struct unix_sk_info {
unsigned flags; unsigned flags;
struct unix_sk_info *peer; struct unix_sk_info *peer;
struct file_desc d; struct file_desc d;
futex_t bound;
}; };
#define USK_PAIR_MASTER 0x1 #define USK_PAIR_MASTER 0x1
...@@ -511,7 +512,6 @@ int run_unix_connections(void) ...@@ -511,7 +512,6 @@ int run_unix_connections(void)
cj = conn_jobs; cj = conn_jobs;
while (cj) { while (cj) {
int attempts = 8;
struct unix_sk_info *ui = cj->sk; struct unix_sk_info *ui = cj->sk;
struct unix_sk_info *peer = ui->peer; struct unix_sk_info *peer = ui->peer;
struct fdinfo_list_entry *fle; struct fdinfo_list_entry *fle;
...@@ -521,19 +521,15 @@ int run_unix_connections(void) ...@@ -521,19 +521,15 @@ int run_unix_connections(void)
fle = file_master(&ui->d); fle = file_master(&ui->d);
futex_wait_while(&peer->bound, 0);
memset(&addr, 0, sizeof(addr)); memset(&addr, 0, sizeof(addr));
addr.sun_family = AF_UNIX; addr.sun_family = AF_UNIX;
memcpy(&addr.sun_path, peer->name, peer->ue->name.len); memcpy(&addr.sun_path, peer->name, peer->ue->name.len);
try_again:
if (connect(fle->fe->fd, (struct sockaddr *)&addr, if (connect(fle->fe->fd, (struct sockaddr *)&addr,
sizeof(addr.sun_family) + sizeof(addr.sun_family) +
peer->ue->name.len) < 0) { peer->ue->name.len) < 0) {
if (attempts) {
usleep(1000);
attempts--;
goto try_again; /* FIXME use futex waiters */
}
pr_perror("Can't connect %#x socket", ui->ue->ino); pr_perror("Can't connect %#x socket", ui->ue->ino);
return -1; return -1;
} }
...@@ -576,6 +572,8 @@ static int bind_unix_sk(int sk, struct unix_sk_info *ui) ...@@ -576,6 +572,8 @@ static int bind_unix_sk(int sk, struct unix_sk_info *ui)
pr_perror("Can't bind socket"); pr_perror("Can't bind socket");
return -1; return -1;
} }
futex_set_and_wake(&ui->bound, 1);
done: done:
return 0; return 0;
} }
...@@ -742,6 +740,7 @@ static int collect_one_unixsk(void *o, ProtobufCMessage *base) ...@@ -742,6 +740,7 @@ static int collect_one_unixsk(void *o, ProtobufCMessage *base)
} else } else
ui->name = NULL; ui->name = NULL;
futex_init(&ui->bound);
ui->peer = NULL; ui->peer = NULL;
ui->flags = 0; ui->flags = 0;
pr_info(" `- Got %#x peer %#x\n", ui->ue->ino, ui->ue->peer); pr_info(" `- Got %#x peer %#x\n", ui->ue->ino, ui->ue->peer);
......
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