[CRIU] [PATCH RFC 23/30] inet: Use task_st futex for notification instead of per-port
Kirill Tkhai
ktkhai at virtuozzo.com
Tue Nov 29 03:05:47 PST 2016
On 08.11.2016 16:08, Pavel Emelyanov wrote:
> Why doesn't per-socket notification work?
It works, but the idea is to use task_st for waiting of every events.
> On 11/01/2016 05:34 PM, Kirill Tkhai wrote:
>> Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
>> ---
>> criu/sk-inet.c | 26 ++++++++++++++++++++------
>> 1 file changed, 20 insertions(+), 6 deletions(-)
>>
>> diff --git a/criu/sk-inet.c b/criu/sk-inet.c
>> index 6a0a2d2..8832c91 100644
>> --- a/criu/sk-inet.c
>> +++ b/criu/sk-inet.c
>> @@ -33,7 +33,7 @@ struct inet_port {
>> int port;
>> int type;
>> struct list_head type_list;
>> - futex_t users;
>> + atomic_t users;
>> mutex_t reuseaddr_lock;
>> struct list_head list;
>> };
>> @@ -45,7 +45,7 @@ static struct inet_port *port_add(struct inet_sk_info *ii, int port)
>>
>> list_for_each_entry(e, &inet_ports, list)
>> if (e->type == type && e->port == port) {
>> - futex_inc(&e->users);
>> + atomic_inc(&e->users);
>> goto out_link;
>> }
>>
>> @@ -57,8 +57,7 @@ static struct inet_port *port_add(struct inet_sk_info *ii, int port)
>>
>> e->port = port;
>> e->type = type;
>> - futex_init(&e->users);
>> - futex_inc(&e->users);
>> + atomic_set(&e->users, 1);
>> mutex_init(&e->reuseaddr_lock);
>> INIT_LIST_HEAD(&e->type_list);
>>
>> @@ -514,6 +513,19 @@ static int inet_validate_address(InetSkEntry *ie)
>> return -1;
>> }
>>
>> +static void dec_users_and_wake(struct inet_port *port)
>> +{
>> + struct fdinfo_list_entry *fle;
>> + struct inet_sk_info *ii;
>> +
>> + if (atomic_dec_return(&port->users))
>> + return;
>> + list_for_each_entry(ii, &port->type_list, port_list) {
>> + fle = file_master(&ii->d);
>> + set_fds_event(fle->pid);
>> + }
>> +}
>> +
>> static int post_open_inet_sk(struct file_desc *d, int sk)
>> {
>> struct inet_sk_info *ii;
>> @@ -536,7 +548,8 @@ static int post_open_inet_sk(struct file_desc *d, int sk)
>> if (ii->ie->opts->reuseaddr)
>> return 0;
>>
>> - futex_wait_until(&ii->port->users, 0);
>> + while (atomic_read(&ii->port->users))
>> + wait_fds_event();
>>
>> val = ii->ie->opts->reuseaddr;
>> if (restore_opt(sk, SOL_SOCKET, SO_REUSEADDR, &val))
>> @@ -554,6 +567,7 @@ int restore_ip_opts(int sk, IpOptsEntry *ioe)
>>
>> return ret;
>> }
>> +
>> static int open_inet_sk(struct file_desc *d)
>> {
>> struct inet_sk_info *ii;
>> @@ -641,7 +655,7 @@ static int open_inet_sk(struct file_desc *d)
>> inet_connect(sk, ii))
>> goto err;
>> done:
>> - futex_dec_and_wake(&ii->port->users);
>> + dec_users_and_wake(ii->port);
>>
>> if (rst_file_params(sk, ie->fown, ie->flags))
>> goto err;
>>
>> .
>>
>
More information about the CRIU
mailing list