diff options
author | David S. Miller <davem@davemloft.net> | 2012-01-24 22:57:24 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-01-24 22:57:24 -0500 |
commit | c54a45700195d9491e2cc2115ea61315a8ba3927 (patch) | |
tree | c87ae0da5bf7c8b79241fdc8d694785092a42a4c /net | |
parent | 61d57f87f3fb04a305f22befabd042ffbec8b852 (diff) | |
parent | 701b259f446be2f3625fb852bceb93afe76e206d (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Diffstat (limited to 'net')
-rw-r--r-- | net/bluetooth/hci_core.c | 2 | ||||
-rw-r--r-- | net/core/ethtool.c | 1 | ||||
-rw-r--r-- | net/core/flow_dissector.c | 1 | ||||
-rw-r--r-- | net/core/pktgen.c | 4 | ||||
-rw-r--r-- | net/core/sock.c | 4 | ||||
-rw-r--r-- | net/ipv4/proc.c | 1 | ||||
-rw-r--r-- | net/ipv4/tcp_bic.c | 11 | ||||
-rw-r--r-- | net/ipv4/tcp_cubic.c | 10 | ||||
-rw-r--r-- | net/ipv4/tcp_input.c | 41 | ||||
-rw-r--r-- | net/ipv4/tcp_ipv4.c | 2 | ||||
-rw-r--r-- | net/ipv6/addrconf.c | 61 | ||||
-rw-r--r-- | net/ipv6/tcp_ipv6.c | 2 | ||||
-rw-r--r-- | net/llc/af_llc.c | 5 | ||||
-rw-r--r-- | net/mac80211/debugfs_key.c | 7 | ||||
-rw-r--r-- | net/mac80211/mesh_hwmp.c | 8 | ||||
-rw-r--r-- | net/mac80211/mesh_plink.c | 4 | ||||
-rw-r--r-- | net/mac80211/mlme.c | 38 | ||||
-rw-r--r-- | net/rds/af_rds.c | 20 | ||||
-rw-r--r-- | net/sched/sch_netem.c | 2 |
19 files changed, 128 insertions, 96 deletions
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index 845da3ee56a0..9de93714213a 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c | |||
@@ -55,7 +55,7 @@ | |||
55 | 55 | ||
56 | #define AUTO_OFF_TIMEOUT 2000 | 56 | #define AUTO_OFF_TIMEOUT 2000 |
57 | 57 | ||
58 | int enable_hs; | 58 | bool enable_hs; |
59 | 59 | ||
60 | static void hci_rx_work(struct work_struct *work); | 60 | static void hci_rx_work(struct work_struct *work); |
61 | static void hci_cmd_work(struct work_struct *work); | 61 | static void hci_cmd_work(struct work_struct *work); |
diff --git a/net/core/ethtool.c b/net/core/ethtool.c index 921aa2b4b415..369b41894527 100644 --- a/net/core/ethtool.c +++ b/net/core/ethtool.c | |||
@@ -1311,6 +1311,7 @@ int dev_ethtool(struct net *net, struct ifreq *ifr) | |||
1311 | case ETHTOOL_GRXCSUM: | 1311 | case ETHTOOL_GRXCSUM: |
1312 | case ETHTOOL_GTXCSUM: | 1312 | case ETHTOOL_GTXCSUM: |
1313 | case ETHTOOL_GSG: | 1313 | case ETHTOOL_GSG: |
1314 | case ETHTOOL_GSSET_INFO: | ||
1314 | case ETHTOOL_GSTRINGS: | 1315 | case ETHTOOL_GSTRINGS: |
1315 | case ETHTOOL_GTSO: | 1316 | case ETHTOOL_GTSO: |
1316 | case ETHTOOL_GPERMADDR: | 1317 | case ETHTOOL_GPERMADDR: |
diff --git a/net/core/flow_dissector.c b/net/core/flow_dissector.c index 0985b9b14b80..a225089df5b6 100644 --- a/net/core/flow_dissector.c +++ b/net/core/flow_dissector.c | |||
@@ -1,4 +1,5 @@ | |||
1 | #include <linux/skbuff.h> | 1 | #include <linux/skbuff.h> |
2 | #include <linux/export.h> | ||
2 | #include <linux/ip.h> | 3 | #include <linux/ip.h> |
3 | #include <linux/ipv6.h> | 4 | #include <linux/ipv6.h> |
4 | #include <linux/if_vlan.h> | 5 | #include <linux/if_vlan.h> |
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 65f80c7b1656..4d8ce93cd503 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
@@ -767,8 +767,8 @@ done: | |||
767 | return i; | 767 | return i; |
768 | } | 768 | } |
769 | 769 | ||
770 | static unsigned long num_arg(const char __user * user_buffer, | 770 | static long num_arg(const char __user *user_buffer, unsigned long maxlen, |
771 | unsigned long maxlen, unsigned long *num) | 771 | unsigned long *num) |
772 | { | 772 | { |
773 | int i; | 773 | int i; |
774 | *num = 0; | 774 | *num = 0; |
diff --git a/net/core/sock.c b/net/core/sock.c index 5c5af9988f94..3e81fd2e3c75 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -1827,7 +1827,7 @@ suppress_allocation: | |||
1827 | /* Alas. Undo changes. */ | 1827 | /* Alas. Undo changes. */ |
1828 | sk->sk_forward_alloc -= amt * SK_MEM_QUANTUM; | 1828 | sk->sk_forward_alloc -= amt * SK_MEM_QUANTUM; |
1829 | 1829 | ||
1830 | sk_memory_allocated_sub(sk, amt, parent_status); | 1830 | sk_memory_allocated_sub(sk, amt); |
1831 | 1831 | ||
1832 | return 0; | 1832 | return 0; |
1833 | } | 1833 | } |
@@ -1840,7 +1840,7 @@ EXPORT_SYMBOL(__sk_mem_schedule); | |||
1840 | void __sk_mem_reclaim(struct sock *sk) | 1840 | void __sk_mem_reclaim(struct sock *sk) |
1841 | { | 1841 | { |
1842 | sk_memory_allocated_sub(sk, | 1842 | sk_memory_allocated_sub(sk, |
1843 | sk->sk_forward_alloc >> SK_MEM_QUANTUM_SHIFT, 0); | 1843 | sk->sk_forward_alloc >> SK_MEM_QUANTUM_SHIFT); |
1844 | sk->sk_forward_alloc &= SK_MEM_QUANTUM - 1; | 1844 | sk->sk_forward_alloc &= SK_MEM_QUANTUM - 1; |
1845 | 1845 | ||
1846 | if (sk_under_memory_pressure(sk) && | 1846 | if (sk_under_memory_pressure(sk) && |
diff --git a/net/ipv4/proc.c b/net/ipv4/proc.c index 3569d8ecaeac..6afc807ee2ad 100644 --- a/net/ipv4/proc.c +++ b/net/ipv4/proc.c | |||
@@ -216,7 +216,6 @@ static const struct snmp_mib snmp4_net_list[] = { | |||
216 | SNMP_MIB_ITEM("TCPPartialUndo", LINUX_MIB_TCPPARTIALUNDO), | 216 | SNMP_MIB_ITEM("TCPPartialUndo", LINUX_MIB_TCPPARTIALUNDO), |
217 | SNMP_MIB_ITEM("TCPDSACKUndo", LINUX_MIB_TCPDSACKUNDO), | 217 | SNMP_MIB_ITEM("TCPDSACKUndo", LINUX_MIB_TCPDSACKUNDO), |
218 | SNMP_MIB_ITEM("TCPLossUndo", LINUX_MIB_TCPLOSSUNDO), | 218 | SNMP_MIB_ITEM("TCPLossUndo", LINUX_MIB_TCPLOSSUNDO), |
219 | SNMP_MIB_ITEM("TCPLoss", LINUX_MIB_TCPLOSS), | ||
220 | SNMP_MIB_ITEM("TCPLostRetransmit", LINUX_MIB_TCPLOSTRETRANSMIT), | 219 | SNMP_MIB_ITEM("TCPLostRetransmit", LINUX_MIB_TCPLOSTRETRANSMIT), |
221 | SNMP_MIB_ITEM("TCPRenoFailures", LINUX_MIB_TCPRENOFAILURES), | 220 | SNMP_MIB_ITEM("TCPRenoFailures", LINUX_MIB_TCPRENOFAILURES), |
222 | SNMP_MIB_ITEM("TCPSackFailures", LINUX_MIB_TCPSACKFAILURES), | 221 | SNMP_MIB_ITEM("TCPSackFailures", LINUX_MIB_TCPSACKFAILURES), |
diff --git a/net/ipv4/tcp_bic.c b/net/ipv4/tcp_bic.c index 6187eb4d1dcf..f45e1c242440 100644 --- a/net/ipv4/tcp_bic.c +++ b/net/ipv4/tcp_bic.c | |||
@@ -63,7 +63,6 @@ static inline void bictcp_reset(struct bictcp *ca) | |||
63 | { | 63 | { |
64 | ca->cnt = 0; | 64 | ca->cnt = 0; |
65 | ca->last_max_cwnd = 0; | 65 | ca->last_max_cwnd = 0; |
66 | ca->loss_cwnd = 0; | ||
67 | ca->last_cwnd = 0; | 66 | ca->last_cwnd = 0; |
68 | ca->last_time = 0; | 67 | ca->last_time = 0; |
69 | ca->epoch_start = 0; | 68 | ca->epoch_start = 0; |
@@ -72,7 +71,11 @@ static inline void bictcp_reset(struct bictcp *ca) | |||
72 | 71 | ||
73 | static void bictcp_init(struct sock *sk) | 72 | static void bictcp_init(struct sock *sk) |
74 | { | 73 | { |
75 | bictcp_reset(inet_csk_ca(sk)); | 74 | struct bictcp *ca = inet_csk_ca(sk); |
75 | |||
76 | bictcp_reset(ca); | ||
77 | ca->loss_cwnd = 0; | ||
78 | |||
76 | if (initial_ssthresh) | 79 | if (initial_ssthresh) |
77 | tcp_sk(sk)->snd_ssthresh = initial_ssthresh; | 80 | tcp_sk(sk)->snd_ssthresh = initial_ssthresh; |
78 | } | 81 | } |
@@ -127,7 +130,7 @@ static inline void bictcp_update(struct bictcp *ca, u32 cwnd) | |||
127 | } | 130 | } |
128 | 131 | ||
129 | /* if in slow start or link utilization is very low */ | 132 | /* if in slow start or link utilization is very low */ |
130 | if (ca->loss_cwnd == 0) { | 133 | if (ca->last_max_cwnd == 0) { |
131 | if (ca->cnt > 20) /* increase cwnd 5% per RTT */ | 134 | if (ca->cnt > 20) /* increase cwnd 5% per RTT */ |
132 | ca->cnt = 20; | 135 | ca->cnt = 20; |
133 | } | 136 | } |
@@ -185,7 +188,7 @@ static u32 bictcp_undo_cwnd(struct sock *sk) | |||
185 | { | 188 | { |
186 | const struct tcp_sock *tp = tcp_sk(sk); | 189 | const struct tcp_sock *tp = tcp_sk(sk); |
187 | const struct bictcp *ca = inet_csk_ca(sk); | 190 | const struct bictcp *ca = inet_csk_ca(sk); |
188 | return max(tp->snd_cwnd, ca->last_max_cwnd); | 191 | return max(tp->snd_cwnd, ca->loss_cwnd); |
189 | } | 192 | } |
190 | 193 | ||
191 | static void bictcp_state(struct sock *sk, u8 new_state) | 194 | static void bictcp_state(struct sock *sk, u8 new_state) |
diff --git a/net/ipv4/tcp_cubic.c b/net/ipv4/tcp_cubic.c index f376b05cca81..a9077f441cb2 100644 --- a/net/ipv4/tcp_cubic.c +++ b/net/ipv4/tcp_cubic.c | |||
@@ -107,7 +107,6 @@ static inline void bictcp_reset(struct bictcp *ca) | |||
107 | { | 107 | { |
108 | ca->cnt = 0; | 108 | ca->cnt = 0; |
109 | ca->last_max_cwnd = 0; | 109 | ca->last_max_cwnd = 0; |
110 | ca->loss_cwnd = 0; | ||
111 | ca->last_cwnd = 0; | 110 | ca->last_cwnd = 0; |
112 | ca->last_time = 0; | 111 | ca->last_time = 0; |
113 | ca->bic_origin_point = 0; | 112 | ca->bic_origin_point = 0; |
@@ -142,7 +141,10 @@ static inline void bictcp_hystart_reset(struct sock *sk) | |||
142 | 141 | ||
143 | static void bictcp_init(struct sock *sk) | 142 | static void bictcp_init(struct sock *sk) |
144 | { | 143 | { |
145 | bictcp_reset(inet_csk_ca(sk)); | 144 | struct bictcp *ca = inet_csk_ca(sk); |
145 | |||
146 | bictcp_reset(ca); | ||
147 | ca->loss_cwnd = 0; | ||
146 | 148 | ||
147 | if (hystart) | 149 | if (hystart) |
148 | bictcp_hystart_reset(sk); | 150 | bictcp_hystart_reset(sk); |
@@ -275,7 +277,7 @@ static inline void bictcp_update(struct bictcp *ca, u32 cwnd) | |||
275 | * The initial growth of cubic function may be too conservative | 277 | * The initial growth of cubic function may be too conservative |
276 | * when the available bandwidth is still unknown. | 278 | * when the available bandwidth is still unknown. |
277 | */ | 279 | */ |
278 | if (ca->loss_cwnd == 0 && ca->cnt > 20) | 280 | if (ca->last_max_cwnd == 0 && ca->cnt > 20) |
279 | ca->cnt = 20; /* increase cwnd 5% per RTT */ | 281 | ca->cnt = 20; /* increase cwnd 5% per RTT */ |
280 | 282 | ||
281 | /* TCP Friendly */ | 283 | /* TCP Friendly */ |
@@ -342,7 +344,7 @@ static u32 bictcp_undo_cwnd(struct sock *sk) | |||
342 | { | 344 | { |
343 | struct bictcp *ca = inet_csk_ca(sk); | 345 | struct bictcp *ca = inet_csk_ca(sk); |
344 | 346 | ||
345 | return max(tcp_sk(sk)->snd_cwnd, ca->last_max_cwnd); | 347 | return max(tcp_sk(sk)->snd_cwnd, ca->loss_cwnd); |
346 | } | 348 | } |
347 | 349 | ||
348 | static void bictcp_state(struct sock *sk, u8 new_state) | 350 | static void bictcp_state(struct sock *sk, u8 new_state) |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 2877c3e09587..976034f82320 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -105,7 +105,6 @@ int sysctl_tcp_abc __read_mostly; | |||
105 | #define FLAG_SYN_ACKED 0x10 /* This ACK acknowledged SYN. */ | 105 | #define FLAG_SYN_ACKED 0x10 /* This ACK acknowledged SYN. */ |
106 | #define FLAG_DATA_SACKED 0x20 /* New SACK. */ | 106 | #define FLAG_DATA_SACKED 0x20 /* New SACK. */ |
107 | #define FLAG_ECE 0x40 /* ECE in this ACK */ | 107 | #define FLAG_ECE 0x40 /* ECE in this ACK */ |
108 | #define FLAG_DATA_LOST 0x80 /* SACK detected data lossage. */ | ||
109 | #define FLAG_SLOWPATH 0x100 /* Do not skip RFC checks for window update.*/ | 108 | #define FLAG_SLOWPATH 0x100 /* Do not skip RFC checks for window update.*/ |
110 | #define FLAG_ONLY_ORIG_SACKED 0x200 /* SACKs only non-rexmit sent before RTO */ | 109 | #define FLAG_ONLY_ORIG_SACKED 0x200 /* SACKs only non-rexmit sent before RTO */ |
111 | #define FLAG_SND_UNA_ADVANCED 0x400 /* Snd_una was changed (!= FLAG_DATA_ACKED) */ | 110 | #define FLAG_SND_UNA_ADVANCED 0x400 /* Snd_una was changed (!= FLAG_DATA_ACKED) */ |
@@ -1040,13 +1039,11 @@ static void tcp_skb_mark_lost_uncond_verify(struct tcp_sock *tp, | |||
1040 | * These 6 states form finite state machine, controlled by the following events: | 1039 | * These 6 states form finite state machine, controlled by the following events: |
1041 | * 1. New ACK (+SACK) arrives. (tcp_sacktag_write_queue()) | 1040 | * 1. New ACK (+SACK) arrives. (tcp_sacktag_write_queue()) |
1042 | * 2. Retransmission. (tcp_retransmit_skb(), tcp_xmit_retransmit_queue()) | 1041 | * 2. Retransmission. (tcp_retransmit_skb(), tcp_xmit_retransmit_queue()) |
1043 | * 3. Loss detection event of one of three flavors: | 1042 | * 3. Loss detection event of two flavors: |
1044 | * A. Scoreboard estimator decided the packet is lost. | 1043 | * A. Scoreboard estimator decided the packet is lost. |
1045 | * A'. Reno "three dupacks" marks head of queue lost. | 1044 | * A'. Reno "three dupacks" marks head of queue lost. |
1046 | * A''. Its FACK modfication, head until snd.fack is lost. | 1045 | * A''. Its FACK modification, head until snd.fack is lost. |
1047 | * B. SACK arrives sacking data transmitted after never retransmitted | 1046 | * B. SACK arrives sacking SND.NXT at the moment, when the |
1048 | * hole was sent out. | ||
1049 | * C. SACK arrives sacking SND.NXT at the moment, when the | ||
1050 | * segment was retransmitted. | 1047 | * segment was retransmitted. |
1051 | * 4. D-SACK added new rule: D-SACK changes any tag to S. | 1048 | * 4. D-SACK added new rule: D-SACK changes any tag to S. |
1052 | * | 1049 | * |
@@ -1153,7 +1150,7 @@ static int tcp_is_sackblock_valid(struct tcp_sock *tp, int is_dsack, | |||
1153 | } | 1150 | } |
1154 | 1151 | ||
1155 | /* Check for lost retransmit. This superb idea is borrowed from "ratehalving". | 1152 | /* Check for lost retransmit. This superb idea is borrowed from "ratehalving". |
1156 | * Event "C". Later note: FACK people cheated me again 8), we have to account | 1153 | * Event "B". Later note: FACK people cheated me again 8), we have to account |
1157 | * for reordering! Ugly, but should help. | 1154 | * for reordering! Ugly, but should help. |
1158 | * | 1155 | * |
1159 | * Search retransmitted skbs from write_queue that were sent when snd_nxt was | 1156 | * Search retransmitted skbs from write_queue that were sent when snd_nxt was |
@@ -1844,10 +1841,6 @@ tcp_sacktag_write_queue(struct sock *sk, const struct sk_buff *ack_skb, | |||
1844 | if (found_dup_sack && ((i + 1) == first_sack_index)) | 1841 | if (found_dup_sack && ((i + 1) == first_sack_index)) |
1845 | next_dup = &sp[i + 1]; | 1842 | next_dup = &sp[i + 1]; |
1846 | 1843 | ||
1847 | /* Event "B" in the comment above. */ | ||
1848 | if (after(end_seq, tp->high_seq)) | ||
1849 | state.flag |= FLAG_DATA_LOST; | ||
1850 | |||
1851 | /* Skip too early cached blocks */ | 1844 | /* Skip too early cached blocks */ |
1852 | while (tcp_sack_cache_ok(tp, cache) && | 1845 | while (tcp_sack_cache_ok(tp, cache) && |
1853 | !before(start_seq, cache->end_seq)) | 1846 | !before(start_seq, cache->end_seq)) |
@@ -2515,8 +2508,11 @@ static void tcp_timeout_skbs(struct sock *sk) | |||
2515 | tcp_verify_left_out(tp); | 2508 | tcp_verify_left_out(tp); |
2516 | } | 2509 | } |
2517 | 2510 | ||
2518 | /* Mark head of queue up as lost. With RFC3517 SACK, the packets is | 2511 | /* Detect loss in event "A" above by marking head of queue up as lost. |
2519 | * is against sacked "cnt", otherwise it's against facked "cnt" | 2512 | * For FACK or non-SACK(Reno) senders, the first "packets" number of segments |
2513 | * are considered lost. For RFC3517 SACK, a segment is considered lost if it | ||
2514 | * has at least tp->reordering SACKed seqments above it; "packets" refers to | ||
2515 | * the maximum SACKed segments to pass before reaching this limit. | ||
2520 | */ | 2516 | */ |
2521 | static void tcp_mark_head_lost(struct sock *sk, int packets, int mark_head) | 2517 | static void tcp_mark_head_lost(struct sock *sk, int packets, int mark_head) |
2522 | { | 2518 | { |
@@ -2525,6 +2521,8 @@ static void tcp_mark_head_lost(struct sock *sk, int packets, int mark_head) | |||
2525 | int cnt, oldcnt; | 2521 | int cnt, oldcnt; |
2526 | int err; | 2522 | int err; |
2527 | unsigned int mss; | 2523 | unsigned int mss; |
2524 | /* Use SACK to deduce losses of new sequences sent during recovery */ | ||
2525 | const u32 loss_high = tcp_is_sack(tp) ? tp->snd_nxt : tp->high_seq; | ||
2528 | 2526 | ||
2529 | WARN_ON(packets > tp->packets_out); | 2527 | WARN_ON(packets > tp->packets_out); |
2530 | if (tp->lost_skb_hint) { | 2528 | if (tp->lost_skb_hint) { |
@@ -2546,7 +2544,7 @@ static void tcp_mark_head_lost(struct sock *sk, int packets, int mark_head) | |||
2546 | tp->lost_skb_hint = skb; | 2544 | tp->lost_skb_hint = skb; |
2547 | tp->lost_cnt_hint = cnt; | 2545 | tp->lost_cnt_hint = cnt; |
2548 | 2546 | ||
2549 | if (after(TCP_SKB_CB(skb)->end_seq, tp->high_seq)) | 2547 | if (after(TCP_SKB_CB(skb)->end_seq, loss_high)) |
2550 | break; | 2548 | break; |
2551 | 2549 | ||
2552 | oldcnt = cnt; | 2550 | oldcnt = cnt; |
@@ -3033,19 +3031,10 @@ static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked, | |||
3033 | if (tcp_check_sack_reneging(sk, flag)) | 3031 | if (tcp_check_sack_reneging(sk, flag)) |
3034 | return; | 3032 | return; |
3035 | 3033 | ||
3036 | /* C. Process data loss notification, provided it is valid. */ | 3034 | /* C. Check consistency of the current state. */ |
3037 | if (tcp_is_fack(tp) && (flag & FLAG_DATA_LOST) && | ||
3038 | before(tp->snd_una, tp->high_seq) && | ||
3039 | icsk->icsk_ca_state != TCP_CA_Open && | ||
3040 | tp->fackets_out > tp->reordering) { | ||
3041 | tcp_mark_head_lost(sk, tp->fackets_out - tp->reordering, 0); | ||
3042 | NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_TCPLOSS); | ||
3043 | } | ||
3044 | |||
3045 | /* D. Check consistency of the current state. */ | ||
3046 | tcp_verify_left_out(tp); | 3035 | tcp_verify_left_out(tp); |
3047 | 3036 | ||
3048 | /* E. Check state exit conditions. State can be terminated | 3037 | /* D. Check state exit conditions. State can be terminated |
3049 | * when high_seq is ACKed. */ | 3038 | * when high_seq is ACKed. */ |
3050 | if (icsk->icsk_ca_state == TCP_CA_Open) { | 3039 | if (icsk->icsk_ca_state == TCP_CA_Open) { |
3051 | WARN_ON(tp->retrans_out != 0); | 3040 | WARN_ON(tp->retrans_out != 0); |
@@ -3077,7 +3066,7 @@ static void tcp_fastretrans_alert(struct sock *sk, int pkts_acked, | |||
3077 | } | 3066 | } |
3078 | } | 3067 | } |
3079 | 3068 | ||
3080 | /* F. Process state. */ | 3069 | /* E. Process state. */ |
3081 | switch (icsk->icsk_ca_state) { | 3070 | switch (icsk->icsk_ca_state) { |
3082 | case TCP_CA_Recovery: | 3071 | case TCP_CA_Recovery: |
3083 | if (!(flag & FLAG_SND_UNA_ADVANCED)) { | 3072 | if (!(flag & FLAG_SND_UNA_ADVANCED)) { |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 1eb4ad57670e..337ba4cca052 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -631,7 +631,7 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb) | |||
631 | arg.iov[0].iov_len = sizeof(rep.th); | 631 | arg.iov[0].iov_len = sizeof(rep.th); |
632 | 632 | ||
633 | #ifdef CONFIG_TCP_MD5SIG | 633 | #ifdef CONFIG_TCP_MD5SIG |
634 | key = sk ? tcp_v4_md5_do_lookup(sk, ip_hdr(skb)->daddr) : NULL; | 634 | key = sk ? tcp_v4_md5_do_lookup(sk, ip_hdr(skb)->saddr) : NULL; |
635 | if (key) { | 635 | if (key) { |
636 | rep.opt[0] = htonl((TCPOPT_NOP << 24) | | 636 | rep.opt[0] = htonl((TCPOPT_NOP << 24) | |
637 | (TCPOPT_NOP << 16) | | 637 | (TCPOPT_NOP << 16) | |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index a225d5ee3c2f..c02280a4d126 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -502,29 +502,31 @@ static void addrconf_forward_change(struct net *net, __s32 newf) | |||
502 | rcu_read_unlock(); | 502 | rcu_read_unlock(); |
503 | } | 503 | } |
504 | 504 | ||
505 | static int addrconf_fixup_forwarding(struct ctl_table *table, int *p, int old) | 505 | static int addrconf_fixup_forwarding(struct ctl_table *table, int *p, int newf) |
506 | { | 506 | { |
507 | struct net *net; | 507 | struct net *net; |
508 | int old; | ||
509 | |||
510 | if (!rtnl_trylock()) | ||
511 | return restart_syscall(); | ||
508 | 512 | ||
509 | net = (struct net *)table->extra2; | 513 | net = (struct net *)table->extra2; |
510 | if (p == &net->ipv6.devconf_dflt->forwarding) | 514 | old = *p; |
511 | return 0; | 515 | *p = newf; |
512 | 516 | ||
513 | if (!rtnl_trylock()) { | 517 | if (p == &net->ipv6.devconf_dflt->forwarding) { |
514 | /* Restore the original values before restarting */ | 518 | rtnl_unlock(); |
515 | *p = old; | 519 | return 0; |
516 | return restart_syscall(); | ||
517 | } | 520 | } |
518 | 521 | ||
519 | if (p == &net->ipv6.devconf_all->forwarding) { | 522 | if (p == &net->ipv6.devconf_all->forwarding) { |
520 | __s32 newf = net->ipv6.devconf_all->forwarding; | ||
521 | net->ipv6.devconf_dflt->forwarding = newf; | 523 | net->ipv6.devconf_dflt->forwarding = newf; |
522 | addrconf_forward_change(net, newf); | 524 | addrconf_forward_change(net, newf); |
523 | } else if ((!*p) ^ (!old)) | 525 | } else if ((!newf) ^ (!old)) |
524 | dev_forward_change((struct inet6_dev *)table->extra1); | 526 | dev_forward_change((struct inet6_dev *)table->extra1); |
525 | rtnl_unlock(); | 527 | rtnl_unlock(); |
526 | 528 | ||
527 | if (*p) | 529 | if (newf) |
528 | rt6_purge_dflt_routers(net); | 530 | rt6_purge_dflt_routers(net); |
529 | return 1; | 531 | return 1; |
530 | } | 532 | } |
@@ -4260,9 +4262,17 @@ int addrconf_sysctl_forward(ctl_table *ctl, int write, | |||
4260 | int *valp = ctl->data; | 4262 | int *valp = ctl->data; |
4261 | int val = *valp; | 4263 | int val = *valp; |
4262 | loff_t pos = *ppos; | 4264 | loff_t pos = *ppos; |
4265 | ctl_table lctl; | ||
4263 | int ret; | 4266 | int ret; |
4264 | 4267 | ||
4265 | ret = proc_dointvec(ctl, write, buffer, lenp, ppos); | 4268 | /* |
4269 | * ctl->data points to idev->cnf.forwarding, we should | ||
4270 | * not modify it until we get the rtnl lock. | ||
4271 | */ | ||
4272 | lctl = *ctl; | ||
4273 | lctl.data = &val; | ||
4274 | |||
4275 | ret = proc_dointvec(&lctl, write, buffer, lenp, ppos); | ||
4266 | 4276 | ||
4267 | if (write) | 4277 | if (write) |
4268 | ret = addrconf_fixup_forwarding(ctl, valp, val); | 4278 | ret = addrconf_fixup_forwarding(ctl, valp, val); |
@@ -4300,26 +4310,27 @@ static void addrconf_disable_change(struct net *net, __s32 newf) | |||
4300 | rcu_read_unlock(); | 4310 | rcu_read_unlock(); |
4301 | } | 4311 | } |
4302 | 4312 | ||
4303 | static int addrconf_disable_ipv6(struct ctl_table *table, int *p, int old) | 4313 | static int addrconf_disable_ipv6(struct ctl_table *table, int *p, int newf) |
4304 | { | 4314 | { |
4305 | struct net *net; | 4315 | struct net *net; |
4316 | int old; | ||
4317 | |||
4318 | if (!rtnl_trylock()) | ||
4319 | return restart_syscall(); | ||
4306 | 4320 | ||
4307 | net = (struct net *)table->extra2; | 4321 | net = (struct net *)table->extra2; |
4322 | old = *p; | ||
4323 | *p = newf; | ||
4308 | 4324 | ||
4309 | if (p == &net->ipv6.devconf_dflt->disable_ipv6) | 4325 | if (p == &net->ipv6.devconf_dflt->disable_ipv6) { |
4326 | rtnl_unlock(); | ||
4310 | return 0; | 4327 | return 0; |
4311 | |||
4312 | if (!rtnl_trylock()) { | ||
4313 | /* Restore the original values before restarting */ | ||
4314 | *p = old; | ||
4315 | return restart_syscall(); | ||
4316 | } | 4328 | } |
4317 | 4329 | ||
4318 | if (p == &net->ipv6.devconf_all->disable_ipv6) { | 4330 | if (p == &net->ipv6.devconf_all->disable_ipv6) { |
4319 | __s32 newf = net->ipv6.devconf_all->disable_ipv6; | ||
4320 | net->ipv6.devconf_dflt->disable_ipv6 = newf; | 4331 | net->ipv6.devconf_dflt->disable_ipv6 = newf; |
4321 | addrconf_disable_change(net, newf); | 4332 | addrconf_disable_change(net, newf); |
4322 | } else if ((!*p) ^ (!old)) | 4333 | } else if ((!newf) ^ (!old)) |
4323 | dev_disable_change((struct inet6_dev *)table->extra1); | 4334 | dev_disable_change((struct inet6_dev *)table->extra1); |
4324 | 4335 | ||
4325 | rtnl_unlock(); | 4336 | rtnl_unlock(); |
@@ -4333,9 +4344,17 @@ int addrconf_sysctl_disable(ctl_table *ctl, int write, | |||
4333 | int *valp = ctl->data; | 4344 | int *valp = ctl->data; |
4334 | int val = *valp; | 4345 | int val = *valp; |
4335 | loff_t pos = *ppos; | 4346 | loff_t pos = *ppos; |
4347 | ctl_table lctl; | ||
4336 | int ret; | 4348 | int ret; |
4337 | 4349 | ||
4338 | ret = proc_dointvec(ctl, write, buffer, lenp, ppos); | 4350 | /* |
4351 | * ctl->data points to idev->cnf.disable_ipv6, we should | ||
4352 | * not modify it until we get the rtnl lock. | ||
4353 | */ | ||
4354 | lctl = *ctl; | ||
4355 | lctl.data = &val; | ||
4356 | |||
4357 | ret = proc_dointvec(&lctl, write, buffer, lenp, ppos); | ||
4339 | 4358 | ||
4340 | if (write) | 4359 | if (write) |
4341 | ret = addrconf_disable_ipv6(ctl, valp, val); | 4360 | ret = addrconf_disable_ipv6(ctl, valp, val); |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 906c7ca43542..3edd05ae4388 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
@@ -1083,7 +1083,7 @@ static void tcp_v6_send_reset(struct sock *sk, struct sk_buff *skb) | |||
1083 | 1083 | ||
1084 | #ifdef CONFIG_TCP_MD5SIG | 1084 | #ifdef CONFIG_TCP_MD5SIG |
1085 | if (sk) | 1085 | if (sk) |
1086 | key = tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->daddr); | 1086 | key = tcp_v6_md5_do_lookup(sk, &ipv6_hdr(skb)->saddr); |
1087 | #endif | 1087 | #endif |
1088 | 1088 | ||
1089 | if (th->ack) | 1089 | if (th->ack) |
diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c index a18e6c3d36e3..b9bef2c75026 100644 --- a/net/llc/af_llc.c +++ b/net/llc/af_llc.c | |||
@@ -713,6 +713,7 @@ static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
713 | struct sk_buff *skb = NULL; | 713 | struct sk_buff *skb = NULL; |
714 | struct sock *sk = sock->sk; | 714 | struct sock *sk = sock->sk; |
715 | struct llc_sock *llc = llc_sk(sk); | 715 | struct llc_sock *llc = llc_sk(sk); |
716 | unsigned long cpu_flags; | ||
716 | size_t copied = 0; | 717 | size_t copied = 0; |
717 | u32 peek_seq = 0; | 718 | u32 peek_seq = 0; |
718 | u32 *seq; | 719 | u32 *seq; |
@@ -838,7 +839,9 @@ static int llc_ui_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
838 | goto copy_uaddr; | 839 | goto copy_uaddr; |
839 | 840 | ||
840 | if (!(flags & MSG_PEEK)) { | 841 | if (!(flags & MSG_PEEK)) { |
842 | spin_lock_irqsave(&sk->sk_receive_queue.lock, cpu_flags); | ||
841 | sk_eat_skb(sk, skb, 0); | 843 | sk_eat_skb(sk, skb, 0); |
844 | spin_unlock_irqrestore(&sk->sk_receive_queue.lock, cpu_flags); | ||
842 | *seq = 0; | 845 | *seq = 0; |
843 | } | 846 | } |
844 | 847 | ||
@@ -859,7 +862,9 @@ copy_uaddr: | |||
859 | llc_cmsg_rcv(msg, skb); | 862 | llc_cmsg_rcv(msg, skb); |
860 | 863 | ||
861 | if (!(flags & MSG_PEEK)) { | 864 | if (!(flags & MSG_PEEK)) { |
865 | spin_lock_irqsave(&sk->sk_receive_queue.lock, cpu_flags); | ||
862 | sk_eat_skb(sk, skb, 0); | 866 | sk_eat_skb(sk, skb, 0); |
867 | spin_unlock_irqrestore(&sk->sk_receive_queue.lock, cpu_flags); | ||
863 | *seq = 0; | 868 | *seq = 0; |
864 | } | 869 | } |
865 | 870 | ||
diff --git a/net/mac80211/debugfs_key.c b/net/mac80211/debugfs_key.c index 38e6101190d9..59edcd95a58d 100644 --- a/net/mac80211/debugfs_key.c +++ b/net/mac80211/debugfs_key.c | |||
@@ -225,9 +225,9 @@ KEY_OPS(key); | |||
225 | key, &key_##name##_ops); | 225 | key, &key_##name##_ops); |
226 | 226 | ||
227 | void ieee80211_debugfs_key_add(struct ieee80211_key *key) | 227 | void ieee80211_debugfs_key_add(struct ieee80211_key *key) |
228 | { | 228 | { |
229 | static int keycount; | 229 | static int keycount; |
230 | char buf[50]; | 230 | char buf[100]; |
231 | struct sta_info *sta; | 231 | struct sta_info *sta; |
232 | 232 | ||
233 | if (!key->local->debugfs.keys) | 233 | if (!key->local->debugfs.keys) |
@@ -244,7 +244,8 @@ void ieee80211_debugfs_key_add(struct ieee80211_key *key) | |||
244 | 244 | ||
245 | sta = key->sta; | 245 | sta = key->sta; |
246 | if (sta) { | 246 | if (sta) { |
247 | sprintf(buf, "../../stations/%pM", sta->sta.addr); | 247 | sprintf(buf, "../../netdev:%s/stations/%pM", |
248 | sta->sdata->name, sta->sta.addr); | ||
248 | key->debugfs.stalink = | 249 | key->debugfs.stalink = |
249 | debugfs_create_symlink("station", key->debugfs.dir, buf); | 250 | debugfs_create_symlink("station", key->debugfs.dir, buf); |
250 | } | 251 | } |
diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c index 73abb7524b2c..54df1b2bafd2 100644 --- a/net/mac80211/mesh_hwmp.c +++ b/net/mac80211/mesh_hwmp.c | |||
@@ -119,12 +119,12 @@ static int mesh_path_sel_frame_tx(enum mpath_frame_type action, u8 flags, | |||
119 | int hdr_len = offsetof(struct ieee80211_mgmt, u.action.u.mesh_action) + | 119 | int hdr_len = offsetof(struct ieee80211_mgmt, u.action.u.mesh_action) + |
120 | sizeof(mgmt->u.action.u.mesh_action); | 120 | sizeof(mgmt->u.action.u.mesh_action); |
121 | 121 | ||
122 | skb = dev_alloc_skb(local->hw.extra_tx_headroom + | 122 | skb = dev_alloc_skb(local->tx_headroom + |
123 | hdr_len + | 123 | hdr_len + |
124 | 2 + 37); /* max HWMP IE */ | 124 | 2 + 37); /* max HWMP IE */ |
125 | if (!skb) | 125 | if (!skb) |
126 | return -1; | 126 | return -1; |
127 | skb_reserve(skb, local->hw.extra_tx_headroom); | 127 | skb_reserve(skb, local->tx_headroom); |
128 | mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len); | 128 | mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len); |
129 | memset(mgmt, 0, hdr_len); | 129 | memset(mgmt, 0, hdr_len); |
130 | mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | | 130 | mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | |
@@ -250,12 +250,12 @@ int mesh_path_error_tx(u8 ttl, u8 *target, __le32 target_sn, | |||
250 | if (time_before(jiffies, ifmsh->next_perr)) | 250 | if (time_before(jiffies, ifmsh->next_perr)) |
251 | return -EAGAIN; | 251 | return -EAGAIN; |
252 | 252 | ||
253 | skb = dev_alloc_skb(local->hw.extra_tx_headroom + | 253 | skb = dev_alloc_skb(local->tx_headroom + |
254 | hdr_len + | 254 | hdr_len + |
255 | 2 + 15 /* PERR IE */); | 255 | 2 + 15 /* PERR IE */); |
256 | if (!skb) | 256 | if (!skb) |
257 | return -1; | 257 | return -1; |
258 | skb_reserve(skb, local->tx_headroom + local->hw.extra_tx_headroom); | 258 | skb_reserve(skb, local->tx_headroom); |
259 | mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len); | 259 | mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len); |
260 | memset(mgmt, 0, hdr_len); | 260 | memset(mgmt, 0, hdr_len); |
261 | mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | | 261 | mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | |
diff --git a/net/mac80211/mesh_plink.c b/net/mac80211/mesh_plink.c index 41ef1b476442..a17251730b9e 100644 --- a/net/mac80211/mesh_plink.c +++ b/net/mac80211/mesh_plink.c | |||
@@ -172,7 +172,7 @@ static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata, | |||
172 | int hdr_len = offsetof(struct ieee80211_mgmt, u.action.u.self_prot) + | 172 | int hdr_len = offsetof(struct ieee80211_mgmt, u.action.u.self_prot) + |
173 | sizeof(mgmt->u.action.u.self_prot); | 173 | sizeof(mgmt->u.action.u.self_prot); |
174 | 174 | ||
175 | skb = dev_alloc_skb(local->hw.extra_tx_headroom + | 175 | skb = dev_alloc_skb(local->tx_headroom + |
176 | hdr_len + | 176 | hdr_len + |
177 | 2 + /* capability info */ | 177 | 2 + /* capability info */ |
178 | 2 + /* AID */ | 178 | 2 + /* AID */ |
@@ -186,7 +186,7 @@ static int mesh_plink_frame_tx(struct ieee80211_sub_if_data *sdata, | |||
186 | sdata->u.mesh.ie_len); | 186 | sdata->u.mesh.ie_len); |
187 | if (!skb) | 187 | if (!skb) |
188 | return -1; | 188 | return -1; |
189 | skb_reserve(skb, local->hw.extra_tx_headroom); | 189 | skb_reserve(skb, local->tx_headroom); |
190 | mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len); | 190 | mgmt = (struct ieee80211_mgmt *) skb_put(skb, hdr_len); |
191 | memset(mgmt, 0, hdr_len); | 191 | memset(mgmt, 0, hdr_len); |
192 | mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | | 192 | mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index ecb4c84c1bb3..295be92f7c77 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -2750,7 +2750,6 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, | |||
2750 | { | 2750 | { |
2751 | struct ieee80211_local *local = sdata->local; | 2751 | struct ieee80211_local *local = sdata->local; |
2752 | struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; | 2752 | struct ieee80211_if_managed *ifmgd = &sdata->u.mgd; |
2753 | struct ieee80211_work *wk; | ||
2754 | u8 bssid[ETH_ALEN]; | 2753 | u8 bssid[ETH_ALEN]; |
2755 | bool assoc_bss = false; | 2754 | bool assoc_bss = false; |
2756 | 2755 | ||
@@ -2763,30 +2762,47 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, | |||
2763 | assoc_bss = true; | 2762 | assoc_bss = true; |
2764 | } else { | 2763 | } else { |
2765 | bool not_auth_yet = false; | 2764 | bool not_auth_yet = false; |
2765 | struct ieee80211_work *tmp, *wk = NULL; | ||
2766 | 2766 | ||
2767 | mutex_unlock(&ifmgd->mtx); | 2767 | mutex_unlock(&ifmgd->mtx); |
2768 | 2768 | ||
2769 | mutex_lock(&local->mtx); | 2769 | mutex_lock(&local->mtx); |
2770 | list_for_each_entry(wk, &local->work_list, list) { | 2770 | list_for_each_entry(tmp, &local->work_list, list) { |
2771 | if (wk->sdata != sdata) | 2771 | if (tmp->sdata != sdata) |
2772 | continue; | 2772 | continue; |
2773 | 2773 | ||
2774 | if (wk->type != IEEE80211_WORK_DIRECT_PROBE && | 2774 | if (tmp->type != IEEE80211_WORK_DIRECT_PROBE && |
2775 | wk->type != IEEE80211_WORK_AUTH && | 2775 | tmp->type != IEEE80211_WORK_AUTH && |
2776 | wk->type != IEEE80211_WORK_ASSOC && | 2776 | tmp->type != IEEE80211_WORK_ASSOC && |
2777 | wk->type != IEEE80211_WORK_ASSOC_BEACON_WAIT) | 2777 | tmp->type != IEEE80211_WORK_ASSOC_BEACON_WAIT) |
2778 | continue; | 2778 | continue; |
2779 | 2779 | ||
2780 | if (memcmp(req->bss->bssid, wk->filter_ta, ETH_ALEN)) | 2780 | if (memcmp(req->bss->bssid, tmp->filter_ta, ETH_ALEN)) |
2781 | continue; | 2781 | continue; |
2782 | 2782 | ||
2783 | not_auth_yet = wk->type == IEEE80211_WORK_DIRECT_PROBE; | 2783 | not_auth_yet = tmp->type == IEEE80211_WORK_DIRECT_PROBE; |
2784 | list_del_rcu(&wk->list); | 2784 | list_del_rcu(&tmp->list); |
2785 | free_work(wk); | 2785 | synchronize_rcu(); |
2786 | wk = tmp; | ||
2786 | break; | 2787 | break; |
2787 | } | 2788 | } |
2788 | mutex_unlock(&local->mtx); | 2789 | mutex_unlock(&local->mtx); |
2789 | 2790 | ||
2791 | if (wk && wk->type == IEEE80211_WORK_ASSOC) { | ||
2792 | /* clean up dummy sta & TX sync */ | ||
2793 | sta_info_destroy_addr(wk->sdata, wk->filter_ta); | ||
2794 | if (wk->assoc.synced) | ||
2795 | drv_finish_tx_sync(local, wk->sdata, | ||
2796 | wk->filter_ta, | ||
2797 | IEEE80211_TX_SYNC_ASSOC); | ||
2798 | } else if (wk && wk->type == IEEE80211_WORK_AUTH) { | ||
2799 | if (wk->probe_auth.synced) | ||
2800 | drv_finish_tx_sync(local, wk->sdata, | ||
2801 | wk->filter_ta, | ||
2802 | IEEE80211_TX_SYNC_AUTH); | ||
2803 | } | ||
2804 | kfree(wk); | ||
2805 | |||
2790 | /* | 2806 | /* |
2791 | * If somebody requests authentication and we haven't | 2807 | * If somebody requests authentication and we haven't |
2792 | * sent out an auth frame yet there's no need to send | 2808 | * sent out an auth frame yet there's no need to send |
diff --git a/net/rds/af_rds.c b/net/rds/af_rds.c index bb6ad81b671d..424ff622ab5f 100644 --- a/net/rds/af_rds.c +++ b/net/rds/af_rds.c | |||
@@ -68,7 +68,6 @@ static int rds_release(struct socket *sock) | |||
68 | { | 68 | { |
69 | struct sock *sk = sock->sk; | 69 | struct sock *sk = sock->sk; |
70 | struct rds_sock *rs; | 70 | struct rds_sock *rs; |
71 | unsigned long flags; | ||
72 | 71 | ||
73 | if (!sk) | 72 | if (!sk) |
74 | goto out; | 73 | goto out; |
@@ -94,10 +93,10 @@ static int rds_release(struct socket *sock) | |||
94 | rds_rdma_drop_keys(rs); | 93 | rds_rdma_drop_keys(rs); |
95 | rds_notify_queue_get(rs, NULL); | 94 | rds_notify_queue_get(rs, NULL); |
96 | 95 | ||
97 | spin_lock_irqsave(&rds_sock_lock, flags); | 96 | spin_lock_bh(&rds_sock_lock); |
98 | list_del_init(&rs->rs_item); | 97 | list_del_init(&rs->rs_item); |
99 | rds_sock_count--; | 98 | rds_sock_count--; |
100 | spin_unlock_irqrestore(&rds_sock_lock, flags); | 99 | spin_unlock_bh(&rds_sock_lock); |
101 | 100 | ||
102 | rds_trans_put(rs->rs_transport); | 101 | rds_trans_put(rs->rs_transport); |
103 | 102 | ||
@@ -409,7 +408,6 @@ static const struct proto_ops rds_proto_ops = { | |||
409 | 408 | ||
410 | static int __rds_create(struct socket *sock, struct sock *sk, int protocol) | 409 | static int __rds_create(struct socket *sock, struct sock *sk, int protocol) |
411 | { | 410 | { |
412 | unsigned long flags; | ||
413 | struct rds_sock *rs; | 411 | struct rds_sock *rs; |
414 | 412 | ||
415 | sock_init_data(sock, sk); | 413 | sock_init_data(sock, sk); |
@@ -426,10 +424,10 @@ static int __rds_create(struct socket *sock, struct sock *sk, int protocol) | |||
426 | spin_lock_init(&rs->rs_rdma_lock); | 424 | spin_lock_init(&rs->rs_rdma_lock); |
427 | rs->rs_rdma_keys = RB_ROOT; | 425 | rs->rs_rdma_keys = RB_ROOT; |
428 | 426 | ||
429 | spin_lock_irqsave(&rds_sock_lock, flags); | 427 | spin_lock_bh(&rds_sock_lock); |
430 | list_add_tail(&rs->rs_item, &rds_sock_list); | 428 | list_add_tail(&rs->rs_item, &rds_sock_list); |
431 | rds_sock_count++; | 429 | rds_sock_count++; |
432 | spin_unlock_irqrestore(&rds_sock_lock, flags); | 430 | spin_unlock_bh(&rds_sock_lock); |
433 | 431 | ||
434 | return 0; | 432 | return 0; |
435 | } | 433 | } |
@@ -471,12 +469,11 @@ static void rds_sock_inc_info(struct socket *sock, unsigned int len, | |||
471 | { | 469 | { |
472 | struct rds_sock *rs; | 470 | struct rds_sock *rs; |
473 | struct rds_incoming *inc; | 471 | struct rds_incoming *inc; |
474 | unsigned long flags; | ||
475 | unsigned int total = 0; | 472 | unsigned int total = 0; |
476 | 473 | ||
477 | len /= sizeof(struct rds_info_message); | 474 | len /= sizeof(struct rds_info_message); |
478 | 475 | ||
479 | spin_lock_irqsave(&rds_sock_lock, flags); | 476 | spin_lock_bh(&rds_sock_lock); |
480 | 477 | ||
481 | list_for_each_entry(rs, &rds_sock_list, rs_item) { | 478 | list_for_each_entry(rs, &rds_sock_list, rs_item) { |
482 | read_lock(&rs->rs_recv_lock); | 479 | read_lock(&rs->rs_recv_lock); |
@@ -492,7 +489,7 @@ static void rds_sock_inc_info(struct socket *sock, unsigned int len, | |||
492 | read_unlock(&rs->rs_recv_lock); | 489 | read_unlock(&rs->rs_recv_lock); |
493 | } | 490 | } |
494 | 491 | ||
495 | spin_unlock_irqrestore(&rds_sock_lock, flags); | 492 | spin_unlock_bh(&rds_sock_lock); |
496 | 493 | ||
497 | lens->nr = total; | 494 | lens->nr = total; |
498 | lens->each = sizeof(struct rds_info_message); | 495 | lens->each = sizeof(struct rds_info_message); |
@@ -504,11 +501,10 @@ static void rds_sock_info(struct socket *sock, unsigned int len, | |||
504 | { | 501 | { |
505 | struct rds_info_socket sinfo; | 502 | struct rds_info_socket sinfo; |
506 | struct rds_sock *rs; | 503 | struct rds_sock *rs; |
507 | unsigned long flags; | ||
508 | 504 | ||
509 | len /= sizeof(struct rds_info_socket); | 505 | len /= sizeof(struct rds_info_socket); |
510 | 506 | ||
511 | spin_lock_irqsave(&rds_sock_lock, flags); | 507 | spin_lock_bh(&rds_sock_lock); |
512 | 508 | ||
513 | if (len < rds_sock_count) | 509 | if (len < rds_sock_count) |
514 | goto out; | 510 | goto out; |
@@ -529,7 +525,7 @@ out: | |||
529 | lens->nr = rds_sock_count; | 525 | lens->nr = rds_sock_count; |
530 | lens->each = sizeof(struct rds_info_socket); | 526 | lens->each = sizeof(struct rds_info_socket); |
531 | 527 | ||
532 | spin_unlock_irqrestore(&rds_sock_lock, flags); | 528 | spin_unlock_bh(&rds_sock_lock); |
533 | } | 529 | } |
534 | 530 | ||
535 | static void rds_exit(void) | 531 | static void rds_exit(void) |
diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c index e7e1d0b57b3d..2776012132ea 100644 --- a/net/sched/sch_netem.c +++ b/net/sched/sch_netem.c | |||
@@ -419,7 +419,7 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch) | |||
419 | 419 | ||
420 | cb = netem_skb_cb(skb); | 420 | cb = netem_skb_cb(skb); |
421 | if (q->gap == 0 || /* not doing reordering */ | 421 | if (q->gap == 0 || /* not doing reordering */ |
422 | q->counter < q->gap || /* inside last reordering gap */ | 422 | q->counter < q->gap - 1 || /* inside last reordering gap */ |
423 | q->reorder < get_crandom(&q->reorder_cor)) { | 423 | q->reorder < get_crandom(&q->reorder_cor)) { |
424 | psched_time_t now; | 424 | psched_time_t now; |
425 | psched_tdiff_t delay; | 425 | psched_tdiff_t delay; |