diff options
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/datagram.c | 5 | ||||
-rw-r--r-- | net/core/dev.c | 285 | ||||
-rw-r--r-- | net/core/ethtool.c | 88 | ||||
-rw-r--r-- | net/core/flow.c | 82 | ||||
-rw-r--r-- | net/core/gen_estimator.c | 4 | ||||
-rw-r--r-- | net/core/iovec.c | 6 | ||||
-rw-r--r-- | net/core/neighbour.c | 6 | ||||
-rw-r--r-- | net/core/net-sysfs.c | 5 | ||||
-rw-r--r-- | net/core/pktgen.c | 12 | ||||
-rw-r--r-- | net/core/rtnetlink.c | 31 | ||||
-rw-r--r-- | net/core/skbuff.c | 92 | ||||
-rw-r--r-- | net/core/sock.c | 4 | ||||
-rw-r--r-- | net/core/utils.c | 15 |
13 files changed, 342 insertions, 293 deletions
diff --git a/net/core/datagram.c b/net/core/datagram.c index 251997a95483..4df1b7a6c1bf 100644 --- a/net/core/datagram.c +++ b/net/core/datagram.c | |||
@@ -746,13 +746,12 @@ unsigned int datagram_poll(struct file *file, struct socket *sock, | |||
746 | if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue)) | 746 | if (sk->sk_err || !skb_queue_empty(&sk->sk_error_queue)) |
747 | mask |= POLLERR; | 747 | mask |= POLLERR; |
748 | if (sk->sk_shutdown & RCV_SHUTDOWN) | 748 | if (sk->sk_shutdown & RCV_SHUTDOWN) |
749 | mask |= POLLRDHUP; | 749 | mask |= POLLRDHUP | POLLIN | POLLRDNORM; |
750 | if (sk->sk_shutdown == SHUTDOWN_MASK) | 750 | if (sk->sk_shutdown == SHUTDOWN_MASK) |
751 | mask |= POLLHUP; | 751 | mask |= POLLHUP; |
752 | 752 | ||
753 | /* readable? */ | 753 | /* readable? */ |
754 | if (!skb_queue_empty(&sk->sk_receive_queue) || | 754 | if (!skb_queue_empty(&sk->sk_receive_queue)) |
755 | (sk->sk_shutdown & RCV_SHUTDOWN)) | ||
756 | mask |= POLLIN | POLLRDNORM; | 755 | mask |= POLLIN | POLLRDNORM; |
757 | 756 | ||
758 | /* Connection-based need to check for termination and startup */ | 757 | /* Connection-based need to check for termination and startup */ |
diff --git a/net/core/dev.c b/net/core/dev.c index 660dd41aaaa6..42b200fdf12e 100644 --- a/net/core/dev.c +++ b/net/core/dev.c | |||
@@ -129,6 +129,7 @@ | |||
129 | #include <linux/random.h> | 129 | #include <linux/random.h> |
130 | #include <trace/events/napi.h> | 130 | #include <trace/events/napi.h> |
131 | #include <linux/pci.h> | 131 | #include <linux/pci.h> |
132 | #include <linux/inetdevice.h> | ||
132 | 133 | ||
133 | #include "net-sysfs.h" | 134 | #include "net-sysfs.h" |
134 | 135 | ||
@@ -371,6 +372,14 @@ static inline void netdev_set_addr_lockdep_class(struct net_device *dev) | |||
371 | * --ANK (980803) | 372 | * --ANK (980803) |
372 | */ | 373 | */ |
373 | 374 | ||
375 | static inline struct list_head *ptype_head(const struct packet_type *pt) | ||
376 | { | ||
377 | if (pt->type == htons(ETH_P_ALL)) | ||
378 | return &ptype_all; | ||
379 | else | ||
380 | return &ptype_base[ntohs(pt->type) & PTYPE_HASH_MASK]; | ||
381 | } | ||
382 | |||
374 | /** | 383 | /** |
375 | * dev_add_pack - add packet handler | 384 | * dev_add_pack - add packet handler |
376 | * @pt: packet type declaration | 385 | * @pt: packet type declaration |
@@ -386,16 +395,11 @@ static inline void netdev_set_addr_lockdep_class(struct net_device *dev) | |||
386 | 395 | ||
387 | void dev_add_pack(struct packet_type *pt) | 396 | void dev_add_pack(struct packet_type *pt) |
388 | { | 397 | { |
389 | int hash; | 398 | struct list_head *head = ptype_head(pt); |
390 | 399 | ||
391 | spin_lock_bh(&ptype_lock); | 400 | spin_lock(&ptype_lock); |
392 | if (pt->type == htons(ETH_P_ALL)) | 401 | list_add_rcu(&pt->list, head); |
393 | list_add_rcu(&pt->list, &ptype_all); | 402 | spin_unlock(&ptype_lock); |
394 | else { | ||
395 | hash = ntohs(pt->type) & PTYPE_HASH_MASK; | ||
396 | list_add_rcu(&pt->list, &ptype_base[hash]); | ||
397 | } | ||
398 | spin_unlock_bh(&ptype_lock); | ||
399 | } | 403 | } |
400 | EXPORT_SYMBOL(dev_add_pack); | 404 | EXPORT_SYMBOL(dev_add_pack); |
401 | 405 | ||
@@ -414,15 +418,10 @@ EXPORT_SYMBOL(dev_add_pack); | |||
414 | */ | 418 | */ |
415 | void __dev_remove_pack(struct packet_type *pt) | 419 | void __dev_remove_pack(struct packet_type *pt) |
416 | { | 420 | { |
417 | struct list_head *head; | 421 | struct list_head *head = ptype_head(pt); |
418 | struct packet_type *pt1; | 422 | struct packet_type *pt1; |
419 | 423 | ||
420 | spin_lock_bh(&ptype_lock); | 424 | spin_lock(&ptype_lock); |
421 | |||
422 | if (pt->type == htons(ETH_P_ALL)) | ||
423 | head = &ptype_all; | ||
424 | else | ||
425 | head = &ptype_base[ntohs(pt->type) & PTYPE_HASH_MASK]; | ||
426 | 425 | ||
427 | list_for_each_entry(pt1, head, list) { | 426 | list_for_each_entry(pt1, head, list) { |
428 | if (pt == pt1) { | 427 | if (pt == pt1) { |
@@ -433,7 +432,7 @@ void __dev_remove_pack(struct packet_type *pt) | |||
433 | 432 | ||
434 | printk(KERN_WARNING "dev_remove_pack: %p not found.\n", pt); | 433 | printk(KERN_WARNING "dev_remove_pack: %p not found.\n", pt); |
435 | out: | 434 | out: |
436 | spin_unlock_bh(&ptype_lock); | 435 | spin_unlock(&ptype_lock); |
437 | } | 436 | } |
438 | EXPORT_SYMBOL(__dev_remove_pack); | 437 | EXPORT_SYMBOL(__dev_remove_pack); |
439 | 438 | ||
@@ -1902,14 +1901,14 @@ static int dev_gso_segment(struct sk_buff *skb) | |||
1902 | 1901 | ||
1903 | /* | 1902 | /* |
1904 | * Try to orphan skb early, right before transmission by the device. | 1903 | * Try to orphan skb early, right before transmission by the device. |
1905 | * We cannot orphan skb if tx timestamp is requested, since | 1904 | * We cannot orphan skb if tx timestamp is requested or the sk-reference |
1906 | * drivers need to call skb_tstamp_tx() to send the timestamp. | 1905 | * is needed on driver level for other reasons, e.g. see net/can/raw.c |
1907 | */ | 1906 | */ |
1908 | static inline void skb_orphan_try(struct sk_buff *skb) | 1907 | static inline void skb_orphan_try(struct sk_buff *skb) |
1909 | { | 1908 | { |
1910 | struct sock *sk = skb->sk; | 1909 | struct sock *sk = skb->sk; |
1911 | 1910 | ||
1912 | if (sk && !skb_tx(skb)->flags) { | 1911 | if (sk && !skb_shinfo(skb)->tx_flags) { |
1913 | /* skb_tx_hash() wont be able to get sk. | 1912 | /* skb_tx_hash() wont be able to get sk. |
1914 | * We copy sk_hash into skb->rxhash | 1913 | * We copy sk_hash into skb->rxhash |
1915 | */ | 1914 | */ |
@@ -1930,7 +1929,7 @@ static inline int skb_needs_linearize(struct sk_buff *skb, | |||
1930 | struct net_device *dev) | 1929 | struct net_device *dev) |
1931 | { | 1930 | { |
1932 | return skb_is_nonlinear(skb) && | 1931 | return skb_is_nonlinear(skb) && |
1933 | ((skb_has_frags(skb) && !(dev->features & NETIF_F_FRAGLIST)) || | 1932 | ((skb_has_frag_list(skb) && !(dev->features & NETIF_F_FRAGLIST)) || |
1934 | (skb_shinfo(skb)->nr_frags && (!(dev->features & NETIF_F_SG) || | 1933 | (skb_shinfo(skb)->nr_frags && (!(dev->features & NETIF_F_SG) || |
1935 | illegal_highdma(dev, skb)))); | 1934 | illegal_highdma(dev, skb)))); |
1936 | } | 1935 | } |
@@ -2259,69 +2258,44 @@ static inline void ____napi_schedule(struct softnet_data *sd, | |||
2259 | __raise_softirq_irqoff(NET_RX_SOFTIRQ); | 2258 | __raise_softirq_irqoff(NET_RX_SOFTIRQ); |
2260 | } | 2259 | } |
2261 | 2260 | ||
2262 | #ifdef CONFIG_RPS | ||
2263 | |||
2264 | /* One global table that all flow-based protocols share. */ | ||
2265 | struct rps_sock_flow_table *rps_sock_flow_table __read_mostly; | ||
2266 | EXPORT_SYMBOL(rps_sock_flow_table); | ||
2267 | |||
2268 | /* | 2261 | /* |
2269 | * get_rps_cpu is called from netif_receive_skb and returns the target | 2262 | * __skb_get_rxhash: calculate a flow hash based on src/dst addresses |
2270 | * CPU from the RPS map of the receiving queue for a given skb. | 2263 | * and src/dst port numbers. Returns a non-zero hash number on success |
2271 | * rcu_read_lock must be held on entry. | 2264 | * and 0 on failure. |
2272 | */ | 2265 | */ |
2273 | static int get_rps_cpu(struct net_device *dev, struct sk_buff *skb, | 2266 | __u32 __skb_get_rxhash(struct sk_buff *skb) |
2274 | struct rps_dev_flow **rflowp) | ||
2275 | { | 2267 | { |
2268 | int nhoff, hash = 0, poff; | ||
2276 | struct ipv6hdr *ip6; | 2269 | struct ipv6hdr *ip6; |
2277 | struct iphdr *ip; | 2270 | struct iphdr *ip; |
2278 | struct netdev_rx_queue *rxqueue; | ||
2279 | struct rps_map *map; | ||
2280 | struct rps_dev_flow_table *flow_table; | ||
2281 | struct rps_sock_flow_table *sock_flow_table; | ||
2282 | int cpu = -1; | ||
2283 | u8 ip_proto; | 2271 | u8 ip_proto; |
2284 | u16 tcpu; | ||
2285 | u32 addr1, addr2, ihl; | 2272 | u32 addr1, addr2, ihl; |
2286 | union { | 2273 | union { |
2287 | u32 v32; | 2274 | u32 v32; |
2288 | u16 v16[2]; | 2275 | u16 v16[2]; |
2289 | } ports; | 2276 | } ports; |
2290 | 2277 | ||
2291 | if (skb_rx_queue_recorded(skb)) { | 2278 | nhoff = skb_network_offset(skb); |
2292 | u16 index = skb_get_rx_queue(skb); | ||
2293 | if (unlikely(index >= dev->num_rx_queues)) { | ||
2294 | WARN_ONCE(dev->num_rx_queues > 1, "%s received packet " | ||
2295 | "on queue %u, but number of RX queues is %u\n", | ||
2296 | dev->name, index, dev->num_rx_queues); | ||
2297 | goto done; | ||
2298 | } | ||
2299 | rxqueue = dev->_rx + index; | ||
2300 | } else | ||
2301 | rxqueue = dev->_rx; | ||
2302 | |||
2303 | if (!rxqueue->rps_map && !rxqueue->rps_flow_table) | ||
2304 | goto done; | ||
2305 | |||
2306 | if (skb->rxhash) | ||
2307 | goto got_hash; /* Skip hash computation on packet header */ | ||
2308 | 2279 | ||
2309 | switch (skb->protocol) { | 2280 | switch (skb->protocol) { |
2310 | case __constant_htons(ETH_P_IP): | 2281 | case __constant_htons(ETH_P_IP): |
2311 | if (!pskb_may_pull(skb, sizeof(*ip))) | 2282 | if (!pskb_may_pull(skb, sizeof(*ip) + nhoff)) |
2312 | goto done; | 2283 | goto done; |
2313 | 2284 | ||
2314 | ip = (struct iphdr *) skb->data; | 2285 | ip = (struct iphdr *) (skb->data + nhoff); |
2315 | ip_proto = ip->protocol; | 2286 | if (ip->frag_off & htons(IP_MF | IP_OFFSET)) |
2287 | ip_proto = 0; | ||
2288 | else | ||
2289 | ip_proto = ip->protocol; | ||
2316 | addr1 = (__force u32) ip->saddr; | 2290 | addr1 = (__force u32) ip->saddr; |
2317 | addr2 = (__force u32) ip->daddr; | 2291 | addr2 = (__force u32) ip->daddr; |
2318 | ihl = ip->ihl; | 2292 | ihl = ip->ihl; |
2319 | break; | 2293 | break; |
2320 | case __constant_htons(ETH_P_IPV6): | 2294 | case __constant_htons(ETH_P_IPV6): |
2321 | if (!pskb_may_pull(skb, sizeof(*ip6))) | 2295 | if (!pskb_may_pull(skb, sizeof(*ip6) + nhoff)) |
2322 | goto done; | 2296 | goto done; |
2323 | 2297 | ||
2324 | ip6 = (struct ipv6hdr *) skb->data; | 2298 | ip6 = (struct ipv6hdr *) (skb->data + nhoff); |
2325 | ip_proto = ip6->nexthdr; | 2299 | ip_proto = ip6->nexthdr; |
2326 | addr1 = (__force u32) ip6->saddr.s6_addr32[3]; | 2300 | addr1 = (__force u32) ip6->saddr.s6_addr32[3]; |
2327 | addr2 = (__force u32) ip6->daddr.s6_addr32[3]; | 2301 | addr2 = (__force u32) ip6->daddr.s6_addr32[3]; |
@@ -2330,33 +2304,80 @@ static int get_rps_cpu(struct net_device *dev, struct sk_buff *skb, | |||
2330 | default: | 2304 | default: |
2331 | goto done; | 2305 | goto done; |
2332 | } | 2306 | } |
2333 | switch (ip_proto) { | 2307 | |
2334 | case IPPROTO_TCP: | 2308 | ports.v32 = 0; |
2335 | case IPPROTO_UDP: | 2309 | poff = proto_ports_offset(ip_proto); |
2336 | case IPPROTO_DCCP: | 2310 | if (poff >= 0) { |
2337 | case IPPROTO_ESP: | 2311 | nhoff += ihl * 4 + poff; |
2338 | case IPPROTO_AH: | 2312 | if (pskb_may_pull(skb, nhoff + 4)) { |
2339 | case IPPROTO_SCTP: | 2313 | ports.v32 = * (__force u32 *) (skb->data + nhoff); |
2340 | case IPPROTO_UDPLITE: | ||
2341 | if (pskb_may_pull(skb, (ihl * 4) + 4)) { | ||
2342 | ports.v32 = * (__force u32 *) (skb->data + (ihl * 4)); | ||
2343 | if (ports.v16[1] < ports.v16[0]) | 2314 | if (ports.v16[1] < ports.v16[0]) |
2344 | swap(ports.v16[0], ports.v16[1]); | 2315 | swap(ports.v16[0], ports.v16[1]); |
2345 | break; | ||
2346 | } | 2316 | } |
2347 | default: | ||
2348 | ports.v32 = 0; | ||
2349 | break; | ||
2350 | } | 2317 | } |
2351 | 2318 | ||
2352 | /* get a consistent hash (same value on both flow directions) */ | 2319 | /* get a consistent hash (same value on both flow directions) */ |
2353 | if (addr2 < addr1) | 2320 | if (addr2 < addr1) |
2354 | swap(addr1, addr2); | 2321 | swap(addr1, addr2); |
2355 | skb->rxhash = jhash_3words(addr1, addr2, ports.v32, hashrnd); | ||
2356 | if (!skb->rxhash) | ||
2357 | skb->rxhash = 1; | ||
2358 | 2322 | ||
2359 | got_hash: | 2323 | hash = jhash_3words(addr1, addr2, ports.v32, hashrnd); |
2324 | if (!hash) | ||
2325 | hash = 1; | ||
2326 | |||
2327 | done: | ||
2328 | return hash; | ||
2329 | } | ||
2330 | EXPORT_SYMBOL(__skb_get_rxhash); | ||
2331 | |||
2332 | #ifdef CONFIG_RPS | ||
2333 | |||
2334 | /* One global table that all flow-based protocols share. */ | ||
2335 | struct rps_sock_flow_table *rps_sock_flow_table __read_mostly; | ||
2336 | EXPORT_SYMBOL(rps_sock_flow_table); | ||
2337 | |||
2338 | /* | ||
2339 | * get_rps_cpu is called from netif_receive_skb and returns the target | ||
2340 | * CPU from the RPS map of the receiving queue for a given skb. | ||
2341 | * rcu_read_lock must be held on entry. | ||
2342 | */ | ||
2343 | static int get_rps_cpu(struct net_device *dev, struct sk_buff *skb, | ||
2344 | struct rps_dev_flow **rflowp) | ||
2345 | { | ||
2346 | struct netdev_rx_queue *rxqueue; | ||
2347 | struct rps_map *map = NULL; | ||
2348 | struct rps_dev_flow_table *flow_table; | ||
2349 | struct rps_sock_flow_table *sock_flow_table; | ||
2350 | int cpu = -1; | ||
2351 | u16 tcpu; | ||
2352 | |||
2353 | if (skb_rx_queue_recorded(skb)) { | ||
2354 | u16 index = skb_get_rx_queue(skb); | ||
2355 | if (unlikely(index >= dev->num_rx_queues)) { | ||
2356 | WARN_ONCE(dev->num_rx_queues > 1, "%s received packet " | ||
2357 | "on queue %u, but number of RX queues is %u\n", | ||
2358 | dev->name, index, dev->num_rx_queues); | ||
2359 | goto done; | ||
2360 | } | ||
2361 | rxqueue = dev->_rx + index; | ||
2362 | } else | ||
2363 | rxqueue = dev->_rx; | ||
2364 | |||
2365 | if (rxqueue->rps_map) { | ||
2366 | map = rcu_dereference(rxqueue->rps_map); | ||
2367 | if (map && map->len == 1) { | ||
2368 | tcpu = map->cpus[0]; | ||
2369 | if (cpu_online(tcpu)) | ||
2370 | cpu = tcpu; | ||
2371 | goto done; | ||
2372 | } | ||
2373 | } else if (!rxqueue->rps_flow_table) { | ||
2374 | goto done; | ||
2375 | } | ||
2376 | |||
2377 | skb_reset_network_header(skb); | ||
2378 | if (!skb_get_rxhash(skb)) | ||
2379 | goto done; | ||
2380 | |||
2360 | flow_table = rcu_dereference(rxqueue->rps_flow_table); | 2381 | flow_table = rcu_dereference(rxqueue->rps_flow_table); |
2361 | sock_flow_table = rcu_dereference(rps_sock_flow_table); | 2382 | sock_flow_table = rcu_dereference(rps_sock_flow_table); |
2362 | if (flow_table && sock_flow_table) { | 2383 | if (flow_table && sock_flow_table) { |
@@ -2396,7 +2417,6 @@ got_hash: | |||
2396 | } | 2417 | } |
2397 | } | 2418 | } |
2398 | 2419 | ||
2399 | map = rcu_dereference(rxqueue->rps_map); | ||
2400 | if (map) { | 2420 | if (map) { |
2401 | tcpu = map->cpus[((u64) skb->rxhash * map->len) >> 32]; | 2421 | tcpu = map->cpus[((u64) skb->rxhash * map->len) >> 32]; |
2402 | 2422 | ||
@@ -2828,8 +2848,8 @@ static int __netif_receive_skb(struct sk_buff *skb) | |||
2828 | if (!netdev_tstamp_prequeue) | 2848 | if (!netdev_tstamp_prequeue) |
2829 | net_timestamp_check(skb); | 2849 | net_timestamp_check(skb); |
2830 | 2850 | ||
2831 | if (vlan_tx_tag_present(skb) && vlan_hwaccel_do_receive(skb)) | 2851 | if (vlan_tx_tag_present(skb)) |
2832 | return NET_RX_SUCCESS; | 2852 | vlan_hwaccel_do_receive(skb); |
2833 | 2853 | ||
2834 | /* if we've gotten here through NAPI, check netpoll */ | 2854 | /* if we've gotten here through NAPI, check netpoll */ |
2835 | if (netpoll_receive_skb(skb)) | 2855 | if (netpoll_receive_skb(skb)) |
@@ -3050,7 +3070,7 @@ out: | |||
3050 | return netif_receive_skb(skb); | 3070 | return netif_receive_skb(skb); |
3051 | } | 3071 | } |
3052 | 3072 | ||
3053 | static void napi_gro_flush(struct napi_struct *napi) | 3073 | inline void napi_gro_flush(struct napi_struct *napi) |
3054 | { | 3074 | { |
3055 | struct sk_buff *skb, *next; | 3075 | struct sk_buff *skb, *next; |
3056 | 3076 | ||
@@ -3063,6 +3083,7 @@ static void napi_gro_flush(struct napi_struct *napi) | |||
3063 | napi->gro_count = 0; | 3083 | napi->gro_count = 0; |
3064 | napi->gro_list = NULL; | 3084 | napi->gro_list = NULL; |
3065 | } | 3085 | } |
3086 | EXPORT_SYMBOL(napi_gro_flush); | ||
3066 | 3087 | ||
3067 | enum gro_result dev_gro_receive(struct napi_struct *napi, struct sk_buff *skb) | 3088 | enum gro_result dev_gro_receive(struct napi_struct *napi, struct sk_buff *skb) |
3068 | { | 3089 | { |
@@ -3077,7 +3098,7 @@ enum gro_result dev_gro_receive(struct napi_struct *napi, struct sk_buff *skb) | |||
3077 | if (!(skb->dev->features & NETIF_F_GRO) || netpoll_rx_on(skb)) | 3098 | if (!(skb->dev->features & NETIF_F_GRO) || netpoll_rx_on(skb)) |
3078 | goto normal; | 3099 | goto normal; |
3079 | 3100 | ||
3080 | if (skb_is_gso(skb) || skb_has_frags(skb)) | 3101 | if (skb_is_gso(skb) || skb_has_frag_list(skb)) |
3081 | goto normal; | 3102 | goto normal; |
3082 | 3103 | ||
3083 | rcu_read_lock(); | 3104 | rcu_read_lock(); |
@@ -3156,16 +3177,18 @@ normal: | |||
3156 | } | 3177 | } |
3157 | EXPORT_SYMBOL(dev_gro_receive); | 3178 | EXPORT_SYMBOL(dev_gro_receive); |
3158 | 3179 | ||
3159 | static gro_result_t | 3180 | static inline gro_result_t |
3160 | __napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb) | 3181 | __napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb) |
3161 | { | 3182 | { |
3162 | struct sk_buff *p; | 3183 | struct sk_buff *p; |
3163 | 3184 | ||
3164 | for (p = napi->gro_list; p; p = p->next) { | 3185 | for (p = napi->gro_list; p; p = p->next) { |
3165 | NAPI_GRO_CB(p)->same_flow = | 3186 | unsigned long diffs; |
3166 | (p->dev == skb->dev) && | 3187 | |
3167 | !compare_ether_header(skb_mac_header(p), | 3188 | diffs = (unsigned long)p->dev ^ (unsigned long)skb->dev; |
3189 | diffs |= compare_ether_header(skb_mac_header(p), | ||
3168 | skb_gro_mac_header(skb)); | 3190 | skb_gro_mac_header(skb)); |
3191 | NAPI_GRO_CB(p)->same_flow = !diffs; | ||
3169 | NAPI_GRO_CB(p)->flush = 0; | 3192 | NAPI_GRO_CB(p)->flush = 0; |
3170 | } | 3193 | } |
3171 | 3194 | ||
@@ -4941,6 +4964,34 @@ void netif_stacked_transfer_operstate(const struct net_device *rootdev, | |||
4941 | } | 4964 | } |
4942 | EXPORT_SYMBOL(netif_stacked_transfer_operstate); | 4965 | EXPORT_SYMBOL(netif_stacked_transfer_operstate); |
4943 | 4966 | ||
4967 | static int netif_alloc_rx_queues(struct net_device *dev) | ||
4968 | { | ||
4969 | #ifdef CONFIG_RPS | ||
4970 | unsigned int i, count = dev->num_rx_queues; | ||
4971 | |||
4972 | if (count) { | ||
4973 | struct netdev_rx_queue *rx; | ||
4974 | |||
4975 | rx = kcalloc(count, sizeof(struct netdev_rx_queue), GFP_KERNEL); | ||
4976 | if (!rx) { | ||
4977 | pr_err("netdev: Unable to allocate %u rx queues.\n", | ||
4978 | count); | ||
4979 | return -ENOMEM; | ||
4980 | } | ||
4981 | dev->_rx = rx; | ||
4982 | atomic_set(&rx->count, count); | ||
4983 | |||
4984 | /* | ||
4985 | * Set a pointer to first element in the array which holds the | ||
4986 | * reference count. | ||
4987 | */ | ||
4988 | for (i = 0; i < count; i++) | ||
4989 | rx[i].first = rx; | ||
4990 | } | ||
4991 | #endif | ||
4992 | return 0; | ||
4993 | } | ||
4994 | |||
4944 | /** | 4995 | /** |
4945 | * register_netdevice - register a network device | 4996 | * register_netdevice - register a network device |
4946 | * @dev: device to register | 4997 | * @dev: device to register |
@@ -4978,24 +5029,10 @@ int register_netdevice(struct net_device *dev) | |||
4978 | 5029 | ||
4979 | dev->iflink = -1; | 5030 | dev->iflink = -1; |
4980 | 5031 | ||
4981 | #ifdef CONFIG_RPS | 5032 | ret = netif_alloc_rx_queues(dev); |
4982 | if (!dev->num_rx_queues) { | 5033 | if (ret) |
4983 | /* | 5034 | goto out; |
4984 | * Allocate a single RX queue if driver never called | ||
4985 | * alloc_netdev_mq | ||
4986 | */ | ||
4987 | |||
4988 | dev->_rx = kzalloc(sizeof(struct netdev_rx_queue), GFP_KERNEL); | ||
4989 | if (!dev->_rx) { | ||
4990 | ret = -ENOMEM; | ||
4991 | goto out; | ||
4992 | } | ||
4993 | 5035 | ||
4994 | dev->_rx->first = dev->_rx; | ||
4995 | atomic_set(&dev->_rx->count, 1); | ||
4996 | dev->num_rx_queues = 1; | ||
4997 | } | ||
4998 | #endif | ||
4999 | /* Init, if this function is available */ | 5036 | /* Init, if this function is available */ |
5000 | if (dev->netdev_ops->ndo_init) { | 5037 | if (dev->netdev_ops->ndo_init) { |
5001 | ret = dev->netdev_ops->ndo_init(dev); | 5038 | ret = dev->netdev_ops->ndo_init(dev); |
@@ -5035,6 +5072,12 @@ int register_netdevice(struct net_device *dev) | |||
5035 | if (dev->features & NETIF_F_SG) | 5072 | if (dev->features & NETIF_F_SG) |
5036 | dev->features |= NETIF_F_GSO; | 5073 | dev->features |= NETIF_F_GSO; |
5037 | 5074 | ||
5075 | /* Enable GRO and NETIF_F_HIGHDMA for vlans by default, | ||
5076 | * vlan_dev_init() will do the dev->features check, so these features | ||
5077 | * are enabled only if supported by underlying device. | ||
5078 | */ | ||
5079 | dev->vlan_features |= (NETIF_F_GRO | NETIF_F_HIGHDMA); | ||
5080 | |||
5038 | ret = call_netdevice_notifiers(NETDEV_POST_INIT, dev); | 5081 | ret = call_netdevice_notifiers(NETDEV_POST_INIT, dev); |
5039 | ret = notifier_to_errno(ret); | 5082 | ret = notifier_to_errno(ret); |
5040 | if (ret) | 5083 | if (ret) |
@@ -5264,7 +5307,7 @@ void netdev_run_todo(void) | |||
5264 | 5307 | ||
5265 | /* paranoia */ | 5308 | /* paranoia */ |
5266 | BUG_ON(atomic_read(&dev->refcnt)); | 5309 | BUG_ON(atomic_read(&dev->refcnt)); |
5267 | WARN_ON(dev->ip_ptr); | 5310 | WARN_ON(rcu_dereference_raw(dev->ip_ptr)); |
5268 | WARN_ON(dev->ip6_ptr); | 5311 | WARN_ON(dev->ip6_ptr); |
5269 | WARN_ON(dev->dn_ptr); | 5312 | WARN_ON(dev->dn_ptr); |
5270 | 5313 | ||
@@ -5386,10 +5429,6 @@ struct net_device *alloc_netdev_mq(int sizeof_priv, const char *name, | |||
5386 | struct net_device *dev; | 5429 | struct net_device *dev; |
5387 | size_t alloc_size; | 5430 | size_t alloc_size; |
5388 | struct net_device *p; | 5431 | struct net_device *p; |
5389 | #ifdef CONFIG_RPS | ||
5390 | struct netdev_rx_queue *rx; | ||
5391 | int i; | ||
5392 | #endif | ||
5393 | 5432 | ||
5394 | BUG_ON(strlen(name) >= sizeof(dev->name)); | 5433 | BUG_ON(strlen(name) >= sizeof(dev->name)); |
5395 | 5434 | ||
@@ -5415,29 +5454,12 @@ struct net_device *alloc_netdev_mq(int sizeof_priv, const char *name, | |||
5415 | goto free_p; | 5454 | goto free_p; |
5416 | } | 5455 | } |
5417 | 5456 | ||
5418 | #ifdef CONFIG_RPS | ||
5419 | rx = kcalloc(queue_count, sizeof(struct netdev_rx_queue), GFP_KERNEL); | ||
5420 | if (!rx) { | ||
5421 | printk(KERN_ERR "alloc_netdev: Unable to allocate " | ||
5422 | "rx queues.\n"); | ||
5423 | goto free_tx; | ||
5424 | } | ||
5425 | |||
5426 | atomic_set(&rx->count, queue_count); | ||
5427 | |||
5428 | /* | ||
5429 | * Set a pointer to first element in the array which holds the | ||
5430 | * reference count. | ||
5431 | */ | ||
5432 | for (i = 0; i < queue_count; i++) | ||
5433 | rx[i].first = rx; | ||
5434 | #endif | ||
5435 | 5457 | ||
5436 | dev = PTR_ALIGN(p, NETDEV_ALIGN); | 5458 | dev = PTR_ALIGN(p, NETDEV_ALIGN); |
5437 | dev->padded = (char *)dev - (char *)p; | 5459 | dev->padded = (char *)dev - (char *)p; |
5438 | 5460 | ||
5439 | if (dev_addr_init(dev)) | 5461 | if (dev_addr_init(dev)) |
5440 | goto free_rx; | 5462 | goto free_tx; |
5441 | 5463 | ||
5442 | dev_mc_init(dev); | 5464 | dev_mc_init(dev); |
5443 | dev_uc_init(dev); | 5465 | dev_uc_init(dev); |
@@ -5449,7 +5471,6 @@ struct net_device *alloc_netdev_mq(int sizeof_priv, const char *name, | |||
5449 | dev->real_num_tx_queues = queue_count; | 5471 | dev->real_num_tx_queues = queue_count; |
5450 | 5472 | ||
5451 | #ifdef CONFIG_RPS | 5473 | #ifdef CONFIG_RPS |
5452 | dev->_rx = rx; | ||
5453 | dev->num_rx_queues = queue_count; | 5474 | dev->num_rx_queues = queue_count; |
5454 | #endif | 5475 | #endif |
5455 | 5476 | ||
@@ -5467,11 +5488,7 @@ struct net_device *alloc_netdev_mq(int sizeof_priv, const char *name, | |||
5467 | strcpy(dev->name, name); | 5488 | strcpy(dev->name, name); |
5468 | return dev; | 5489 | return dev; |
5469 | 5490 | ||
5470 | free_rx: | ||
5471 | #ifdef CONFIG_RPS | ||
5472 | kfree(rx); | ||
5473 | free_tx: | 5491 | free_tx: |
5474 | #endif | ||
5475 | kfree(tx); | 5492 | kfree(tx); |
5476 | free_p: | 5493 | free_p: |
5477 | kfree(p); | 5494 | kfree(p); |
@@ -5658,6 +5675,10 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char | |||
5658 | 5675 | ||
5659 | /* Notify protocols, that we are about to destroy | 5676 | /* Notify protocols, that we are about to destroy |
5660 | this device. They should clean all the things. | 5677 | this device. They should clean all the things. |
5678 | |||
5679 | Note that dev->reg_state stays at NETREG_REGISTERED. | ||
5680 | This is wanted because this way 8021q and macvlan know | ||
5681 | the device is just moving and can keep their slaves up. | ||
5661 | */ | 5682 | */ |
5662 | call_netdevice_notifiers(NETDEV_UNREGISTER, dev); | 5683 | call_netdevice_notifiers(NETDEV_UNREGISTER, dev); |
5663 | call_netdevice_notifiers(NETDEV_UNREGISTER_BATCH, dev); | 5684 | call_netdevice_notifiers(NETDEV_UNREGISTER_BATCH, dev); |
diff --git a/net/core/ethtool.c b/net/core/ethtool.c index 7a85367b3c2f..7d7e572cedc7 100644 --- a/net/core/ethtool.c +++ b/net/core/ethtool.c | |||
@@ -19,6 +19,7 @@ | |||
19 | #include <linux/netdevice.h> | 19 | #include <linux/netdevice.h> |
20 | #include <linux/bitops.h> | 20 | #include <linux/bitops.h> |
21 | #include <linux/uaccess.h> | 21 | #include <linux/uaccess.h> |
22 | #include <linux/vmalloc.h> | ||
22 | #include <linux/slab.h> | 23 | #include <linux/slab.h> |
23 | 24 | ||
24 | /* | 25 | /* |
@@ -205,18 +206,24 @@ static noinline_for_stack int ethtool_get_drvinfo(struct net_device *dev, | |||
205 | struct ethtool_drvinfo info; | 206 | struct ethtool_drvinfo info; |
206 | const struct ethtool_ops *ops = dev->ethtool_ops; | 207 | const struct ethtool_ops *ops = dev->ethtool_ops; |
207 | 208 | ||
208 | if (!ops->get_drvinfo) | ||
209 | return -EOPNOTSUPP; | ||
210 | |||
211 | memset(&info, 0, sizeof(info)); | 209 | memset(&info, 0, sizeof(info)); |
212 | info.cmd = ETHTOOL_GDRVINFO; | 210 | info.cmd = ETHTOOL_GDRVINFO; |
213 | ops->get_drvinfo(dev, &info); | 211 | if (ops && ops->get_drvinfo) { |
212 | ops->get_drvinfo(dev, &info); | ||
213 | } else if (dev->dev.parent && dev->dev.parent->driver) { | ||
214 | strlcpy(info.bus_info, dev_name(dev->dev.parent), | ||
215 | sizeof(info.bus_info)); | ||
216 | strlcpy(info.driver, dev->dev.parent->driver->name, | ||
217 | sizeof(info.driver)); | ||
218 | } else { | ||
219 | return -EOPNOTSUPP; | ||
220 | } | ||
214 | 221 | ||
215 | /* | 222 | /* |
216 | * this method of obtaining string set info is deprecated; | 223 | * this method of obtaining string set info is deprecated; |
217 | * Use ETHTOOL_GSSET_INFO instead. | 224 | * Use ETHTOOL_GSSET_INFO instead. |
218 | */ | 225 | */ |
219 | if (ops->get_sset_count) { | 226 | if (ops && ops->get_sset_count) { |
220 | int rc; | 227 | int rc; |
221 | 228 | ||
222 | rc = ops->get_sset_count(dev, ETH_SS_TEST); | 229 | rc = ops->get_sset_count(dev, ETH_SS_TEST); |
@@ -229,9 +236,9 @@ static noinline_for_stack int ethtool_get_drvinfo(struct net_device *dev, | |||
229 | if (rc >= 0) | 236 | if (rc >= 0) |
230 | info.n_priv_flags = rc; | 237 | info.n_priv_flags = rc; |
231 | } | 238 | } |
232 | if (ops->get_regs_len) | 239 | if (ops && ops->get_regs_len) |
233 | info.regdump_len = ops->get_regs_len(dev); | 240 | info.regdump_len = ops->get_regs_len(dev); |
234 | if (ops->get_eeprom_len) | 241 | if (ops && ops->get_eeprom_len) |
235 | info.eedump_len = ops->get_eeprom_len(dev); | 242 | info.eedump_len = ops->get_eeprom_len(dev); |
236 | 243 | ||
237 | if (copy_to_user(useraddr, &info, sizeof(info))) | 244 | if (copy_to_user(useraddr, &info, sizeof(info))) |
@@ -479,6 +486,38 @@ static void __rx_ntuple_filter_add(struct ethtool_rx_ntuple_list *list, | |||
479 | list->count++; | 486 | list->count++; |
480 | } | 487 | } |
481 | 488 | ||
489 | /* | ||
490 | * ethtool does not (or did not) set masks for flow parameters that are | ||
491 | * not specified, so if both value and mask are 0 then this must be | ||
492 | * treated as equivalent to a mask with all bits set. Implement that | ||
493 | * here rather than in drivers. | ||
494 | */ | ||
495 | static void rx_ntuple_fix_masks(struct ethtool_rx_ntuple_flow_spec *fs) | ||
496 | { | ||
497 | struct ethtool_tcpip4_spec *entry = &fs->h_u.tcp_ip4_spec; | ||
498 | struct ethtool_tcpip4_spec *mask = &fs->m_u.tcp_ip4_spec; | ||
499 | |||
500 | if (fs->flow_type != TCP_V4_FLOW && | ||
501 | fs->flow_type != UDP_V4_FLOW && | ||
502 | fs->flow_type != SCTP_V4_FLOW) | ||
503 | return; | ||
504 | |||
505 | if (!(entry->ip4src | mask->ip4src)) | ||
506 | mask->ip4src = htonl(0xffffffff); | ||
507 | if (!(entry->ip4dst | mask->ip4dst)) | ||
508 | mask->ip4dst = htonl(0xffffffff); | ||
509 | if (!(entry->psrc | mask->psrc)) | ||
510 | mask->psrc = htons(0xffff); | ||
511 | if (!(entry->pdst | mask->pdst)) | ||
512 | mask->pdst = htons(0xffff); | ||
513 | if (!(entry->tos | mask->tos)) | ||
514 | mask->tos = 0xff; | ||
515 | if (!(fs->vlan_tag | fs->vlan_tag_mask)) | ||
516 | fs->vlan_tag_mask = 0xffff; | ||
517 | if (!(fs->data | fs->data_mask)) | ||
518 | fs->data_mask = 0xffffffffffffffffULL; | ||
519 | } | ||
520 | |||
482 | static noinline_for_stack int ethtool_set_rx_ntuple(struct net_device *dev, | 521 | static noinline_for_stack int ethtool_set_rx_ntuple(struct net_device *dev, |
483 | void __user *useraddr) | 522 | void __user *useraddr) |
484 | { | 523 | { |
@@ -493,6 +532,8 @@ static noinline_for_stack int ethtool_set_rx_ntuple(struct net_device *dev, | |||
493 | if (copy_from_user(&cmd, useraddr, sizeof(cmd))) | 532 | if (copy_from_user(&cmd, useraddr, sizeof(cmd))) |
494 | return -EFAULT; | 533 | return -EFAULT; |
495 | 534 | ||
535 | rx_ntuple_fix_masks(&cmd.fs); | ||
536 | |||
496 | /* | 537 | /* |
497 | * Cache filter in dev struct for GET operation only if | 538 | * Cache filter in dev struct for GET operation only if |
498 | * the underlying driver doesn't have its own GET operation, and | 539 | * the underlying driver doesn't have its own GET operation, and |
@@ -667,19 +708,19 @@ static int ethtool_get_rx_ntuple(struct net_device *dev, void __user *useraddr) | |||
667 | break; | 708 | break; |
668 | case IP_USER_FLOW: | 709 | case IP_USER_FLOW: |
669 | sprintf(p, "\tSrc IP addr: 0x%x\n", | 710 | sprintf(p, "\tSrc IP addr: 0x%x\n", |
670 | fsc->fs.h_u.raw_ip4_spec.ip4src); | 711 | fsc->fs.h_u.usr_ip4_spec.ip4src); |
671 | p += ETH_GSTRING_LEN; | 712 | p += ETH_GSTRING_LEN; |
672 | num_strings++; | 713 | num_strings++; |
673 | sprintf(p, "\tSrc IP mask: 0x%x\n", | 714 | sprintf(p, "\tSrc IP mask: 0x%x\n", |
674 | fsc->fs.m_u.raw_ip4_spec.ip4src); | 715 | fsc->fs.m_u.usr_ip4_spec.ip4src); |
675 | p += ETH_GSTRING_LEN; | 716 | p += ETH_GSTRING_LEN; |
676 | num_strings++; | 717 | num_strings++; |
677 | sprintf(p, "\tDest IP addr: 0x%x\n", | 718 | sprintf(p, "\tDest IP addr: 0x%x\n", |
678 | fsc->fs.h_u.raw_ip4_spec.ip4dst); | 719 | fsc->fs.h_u.usr_ip4_spec.ip4dst); |
679 | p += ETH_GSTRING_LEN; | 720 | p += ETH_GSTRING_LEN; |
680 | num_strings++; | 721 | num_strings++; |
681 | sprintf(p, "\tDest IP mask: 0x%x\n", | 722 | sprintf(p, "\tDest IP mask: 0x%x\n", |
682 | fsc->fs.m_u.raw_ip4_spec.ip4dst); | 723 | fsc->fs.m_u.usr_ip4_spec.ip4dst); |
683 | p += ETH_GSTRING_LEN; | 724 | p += ETH_GSTRING_LEN; |
684 | num_strings++; | 725 | num_strings++; |
685 | break; | 726 | break; |
@@ -775,7 +816,7 @@ static int ethtool_get_regs(struct net_device *dev, char __user *useraddr) | |||
775 | if (regs.len > reglen) | 816 | if (regs.len > reglen) |
776 | regs.len = reglen; | 817 | regs.len = reglen; |
777 | 818 | ||
778 | regbuf = kmalloc(reglen, GFP_USER); | 819 | regbuf = vmalloc(reglen); |
779 | if (!regbuf) | 820 | if (!regbuf) |
780 | return -ENOMEM; | 821 | return -ENOMEM; |
781 | 822 | ||
@@ -790,7 +831,7 @@ static int ethtool_get_regs(struct net_device *dev, char __user *useraddr) | |||
790 | ret = 0; | 831 | ret = 0; |
791 | 832 | ||
792 | out: | 833 | out: |
793 | kfree(regbuf); | 834 | vfree(regbuf); |
794 | return ret; | 835 | return ret; |
795 | } | 836 | } |
796 | 837 | ||
@@ -1175,8 +1216,11 @@ static int ethtool_set_gro(struct net_device *dev, char __user *useraddr) | |||
1175 | return -EFAULT; | 1216 | return -EFAULT; |
1176 | 1217 | ||
1177 | if (edata.data) { | 1218 | if (edata.data) { |
1178 | if (!dev->ethtool_ops->get_rx_csum || | 1219 | u32 rxcsum = dev->ethtool_ops->get_rx_csum ? |
1179 | !dev->ethtool_ops->get_rx_csum(dev)) | 1220 | dev->ethtool_ops->get_rx_csum(dev) : |
1221 | ethtool_op_get_rx_csum(dev); | ||
1222 | |||
1223 | if (!rxcsum) | ||
1180 | return -EINVAL; | 1224 | return -EINVAL; |
1181 | dev->features |= NETIF_F_GRO; | 1225 | dev->features |= NETIF_F_GRO; |
1182 | } else | 1226 | } else |
@@ -1402,14 +1446,22 @@ int dev_ethtool(struct net *net, struct ifreq *ifr) | |||
1402 | if (!dev || !netif_device_present(dev)) | 1446 | if (!dev || !netif_device_present(dev)) |
1403 | return -ENODEV; | 1447 | return -ENODEV; |
1404 | 1448 | ||
1405 | if (!dev->ethtool_ops) | ||
1406 | return -EOPNOTSUPP; | ||
1407 | |||
1408 | if (copy_from_user(ðcmd, useraddr, sizeof(ethcmd))) | 1449 | if (copy_from_user(ðcmd, useraddr, sizeof(ethcmd))) |
1409 | return -EFAULT; | 1450 | return -EFAULT; |
1410 | 1451 | ||
1452 | if (!dev->ethtool_ops) { | ||
1453 | /* ETHTOOL_GDRVINFO does not require any driver support. | ||
1454 | * It is also unprivileged and does not change anything, | ||
1455 | * so we can take a shortcut to it. */ | ||
1456 | if (ethcmd == ETHTOOL_GDRVINFO) | ||
1457 | return ethtool_get_drvinfo(dev, useraddr); | ||
1458 | else | ||
1459 | return -EOPNOTSUPP; | ||
1460 | } | ||
1461 | |||
1411 | /* Allow some commands to be done by anyone */ | 1462 | /* Allow some commands to be done by anyone */ |
1412 | switch (ethcmd) { | 1463 | switch (ethcmd) { |
1464 | case ETHTOOL_GSET: | ||
1413 | case ETHTOOL_GDRVINFO: | 1465 | case ETHTOOL_GDRVINFO: |
1414 | case ETHTOOL_GMSGLVL: | 1466 | case ETHTOOL_GMSGLVL: |
1415 | case ETHTOOL_GCOALESCE: | 1467 | case ETHTOOL_GCOALESCE: |
diff --git a/net/core/flow.c b/net/core/flow.c index f67dcbfe54ef..127c8a7ffd61 100644 --- a/net/core/flow.c +++ b/net/core/flow.c | |||
@@ -53,8 +53,7 @@ struct flow_flush_info { | |||
53 | 53 | ||
54 | struct flow_cache { | 54 | struct flow_cache { |
55 | u32 hash_shift; | 55 | u32 hash_shift; |
56 | unsigned long order; | 56 | struct flow_cache_percpu __percpu *percpu; |
57 | struct flow_cache_percpu *percpu; | ||
58 | struct notifier_block hotcpu_notifier; | 57 | struct notifier_block hotcpu_notifier; |
59 | int low_watermark; | 58 | int low_watermark; |
60 | int high_watermark; | 59 | int high_watermark; |
@@ -64,7 +63,7 @@ struct flow_cache { | |||
64 | atomic_t flow_cache_genid = ATOMIC_INIT(0); | 63 | atomic_t flow_cache_genid = ATOMIC_INIT(0); |
65 | EXPORT_SYMBOL(flow_cache_genid); | 64 | EXPORT_SYMBOL(flow_cache_genid); |
66 | static struct flow_cache flow_cache_global; | 65 | static struct flow_cache flow_cache_global; |
67 | static struct kmem_cache *flow_cachep; | 66 | static struct kmem_cache *flow_cachep __read_mostly; |
68 | 67 | ||
69 | static DEFINE_SPINLOCK(flow_cache_gc_lock); | 68 | static DEFINE_SPINLOCK(flow_cache_gc_lock); |
70 | static LIST_HEAD(flow_cache_gc_list); | 69 | static LIST_HEAD(flow_cache_gc_list); |
@@ -177,15 +176,11 @@ static u32 flow_hash_code(struct flow_cache *fc, | |||
177 | { | 176 | { |
178 | u32 *k = (u32 *) key; | 177 | u32 *k = (u32 *) key; |
179 | 178 | ||
180 | return (jhash2(k, (sizeof(*key) / sizeof(u32)), fcp->hash_rnd) | 179 | return jhash2(k, (sizeof(*key) / sizeof(u32)), fcp->hash_rnd) |
181 | & (flow_cache_hash_size(fc) - 1)); | 180 | & (flow_cache_hash_size(fc) - 1); |
182 | } | 181 | } |
183 | 182 | ||
184 | #if (BITS_PER_LONG == 64) | 183 | typedef unsigned long flow_compare_t; |
185 | typedef u64 flow_compare_t; | ||
186 | #else | ||
187 | typedef u32 flow_compare_t; | ||
188 | #endif | ||
189 | 184 | ||
190 | /* I hear what you're saying, use memcmp. But memcmp cannot make | 185 | /* I hear what you're saying, use memcmp. But memcmp cannot make |
191 | * important assumptions that we can here, such as alignment and | 186 | * important assumptions that we can here, such as alignment and |
@@ -357,62 +352,73 @@ void flow_cache_flush(void) | |||
357 | put_online_cpus(); | 352 | put_online_cpus(); |
358 | } | 353 | } |
359 | 354 | ||
360 | static void __init flow_cache_cpu_prepare(struct flow_cache *fc, | 355 | static int __cpuinit flow_cache_cpu_prepare(struct flow_cache *fc, int cpu) |
361 | struct flow_cache_percpu *fcp) | ||
362 | { | 356 | { |
363 | fcp->hash_table = (struct hlist_head *) | 357 | struct flow_cache_percpu *fcp = per_cpu_ptr(fc->percpu, cpu); |
364 | __get_free_pages(GFP_KERNEL|__GFP_ZERO, fc->order); | 358 | size_t sz = sizeof(struct hlist_head) * flow_cache_hash_size(fc); |
365 | if (!fcp->hash_table) | ||
366 | panic("NET: failed to allocate flow cache order %lu\n", fc->order); | ||
367 | 359 | ||
368 | fcp->hash_rnd_recalc = 1; | 360 | if (!fcp->hash_table) { |
369 | fcp->hash_count = 0; | 361 | fcp->hash_table = kzalloc_node(sz, GFP_KERNEL, cpu_to_node(cpu)); |
370 | tasklet_init(&fcp->flush_tasklet, flow_cache_flush_tasklet, 0); | 362 | if (!fcp->hash_table) { |
363 | pr_err("NET: failed to allocate flow cache sz %zu\n", sz); | ||
364 | return -ENOMEM; | ||
365 | } | ||
366 | fcp->hash_rnd_recalc = 1; | ||
367 | fcp->hash_count = 0; | ||
368 | tasklet_init(&fcp->flush_tasklet, flow_cache_flush_tasklet, 0); | ||
369 | } | ||
370 | return 0; | ||
371 | } | 371 | } |
372 | 372 | ||
373 | static int flow_cache_cpu(struct notifier_block *nfb, | 373 | static int __cpuinit flow_cache_cpu(struct notifier_block *nfb, |
374 | unsigned long action, | 374 | unsigned long action, |
375 | void *hcpu) | 375 | void *hcpu) |
376 | { | 376 | { |
377 | struct flow_cache *fc = container_of(nfb, struct flow_cache, hotcpu_notifier); | 377 | struct flow_cache *fc = container_of(nfb, struct flow_cache, hotcpu_notifier); |
378 | int cpu = (unsigned long) hcpu; | 378 | int res, cpu = (unsigned long) hcpu; |
379 | struct flow_cache_percpu *fcp = per_cpu_ptr(fc->percpu, cpu); | 379 | struct flow_cache_percpu *fcp = per_cpu_ptr(fc->percpu, cpu); |
380 | 380 | ||
381 | if (action == CPU_DEAD || action == CPU_DEAD_FROZEN) | 381 | switch (action) { |
382 | case CPU_UP_PREPARE: | ||
383 | case CPU_UP_PREPARE_FROZEN: | ||
384 | res = flow_cache_cpu_prepare(fc, cpu); | ||
385 | if (res) | ||
386 | return notifier_from_errno(res); | ||
387 | break; | ||
388 | case CPU_DEAD: | ||
389 | case CPU_DEAD_FROZEN: | ||
382 | __flow_cache_shrink(fc, fcp, 0); | 390 | __flow_cache_shrink(fc, fcp, 0); |
391 | break; | ||
392 | } | ||
383 | return NOTIFY_OK; | 393 | return NOTIFY_OK; |
384 | } | 394 | } |
385 | 395 | ||
386 | static int flow_cache_init(struct flow_cache *fc) | 396 | static int __init flow_cache_init(struct flow_cache *fc) |
387 | { | 397 | { |
388 | unsigned long order; | ||
389 | int i; | 398 | int i; |
390 | 399 | ||
391 | fc->hash_shift = 10; | 400 | fc->hash_shift = 10; |
392 | fc->low_watermark = 2 * flow_cache_hash_size(fc); | 401 | fc->low_watermark = 2 * flow_cache_hash_size(fc); |
393 | fc->high_watermark = 4 * flow_cache_hash_size(fc); | 402 | fc->high_watermark = 4 * flow_cache_hash_size(fc); |
394 | 403 | ||
395 | for (order = 0; | ||
396 | (PAGE_SIZE << order) < | ||
397 | (sizeof(struct hlist_head)*flow_cache_hash_size(fc)); | ||
398 | order++) | ||
399 | /* NOTHING */; | ||
400 | fc->order = order; | ||
401 | fc->percpu = alloc_percpu(struct flow_cache_percpu); | 404 | fc->percpu = alloc_percpu(struct flow_cache_percpu); |
405 | if (!fc->percpu) | ||
406 | return -ENOMEM; | ||
402 | 407 | ||
403 | setup_timer(&fc->rnd_timer, flow_cache_new_hashrnd, | 408 | for_each_online_cpu(i) { |
404 | (unsigned long) fc); | 409 | if (flow_cache_cpu_prepare(fc, i)) |
405 | fc->rnd_timer.expires = jiffies + FLOW_HASH_RND_PERIOD; | 410 | return -ENOMEM; |
406 | add_timer(&fc->rnd_timer); | 411 | } |
407 | |||
408 | for_each_possible_cpu(i) | ||
409 | flow_cache_cpu_prepare(fc, per_cpu_ptr(fc->percpu, i)); | ||
410 | |||
411 | fc->hotcpu_notifier = (struct notifier_block){ | 412 | fc->hotcpu_notifier = (struct notifier_block){ |
412 | .notifier_call = flow_cache_cpu, | 413 | .notifier_call = flow_cache_cpu, |
413 | }; | 414 | }; |
414 | register_hotcpu_notifier(&fc->hotcpu_notifier); | 415 | register_hotcpu_notifier(&fc->hotcpu_notifier); |
415 | 416 | ||
417 | setup_timer(&fc->rnd_timer, flow_cache_new_hashrnd, | ||
418 | (unsigned long) fc); | ||
419 | fc->rnd_timer.expires = jiffies + FLOW_HASH_RND_PERIOD; | ||
420 | add_timer(&fc->rnd_timer); | ||
421 | |||
416 | return 0; | 422 | return 0; |
417 | } | 423 | } |
418 | 424 | ||
diff --git a/net/core/gen_estimator.c b/net/core/gen_estimator.c index 6743146e4d6b..7c2373321b74 100644 --- a/net/core/gen_estimator.c +++ b/net/core/gen_estimator.c | |||
@@ -274,9 +274,9 @@ void gen_kill_estimator(struct gnet_stats_basic_packed *bstats, | |||
274 | while ((e = gen_find_node(bstats, rate_est))) { | 274 | while ((e = gen_find_node(bstats, rate_est))) { |
275 | rb_erase(&e->node, &est_root); | 275 | rb_erase(&e->node, &est_root); |
276 | 276 | ||
277 | write_lock_bh(&est_lock); | 277 | write_lock(&est_lock); |
278 | e->bstats = NULL; | 278 | e->bstats = NULL; |
279 | write_unlock_bh(&est_lock); | 279 | write_unlock(&est_lock); |
280 | 280 | ||
281 | list_del_rcu(&e->list); | 281 | list_del_rcu(&e->list); |
282 | call_rcu(&e->e_rcu, __gen_kill_estimator); | 282 | call_rcu(&e->e_rcu, __gen_kill_estimator); |
diff --git a/net/core/iovec.c b/net/core/iovec.c index 1cd98df412df..f4657c2127b4 100644 --- a/net/core/iovec.c +++ b/net/core/iovec.c | |||
@@ -41,7 +41,9 @@ int verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr *address, | |||
41 | 41 | ||
42 | if (m->msg_namelen) { | 42 | if (m->msg_namelen) { |
43 | if (mode == VERIFY_READ) { | 43 | if (mode == VERIFY_READ) { |
44 | err = move_addr_to_kernel(m->msg_name, m->msg_namelen, | 44 | void __user *namep; |
45 | namep = (void __user __force *) m->msg_name; | ||
46 | err = move_addr_to_kernel(namep, m->msg_namelen, | ||
45 | address); | 47 | address); |
46 | if (err < 0) | 48 | if (err < 0) |
47 | return err; | 49 | return err; |
@@ -52,7 +54,7 @@ int verify_iovec(struct msghdr *m, struct iovec *iov, struct sockaddr *address, | |||
52 | } | 54 | } |
53 | 55 | ||
54 | size = m->msg_iovlen * sizeof(struct iovec); | 56 | size = m->msg_iovlen * sizeof(struct iovec); |
55 | if (copy_from_user(iov, m->msg_iov, size)) | 57 | if (copy_from_user(iov, (void __user __force *) m->msg_iov, size)) |
56 | return -EFAULT; | 58 | return -EFAULT; |
57 | 59 | ||
58 | m->msg_iov = iov; | 60 | m->msg_iov = iov; |
diff --git a/net/core/neighbour.c b/net/core/neighbour.c index a4e0a7482c2b..96b1a749abb4 100644 --- a/net/core/neighbour.c +++ b/net/core/neighbour.c | |||
@@ -122,7 +122,7 @@ static void neigh_cleanup_and_release(struct neighbour *neigh) | |||
122 | 122 | ||
123 | unsigned long neigh_rand_reach_time(unsigned long base) | 123 | unsigned long neigh_rand_reach_time(unsigned long base) |
124 | { | 124 | { |
125 | return (base ? (net_random() % base) + (base >> 1) : 0); | 125 | return base ? (net_random() % base) + (base >> 1) : 0; |
126 | } | 126 | } |
127 | EXPORT_SYMBOL(neigh_rand_reach_time); | 127 | EXPORT_SYMBOL(neigh_rand_reach_time); |
128 | 128 | ||
@@ -766,9 +766,9 @@ next_elt: | |||
766 | static __inline__ int neigh_max_probes(struct neighbour *n) | 766 | static __inline__ int neigh_max_probes(struct neighbour *n) |
767 | { | 767 | { |
768 | struct neigh_parms *p = n->parms; | 768 | struct neigh_parms *p = n->parms; |
769 | return (n->nud_state & NUD_PROBE ? | 769 | return (n->nud_state & NUD_PROBE) ? |
770 | p->ucast_probes : | 770 | p->ucast_probes : |
771 | p->ucast_probes + p->app_probes + p->mcast_probes); | 771 | p->ucast_probes + p->app_probes + p->mcast_probes; |
772 | } | 772 | } |
773 | 773 | ||
774 | static void neigh_invalidate(struct neighbour *neigh) | 774 | static void neigh_invalidate(struct neighbour *neigh) |
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c index af4dfbadf2a0..76485a3f910b 100644 --- a/net/core/net-sysfs.c +++ b/net/core/net-sysfs.c | |||
@@ -515,7 +515,7 @@ static ssize_t rx_queue_attr_store(struct kobject *kobj, struct attribute *attr, | |||
515 | return attribute->store(queue, attribute, buf, count); | 515 | return attribute->store(queue, attribute, buf, count); |
516 | } | 516 | } |
517 | 517 | ||
518 | static struct sysfs_ops rx_queue_sysfs_ops = { | 518 | static const struct sysfs_ops rx_queue_sysfs_ops = { |
519 | .show = rx_queue_attr_show, | 519 | .show = rx_queue_attr_show, |
520 | .store = rx_queue_attr_store, | 520 | .store = rx_queue_attr_store, |
521 | }; | 521 | }; |
@@ -789,12 +789,13 @@ static const void *net_netlink_ns(struct sock *sk) | |||
789 | return sock_net(sk); | 789 | return sock_net(sk); |
790 | } | 790 | } |
791 | 791 | ||
792 | static struct kobj_ns_type_operations net_ns_type_operations = { | 792 | struct kobj_ns_type_operations net_ns_type_operations = { |
793 | .type = KOBJ_NS_TYPE_NET, | 793 | .type = KOBJ_NS_TYPE_NET, |
794 | .current_ns = net_current_ns, | 794 | .current_ns = net_current_ns, |
795 | .netlink_ns = net_netlink_ns, | 795 | .netlink_ns = net_netlink_ns, |
796 | .initial_ns = net_initial_ns, | 796 | .initial_ns = net_initial_ns, |
797 | }; | 797 | }; |
798 | EXPORT_SYMBOL_GPL(net_ns_type_operations); | ||
798 | 799 | ||
799 | static void net_kobj_ns_exit(struct net *net) | 800 | static void net_kobj_ns_exit(struct net *net) |
800 | { | 801 | { |
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 10a1ea72010d..2c0df0f95b3d 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
@@ -729,16 +729,14 @@ static int hex32_arg(const char __user *user_buffer, unsigned long maxlen, | |||
729 | *num = 0; | 729 | *num = 0; |
730 | 730 | ||
731 | for (; i < maxlen; i++) { | 731 | for (; i < maxlen; i++) { |
732 | int value; | ||
732 | char c; | 733 | char c; |
733 | *num <<= 4; | 734 | *num <<= 4; |
734 | if (get_user(c, &user_buffer[i])) | 735 | if (get_user(c, &user_buffer[i])) |
735 | return -EFAULT; | 736 | return -EFAULT; |
736 | if ((c >= '0') && (c <= '9')) | 737 | value = hex_to_bin(c); |
737 | *num |= c - '0'; | 738 | if (value >= 0) |
738 | else if ((c >= 'a') && (c <= 'f')) | 739 | *num |= value; |
739 | *num |= c - 'a' + 10; | ||
740 | else if ((c >= 'A') && (c <= 'F')) | ||
741 | *num |= c - 'A' + 10; | ||
742 | else | 740 | else |
743 | break; | 741 | break; |
744 | } | 742 | } |
@@ -3907,8 +3905,6 @@ static void __exit pg_cleanup(void) | |||
3907 | { | 3905 | { |
3908 | struct pktgen_thread *t; | 3906 | struct pktgen_thread *t; |
3909 | struct list_head *q, *n; | 3907 | struct list_head *q, *n; |
3910 | wait_queue_head_t queue; | ||
3911 | init_waitqueue_head(&queue); | ||
3912 | 3908 | ||
3913 | /* Stop all interfaces & threads */ | 3909 | /* Stop all interfaces & threads */ |
3914 | 3910 | ||
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index f78d821bd935..b2a718dfd720 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -612,36 +612,7 @@ static void copy_rtnl_link_stats(struct rtnl_link_stats *a, | |||
612 | 612 | ||
613 | static void copy_rtnl_link_stats64(void *v, const struct rtnl_link_stats64 *b) | 613 | static void copy_rtnl_link_stats64(void *v, const struct rtnl_link_stats64 *b) |
614 | { | 614 | { |
615 | struct rtnl_link_stats64 a; | 615 | memcpy(v, b, sizeof(*b)); |
616 | |||
617 | a.rx_packets = b->rx_packets; | ||
618 | a.tx_packets = b->tx_packets; | ||
619 | a.rx_bytes = b->rx_bytes; | ||
620 | a.tx_bytes = b->tx_bytes; | ||
621 | a.rx_errors = b->rx_errors; | ||
622 | a.tx_errors = b->tx_errors; | ||
623 | a.rx_dropped = b->rx_dropped; | ||
624 | a.tx_dropped = b->tx_dropped; | ||
625 | |||
626 | a.multicast = b->multicast; | ||
627 | a.collisions = b->collisions; | ||
628 | |||
629 | a.rx_length_errors = b->rx_length_errors; | ||
630 | a.rx_over_errors = b->rx_over_errors; | ||
631 | a.rx_crc_errors = b->rx_crc_errors; | ||
632 | a.rx_frame_errors = b->rx_frame_errors; | ||
633 | a.rx_fifo_errors = b->rx_fifo_errors; | ||
634 | a.rx_missed_errors = b->rx_missed_errors; | ||
635 | |||
636 | a.tx_aborted_errors = b->tx_aborted_errors; | ||
637 | a.tx_carrier_errors = b->tx_carrier_errors; | ||
638 | a.tx_fifo_errors = b->tx_fifo_errors; | ||
639 | a.tx_heartbeat_errors = b->tx_heartbeat_errors; | ||
640 | a.tx_window_errors = b->tx_window_errors; | ||
641 | |||
642 | a.rx_compressed = b->rx_compressed; | ||
643 | a.tx_compressed = b->tx_compressed; | ||
644 | memcpy(v, &a, sizeof(a)); | ||
645 | } | 616 | } |
646 | 617 | ||
647 | /* All VF info */ | 618 | /* All VF info */ |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index c83b421341c0..752c1972b3a7 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -202,8 +202,6 @@ struct sk_buff *__alloc_skb(unsigned int size, gfp_t gfp_mask, | |||
202 | skb->data = data; | 202 | skb->data = data; |
203 | skb_reset_tail_pointer(skb); | 203 | skb_reset_tail_pointer(skb); |
204 | skb->end = skb->tail + size; | 204 | skb->end = skb->tail + size; |
205 | kmemcheck_annotate_bitfield(skb, flags1); | ||
206 | kmemcheck_annotate_bitfield(skb, flags2); | ||
207 | #ifdef NET_SKBUFF_DATA_USES_OFFSET | 205 | #ifdef NET_SKBUFF_DATA_USES_OFFSET |
208 | skb->mac_header = ~0U; | 206 | skb->mac_header = ~0U; |
209 | #endif | 207 | #endif |
@@ -340,7 +338,7 @@ static void skb_release_data(struct sk_buff *skb) | |||
340 | put_page(skb_shinfo(skb)->frags[i].page); | 338 | put_page(skb_shinfo(skb)->frags[i].page); |
341 | } | 339 | } |
342 | 340 | ||
343 | if (skb_has_frags(skb)) | 341 | if (skb_has_frag_list(skb)) |
344 | skb_drop_fraglist(skb); | 342 | skb_drop_fraglist(skb); |
345 | 343 | ||
346 | kfree(skb->head); | 344 | kfree(skb->head); |
@@ -685,16 +683,10 @@ static void copy_skb_header(struct sk_buff *new, const struct sk_buff *old) | |||
685 | 683 | ||
686 | struct sk_buff *skb_copy(const struct sk_buff *skb, gfp_t gfp_mask) | 684 | struct sk_buff *skb_copy(const struct sk_buff *skb, gfp_t gfp_mask) |
687 | { | 685 | { |
688 | int headerlen = skb->data - skb->head; | 686 | int headerlen = skb_headroom(skb); |
689 | /* | 687 | unsigned int size = (skb_end_pointer(skb) - skb->head) + skb->data_len; |
690 | * Allocate the copy buffer | 688 | struct sk_buff *n = alloc_skb(size, gfp_mask); |
691 | */ | 689 | |
692 | struct sk_buff *n; | ||
693 | #ifdef NET_SKBUFF_DATA_USES_OFFSET | ||
694 | n = alloc_skb(skb->end + skb->data_len, gfp_mask); | ||
695 | #else | ||
696 | n = alloc_skb(skb->end - skb->head + skb->data_len, gfp_mask); | ||
697 | #endif | ||
698 | if (!n) | 690 | if (!n) |
699 | return NULL; | 691 | return NULL; |
700 | 692 | ||
@@ -726,20 +718,14 @@ EXPORT_SYMBOL(skb_copy); | |||
726 | 718 | ||
727 | struct sk_buff *pskb_copy(struct sk_buff *skb, gfp_t gfp_mask) | 719 | struct sk_buff *pskb_copy(struct sk_buff *skb, gfp_t gfp_mask) |
728 | { | 720 | { |
729 | /* | 721 | unsigned int size = skb_end_pointer(skb) - skb->head; |
730 | * Allocate the copy buffer | 722 | struct sk_buff *n = alloc_skb(size, gfp_mask); |
731 | */ | 723 | |
732 | struct sk_buff *n; | ||
733 | #ifdef NET_SKBUFF_DATA_USES_OFFSET | ||
734 | n = alloc_skb(skb->end, gfp_mask); | ||
735 | #else | ||
736 | n = alloc_skb(skb->end - skb->head, gfp_mask); | ||
737 | #endif | ||
738 | if (!n) | 724 | if (!n) |
739 | goto out; | 725 | goto out; |
740 | 726 | ||
741 | /* Set the data pointer */ | 727 | /* Set the data pointer */ |
742 | skb_reserve(n, skb->data - skb->head); | 728 | skb_reserve(n, skb_headroom(skb)); |
743 | /* Set the tail pointer and length */ | 729 | /* Set the tail pointer and length */ |
744 | skb_put(n, skb_headlen(skb)); | 730 | skb_put(n, skb_headlen(skb)); |
745 | /* Copy the bytes */ | 731 | /* Copy the bytes */ |
@@ -759,7 +745,7 @@ struct sk_buff *pskb_copy(struct sk_buff *skb, gfp_t gfp_mask) | |||
759 | skb_shinfo(n)->nr_frags = i; | 745 | skb_shinfo(n)->nr_frags = i; |
760 | } | 746 | } |
761 | 747 | ||
762 | if (skb_has_frags(skb)) { | 748 | if (skb_has_frag_list(skb)) { |
763 | skb_shinfo(n)->frag_list = skb_shinfo(skb)->frag_list; | 749 | skb_shinfo(n)->frag_list = skb_shinfo(skb)->frag_list; |
764 | skb_clone_fraglist(n); | 750 | skb_clone_fraglist(n); |
765 | } | 751 | } |
@@ -791,12 +777,9 @@ int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail, | |||
791 | { | 777 | { |
792 | int i; | 778 | int i; |
793 | u8 *data; | 779 | u8 *data; |
794 | #ifdef NET_SKBUFF_DATA_USES_OFFSET | 780 | int size = nhead + (skb_end_pointer(skb) - skb->head) + ntail; |
795 | int size = nhead + skb->end + ntail; | ||
796 | #else | ||
797 | int size = nhead + (skb->end - skb->head) + ntail; | ||
798 | #endif | ||
799 | long off; | 781 | long off; |
782 | bool fastpath; | ||
800 | 783 | ||
801 | BUG_ON(nhead < 0); | 784 | BUG_ON(nhead < 0); |
802 | 785 | ||
@@ -810,23 +793,36 @@ int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail, | |||
810 | goto nodata; | 793 | goto nodata; |
811 | 794 | ||
812 | /* Copy only real data... and, alas, header. This should be | 795 | /* Copy only real data... and, alas, header. This should be |
813 | * optimized for the cases when header is void. */ | 796 | * optimized for the cases when header is void. |
814 | #ifdef NET_SKBUFF_DATA_USES_OFFSET | 797 | */ |
815 | memcpy(data + nhead, skb->head, skb->tail); | 798 | memcpy(data + nhead, skb->head, skb_tail_pointer(skb) - skb->head); |
816 | #else | 799 | |
817 | memcpy(data + nhead, skb->head, skb->tail - skb->head); | 800 | memcpy((struct skb_shared_info *)(data + size), |
818 | #endif | 801 | skb_shinfo(skb), |
819 | memcpy(data + size, skb_end_pointer(skb), | ||
820 | offsetof(struct skb_shared_info, frags[skb_shinfo(skb)->nr_frags])); | 802 | offsetof(struct skb_shared_info, frags[skb_shinfo(skb)->nr_frags])); |
821 | 803 | ||
822 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) | 804 | /* Check if we can avoid taking references on fragments if we own |
823 | get_page(skb_shinfo(skb)->frags[i].page); | 805 | * the last reference on skb->head. (see skb_release_data()) |
806 | */ | ||
807 | if (!skb->cloned) | ||
808 | fastpath = true; | ||
809 | else { | ||
810 | int delta = skb->nohdr ? (1 << SKB_DATAREF_SHIFT) + 1 : 1; | ||
824 | 811 | ||
825 | if (skb_has_frags(skb)) | 812 | fastpath = atomic_read(&skb_shinfo(skb)->dataref) == delta; |
826 | skb_clone_fraglist(skb); | 813 | } |
827 | 814 | ||
828 | skb_release_data(skb); | 815 | if (fastpath) { |
816 | kfree(skb->head); | ||
817 | } else { | ||
818 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) | ||
819 | get_page(skb_shinfo(skb)->frags[i].page); | ||
829 | 820 | ||
821 | if (skb_has_frag_list(skb)) | ||
822 | skb_clone_fraglist(skb); | ||
823 | |||
824 | skb_release_data(skb); | ||
825 | } | ||
830 | off = (data + nhead) - skb->head; | 826 | off = (data + nhead) - skb->head; |
831 | 827 | ||
832 | skb->head = data; | 828 | skb->head = data; |
@@ -1099,7 +1095,7 @@ drop_pages: | |||
1099 | for (; i < nfrags; i++) | 1095 | for (; i < nfrags; i++) |
1100 | put_page(skb_shinfo(skb)->frags[i].page); | 1096 | put_page(skb_shinfo(skb)->frags[i].page); |
1101 | 1097 | ||
1102 | if (skb_has_frags(skb)) | 1098 | if (skb_has_frag_list(skb)) |
1103 | skb_drop_fraglist(skb); | 1099 | skb_drop_fraglist(skb); |
1104 | goto done; | 1100 | goto done; |
1105 | } | 1101 | } |
@@ -1194,7 +1190,7 @@ unsigned char *__pskb_pull_tail(struct sk_buff *skb, int delta) | |||
1194 | /* Optimization: no fragments, no reasons to preestimate | 1190 | /* Optimization: no fragments, no reasons to preestimate |
1195 | * size of pulled pages. Superb. | 1191 | * size of pulled pages. Superb. |
1196 | */ | 1192 | */ |
1197 | if (!skb_has_frags(skb)) | 1193 | if (!skb_has_frag_list(skb)) |
1198 | goto pull_pages; | 1194 | goto pull_pages; |
1199 | 1195 | ||
1200 | /* Estimate size of pulled pages. */ | 1196 | /* Estimate size of pulled pages. */ |
@@ -2323,7 +2319,7 @@ next_skb: | |||
2323 | st->frag_data = NULL; | 2319 | st->frag_data = NULL; |
2324 | } | 2320 | } |
2325 | 2321 | ||
2326 | if (st->root_skb == st->cur_skb && skb_has_frags(st->root_skb)) { | 2322 | if (st->root_skb == st->cur_skb && skb_has_frag_list(st->root_skb)) { |
2327 | st->cur_skb = skb_shinfo(st->root_skb)->frag_list; | 2323 | st->cur_skb = skb_shinfo(st->root_skb)->frag_list; |
2328 | st->frag_idx = 0; | 2324 | st->frag_idx = 0; |
2329 | goto next_skb; | 2325 | goto next_skb; |
@@ -2893,7 +2889,7 @@ int skb_cow_data(struct sk_buff *skb, int tailbits, struct sk_buff **trailer) | |||
2893 | return -ENOMEM; | 2889 | return -ENOMEM; |
2894 | 2890 | ||
2895 | /* Easy case. Most of packets will go this way. */ | 2891 | /* Easy case. Most of packets will go this way. */ |
2896 | if (!skb_has_frags(skb)) { | 2892 | if (!skb_has_frag_list(skb)) { |
2897 | /* A little of trouble, not enough of space for trailer. | 2893 | /* A little of trouble, not enough of space for trailer. |
2898 | * This should not happen, when stack is tuned to generate | 2894 | * This should not happen, when stack is tuned to generate |
2899 | * good frames. OK, on miss we reallocate and reserve even more | 2895 | * good frames. OK, on miss we reallocate and reserve even more |
@@ -2928,7 +2924,7 @@ int skb_cow_data(struct sk_buff *skb, int tailbits, struct sk_buff **trailer) | |||
2928 | 2924 | ||
2929 | if (skb1->next == NULL && tailbits) { | 2925 | if (skb1->next == NULL && tailbits) { |
2930 | if (skb_shinfo(skb1)->nr_frags || | 2926 | if (skb_shinfo(skb1)->nr_frags || |
2931 | skb_has_frags(skb1) || | 2927 | skb_has_frag_list(skb1) || |
2932 | skb_tailroom(skb1) < tailbits) | 2928 | skb_tailroom(skb1) < tailbits) |
2933 | ntail = tailbits + 128; | 2929 | ntail = tailbits + 128; |
2934 | } | 2930 | } |
@@ -2937,7 +2933,7 @@ int skb_cow_data(struct sk_buff *skb, int tailbits, struct sk_buff **trailer) | |||
2937 | skb_cloned(skb1) || | 2933 | skb_cloned(skb1) || |
2938 | ntail || | 2934 | ntail || |
2939 | skb_shinfo(skb1)->nr_frags || | 2935 | skb_shinfo(skb1)->nr_frags || |
2940 | skb_has_frags(skb1)) { | 2936 | skb_has_frag_list(skb1)) { |
2941 | struct sk_buff *skb2; | 2937 | struct sk_buff *skb2; |
2942 | 2938 | ||
2943 | /* Fuck, we are miserable poor guys... */ | 2939 | /* Fuck, we are miserable poor guys... */ |
@@ -3020,7 +3016,7 @@ void skb_tstamp_tx(struct sk_buff *orig_skb, | |||
3020 | } else { | 3016 | } else { |
3021 | /* | 3017 | /* |
3022 | * no hardware time stamps available, | 3018 | * no hardware time stamps available, |
3023 | * so keep the skb_shared_tx and only | 3019 | * so keep the shared tx_flags and only |
3024 | * store software time stamp | 3020 | * store software time stamp |
3025 | */ | 3021 | */ |
3026 | skb->tstamp = ktime_get_real(); | 3022 | skb->tstamp = ktime_get_real(); |
diff --git a/net/core/sock.c b/net/core/sock.c index ef30e9d286e7..42365deeba27 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -1557,6 +1557,8 @@ struct sk_buff *sock_alloc_send_skb(struct sock *sk, unsigned long size, | |||
1557 | EXPORT_SYMBOL(sock_alloc_send_skb); | 1557 | EXPORT_SYMBOL(sock_alloc_send_skb); |
1558 | 1558 | ||
1559 | static void __lock_sock(struct sock *sk) | 1559 | static void __lock_sock(struct sock *sk) |
1560 | __releases(&sk->sk_lock.slock) | ||
1561 | __acquires(&sk->sk_lock.slock) | ||
1560 | { | 1562 | { |
1561 | DEFINE_WAIT(wait); | 1563 | DEFINE_WAIT(wait); |
1562 | 1564 | ||
@@ -1573,6 +1575,8 @@ static void __lock_sock(struct sock *sk) | |||
1573 | } | 1575 | } |
1574 | 1576 | ||
1575 | static void __release_sock(struct sock *sk) | 1577 | static void __release_sock(struct sock *sk) |
1578 | __releases(&sk->sk_lock.slock) | ||
1579 | __acquires(&sk->sk_lock.slock) | ||
1576 | { | 1580 | { |
1577 | struct sk_buff *skb = sk->sk_backlog.head; | 1581 | struct sk_buff *skb = sk->sk_backlog.head; |
1578 | 1582 | ||
diff --git a/net/core/utils.c b/net/core/utils.c index f41854470539..5fea0ab21902 100644 --- a/net/core/utils.c +++ b/net/core/utils.c | |||
@@ -75,7 +75,7 @@ __be32 in_aton(const char *str) | |||
75 | str++; | 75 | str++; |
76 | } | 76 | } |
77 | } | 77 | } |
78 | return(htonl(l)); | 78 | return htonl(l); |
79 | } | 79 | } |
80 | EXPORT_SYMBOL(in_aton); | 80 | EXPORT_SYMBOL(in_aton); |
81 | 81 | ||
@@ -92,18 +92,19 @@ EXPORT_SYMBOL(in_aton); | |||
92 | 92 | ||
93 | static inline int xdigit2bin(char c, int delim) | 93 | static inline int xdigit2bin(char c, int delim) |
94 | { | 94 | { |
95 | int val; | ||
96 | |||
95 | if (c == delim || c == '\0') | 97 | if (c == delim || c == '\0') |
96 | return IN6PTON_DELIM; | 98 | return IN6PTON_DELIM; |
97 | if (c == ':') | 99 | if (c == ':') |
98 | return IN6PTON_COLON_MASK; | 100 | return IN6PTON_COLON_MASK; |
99 | if (c == '.') | 101 | if (c == '.') |
100 | return IN6PTON_DOT; | 102 | return IN6PTON_DOT; |
101 | if (c >= '0' && c <= '9') | 103 | |
102 | return (IN6PTON_XDIGIT | IN6PTON_DIGIT| (c - '0')); | 104 | val = hex_to_bin(c); |
103 | if (c >= 'a' && c <= 'f') | 105 | if (val >= 0) |
104 | return (IN6PTON_XDIGIT | (c - 'a' + 10)); | 106 | return val | IN6PTON_XDIGIT | (val < 10 ? IN6PTON_DIGIT : 0); |
105 | if (c >= 'A' && c <= 'F') | 107 | |
106 | return (IN6PTON_XDIGIT | (c - 'A' + 10)); | ||
107 | if (delim == -1) | 108 | if (delim == -1) |
108 | return IN6PTON_DELIM; | 109 | return IN6PTON_DELIM; |
109 | return IN6PTON_UNKNOWN; | 110 | return IN6PTON_UNKNOWN; |