Acked-by: Andrew Vagin <[email protected]>

I'm agree that we need to remove this function, but I don't know how it
fixes the bug.

On Fri, May 29, 2015 at 04:53:39PM +0300, Kirill Tkhai wrote:
> This is a leftover from earlier versions of PCS,
> and we do not need that functionality in 3.10.
> 
> It was the reason of the kernel panic in 2.6.32:
> https://jira.sw.ru/browse/PSBM-33755, in the test
> of forced CT destroying.
> 
> Also, tcp_v4_kill_ve_sockets() looks as the only
> user of synchronize_net(), so we're not need this
> function too (the only net hook fini_venet_acct_ip6_stat()
> from the chain doesn't need it). Besides this, there
> will be one more synchronize_rcu() later in
> ve_drop_context().
> 
> Signed-off-by: Kirill Tkhai <[email protected]>
> ---
>  include/linux/ve_proto.h |    5 +--
>  kernel/ve/ve.c           |    5 +--
>  net/ipv4/tcp_ipv4.c      |   88 
> ----------------------------------------------
>  3 files changed, 2 insertions(+), 96 deletions(-)
> 
> diff --git a/include/linux/ve_proto.h b/include/linux/ve_proto.h
> index d491ab0..e77d6f9 100644
> --- a/include/linux/ve_proto.h
> +++ b/include/linux/ve_proto.h
> @@ -50,12 +50,9 @@ typedef void (*ve_seq_print_t)(struct seq_file *, struct 
> ve_struct *);
>  void vzmon_register_veaddr_print_cb(ve_seq_print_t);
>  void vzmon_unregister_veaddr_print_cb(ve_seq_print_t);
>  
> -#ifdef CONFIG_INET
> -void tcp_v4_kill_ve_sockets(struct ve_struct *envid);
> -#ifdef CONFIG_VE_NETDEV
> +#if defined(CONFIG_INET) && defined(CONFIG_VE_NETDEV)
>  int venet_init(void);
>  #endif
> -#endif
>  
>  extern struct list_head ve_list_head;
>  #define for_each_ve(ve)      list_for_each_entry((ve), &ve_list_head, 
> ve_list)
> diff --git a/kernel/ve/ve.c b/kernel/ve/ve.c
> index 55b7d86..3128fdb 100644
> --- a/kernel/ve/ve.c
> +++ b/kernel/ve/ve.c
> @@ -647,10 +647,7 @@ void ve_exit_ns(struct pid_namespace *pid_ns)
>  
>       down_write(&ve->op_sem);
>       ve_hook_iterate_fini(VE_SS_CHAIN, ve);
> -#ifdef CONFIG_INET
> -     tcp_v4_kill_ve_sockets(ve);
> -     synchronize_net();
> -#endif
> +
>       ve_list_del(ve);
>       ve_drop_context(ve);
>       up_write(&ve->op_sem);
> diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
> index ad4520c..a8ef57a 100644
> --- a/net/ipv4/tcp_ipv4.c
> +++ b/net/ipv4/tcp_ipv4.c
> @@ -2812,91 +2812,3 @@ void __init tcp_v4_init(void)
>       if (register_pernet_subsys(&tcp_sk_ops))
>               panic("Failed to create the TCP control socket.\n");
>  }
> -
> -#ifdef CONFIG_VE
> -static void tcp_kill_ve_onesk(struct sock *sk)
> -{
> -     struct tcp_sock *tp = tcp_sk(sk);
> -
> -     /* Check the assumed state of the socket. */
> -     if (!sock_flag(sk, SOCK_DEAD)) {
> -             printk(KERN_WARNING "Killing sk: dead %d, state %d, "
> -                     "wrseq %u unseq %u, wrqu %d.\n",
> -                     sock_flag(sk, SOCK_DEAD), sk->sk_state,
> -                     tp->write_seq, tp->snd_una,
> -                     !skb_queue_empty(&sk->sk_write_queue));
> -             sk->sk_err = ECONNRESET;
> -             sk->sk_error_report(sk);
> -     }
> -
> -     tcp_send_active_reset(sk, GFP_ATOMIC);
> -     switch (sk->sk_state) {
> -             case TCP_FIN_WAIT1:
> -             case TCP_CLOSING:
> -                     /* In these 2 states the peer may want us to retransmit
> -                      * some data and/or FIN.  Entering "resetting mode"
> -                      * instead.
> -                      */
> -                     tcp_time_wait(sk, TCP_CLOSE, 0);
> -                     break;
> -             case TCP_FIN_WAIT2:
> -                     /* By some reason the socket may stay in this state
> -                      * without turning into a TW bucket.  Fix it.
> -                      */
> -                     tcp_time_wait(sk, TCP_FIN_WAIT2, 0);
> -                     break;
> -             default:
> -                     /* Just jump into CLOSED state. */
> -                     tcp_done(sk);
> -                     break;
> -     }
> -}
> -
> -void tcp_v4_kill_ve_sockets(struct ve_struct *envid)
> -{
> -     struct inet_ehash_bucket *head;
> -     int i, retry;
> -
> -     /* alive */
> -again:
> -     retry = 0;
> -     local_bh_disable();
> -     head = tcp_hashinfo.ehash;
> -     for (i = 0; i < tcp_hashinfo.ehash_mask; i++) {
> -             struct sock *sk;
> -             struct hlist_nulls_node *node;
> -             spinlock_t *lock = inet_ehash_lockp(&tcp_hashinfo, i);
> -more_work:
> -             spin_lock(lock);
> -             sk_nulls_for_each(sk, node, &head[i].chain) {
> -                     if (sock_net(sk)->owner_ve == envid) {
> -                             sock_hold(sk);
> -                             spin_unlock(lock);
> -
> -                             bh_lock_sock(sk);
> -                             if (sock_owned_by_user(sk)) {
> -                                     retry = 1;
> -                                     bh_unlock_sock(sk);
> -                                     sock_put(sk);
> -                                     goto enable_bh;
> -                             }
> -                             /* sk might have disappeared from the hash 
> before
> -                              * we got the lock */
> -                             if (sk->sk_state != TCP_CLOSE)
> -                                     tcp_kill_ve_onesk(sk);
> -                             bh_unlock_sock(sk);
> -                             sock_put(sk);
> -                             goto more_work;
> -                     }
> -             }
> -             spin_unlock(lock);
> -     }
> -enable_bh:
> -     local_bh_enable();
> -     if (retry) {
> -             schedule_timeout_interruptible(HZ);
> -             goto again;
> -     }
> -}
> -EXPORT_SYMBOL(tcp_v4_kill_ve_sockets);
> -#endif
> 
_______________________________________________
Devel mailing list
[email protected]
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to