diff options
Diffstat (limited to 'net/core/sock.c')
-rw-r--r-- | net/core/sock.c | 42 |
1 files changed, 39 insertions, 3 deletions
diff --git a/net/core/sock.c b/net/core/sock.c index 4ed7b1d12f5e..16069139797c 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -125,6 +125,7 @@ | |||
125 | #include <net/xfrm.h> | 125 | #include <net/xfrm.h> |
126 | #include <linux/ipsec.h> | 126 | #include <linux/ipsec.h> |
127 | #include <net/cls_cgroup.h> | 127 | #include <net/cls_cgroup.h> |
128 | #include <net/netprio_cgroup.h> | ||
128 | 129 | ||
129 | #include <linux/filter.h> | 130 | #include <linux/filter.h> |
130 | 131 | ||
@@ -221,10 +222,16 @@ __u32 sysctl_rmem_default __read_mostly = SK_RMEM_MAX; | |||
221 | int sysctl_optmem_max __read_mostly = sizeof(unsigned long)*(2*UIO_MAXIOV+512); | 222 | int sysctl_optmem_max __read_mostly = sizeof(unsigned long)*(2*UIO_MAXIOV+512); |
222 | EXPORT_SYMBOL(sysctl_optmem_max); | 223 | EXPORT_SYMBOL(sysctl_optmem_max); |
223 | 224 | ||
224 | #if defined(CONFIG_CGROUPS) && !defined(CONFIG_NET_CLS_CGROUP) | 225 | #if defined(CONFIG_CGROUPS) |
226 | #if !defined(CONFIG_NET_CLS_CGROUP) | ||
225 | int net_cls_subsys_id = -1; | 227 | int net_cls_subsys_id = -1; |
226 | EXPORT_SYMBOL_GPL(net_cls_subsys_id); | 228 | EXPORT_SYMBOL_GPL(net_cls_subsys_id); |
227 | #endif | 229 | #endif |
230 | #if !defined(CONFIG_NETPRIO_CGROUP) | ||
231 | int net_prio_subsys_id = -1; | ||
232 | EXPORT_SYMBOL_GPL(net_prio_subsys_id); | ||
233 | #endif | ||
234 | #endif | ||
228 | 235 | ||
229 | static int sock_set_timeout(long *timeo_p, char __user *optval, int optlen) | 236 | static int sock_set_timeout(long *timeo_p, char __user *optval, int optlen) |
230 | { | 237 | { |
@@ -740,6 +747,11 @@ set_rcvbuf: | |||
740 | case SO_RXQ_OVFL: | 747 | case SO_RXQ_OVFL: |
741 | sock_valbool_flag(sk, SOCK_RXQ_OVFL, valbool); | 748 | sock_valbool_flag(sk, SOCK_RXQ_OVFL, valbool); |
742 | break; | 749 | break; |
750 | |||
751 | case SO_WIFI_STATUS: | ||
752 | sock_valbool_flag(sk, SOCK_WIFI_STATUS, valbool); | ||
753 | break; | ||
754 | |||
743 | default: | 755 | default: |
744 | ret = -ENOPROTOOPT; | 756 | ret = -ENOPROTOOPT; |
745 | break; | 757 | break; |
@@ -961,6 +973,10 @@ int sock_getsockopt(struct socket *sock, int level, int optname, | |||
961 | v.val = !!sock_flag(sk, SOCK_RXQ_OVFL); | 973 | v.val = !!sock_flag(sk, SOCK_RXQ_OVFL); |
962 | break; | 974 | break; |
963 | 975 | ||
976 | case SO_WIFI_STATUS: | ||
977 | v.val = !!sock_flag(sk, SOCK_WIFI_STATUS); | ||
978 | break; | ||
979 | |||
964 | default: | 980 | default: |
965 | return -ENOPROTOOPT; | 981 | return -ENOPROTOOPT; |
966 | } | 982 | } |
@@ -1111,6 +1127,18 @@ void sock_update_classid(struct sock *sk) | |||
1111 | sk->sk_classid = classid; | 1127 | sk->sk_classid = classid; |
1112 | } | 1128 | } |
1113 | EXPORT_SYMBOL(sock_update_classid); | 1129 | EXPORT_SYMBOL(sock_update_classid); |
1130 | |||
1131 | void sock_update_netprioidx(struct sock *sk) | ||
1132 | { | ||
1133 | struct cgroup_netprio_state *state; | ||
1134 | if (in_interrupt()) | ||
1135 | return; | ||
1136 | rcu_read_lock(); | ||
1137 | state = task_netprio_state(current); | ||
1138 | sk->sk_cgrp_prioidx = state ? state->prioidx : 0; | ||
1139 | rcu_read_unlock(); | ||
1140 | } | ||
1141 | EXPORT_SYMBOL_GPL(sock_update_netprioidx); | ||
1114 | #endif | 1142 | #endif |
1115 | 1143 | ||
1116 | /** | 1144 | /** |
@@ -1138,6 +1166,7 @@ struct sock *sk_alloc(struct net *net, int family, gfp_t priority, | |||
1138 | atomic_set(&sk->sk_wmem_alloc, 1); | 1166 | atomic_set(&sk->sk_wmem_alloc, 1); |
1139 | 1167 | ||
1140 | sock_update_classid(sk); | 1168 | sock_update_classid(sk); |
1169 | sock_update_netprioidx(sk); | ||
1141 | } | 1170 | } |
1142 | 1171 | ||
1143 | return sk; | 1172 | return sk; |
@@ -1204,7 +1233,14 @@ void sk_release_kernel(struct sock *sk) | |||
1204 | } | 1233 | } |
1205 | EXPORT_SYMBOL(sk_release_kernel); | 1234 | EXPORT_SYMBOL(sk_release_kernel); |
1206 | 1235 | ||
1207 | struct sock *sk_clone(const struct sock *sk, const gfp_t priority) | 1236 | /** |
1237 | * sk_clone_lock - clone a socket, and lock its clone | ||
1238 | * @sk: the socket to clone | ||
1239 | * @priority: for allocation (%GFP_KERNEL, %GFP_ATOMIC, etc) | ||
1240 | * | ||
1241 | * Caller must unlock socket even in error path (bh_unlock_sock(newsk)) | ||
1242 | */ | ||
1243 | struct sock *sk_clone_lock(const struct sock *sk, const gfp_t priority) | ||
1208 | { | 1244 | { |
1209 | struct sock *newsk; | 1245 | struct sock *newsk; |
1210 | 1246 | ||
@@ -1297,7 +1333,7 @@ struct sock *sk_clone(const struct sock *sk, const gfp_t priority) | |||
1297 | out: | 1333 | out: |
1298 | return newsk; | 1334 | return newsk; |
1299 | } | 1335 | } |
1300 | EXPORT_SYMBOL_GPL(sk_clone); | 1336 | EXPORT_SYMBOL_GPL(sk_clone_lock); |
1301 | 1337 | ||
1302 | void sk_setup_caps(struct sock *sk, struct dst_entry *dst) | 1338 | void sk_setup_caps(struct sock *sk, struct dst_entry *dst) |
1303 | { | 1339 | { |