diff options
author | David S. Miller <davem@davemloft.net> | 2008-12-15 23:03:50 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-12-15 23:03:50 -0500 |
commit | eb14f019597cd86c21a6c601d7e900f40030c2e7 (patch) | |
tree | 36fb2f36a1747f98988f87215db1eef3a71d45eb /net | |
parent | 9a4a84294b0d60b8c287131478f743ba2bc68949 (diff) | |
parent | a3dd15444baa9c7522c8457ab564c41219dfb44c (diff) |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts:
drivers/net/e1000e/ich8lan.c
Diffstat (limited to 'net')
-rw-r--r-- | net/core/netpoll.c | 2 | ||||
-rw-r--r-- | net/ipv4/netfilter/nf_nat_rule.c | 2 | ||||
-rw-r--r-- | net/ipv4/tcp_vegas.c | 80 | ||||
-rw-r--r-- | net/ipv6/ndisc.c | 7 | ||||
-rw-r--r-- | net/netfilter/xt_socket.c | 2 | ||||
-rw-r--r-- | net/netlabel/netlabel_unlabeled.c | 38 | ||||
-rw-r--r-- | net/phonet/pep-gprs.c | 27 | ||||
-rw-r--r-- | net/sched/sch_netem.c | 3 | ||||
-rw-r--r-- | net/sunrpc/svcsock.c | 9 |
9 files changed, 69 insertions, 101 deletions
diff --git a/net/core/netpoll.c b/net/core/netpoll.c index 96fb0519eb7a..755414cd49d1 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c | |||
@@ -134,9 +134,11 @@ static int poll_one_napi(struct netpoll_info *npinfo, | |||
134 | 134 | ||
135 | npinfo->rx_flags |= NETPOLL_RX_DROP; | 135 | npinfo->rx_flags |= NETPOLL_RX_DROP; |
136 | atomic_inc(&trapped); | 136 | atomic_inc(&trapped); |
137 | set_bit(NAPI_STATE_NPSVC, &napi->state); | ||
137 | 138 | ||
138 | work = napi->poll(napi, budget); | 139 | work = napi->poll(napi, budget); |
139 | 140 | ||
141 | clear_bit(NAPI_STATE_NPSVC, &napi->state); | ||
140 | atomic_dec(&trapped); | 142 | atomic_dec(&trapped); |
141 | npinfo->rx_flags &= ~NETPOLL_RX_DROP; | 143 | npinfo->rx_flags &= ~NETPOLL_RX_DROP; |
142 | 144 | ||
diff --git a/net/ipv4/netfilter/nf_nat_rule.c b/net/ipv4/netfilter/nf_nat_rule.c index cf95469ab9f1..a7eb04719044 100644 --- a/net/ipv4/netfilter/nf_nat_rule.c +++ b/net/ipv4/netfilter/nf_nat_rule.c | |||
@@ -61,7 +61,7 @@ static struct | |||
61 | static struct xt_table nat_table = { | 61 | static struct xt_table nat_table = { |
62 | .name = "nat", | 62 | .name = "nat", |
63 | .valid_hooks = NAT_VALID_HOOKS, | 63 | .valid_hooks = NAT_VALID_HOOKS, |
64 | .lock = __RW_LOCK_UNLOCKED(__nat_table.lock), | 64 | .lock = __RW_LOCK_UNLOCKED(nat_table.lock), |
65 | .me = THIS_MODULE, | 65 | .me = THIS_MODULE, |
66 | .af = AF_INET, | 66 | .af = AF_INET, |
67 | }; | 67 | }; |
diff --git a/net/ipv4/tcp_vegas.c b/net/ipv4/tcp_vegas.c index 7cd22262de3a..a453aac91bd3 100644 --- a/net/ipv4/tcp_vegas.c +++ b/net/ipv4/tcp_vegas.c | |||
@@ -40,18 +40,14 @@ | |||
40 | 40 | ||
41 | #include "tcp_vegas.h" | 41 | #include "tcp_vegas.h" |
42 | 42 | ||
43 | /* Default values of the Vegas variables, in fixed-point representation | 43 | static int alpha = 2; |
44 | * with V_PARAM_SHIFT bits to the right of the binary point. | 44 | static int beta = 4; |
45 | */ | 45 | static int gamma = 1; |
46 | #define V_PARAM_SHIFT 1 | ||
47 | static int alpha = 2<<V_PARAM_SHIFT; | ||
48 | static int beta = 4<<V_PARAM_SHIFT; | ||
49 | static int gamma = 1<<V_PARAM_SHIFT; | ||
50 | 46 | ||
51 | module_param(alpha, int, 0644); | 47 | module_param(alpha, int, 0644); |
52 | MODULE_PARM_DESC(alpha, "lower bound of packets in network (scale by 2)"); | 48 | MODULE_PARM_DESC(alpha, "lower bound of packets in network"); |
53 | module_param(beta, int, 0644); | 49 | module_param(beta, int, 0644); |
54 | MODULE_PARM_DESC(beta, "upper bound of packets in network (scale by 2)"); | 50 | MODULE_PARM_DESC(beta, "upper bound of packets in network"); |
55 | module_param(gamma, int, 0644); | 51 | module_param(gamma, int, 0644); |
56 | MODULE_PARM_DESC(gamma, "limit on increase (scale by 2)"); | 52 | MODULE_PARM_DESC(gamma, "limit on increase (scale by 2)"); |
57 | 53 | ||
@@ -172,49 +168,13 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 in_flight) | |||
172 | return; | 168 | return; |
173 | } | 169 | } |
174 | 170 | ||
175 | /* The key players are v_beg_snd_una and v_beg_snd_nxt. | ||
176 | * | ||
177 | * These are so named because they represent the approximate values | ||
178 | * of snd_una and snd_nxt at the beginning of the current RTT. More | ||
179 | * precisely, they represent the amount of data sent during the RTT. | ||
180 | * At the end of the RTT, when we receive an ACK for v_beg_snd_nxt, | ||
181 | * we will calculate that (v_beg_snd_nxt - v_beg_snd_una) outstanding | ||
182 | * bytes of data have been ACKed during the course of the RTT, giving | ||
183 | * an "actual" rate of: | ||
184 | * | ||
185 | * (v_beg_snd_nxt - v_beg_snd_una) / (rtt duration) | ||
186 | * | ||
187 | * Unfortunately, v_beg_snd_una is not exactly equal to snd_una, | ||
188 | * because delayed ACKs can cover more than one segment, so they | ||
189 | * don't line up nicely with the boundaries of RTTs. | ||
190 | * | ||
191 | * Another unfortunate fact of life is that delayed ACKs delay the | ||
192 | * advance of the left edge of our send window, so that the number | ||
193 | * of bytes we send in an RTT is often less than our cwnd will allow. | ||
194 | * So we keep track of our cwnd separately, in v_beg_snd_cwnd. | ||
195 | */ | ||
196 | |||
197 | if (after(ack, vegas->beg_snd_nxt)) { | 171 | if (after(ack, vegas->beg_snd_nxt)) { |
198 | /* Do the Vegas once-per-RTT cwnd adjustment. */ | 172 | /* Do the Vegas once-per-RTT cwnd adjustment. */ |
199 | u32 old_wnd, old_snd_cwnd; | ||
200 | |||
201 | |||
202 | /* Here old_wnd is essentially the window of data that was | ||
203 | * sent during the previous RTT, and has all | ||
204 | * been acknowledged in the course of the RTT that ended | ||
205 | * with the ACK we just received. Likewise, old_snd_cwnd | ||
206 | * is the cwnd during the previous RTT. | ||
207 | */ | ||
208 | old_wnd = (vegas->beg_snd_nxt - vegas->beg_snd_una) / | ||
209 | tp->mss_cache; | ||
210 | old_snd_cwnd = vegas->beg_snd_cwnd; | ||
211 | 173 | ||
212 | /* Save the extent of the current window so we can use this | 174 | /* Save the extent of the current window so we can use this |
213 | * at the end of the next RTT. | 175 | * at the end of the next RTT. |
214 | */ | 176 | */ |
215 | vegas->beg_snd_una = vegas->beg_snd_nxt; | ||
216 | vegas->beg_snd_nxt = tp->snd_nxt; | 177 | vegas->beg_snd_nxt = tp->snd_nxt; |
217 | vegas->beg_snd_cwnd = tp->snd_cwnd; | ||
218 | 178 | ||
219 | /* We do the Vegas calculations only if we got enough RTT | 179 | /* We do the Vegas calculations only if we got enough RTT |
220 | * samples that we can be reasonably sure that we got | 180 | * samples that we can be reasonably sure that we got |
@@ -252,22 +212,14 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 in_flight) | |||
252 | * | 212 | * |
253 | * This is: | 213 | * This is: |
254 | * (actual rate in segments) * baseRTT | 214 | * (actual rate in segments) * baseRTT |
255 | * We keep it as a fixed point number with | ||
256 | * V_PARAM_SHIFT bits to the right of the binary point. | ||
257 | */ | 215 | */ |
258 | target_cwnd = ((u64)old_wnd * vegas->baseRTT); | 216 | target_cwnd = tp->snd_cwnd * vegas->baseRTT / rtt; |
259 | target_cwnd <<= V_PARAM_SHIFT; | ||
260 | do_div(target_cwnd, rtt); | ||
261 | 217 | ||
262 | /* Calculate the difference between the window we had, | 218 | /* Calculate the difference between the window we had, |
263 | * and the window we would like to have. This quantity | 219 | * and the window we would like to have. This quantity |
264 | * is the "Diff" from the Arizona Vegas papers. | 220 | * is the "Diff" from the Arizona Vegas papers. |
265 | * | ||
266 | * Again, this is a fixed point number with | ||
267 | * V_PARAM_SHIFT bits to the right of the binary | ||
268 | * point. | ||
269 | */ | 221 | */ |
270 | diff = (old_wnd << V_PARAM_SHIFT) - target_cwnd; | 222 | diff = tp->snd_cwnd * (rtt-vegas->baseRTT) / vegas->baseRTT; |
271 | 223 | ||
272 | if (diff > gamma && tp->snd_ssthresh > 2 ) { | 224 | if (diff > gamma && tp->snd_ssthresh > 2 ) { |
273 | /* Going too fast. Time to slow down | 225 | /* Going too fast. Time to slow down |
@@ -282,16 +234,13 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 in_flight) | |||
282 | * truncation robs us of full link | 234 | * truncation robs us of full link |
283 | * utilization. | 235 | * utilization. |
284 | */ | 236 | */ |
285 | tp->snd_cwnd = min(tp->snd_cwnd, | 237 | tp->snd_cwnd = min(tp->snd_cwnd, (u32)target_cwnd+1); |
286 | ((u32)target_cwnd >> | ||
287 | V_PARAM_SHIFT)+1); | ||
288 | 238 | ||
289 | } else if (tp->snd_cwnd <= tp->snd_ssthresh) { | 239 | } else if (tp->snd_cwnd <= tp->snd_ssthresh) { |
290 | /* Slow start. */ | 240 | /* Slow start. */ |
291 | tcp_slow_start(tp); | 241 | tcp_slow_start(tp); |
292 | } else { | 242 | } else { |
293 | /* Congestion avoidance. */ | 243 | /* Congestion avoidance. */ |
294 | u32 next_snd_cwnd; | ||
295 | 244 | ||
296 | /* Figure out where we would like cwnd | 245 | /* Figure out where we would like cwnd |
297 | * to be. | 246 | * to be. |
@@ -300,26 +249,17 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 in_flight) | |||
300 | /* The old window was too fast, so | 249 | /* The old window was too fast, so |
301 | * we slow down. | 250 | * we slow down. |
302 | */ | 251 | */ |
303 | next_snd_cwnd = old_snd_cwnd - 1; | 252 | tp->snd_cwnd--; |
304 | } else if (diff < alpha) { | 253 | } else if (diff < alpha) { |
305 | /* We don't have enough extra packets | 254 | /* We don't have enough extra packets |
306 | * in the network, so speed up. | 255 | * in the network, so speed up. |
307 | */ | 256 | */ |
308 | next_snd_cwnd = old_snd_cwnd + 1; | 257 | tp->snd_cwnd++; |
309 | } else { | 258 | } else { |
310 | /* Sending just as fast as we | 259 | /* Sending just as fast as we |
311 | * should be. | 260 | * should be. |
312 | */ | 261 | */ |
313 | next_snd_cwnd = old_snd_cwnd; | ||
314 | } | 262 | } |
315 | |||
316 | /* Adjust cwnd upward or downward, toward the | ||
317 | * desired value. | ||
318 | */ | ||
319 | if (next_snd_cwnd > tp->snd_cwnd) | ||
320 | tp->snd_cwnd++; | ||
321 | else if (next_snd_cwnd < tp->snd_cwnd) | ||
322 | tp->snd_cwnd--; | ||
323 | } | 263 | } |
324 | 264 | ||
325 | if (tp->snd_cwnd < 2) | 265 | if (tp->snd_cwnd < 2) |
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index e4acc212345e..3e2970841bd8 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
@@ -947,8 +947,13 @@ static void ndisc_recv_na(struct sk_buff *skb) | |||
947 | is invalid, but ndisc specs say nothing | 947 | is invalid, but ndisc specs say nothing |
948 | about it. It could be misconfiguration, or | 948 | about it. It could be misconfiguration, or |
949 | an smart proxy agent tries to help us :-) | 949 | an smart proxy agent tries to help us :-) |
950 | |||
951 | We should not print the error if NA has been | ||
952 | received from loopback - it is just our own | ||
953 | unsolicited advertisement. | ||
950 | */ | 954 | */ |
951 | ND_PRINTK1(KERN_WARNING | 955 | if (skb->pkt_type != PACKET_LOOPBACK) |
956 | ND_PRINTK1(KERN_WARNING | ||
952 | "ICMPv6 NA: someone advertises our address on %s!\n", | 957 | "ICMPv6 NA: someone advertises our address on %s!\n", |
953 | ifp->idev->dev->name); | 958 | ifp->idev->dev->name); |
954 | in6_ifa_put(ifp); | 959 | in6_ifa_put(ifp); |
diff --git a/net/netfilter/xt_socket.c b/net/netfilter/xt_socket.c index 02a8fed21082..1acc089be7e9 100644 --- a/net/netfilter/xt_socket.c +++ b/net/netfilter/xt_socket.c | |||
@@ -141,7 +141,7 @@ socket_mt(const struct sk_buff *skb, const struct xt_match_param *par) | |||
141 | sk = nf_tproxy_get_sock_v4(dev_net(skb->dev), protocol, | 141 | sk = nf_tproxy_get_sock_v4(dev_net(skb->dev), protocol, |
142 | saddr, daddr, sport, dport, par->in, false); | 142 | saddr, daddr, sport, dport, par->in, false); |
143 | if (sk != NULL) { | 143 | if (sk != NULL) { |
144 | bool wildcard = (inet_sk(sk)->rcv_saddr == 0); | 144 | bool wildcard = (sk->sk_state != TCP_TIME_WAIT && inet_sk(sk)->rcv_saddr == 0); |
145 | 145 | ||
146 | nf_tproxy_put_sock(sk); | 146 | nf_tproxy_put_sock(sk); |
147 | if (wildcard) | 147 | if (wildcard) |
diff --git a/net/netlabel/netlabel_unlabeled.c b/net/netlabel/netlabel_unlabeled.c index 90c8506a0aac..8c0308032178 100644 --- a/net/netlabel/netlabel_unlabeled.c +++ b/net/netlabel/netlabel_unlabeled.c | |||
@@ -562,7 +562,6 @@ static int netlbl_unlhsh_remove_addr4(struct net *net, | |||
562 | const struct in_addr *mask, | 562 | const struct in_addr *mask, |
563 | struct netlbl_audit *audit_info) | 563 | struct netlbl_audit *audit_info) |
564 | { | 564 | { |
565 | int ret_val = 0; | ||
566 | struct netlbl_af4list *list_entry; | 565 | struct netlbl_af4list *list_entry; |
567 | struct netlbl_unlhsh_addr4 *entry; | 566 | struct netlbl_unlhsh_addr4 *entry; |
568 | struct audit_buffer *audit_buf; | 567 | struct audit_buffer *audit_buf; |
@@ -577,7 +576,7 @@ static int netlbl_unlhsh_remove_addr4(struct net *net, | |||
577 | if (list_entry != NULL) | 576 | if (list_entry != NULL) |
578 | entry = netlbl_unlhsh_addr4_entry(list_entry); | 577 | entry = netlbl_unlhsh_addr4_entry(list_entry); |
579 | else | 578 | else |
580 | ret_val = -ENOENT; | 579 | entry = NULL; |
581 | 580 | ||
582 | audit_buf = netlbl_audit_start_common(AUDIT_MAC_UNLBL_STCDEL, | 581 | audit_buf = netlbl_audit_start_common(AUDIT_MAC_UNLBL_STCDEL, |
583 | audit_info); | 582 | audit_info); |
@@ -588,19 +587,21 @@ static int netlbl_unlhsh_remove_addr4(struct net *net, | |||
588 | addr->s_addr, mask->s_addr); | 587 | addr->s_addr, mask->s_addr); |
589 | if (dev != NULL) | 588 | if (dev != NULL) |
590 | dev_put(dev); | 589 | dev_put(dev); |
591 | if (entry && security_secid_to_secctx(entry->secid, | 590 | if (entry != NULL && |
592 | &secctx, | 591 | security_secid_to_secctx(entry->secid, |
593 | &secctx_len) == 0) { | 592 | &secctx, &secctx_len) == 0) { |
594 | audit_log_format(audit_buf, " sec_obj=%s", secctx); | 593 | audit_log_format(audit_buf, " sec_obj=%s", secctx); |
595 | security_release_secctx(secctx, secctx_len); | 594 | security_release_secctx(secctx, secctx_len); |
596 | } | 595 | } |
597 | audit_log_format(audit_buf, " res=%u", ret_val == 0 ? 1 : 0); | 596 | audit_log_format(audit_buf, " res=%u", entry != NULL ? 1 : 0); |
598 | audit_log_end(audit_buf); | 597 | audit_log_end(audit_buf); |
599 | } | 598 | } |
600 | 599 | ||
601 | if (ret_val == 0) | 600 | if (entry == NULL) |
602 | call_rcu(&entry->rcu, netlbl_unlhsh_free_addr4); | 601 | return -ENOENT; |
603 | return ret_val; | 602 | |
603 | call_rcu(&entry->rcu, netlbl_unlhsh_free_addr4); | ||
604 | return 0; | ||
604 | } | 605 | } |
605 | 606 | ||
606 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | 607 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) |
@@ -624,7 +625,6 @@ static int netlbl_unlhsh_remove_addr6(struct net *net, | |||
624 | const struct in6_addr *mask, | 625 | const struct in6_addr *mask, |
625 | struct netlbl_audit *audit_info) | 626 | struct netlbl_audit *audit_info) |
626 | { | 627 | { |
627 | int ret_val = 0; | ||
628 | struct netlbl_af6list *list_entry; | 628 | struct netlbl_af6list *list_entry; |
629 | struct netlbl_unlhsh_addr6 *entry; | 629 | struct netlbl_unlhsh_addr6 *entry; |
630 | struct audit_buffer *audit_buf; | 630 | struct audit_buffer *audit_buf; |
@@ -638,7 +638,7 @@ static int netlbl_unlhsh_remove_addr6(struct net *net, | |||
638 | if (list_entry != NULL) | 638 | if (list_entry != NULL) |
639 | entry = netlbl_unlhsh_addr6_entry(list_entry); | 639 | entry = netlbl_unlhsh_addr6_entry(list_entry); |
640 | else | 640 | else |
641 | ret_val = -ENOENT; | 641 | entry = NULL; |
642 | 642 | ||
643 | audit_buf = netlbl_audit_start_common(AUDIT_MAC_UNLBL_STCDEL, | 643 | audit_buf = netlbl_audit_start_common(AUDIT_MAC_UNLBL_STCDEL, |
644 | audit_info); | 644 | audit_info); |
@@ -649,19 +649,21 @@ static int netlbl_unlhsh_remove_addr6(struct net *net, | |||
649 | addr, mask); | 649 | addr, mask); |
650 | if (dev != NULL) | 650 | if (dev != NULL) |
651 | dev_put(dev); | 651 | dev_put(dev); |
652 | if (entry && security_secid_to_secctx(entry->secid, | 652 | if (entry != NULL && |
653 | &secctx, | 653 | security_secid_to_secctx(entry->secid, |
654 | &secctx_len) == 0) { | 654 | &secctx, &secctx_len) == 0) { |
655 | audit_log_format(audit_buf, " sec_obj=%s", secctx); | 655 | audit_log_format(audit_buf, " sec_obj=%s", secctx); |
656 | security_release_secctx(secctx, secctx_len); | 656 | security_release_secctx(secctx, secctx_len); |
657 | } | 657 | } |
658 | audit_log_format(audit_buf, " res=%u", ret_val == 0 ? 1 : 0); | 658 | audit_log_format(audit_buf, " res=%u", entry != NULL ? 1 : 0); |
659 | audit_log_end(audit_buf); | 659 | audit_log_end(audit_buf); |
660 | } | 660 | } |
661 | 661 | ||
662 | if (ret_val == 0) | 662 | if (entry == NULL) |
663 | call_rcu(&entry->rcu, netlbl_unlhsh_free_addr6); | 663 | return -ENOENT; |
664 | return ret_val; | 664 | |
665 | call_rcu(&entry->rcu, netlbl_unlhsh_free_addr6); | ||
666 | return 0; | ||
665 | } | 667 | } |
666 | #endif /* IPv6 */ | 668 | #endif /* IPv6 */ |
667 | 669 | ||
diff --git a/net/phonet/pep-gprs.c b/net/phonet/pep-gprs.c index e6e8e44852e5..22848dd7d67a 100644 --- a/net/phonet/pep-gprs.c +++ b/net/phonet/pep-gprs.c | |||
@@ -155,12 +155,13 @@ static void gprs_data_ready(struct sock *sk, int len) | |||
155 | static void gprs_write_space(struct sock *sk) | 155 | static void gprs_write_space(struct sock *sk) |
156 | { | 156 | { |
157 | struct gprs_dev *dev = sk->sk_user_data; | 157 | struct gprs_dev *dev = sk->sk_user_data; |
158 | struct net_device *net = dev->net; | ||
158 | unsigned credits = pep_writeable(sk); | 159 | unsigned credits = pep_writeable(sk); |
159 | 160 | ||
160 | spin_lock_bh(&dev->tx_lock); | 161 | spin_lock_bh(&dev->tx_lock); |
161 | dev->tx_max = credits; | 162 | dev->tx_max = credits; |
162 | if (credits > skb_queue_len(&dev->tx_queue)) | 163 | if (credits > skb_queue_len(&dev->tx_queue) && netif_running(net)) |
163 | netif_wake_queue(dev->net); | 164 | netif_wake_queue(net); |
164 | spin_unlock_bh(&dev->tx_lock); | 165 | spin_unlock_bh(&dev->tx_lock); |
165 | } | 166 | } |
166 | 167 | ||
@@ -168,6 +169,23 @@ static void gprs_write_space(struct sock *sk) | |||
168 | * Network device callbacks | 169 | * Network device callbacks |
169 | */ | 170 | */ |
170 | 171 | ||
172 | static int gprs_open(struct net_device *dev) | ||
173 | { | ||
174 | struct gprs_dev *gp = netdev_priv(dev); | ||
175 | |||
176 | gprs_write_space(gp->sk); | ||
177 | return 0; | ||
178 | } | ||
179 | |||
180 | static int gprs_close(struct net_device *dev) | ||
181 | { | ||
182 | struct gprs_dev *gp = netdev_priv(dev); | ||
183 | |||
184 | netif_stop_queue(dev); | ||
185 | flush_work(&gp->tx_work); | ||
186 | return 0; | ||
187 | } | ||
188 | |||
171 | static int gprs_xmit(struct sk_buff *skb, struct net_device *net) | 189 | static int gprs_xmit(struct sk_buff *skb, struct net_device *net) |
172 | { | 190 | { |
173 | struct gprs_dev *dev = netdev_priv(net); | 191 | struct gprs_dev *dev = netdev_priv(net); |
@@ -248,6 +266,8 @@ static void gprs_setup(struct net_device *net) | |||
248 | net->tx_queue_len = 10; | 266 | net->tx_queue_len = 10; |
249 | 267 | ||
250 | net->destructor = free_netdev; | 268 | net->destructor = free_netdev; |
269 | net->open = gprs_open; | ||
270 | net->stop = gprs_close; | ||
251 | net->hard_start_xmit = gprs_xmit; /* mandatory */ | 271 | net->hard_start_xmit = gprs_xmit; /* mandatory */ |
252 | net->change_mtu = gprs_set_mtu; | 272 | net->change_mtu = gprs_set_mtu; |
253 | } | 273 | } |
@@ -311,7 +331,6 @@ int gprs_attach(struct sock *sk) | |||
311 | dev->sk = sk; | 331 | dev->sk = sk; |
312 | 332 | ||
313 | printk(KERN_DEBUG"%s: attached\n", net->name); | 333 | printk(KERN_DEBUG"%s: attached\n", net->name); |
314 | gprs_write_space(sk); /* kick off TX */ | ||
315 | return net->ifindex; | 334 | return net->ifindex; |
316 | 335 | ||
317 | out_rel: | 336 | out_rel: |
@@ -334,7 +353,5 @@ void gprs_detach(struct sock *sk) | |||
334 | 353 | ||
335 | printk(KERN_DEBUG"%s: detached\n", net->name); | 354 | printk(KERN_DEBUG"%s: detached\n", net->name); |
336 | unregister_netdev(net); | 355 | unregister_netdev(net); |
337 | flush_scheduled_work(); | ||
338 | sock_put(sk); | 356 | sock_put(sk); |
339 | skb_queue_purge(&dev->tx_queue); | ||
340 | } | 357 | } |
diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c index f840d6b27c65..7e78f1c0f357 100644 --- a/net/sched/sch_netem.c +++ b/net/sched/sch_netem.c | |||
@@ -46,9 +46,6 @@ | |||
46 | layering other disciplines. It does not need to do bandwidth | 46 | layering other disciplines. It does not need to do bandwidth |
47 | control either since that can be handled by using token | 47 | control either since that can be handled by using token |
48 | bucket or other rate control. | 48 | bucket or other rate control. |
49 | |||
50 | The simulator is limited by the Linux timer resolution | ||
51 | and will create packet bursts on the HZ boundary (1ms). | ||
52 | */ | 49 | */ |
53 | 50 | ||
54 | struct netem_sched_data { | 51 | struct netem_sched_data { |
diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c index 6f7d1f2d2f36..ef3238d665ee 100644 --- a/net/sunrpc/svcsock.c +++ b/net/sunrpc/svcsock.c | |||
@@ -1183,7 +1183,11 @@ int svc_addsock(struct svc_serv *serv, | |||
1183 | else if (so->state > SS_UNCONNECTED) | 1183 | else if (so->state > SS_UNCONNECTED) |
1184 | err = -EISCONN; | 1184 | err = -EISCONN; |
1185 | else { | 1185 | else { |
1186 | svsk = svc_setup_socket(serv, so, &err, SVC_SOCK_DEFAULTS); | 1186 | if (!try_module_get(THIS_MODULE)) |
1187 | err = -ENOENT; | ||
1188 | else | ||
1189 | svsk = svc_setup_socket(serv, so, &err, | ||
1190 | SVC_SOCK_DEFAULTS); | ||
1187 | if (svsk) { | 1191 | if (svsk) { |
1188 | struct sockaddr_storage addr; | 1192 | struct sockaddr_storage addr; |
1189 | struct sockaddr *sin = (struct sockaddr *)&addr; | 1193 | struct sockaddr *sin = (struct sockaddr *)&addr; |
@@ -1196,7 +1200,8 @@ int svc_addsock(struct svc_serv *serv, | |||
1196 | spin_unlock_bh(&serv->sv_lock); | 1200 | spin_unlock_bh(&serv->sv_lock); |
1197 | svc_xprt_received(&svsk->sk_xprt); | 1201 | svc_xprt_received(&svsk->sk_xprt); |
1198 | err = 0; | 1202 | err = 0; |
1199 | } | 1203 | } else |
1204 | module_put(THIS_MODULE); | ||
1200 | } | 1205 | } |
1201 | if (err) { | 1206 | if (err) { |
1202 | sockfd_put(so); | 1207 | sockfd_put(so); |