aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/tcp.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4/tcp.c')
-rw-r--r--net/ipv4/tcp.c34
1 files changed, 24 insertions, 10 deletions
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
index 8ce29747ad9b..3284393d09b4 100644
--- a/net/ipv4/tcp.c
+++ b/net/ipv4/tcp.c
@@ -2840,7 +2840,6 @@ static void __tcp_free_md5sig_pool(struct tcp_md5sig_pool * __percpu *pool)
2840 if (p->md5_desc.tfm) 2840 if (p->md5_desc.tfm)
2841 crypto_free_hash(p->md5_desc.tfm); 2841 crypto_free_hash(p->md5_desc.tfm);
2842 kfree(p); 2842 kfree(p);
2843 p = NULL;
2844 } 2843 }
2845 } 2844 }
2846 free_percpu(pool); 2845 free_percpu(pool);
@@ -2938,25 +2937,40 @@ retry:
2938 2937
2939EXPORT_SYMBOL(tcp_alloc_md5sig_pool); 2938EXPORT_SYMBOL(tcp_alloc_md5sig_pool);
2940 2939
2941struct tcp_md5sig_pool *__tcp_get_md5sig_pool(int cpu) 2940
2941/**
2942 * tcp_get_md5sig_pool - get md5sig_pool for this user
2943 *
2944 * We use percpu structure, so if we succeed, we exit with preemption
2945 * and BH disabled, to make sure another thread or softirq handling
2946 * wont try to get same context.
2947 */
2948struct tcp_md5sig_pool *tcp_get_md5sig_pool(void)
2942{ 2949{
2943 struct tcp_md5sig_pool * __percpu *p; 2950 struct tcp_md5sig_pool * __percpu *p;
2944 spin_lock_bh(&tcp_md5sig_pool_lock); 2951
2952 local_bh_disable();
2953
2954 spin_lock(&tcp_md5sig_pool_lock);
2945 p = tcp_md5sig_pool; 2955 p = tcp_md5sig_pool;
2946 if (p) 2956 if (p)
2947 tcp_md5sig_users++; 2957 tcp_md5sig_users++;
2948 spin_unlock_bh(&tcp_md5sig_pool_lock); 2958 spin_unlock(&tcp_md5sig_pool_lock);
2949 return (p ? *per_cpu_ptr(p, cpu) : NULL); 2959
2950} 2960 if (p)
2961 return *per_cpu_ptr(p, smp_processor_id());
2951 2962
2952EXPORT_SYMBOL(__tcp_get_md5sig_pool); 2963 local_bh_enable();
2964 return NULL;
2965}
2966EXPORT_SYMBOL(tcp_get_md5sig_pool);
2953 2967
2954void __tcp_put_md5sig_pool(void) 2968void tcp_put_md5sig_pool(void)
2955{ 2969{
2970 local_bh_enable();
2956 tcp_free_md5sig_pool(); 2971 tcp_free_md5sig_pool();
2957} 2972}
2958 2973EXPORT_SYMBOL(tcp_put_md5sig_pool);
2959EXPORT_SYMBOL(__tcp_put_md5sig_pool);
2960 2974
2961int tcp_md5_hash_header(struct tcp_md5sig_pool *hp, 2975int tcp_md5_hash_header(struct tcp_md5sig_pool *hp,
2962 struct tcphdr *th) 2976 struct tcphdr *th)