diff options
author | David S. Miller <davem@davemloft.net> | 2011-12-23 17:13:56 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-12-23 17:13:56 -0500 |
commit | abb434cb0539fb355c1c921f8fd761efbbac3462 (patch) | |
tree | 24a7d99ec161f8fd4dc9ff03c9c4cc93be883ce6 /net | |
parent | 2494654d4890316e7340fb8b3458daad0474a1b9 (diff) | |
parent | 6350323ad8def2ac00d77cdee3b79c9b9fba75c4 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts:
net/bluetooth/l2cap_core.c
Just two overlapping changes, one added an initialization of
a local variable, and another change added a new local variable.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net')
-rw-r--r-- | net/bluetooth/hci_conn.c | 2 | ||||
-rw-r--r-- | net/bluetooth/l2cap_core.c | 12 | ||||
-rw-r--r-- | net/bluetooth/rfcomm/core.c | 1 | ||||
-rw-r--r-- | net/bridge/br_netfilter.c | 8 | ||||
-rw-r--r-- | net/ceph/crush/mapper.c | 35 | ||||
-rw-r--r-- | net/core/flow.c | 12 | ||||
-rw-r--r-- | net/core/net-sysfs.c | 7 | ||||
-rw-r--r-- | net/core/sock.c | 6 | ||||
-rw-r--r-- | net/ipv4/ipconfig.c | 4 | ||||
-rw-r--r-- | net/ipv4/route.c | 112 | ||||
-rw-r--r-- | net/ipv6/ip6_output.c | 2 | ||||
-rw-r--r-- | net/llc/af_llc.c | 14 | ||||
-rw-r--r-- | net/netfilter/xt_connbytes.c | 6 | ||||
-rw-r--r-- | net/packet/af_packet.c | 6 | ||||
-rw-r--r-- | net/sched/sch_mqprio.c | 2 | ||||
-rw-r--r-- | net/sctp/associola.c | 2 | ||||
-rw-r--r-- | net/sctp/output.c | 8 | ||||
-rw-r--r-- | net/sctp/outqueue.c | 6 | ||||
-rw-r--r-- | net/sctp/protocol.c | 3 | ||||
-rw-r--r-- | net/sctp/socket.c | 2 | ||||
-rw-r--r-- | net/sctp/sysctl.c | 13 | ||||
-rw-r--r-- | net/sunrpc/sched.c | 30 | ||||
-rw-r--r-- | net/sunrpc/xprt.c | 10 | ||||
-rw-r--r-- | net/xfrm/xfrm_policy.c | 18 |
24 files changed, 243 insertions, 78 deletions
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c index b328ac611ccd..3fa08dda825e 100644 --- a/net/bluetooth/hci_conn.c +++ b/net/bluetooth/hci_conn.c | |||
@@ -674,7 +674,7 @@ int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type) | |||
674 | goto encrypt; | 674 | goto encrypt; |
675 | 675 | ||
676 | auth: | 676 | auth: |
677 | if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend)) | 677 | if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend)) |
678 | return 0; | 678 | return 0; |
679 | 679 | ||
680 | if (!hci_conn_auth(conn, sec_level, auth_type)) | 680 | if (!hci_conn_auth(conn, sec_level, auth_type)) |
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index 26dc3f6a8346..9bc22e4c4c61 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c | |||
@@ -2372,7 +2372,7 @@ static int l2cap_parse_conf_rsp(struct l2cap_chan *chan, void *rsp, int len, voi | |||
2372 | void *ptr = req->data; | 2372 | void *ptr = req->data; |
2373 | int type, olen; | 2373 | int type, olen; |
2374 | unsigned long val; | 2374 | unsigned long val; |
2375 | struct l2cap_conf_rfc rfc; | 2375 | struct l2cap_conf_rfc rfc = { .mode = L2CAP_MODE_BASIC }; |
2376 | struct l2cap_conf_efs efs; | 2376 | struct l2cap_conf_efs efs; |
2377 | 2377 | ||
2378 | BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data); | 2378 | BT_DBG("chan %p, rsp %p, len %d, req %p", chan, rsp, len, data); |
@@ -2522,6 +2522,16 @@ static void l2cap_conf_rfc_get(struct l2cap_chan *chan, void *rsp, int len) | |||
2522 | } | 2522 | } |
2523 | } | 2523 | } |
2524 | 2524 | ||
2525 | /* Use sane default values in case a misbehaving remote device | ||
2526 | * did not send an RFC option. | ||
2527 | */ | ||
2528 | rfc.mode = chan->mode; | ||
2529 | rfc.retrans_timeout = cpu_to_le16(L2CAP_DEFAULT_RETRANS_TO); | ||
2530 | rfc.monitor_timeout = cpu_to_le16(L2CAP_DEFAULT_MONITOR_TO); | ||
2531 | rfc.max_pdu_size = cpu_to_le16(chan->imtu); | ||
2532 | |||
2533 | BT_ERR("Expected RFC option was not found, using defaults"); | ||
2534 | |||
2525 | done: | 2535 | done: |
2526 | switch (rfc.mode) { | 2536 | switch (rfc.mode) { |
2527 | case L2CAP_MODE_ERTM: | 2537 | case L2CAP_MODE_ERTM: |
diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c index e5ddef081e69..eac849b935a1 100644 --- a/net/bluetooth/rfcomm/core.c +++ b/net/bluetooth/rfcomm/core.c | |||
@@ -1162,6 +1162,7 @@ static int rfcomm_recv_ua(struct rfcomm_session *s, u8 dlci) | |||
1162 | if (list_empty(&s->dlcs)) { | 1162 | if (list_empty(&s->dlcs)) { |
1163 | s->state = BT_DISCONN; | 1163 | s->state = BT_DISCONN; |
1164 | rfcomm_send_disc(s, 0); | 1164 | rfcomm_send_disc(s, 0); |
1165 | rfcomm_session_clear_timer(s); | ||
1165 | } | 1166 | } |
1166 | 1167 | ||
1167 | break; | 1168 | break; |
diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c index 52e44605fb7b..84122472656c 100644 --- a/net/bridge/br_netfilter.c +++ b/net/bridge/br_netfilter.c | |||
@@ -114,12 +114,18 @@ static struct neighbour *fake_neigh_lookup(const struct dst_entry *dst, const vo | |||
114 | return NULL; | 114 | return NULL; |
115 | } | 115 | } |
116 | 116 | ||
117 | static unsigned int fake_mtu(const struct dst_entry *dst) | ||
118 | { | ||
119 | return dst->dev->mtu; | ||
120 | } | ||
121 | |||
117 | static struct dst_ops fake_dst_ops = { | 122 | static struct dst_ops fake_dst_ops = { |
118 | .family = AF_INET, | 123 | .family = AF_INET, |
119 | .protocol = cpu_to_be16(ETH_P_IP), | 124 | .protocol = cpu_to_be16(ETH_P_IP), |
120 | .update_pmtu = fake_update_pmtu, | 125 | .update_pmtu = fake_update_pmtu, |
121 | .cow_metrics = fake_cow_metrics, | 126 | .cow_metrics = fake_cow_metrics, |
122 | .neigh_lookup = fake_neigh_lookup, | 127 | .neigh_lookup = fake_neigh_lookup, |
128 | .mtu = fake_mtu, | ||
123 | }; | 129 | }; |
124 | 130 | ||
125 | /* | 131 | /* |
@@ -141,7 +147,7 @@ void br_netfilter_rtable_init(struct net_bridge *br) | |||
141 | rt->dst.dev = br->dev; | 147 | rt->dst.dev = br->dev; |
142 | rt->dst.path = &rt->dst; | 148 | rt->dst.path = &rt->dst; |
143 | dst_init_metrics(&rt->dst, br_dst_default_metrics, true); | 149 | dst_init_metrics(&rt->dst, br_dst_default_metrics, true); |
144 | rt->dst.flags = DST_NOXFRM; | 150 | rt->dst.flags = DST_NOXFRM | DST_NOPEER; |
145 | rt->dst.ops = &fake_dst_ops; | 151 | rt->dst.ops = &fake_dst_ops; |
146 | } | 152 | } |
147 | 153 | ||
diff --git a/net/ceph/crush/mapper.c b/net/ceph/crush/mapper.c index 42599e31dcad..3a94eae7abe9 100644 --- a/net/ceph/crush/mapper.c +++ b/net/ceph/crush/mapper.c | |||
@@ -477,7 +477,6 @@ int crush_do_rule(struct crush_map *map, | |||
477 | int i, j; | 477 | int i, j; |
478 | int numrep; | 478 | int numrep; |
479 | int firstn; | 479 | int firstn; |
480 | int rc = -1; | ||
481 | 480 | ||
482 | BUG_ON(ruleno >= map->max_rules); | 481 | BUG_ON(ruleno >= map->max_rules); |
483 | 482 | ||
@@ -491,23 +490,18 @@ int crush_do_rule(struct crush_map *map, | |||
491 | * that this may or may not correspond to the specific types | 490 | * that this may or may not correspond to the specific types |
492 | * referenced by the crush rule. | 491 | * referenced by the crush rule. |
493 | */ | 492 | */ |
494 | if (force >= 0) { | 493 | if (force >= 0 && |
495 | if (force >= map->max_devices || | 494 | force < map->max_devices && |
496 | map->device_parents[force] == 0) { | 495 | map->device_parents[force] != 0 && |
497 | /*dprintk("CRUSH: forcefed device dne\n");*/ | 496 | !is_out(map, weight, force, x)) { |
498 | rc = -1; /* force fed device dne */ | 497 | while (1) { |
499 | goto out; | 498 | force_context[++force_pos] = force; |
500 | } | 499 | if (force >= 0) |
501 | if (!is_out(map, weight, force, x)) { | 500 | force = map->device_parents[force]; |
502 | while (1) { | 501 | else |
503 | force_context[++force_pos] = force; | 502 | force = map->bucket_parents[-1-force]; |
504 | if (force >= 0) | 503 | if (force == 0) |
505 | force = map->device_parents[force]; | 504 | break; |
506 | else | ||
507 | force = map->bucket_parents[-1-force]; | ||
508 | if (force == 0) | ||
509 | break; | ||
510 | } | ||
511 | } | 505 | } |
512 | } | 506 | } |
513 | 507 | ||
@@ -600,10 +594,7 @@ int crush_do_rule(struct crush_map *map, | |||
600 | BUG_ON(1); | 594 | BUG_ON(1); |
601 | } | 595 | } |
602 | } | 596 | } |
603 | rc = result_len; | 597 | return result_len; |
604 | |||
605 | out: | ||
606 | return rc; | ||
607 | } | 598 | } |
608 | 599 | ||
609 | 600 | ||
diff --git a/net/core/flow.c b/net/core/flow.c index 8ae42de9c79e..e318c7e98042 100644 --- a/net/core/flow.c +++ b/net/core/flow.c | |||
@@ -358,6 +358,18 @@ void flow_cache_flush(void) | |||
358 | put_online_cpus(); | 358 | put_online_cpus(); |
359 | } | 359 | } |
360 | 360 | ||
361 | static void flow_cache_flush_task(struct work_struct *work) | ||
362 | { | ||
363 | flow_cache_flush(); | ||
364 | } | ||
365 | |||
366 | static DECLARE_WORK(flow_cache_flush_work, flow_cache_flush_task); | ||
367 | |||
368 | void flow_cache_flush_deferred(void) | ||
369 | { | ||
370 | schedule_work(&flow_cache_flush_work); | ||
371 | } | ||
372 | |||
361 | static int __cpuinit flow_cache_cpu_prepare(struct flow_cache *fc, int cpu) | 373 | static int __cpuinit flow_cache_cpu_prepare(struct flow_cache *fc, int cpu) |
362 | { | 374 | { |
363 | struct flow_cache_percpu *fcp = per_cpu_ptr(fc->percpu, cpu); | 375 | struct flow_cache_percpu *fcp = per_cpu_ptr(fc->percpu, cpu); |
diff --git a/net/core/net-sysfs.c b/net/core/net-sysfs.c index 9d134636f87c..4b4d0b0a3543 100644 --- a/net/core/net-sysfs.c +++ b/net/core/net-sysfs.c | |||
@@ -669,11 +669,14 @@ static ssize_t store_rps_dev_flow_table_cnt(struct netdev_rx_queue *queue, | |||
669 | if (count) { | 669 | if (count) { |
670 | int i; | 670 | int i; |
671 | 671 | ||
672 | if (count > 1<<30) { | 672 | if (count > INT_MAX) |
673 | return -EINVAL; | ||
674 | count = roundup_pow_of_two(count); | ||
675 | if (count > (ULONG_MAX - sizeof(struct rps_dev_flow_table)) | ||
676 | / sizeof(struct rps_dev_flow)) { | ||
673 | /* Enforce a limit to prevent overflow */ | 677 | /* Enforce a limit to prevent overflow */ |
674 | return -EINVAL; | 678 | return -EINVAL; |
675 | } | 679 | } |
676 | count = roundup_pow_of_two(count); | ||
677 | table = vmalloc(RPS_DEV_FLOW_TABLE_SIZE(count)); | 680 | table = vmalloc(RPS_DEV_FLOW_TABLE_SIZE(count)); |
678 | if (!table) | 681 | if (!table) |
679 | return -ENOMEM; | 682 | return -ENOMEM; |
diff --git a/net/core/sock.c b/net/core/sock.c index 0c67facf42f3..002939cfc069 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -339,11 +339,7 @@ int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) | |||
339 | unsigned long flags; | 339 | unsigned long flags; |
340 | struct sk_buff_head *list = &sk->sk_receive_queue; | 340 | struct sk_buff_head *list = &sk->sk_receive_queue; |
341 | 341 | ||
342 | /* Cast sk->rcvbuf to unsigned... It's pointless, but reduces | 342 | if (atomic_read(&sk->sk_rmem_alloc) >= sk->sk_rcvbuf) { |
343 | number of warnings when compiling with -W --ANK | ||
344 | */ | ||
345 | if (atomic_read(&sk->sk_rmem_alloc) + skb->truesize >= | ||
346 | (unsigned)sk->sk_rcvbuf) { | ||
347 | atomic_inc(&sk->sk_drops); | 343 | atomic_inc(&sk->sk_drops); |
348 | trace_sock_rcvqueue_full(sk, skb); | 344 | trace_sock_rcvqueue_full(sk, skb); |
349 | return -ENOMEM; | 345 | return -ENOMEM; |
diff --git a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c index 915eb5265b2e..7e4ec9fc2cef 100644 --- a/net/ipv4/ipconfig.c +++ b/net/ipv4/ipconfig.c | |||
@@ -253,6 +253,10 @@ static int __init ic_open_devs(void) | |||
253 | } | 253 | } |
254 | } | 254 | } |
255 | 255 | ||
256 | /* no point in waiting if we could not bring up at least one device */ | ||
257 | if (!ic_first_dev) | ||
258 | goto have_carrier; | ||
259 | |||
256 | /* wait for a carrier on at least one device */ | 260 | /* wait for a carrier on at least one device */ |
257 | start = jiffies; | 261 | start = jiffies; |
258 | while (jiffies - start < msecs_to_jiffies(CONF_CARRIER_TIMEOUT)) { | 262 | while (jiffies - start < msecs_to_jiffies(CONF_CARRIER_TIMEOUT)) { |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index f30112f7559a..bcacf54e5418 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -91,6 +91,7 @@ | |||
91 | #include <linux/rcupdate.h> | 91 | #include <linux/rcupdate.h> |
92 | #include <linux/times.h> | 92 | #include <linux/times.h> |
93 | #include <linux/slab.h> | 93 | #include <linux/slab.h> |
94 | #include <linux/prefetch.h> | ||
94 | #include <net/dst.h> | 95 | #include <net/dst.h> |
95 | #include <net/net_namespace.h> | 96 | #include <net/net_namespace.h> |
96 | #include <net/protocol.h> | 97 | #include <net/protocol.h> |
@@ -119,6 +120,7 @@ | |||
119 | 120 | ||
120 | static int ip_rt_max_size; | 121 | static int ip_rt_max_size; |
121 | static int ip_rt_gc_timeout __read_mostly = RT_GC_TIMEOUT; | 122 | static int ip_rt_gc_timeout __read_mostly = RT_GC_TIMEOUT; |
123 | static int ip_rt_gc_interval __read_mostly = 60 * HZ; | ||
122 | static int ip_rt_gc_min_interval __read_mostly = HZ / 2; | 124 | static int ip_rt_gc_min_interval __read_mostly = HZ / 2; |
123 | static int ip_rt_redirect_number __read_mostly = 9; | 125 | static int ip_rt_redirect_number __read_mostly = 9; |
124 | static int ip_rt_redirect_load __read_mostly = HZ / 50; | 126 | static int ip_rt_redirect_load __read_mostly = HZ / 50; |
@@ -132,6 +134,9 @@ static int ip_rt_min_advmss __read_mostly = 256; | |||
132 | static int rt_chain_length_max __read_mostly = 20; | 134 | static int rt_chain_length_max __read_mostly = 20; |
133 | static int redirect_genid; | 135 | static int redirect_genid; |
134 | 136 | ||
137 | static struct delayed_work expires_work; | ||
138 | static unsigned long expires_ljiffies; | ||
139 | |||
135 | /* | 140 | /* |
136 | * Interface to generic destination cache. | 141 | * Interface to generic destination cache. |
137 | */ | 142 | */ |
@@ -829,6 +834,97 @@ static int has_noalias(const struct rtable *head, const struct rtable *rth) | |||
829 | return ONE; | 834 | return ONE; |
830 | } | 835 | } |
831 | 836 | ||
837 | static void rt_check_expire(void) | ||
838 | { | ||
839 | static unsigned int rover; | ||
840 | unsigned int i = rover, goal; | ||
841 | struct rtable *rth; | ||
842 | struct rtable __rcu **rthp; | ||
843 | unsigned long samples = 0; | ||
844 | unsigned long sum = 0, sum2 = 0; | ||
845 | unsigned long delta; | ||
846 | u64 mult; | ||
847 | |||
848 | delta = jiffies - expires_ljiffies; | ||
849 | expires_ljiffies = jiffies; | ||
850 | mult = ((u64)delta) << rt_hash_log; | ||
851 | if (ip_rt_gc_timeout > 1) | ||
852 | do_div(mult, ip_rt_gc_timeout); | ||
853 | goal = (unsigned int)mult; | ||
854 | if (goal > rt_hash_mask) | ||
855 | goal = rt_hash_mask + 1; | ||
856 | for (; goal > 0; goal--) { | ||
857 | unsigned long tmo = ip_rt_gc_timeout; | ||
858 | unsigned long length; | ||
859 | |||
860 | i = (i + 1) & rt_hash_mask; | ||
861 | rthp = &rt_hash_table[i].chain; | ||
862 | |||
863 | if (need_resched()) | ||
864 | cond_resched(); | ||
865 | |||
866 | samples++; | ||
867 | |||
868 | if (rcu_dereference_raw(*rthp) == NULL) | ||
869 | continue; | ||
870 | length = 0; | ||
871 | spin_lock_bh(rt_hash_lock_addr(i)); | ||
872 | while ((rth = rcu_dereference_protected(*rthp, | ||
873 | lockdep_is_held(rt_hash_lock_addr(i)))) != NULL) { | ||
874 | prefetch(rth->dst.rt_next); | ||
875 | if (rt_is_expired(rth)) { | ||
876 | *rthp = rth->dst.rt_next; | ||
877 | rt_free(rth); | ||
878 | continue; | ||
879 | } | ||
880 | if (rth->dst.expires) { | ||
881 | /* Entry is expired even if it is in use */ | ||
882 | if (time_before_eq(jiffies, rth->dst.expires)) { | ||
883 | nofree: | ||
884 | tmo >>= 1; | ||
885 | rthp = &rth->dst.rt_next; | ||
886 | /* | ||
887 | * We only count entries on | ||
888 | * a chain with equal hash inputs once | ||
889 | * so that entries for different QOS | ||
890 | * levels, and other non-hash input | ||
891 | * attributes don't unfairly skew | ||
892 | * the length computation | ||
893 | */ | ||
894 | length += has_noalias(rt_hash_table[i].chain, rth); | ||
895 | continue; | ||
896 | } | ||
897 | } else if (!rt_may_expire(rth, tmo, ip_rt_gc_timeout)) | ||
898 | goto nofree; | ||
899 | |||
900 | /* Cleanup aged off entries. */ | ||
901 | *rthp = rth->dst.rt_next; | ||
902 | rt_free(rth); | ||
903 | } | ||
904 | spin_unlock_bh(rt_hash_lock_addr(i)); | ||
905 | sum += length; | ||
906 | sum2 += length*length; | ||
907 | } | ||
908 | if (samples) { | ||
909 | unsigned long avg = sum / samples; | ||
910 | unsigned long sd = int_sqrt(sum2 / samples - avg*avg); | ||
911 | rt_chain_length_max = max_t(unsigned long, | ||
912 | ip_rt_gc_elasticity, | ||
913 | (avg + 4*sd) >> FRACT_BITS); | ||
914 | } | ||
915 | rover = i; | ||
916 | } | ||
917 | |||
918 | /* | ||
919 | * rt_worker_func() is run in process context. | ||
920 | * we call rt_check_expire() to scan part of the hash table | ||
921 | */ | ||
922 | static void rt_worker_func(struct work_struct *work) | ||
923 | { | ||
924 | rt_check_expire(); | ||
925 | schedule_delayed_work(&expires_work, ip_rt_gc_interval); | ||
926 | } | ||
927 | |||
832 | /* | 928 | /* |
833 | * Perturbation of rt_genid by a small quantity [1..256] | 929 | * Perturbation of rt_genid by a small quantity [1..256] |
834 | * Using 8 bits of shuffling ensure we can call rt_cache_invalidate() | 930 | * Using 8 bits of shuffling ensure we can call rt_cache_invalidate() |
@@ -1265,7 +1361,7 @@ void __ip_select_ident(struct iphdr *iph, struct dst_entry *dst, int more) | |||
1265 | { | 1361 | { |
1266 | struct rtable *rt = (struct rtable *) dst; | 1362 | struct rtable *rt = (struct rtable *) dst; |
1267 | 1363 | ||
1268 | if (rt) { | 1364 | if (rt && !(rt->dst.flags & DST_NOPEER)) { |
1269 | if (rt->peer == NULL) | 1365 | if (rt->peer == NULL) |
1270 | rt_bind_peer(rt, rt->rt_dst, 1); | 1366 | rt_bind_peer(rt, rt->rt_dst, 1); |
1271 | 1367 | ||
@@ -1276,7 +1372,7 @@ void __ip_select_ident(struct iphdr *iph, struct dst_entry *dst, int more) | |||
1276 | iph->id = htons(inet_getid(rt->peer, more)); | 1372 | iph->id = htons(inet_getid(rt->peer, more)); |
1277 | return; | 1373 | return; |
1278 | } | 1374 | } |
1279 | } else | 1375 | } else if (!rt) |
1280 | printk(KERN_DEBUG "rt_bind_peer(0) @%p\n", | 1376 | printk(KERN_DEBUG "rt_bind_peer(0) @%p\n", |
1281 | __builtin_return_address(0)); | 1377 | __builtin_return_address(0)); |
1282 | 1378 | ||
@@ -3173,6 +3269,13 @@ static ctl_table ipv4_route_table[] = { | |||
3173 | .proc_handler = proc_dointvec_jiffies, | 3269 | .proc_handler = proc_dointvec_jiffies, |
3174 | }, | 3270 | }, |
3175 | { | 3271 | { |
3272 | .procname = "gc_interval", | ||
3273 | .data = &ip_rt_gc_interval, | ||
3274 | .maxlen = sizeof(int), | ||
3275 | .mode = 0644, | ||
3276 | .proc_handler = proc_dointvec_jiffies, | ||
3277 | }, | ||
3278 | { | ||
3176 | .procname = "redirect_load", | 3279 | .procname = "redirect_load", |
3177 | .data = &ip_rt_redirect_load, | 3280 | .data = &ip_rt_redirect_load, |
3178 | .maxlen = sizeof(int), | 3281 | .maxlen = sizeof(int), |
@@ -3382,6 +3485,11 @@ int __init ip_rt_init(void) | |||
3382 | devinet_init(); | 3485 | devinet_init(); |
3383 | ip_fib_init(); | 3486 | ip_fib_init(); |
3384 | 3487 | ||
3488 | INIT_DELAYED_WORK_DEFERRABLE(&expires_work, rt_worker_func); | ||
3489 | expires_ljiffies = jiffies; | ||
3490 | schedule_delayed_work(&expires_work, | ||
3491 | net_random() % ip_rt_gc_interval + ip_rt_gc_interval); | ||
3492 | |||
3385 | if (ip_rt_proc_init()) | 3493 | if (ip_rt_proc_init()) |
3386 | printk(KERN_ERR "Unable to create route proc files\n"); | 3494 | printk(KERN_ERR "Unable to create route proc files\n"); |
3387 | #ifdef CONFIG_XFRM | 3495 | #ifdef CONFIG_XFRM |
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 71d26999c955..d97e07183ce9 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -604,7 +604,7 @@ void ipv6_select_ident(struct frag_hdr *fhdr, struct rt6_info *rt) | |||
604 | static atomic_t ipv6_fragmentation_id; | 604 | static atomic_t ipv6_fragmentation_id; |
605 | int old, new; | 605 | int old, new; |
606 | 606 | ||
607 | if (rt) { | 607 | if (rt && !(rt->dst.flags & DST_NOPEER)) { |
608 | struct inet_peer *peer; | 608 | struct inet_peer *peer; |
609 | 609 | ||
610 | if (!rt->rt6i_peer) | 610 | if (!rt->rt6i_peer) |
diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c index dfd3a648a551..a18e6c3d36e3 100644 --- a/net/llc/af_llc.c +++ b/net/llc/af_llc.c | |||
@@ -833,15 +833,15 @@ static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
833 | copied += used; | 833 | copied += used; |
834 | len -= used; | 834 | len -= used; |
835 | 835 | ||
836 | /* For non stream protcols we get one packet per recvmsg call */ | ||
837 | if (sk->sk_type != SOCK_STREAM) | ||
838 | goto copy_uaddr; | ||
839 | |||
836 | if (!(flags & MSG_PEEK)) { | 840 | if (!(flags & MSG_PEEK)) { |
837 | sk_eat_skb(sk, skb, 0); | 841 | sk_eat_skb(sk, skb, 0); |
838 | *seq = 0; | 842 | *seq = 0; |
839 | } | 843 | } |
840 | 844 | ||
841 | /* For non stream protcols we get one packet per recvmsg call */ | ||
842 | if (sk->sk_type != SOCK_STREAM) | ||
843 | goto copy_uaddr; | ||
844 | |||
845 | /* Partial read */ | 845 | /* Partial read */ |
846 | if (used + offset < skb->len) | 846 | if (used + offset < skb->len) |
847 | continue; | 847 | continue; |
@@ -857,6 +857,12 @@ copy_uaddr: | |||
857 | } | 857 | } |
858 | if (llc_sk(sk)->cmsg_flags) | 858 | if (llc_sk(sk)->cmsg_flags) |
859 | llc_cmsg_rcv(msg, skb); | 859 | llc_cmsg_rcv(msg, skb); |
860 | |||
861 | if (!(flags & MSG_PEEK)) { | ||
862 | sk_eat_skb(sk, skb, 0); | ||
863 | *seq = 0; | ||
864 | } | ||
865 | |||
860 | goto out; | 866 | goto out; |
861 | } | 867 | } |
862 | 868 | ||
diff --git a/net/netfilter/xt_connbytes.c b/net/netfilter/xt_connbytes.c index 5b138506690e..9ddf1c3bfb39 100644 --- a/net/netfilter/xt_connbytes.c +++ b/net/netfilter/xt_connbytes.c | |||
@@ -87,10 +87,10 @@ connbytes_mt(const struct sk_buff *skb, struct xt_action_param *par) | |||
87 | break; | 87 | break; |
88 | } | 88 | } |
89 | 89 | ||
90 | if (sinfo->count.to) | 90 | if (sinfo->count.to >= sinfo->count.from) |
91 | return what <= sinfo->count.to && what >= sinfo->count.from; | 91 | return what <= sinfo->count.to && what >= sinfo->count.from; |
92 | else | 92 | else /* inverted */ |
93 | return what >= sinfo->count.from; | 93 | return what < sinfo->count.to || what > sinfo->count.from; |
94 | } | 94 | } |
95 | 95 | ||
96 | static int connbytes_mt_check(const struct xt_mtchk_param *par) | 96 | static int connbytes_mt_check(const struct xt_mtchk_param *par) |
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 0da505c9ac23..e56ca75e3f43 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
@@ -1631,8 +1631,7 @@ static int packet_rcv(struct sk_buff *skb, struct net_device *dev, | |||
1631 | if (snaplen > res) | 1631 | if (snaplen > res) |
1632 | snaplen = res; | 1632 | snaplen = res; |
1633 | 1633 | ||
1634 | if (atomic_read(&sk->sk_rmem_alloc) + skb->truesize >= | 1634 | if (atomic_read(&sk->sk_rmem_alloc) >= sk->sk_rcvbuf) |
1635 | (unsigned)sk->sk_rcvbuf) | ||
1636 | goto drop_n_acct; | 1635 | goto drop_n_acct; |
1637 | 1636 | ||
1638 | if (skb_shared(skb)) { | 1637 | if (skb_shared(skb)) { |
@@ -1763,8 +1762,7 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, | |||
1763 | if (po->tp_version <= TPACKET_V2) { | 1762 | if (po->tp_version <= TPACKET_V2) { |
1764 | if (macoff + snaplen > po->rx_ring.frame_size) { | 1763 | if (macoff + snaplen > po->rx_ring.frame_size) { |
1765 | if (po->copy_thresh && | 1764 | if (po->copy_thresh && |
1766 | atomic_read(&sk->sk_rmem_alloc) + skb->truesize | 1765 | atomic_read(&sk->sk_rmem_alloc) < sk->sk_rcvbuf) { |
1767 | < (unsigned)sk->sk_rcvbuf) { | ||
1768 | if (skb_shared(skb)) { | 1766 | if (skb_shared(skb)) { |
1769 | copy_skb = skb_clone(skb, GFP_ATOMIC); | 1767 | copy_skb = skb_clone(skb, GFP_ATOMIC); |
1770 | } else { | 1768 | } else { |
diff --git a/net/sched/sch_mqprio.c b/net/sched/sch_mqprio.c index f88256cbacbf..28de43092330 100644 --- a/net/sched/sch_mqprio.c +++ b/net/sched/sch_mqprio.c | |||
@@ -107,7 +107,7 @@ static int mqprio_init(struct Qdisc *sch, struct nlattr *opt) | |||
107 | if (!netif_is_multiqueue(dev)) | 107 | if (!netif_is_multiqueue(dev)) |
108 | return -EOPNOTSUPP; | 108 | return -EOPNOTSUPP; |
109 | 109 | ||
110 | if (nla_len(opt) < sizeof(*qopt)) | 110 | if (!opt || nla_len(opt) < sizeof(*qopt)) |
111 | return -EINVAL; | 111 | return -EINVAL; |
112 | 112 | ||
113 | qopt = nla_data(opt); | 113 | qopt = nla_data(opt); |
diff --git a/net/sctp/associola.c b/net/sctp/associola.c index 152b5b3c3fff..acd2edbc073e 100644 --- a/net/sctp/associola.c +++ b/net/sctp/associola.c | |||
@@ -173,7 +173,7 @@ static struct sctp_association *sctp_association_init(struct sctp_association *a | |||
173 | asoc->timeouts[SCTP_EVENT_TIMEOUT_HEARTBEAT] = 0; | 173 | asoc->timeouts[SCTP_EVENT_TIMEOUT_HEARTBEAT] = 0; |
174 | asoc->timeouts[SCTP_EVENT_TIMEOUT_SACK] = asoc->sackdelay; | 174 | asoc->timeouts[SCTP_EVENT_TIMEOUT_SACK] = asoc->sackdelay; |
175 | asoc->timeouts[SCTP_EVENT_TIMEOUT_AUTOCLOSE] = | 175 | asoc->timeouts[SCTP_EVENT_TIMEOUT_AUTOCLOSE] = |
176 | (unsigned long)sp->autoclose * HZ; | 176 | min_t(unsigned long, sp->autoclose, sctp_max_autoclose) * HZ; |
177 | 177 | ||
178 | /* Initializes the timers */ | 178 | /* Initializes the timers */ |
179 | for (i = SCTP_EVENT_TIMEOUT_NONE; i < SCTP_NUM_TIMEOUT_TYPES; ++i) | 179 | for (i = SCTP_EVENT_TIMEOUT_NONE; i < SCTP_NUM_TIMEOUT_TYPES; ++i) |
diff --git a/net/sctp/output.c b/net/sctp/output.c index 08b3cead6503..817174eb5f41 100644 --- a/net/sctp/output.c +++ b/net/sctp/output.c | |||
@@ -697,13 +697,7 @@ static void sctp_packet_append_data(struct sctp_packet *packet, | |||
697 | /* Keep track of how many bytes are in flight to the receiver. */ | 697 | /* Keep track of how many bytes are in flight to the receiver. */ |
698 | asoc->outqueue.outstanding_bytes += datasize; | 698 | asoc->outqueue.outstanding_bytes += datasize; |
699 | 699 | ||
700 | /* Update our view of the receiver's rwnd. Include sk_buff overhead | 700 | /* Update our view of the receiver's rwnd. */ |
701 | * while updating peer.rwnd so that it reduces the chances of a | ||
702 | * receiver running out of receive buffer space even when receive | ||
703 | * window is still open. This can happen when a sender is sending | ||
704 | * sending small messages. | ||
705 | */ | ||
706 | datasize += sizeof(struct sk_buff); | ||
707 | if (datasize < rwnd) | 701 | if (datasize < rwnd) |
708 | rwnd -= datasize; | 702 | rwnd -= datasize; |
709 | else | 703 | else |
diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c index 14c2b06028ff..cfeb1d4a1ee6 100644 --- a/net/sctp/outqueue.c +++ b/net/sctp/outqueue.c | |||
@@ -411,8 +411,7 @@ void sctp_retransmit_mark(struct sctp_outq *q, | |||
411 | chunk->transport->flight_size -= | 411 | chunk->transport->flight_size -= |
412 | sctp_data_size(chunk); | 412 | sctp_data_size(chunk); |
413 | q->outstanding_bytes -= sctp_data_size(chunk); | 413 | q->outstanding_bytes -= sctp_data_size(chunk); |
414 | q->asoc->peer.rwnd += (sctp_data_size(chunk) + | 414 | q->asoc->peer.rwnd += sctp_data_size(chunk); |
415 | sizeof(struct sk_buff)); | ||
416 | } | 415 | } |
417 | continue; | 416 | continue; |
418 | } | 417 | } |
@@ -432,8 +431,7 @@ void sctp_retransmit_mark(struct sctp_outq *q, | |||
432 | * (Section 7.2.4)), add the data size of those | 431 | * (Section 7.2.4)), add the data size of those |
433 | * chunks to the rwnd. | 432 | * chunks to the rwnd. |
434 | */ | 433 | */ |
435 | q->asoc->peer.rwnd += (sctp_data_size(chunk) + | 434 | q->asoc->peer.rwnd += sctp_data_size(chunk); |
436 | sizeof(struct sk_buff)); | ||
437 | q->outstanding_bytes -= sctp_data_size(chunk); | 435 | q->outstanding_bytes -= sctp_data_size(chunk); |
438 | if (chunk->transport) | 436 | if (chunk->transport) |
439 | transport->flight_size -= sctp_data_size(chunk); | 437 | transport->flight_size -= sctp_data_size(chunk); |
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index 544a9b68eb53..5942d27b1444 100644 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c | |||
@@ -1285,6 +1285,9 @@ SCTP_STATIC __init int sctp_init(void) | |||
1285 | sctp_max_instreams = SCTP_DEFAULT_INSTREAMS; | 1285 | sctp_max_instreams = SCTP_DEFAULT_INSTREAMS; |
1286 | sctp_max_outstreams = SCTP_DEFAULT_OUTSTREAMS; | 1286 | sctp_max_outstreams = SCTP_DEFAULT_OUTSTREAMS; |
1287 | 1287 | ||
1288 | /* Initialize maximum autoclose timeout. */ | ||
1289 | sctp_max_autoclose = INT_MAX / HZ; | ||
1290 | |||
1288 | /* Initialize handle used for association ids. */ | 1291 | /* Initialize handle used for association ids. */ |
1289 | idr_init(&sctp_assocs_id); | 1292 | idr_init(&sctp_assocs_id); |
1290 | 1293 | ||
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index db0308344d07..408ebd0e7330 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c | |||
@@ -2200,8 +2200,6 @@ static int sctp_setsockopt_autoclose(struct sock *sk, char __user *optval, | |||
2200 | return -EINVAL; | 2200 | return -EINVAL; |
2201 | if (copy_from_user(&sp->autoclose, optval, optlen)) | 2201 | if (copy_from_user(&sp->autoclose, optval, optlen)) |
2202 | return -EFAULT; | 2202 | return -EFAULT; |
2203 | /* make sure it won't exceed MAX_SCHEDULE_TIMEOUT */ | ||
2204 | sp->autoclose = min_t(long, sp->autoclose, MAX_SCHEDULE_TIMEOUT / HZ); | ||
2205 | 2203 | ||
2206 | return 0; | 2204 | return 0; |
2207 | } | 2205 | } |
diff --git a/net/sctp/sysctl.c b/net/sctp/sysctl.c index 6b3952961b85..60ffbd067ff7 100644 --- a/net/sctp/sysctl.c +++ b/net/sctp/sysctl.c | |||
@@ -53,6 +53,10 @@ static int sack_timer_min = 1; | |||
53 | static int sack_timer_max = 500; | 53 | static int sack_timer_max = 500; |
54 | static int addr_scope_max = 3; /* check sctp_scope_policy_t in include/net/sctp/constants.h for max entries */ | 54 | static int addr_scope_max = 3; /* check sctp_scope_policy_t in include/net/sctp/constants.h for max entries */ |
55 | static int rwnd_scale_max = 16; | 55 | static int rwnd_scale_max = 16; |
56 | static unsigned long max_autoclose_min = 0; | ||
57 | static unsigned long max_autoclose_max = | ||
58 | (MAX_SCHEDULE_TIMEOUT / HZ > UINT_MAX) | ||
59 | ? UINT_MAX : MAX_SCHEDULE_TIMEOUT / HZ; | ||
56 | 60 | ||
57 | extern long sysctl_sctp_mem[3]; | 61 | extern long sysctl_sctp_mem[3]; |
58 | extern int sysctl_sctp_rmem[3]; | 62 | extern int sysctl_sctp_rmem[3]; |
@@ -258,6 +262,15 @@ static ctl_table sctp_table[] = { | |||
258 | .extra1 = &one, | 262 | .extra1 = &one, |
259 | .extra2 = &rwnd_scale_max, | 263 | .extra2 = &rwnd_scale_max, |
260 | }, | 264 | }, |
265 | { | ||
266 | .procname = "max_autoclose", | ||
267 | .data = &sctp_max_autoclose, | ||
268 | .maxlen = sizeof(unsigned long), | ||
269 | .mode = 0644, | ||
270 | .proc_handler = &proc_doulongvec_minmax, | ||
271 | .extra1 = &max_autoclose_min, | ||
272 | .extra2 = &max_autoclose_max, | ||
273 | }, | ||
261 | 274 | ||
262 | { /* sentinel */ } | 275 | { /* sentinel */ } |
263 | }; | 276 | }; |
diff --git a/net/sunrpc/sched.c b/net/sunrpc/sched.c index d12ffa545811..00a1a2acd587 100644 --- a/net/sunrpc/sched.c +++ b/net/sunrpc/sched.c | |||
@@ -590,6 +590,27 @@ void rpc_prepare_task(struct rpc_task *task) | |||
590 | task->tk_ops->rpc_call_prepare(task, task->tk_calldata); | 590 | task->tk_ops->rpc_call_prepare(task, task->tk_calldata); |
591 | } | 591 | } |
592 | 592 | ||
593 | static void | ||
594 | rpc_init_task_statistics(struct rpc_task *task) | ||
595 | { | ||
596 | /* Initialize retry counters */ | ||
597 | task->tk_garb_retry = 2; | ||
598 | task->tk_cred_retry = 2; | ||
599 | task->tk_rebind_retry = 2; | ||
600 | |||
601 | /* starting timestamp */ | ||
602 | task->tk_start = ktime_get(); | ||
603 | } | ||
604 | |||
605 | static void | ||
606 | rpc_reset_task_statistics(struct rpc_task *task) | ||
607 | { | ||
608 | task->tk_timeouts = 0; | ||
609 | task->tk_flags &= ~(RPC_CALL_MAJORSEEN|RPC_TASK_KILLED|RPC_TASK_SENT); | ||
610 | |||
611 | rpc_init_task_statistics(task); | ||
612 | } | ||
613 | |||
593 | /* | 614 | /* |
594 | * Helper that calls task->tk_ops->rpc_call_done if it exists | 615 | * Helper that calls task->tk_ops->rpc_call_done if it exists |
595 | */ | 616 | */ |
@@ -602,6 +623,7 @@ void rpc_exit_task(struct rpc_task *task) | |||
602 | WARN_ON(RPC_ASSASSINATED(task)); | 623 | WARN_ON(RPC_ASSASSINATED(task)); |
603 | /* Always release the RPC slot and buffer memory */ | 624 | /* Always release the RPC slot and buffer memory */ |
604 | xprt_release(task); | 625 | xprt_release(task); |
626 | rpc_reset_task_statistics(task); | ||
605 | } | 627 | } |
606 | } | 628 | } |
607 | } | 629 | } |
@@ -804,11 +826,6 @@ static void rpc_init_task(struct rpc_task *task, const struct rpc_task_setup *ta | |||
804 | task->tk_calldata = task_setup_data->callback_data; | 826 | task->tk_calldata = task_setup_data->callback_data; |
805 | INIT_LIST_HEAD(&task->tk_task); | 827 | INIT_LIST_HEAD(&task->tk_task); |
806 | 828 | ||
807 | /* Initialize retry counters */ | ||
808 | task->tk_garb_retry = 2; | ||
809 | task->tk_cred_retry = 2; | ||
810 | task->tk_rebind_retry = 2; | ||
811 | |||
812 | task->tk_priority = task_setup_data->priority - RPC_PRIORITY_LOW; | 829 | task->tk_priority = task_setup_data->priority - RPC_PRIORITY_LOW; |
813 | task->tk_owner = current->tgid; | 830 | task->tk_owner = current->tgid; |
814 | 831 | ||
@@ -818,8 +835,7 @@ static void rpc_init_task(struct rpc_task *task, const struct rpc_task_setup *ta | |||
818 | if (task->tk_ops->rpc_call_prepare != NULL) | 835 | if (task->tk_ops->rpc_call_prepare != NULL) |
819 | task->tk_action = rpc_prepare_task; | 836 | task->tk_action = rpc_prepare_task; |
820 | 837 | ||
821 | /* starting timestamp */ | 838 | rpc_init_task_statistics(task); |
822 | task->tk_start = ktime_get(); | ||
823 | 839 | ||
824 | dprintk("RPC: new task initialized, procpid %u\n", | 840 | dprintk("RPC: new task initialized, procpid %u\n", |
825 | task_pid_nr(current)); | 841 | task_pid_nr(current)); |
diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c index f4385e45a5fc..c64c0ef519b5 100644 --- a/net/sunrpc/xprt.c +++ b/net/sunrpc/xprt.c | |||
@@ -995,13 +995,11 @@ out_init_req: | |||
995 | 995 | ||
996 | static void xprt_free_slot(struct rpc_xprt *xprt, struct rpc_rqst *req) | 996 | static void xprt_free_slot(struct rpc_xprt *xprt, struct rpc_rqst *req) |
997 | { | 997 | { |
998 | if (xprt_dynamic_free_slot(xprt, req)) | ||
999 | return; | ||
1000 | |||
1001 | memset(req, 0, sizeof(*req)); /* mark unused */ | ||
1002 | |||
1003 | spin_lock(&xprt->reserve_lock); | 998 | spin_lock(&xprt->reserve_lock); |
1004 | list_add(&req->rq_list, &xprt->free); | 999 | if (!xprt_dynamic_free_slot(xprt, req)) { |
1000 | memset(req, 0, sizeof(*req)); /* mark unused */ | ||
1001 | list_add(&req->rq_list, &xprt->free); | ||
1002 | } | ||
1005 | rpc_wake_up_next(&xprt->backlog); | 1003 | rpc_wake_up_next(&xprt->backlog); |
1006 | spin_unlock(&xprt->reserve_lock); | 1004 | spin_unlock(&xprt->reserve_lock); |
1007 | } | 1005 | } |
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index eb6b0b7781a5..7661576b6f45 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
@@ -2276,8 +2276,6 @@ static void __xfrm_garbage_collect(struct net *net) | |||
2276 | { | 2276 | { |
2277 | struct dst_entry *head, *next; | 2277 | struct dst_entry *head, *next; |
2278 | 2278 | ||
2279 | flow_cache_flush(); | ||
2280 | |||
2281 | spin_lock_bh(&xfrm_policy_sk_bundle_lock); | 2279 | spin_lock_bh(&xfrm_policy_sk_bundle_lock); |
2282 | head = xfrm_policy_sk_bundles; | 2280 | head = xfrm_policy_sk_bundles; |
2283 | xfrm_policy_sk_bundles = NULL; | 2281 | xfrm_policy_sk_bundles = NULL; |
@@ -2290,6 +2288,18 @@ static void __xfrm_garbage_collect(struct net *net) | |||
2290 | } | 2288 | } |
2291 | } | 2289 | } |
2292 | 2290 | ||
2291 | static void xfrm_garbage_collect(struct net *net) | ||
2292 | { | ||
2293 | flow_cache_flush(); | ||
2294 | __xfrm_garbage_collect(net); | ||
2295 | } | ||
2296 | |||
2297 | static void xfrm_garbage_collect_deferred(struct net *net) | ||
2298 | { | ||
2299 | flow_cache_flush_deferred(); | ||
2300 | __xfrm_garbage_collect(net); | ||
2301 | } | ||
2302 | |||
2293 | static void xfrm_init_pmtu(struct dst_entry *dst) | 2303 | static void xfrm_init_pmtu(struct dst_entry *dst) |
2294 | { | 2304 | { |
2295 | do { | 2305 | do { |
@@ -2422,7 +2432,7 @@ int xfrm_policy_register_afinfo(struct xfrm_policy_afinfo *afinfo) | |||
2422 | if (likely(dst_ops->neigh_lookup == NULL)) | 2432 | if (likely(dst_ops->neigh_lookup == NULL)) |
2423 | dst_ops->neigh_lookup = xfrm_neigh_lookup; | 2433 | dst_ops->neigh_lookup = xfrm_neigh_lookup; |
2424 | if (likely(afinfo->garbage_collect == NULL)) | 2434 | if (likely(afinfo->garbage_collect == NULL)) |
2425 | afinfo->garbage_collect = __xfrm_garbage_collect; | 2435 | afinfo->garbage_collect = xfrm_garbage_collect_deferred; |
2426 | xfrm_policy_afinfo[afinfo->family] = afinfo; | 2436 | xfrm_policy_afinfo[afinfo->family] = afinfo; |
2427 | } | 2437 | } |
2428 | write_unlock_bh(&xfrm_policy_afinfo_lock); | 2438 | write_unlock_bh(&xfrm_policy_afinfo_lock); |
@@ -2516,7 +2526,7 @@ static int xfrm_dev_event(struct notifier_block *this, unsigned long event, void | |||
2516 | 2526 | ||
2517 | switch (event) { | 2527 | switch (event) { |
2518 | case NETDEV_DOWN: | 2528 | case NETDEV_DOWN: |
2519 | __xfrm_garbage_collect(dev_net(dev)); | 2529 | xfrm_garbage_collect(dev_net(dev)); |
2520 | } | 2530 | } |
2521 | return NOTIFY_DONE; | 2531 | return NOTIFY_DONE; |
2522 | } | 2532 | } |