diff options
Diffstat (limited to 'net')
| -rw-r--r-- | net/batman-adv/translation-table.c | 27 | ||||
| -rw-r--r-- | net/bluetooth/bnep/core.c | 8 | ||||
| -rw-r--r-- | net/bluetooth/cmtp/core.c | 5 | ||||
| -rw-r--r-- | net/bluetooth/hci_event.c | 2 | ||||
| -rw-r--r-- | net/ceph/crush/mapper.c | 35 | ||||
| -rw-r--r-- | net/ipv4/ipip.c | 7 | ||||
| -rw-r--r-- | net/ipv6/addrconf.c | 3 | ||||
| -rw-r--r-- | net/ipv6/route.c | 2 | ||||
| -rw-r--r-- | net/ipv6/sit.c | 7 | ||||
| -rw-r--r-- | net/mac80211/agg-tx.c | 86 | ||||
| -rw-r--r-- | net/sched/sch_gred.c | 2 |
11 files changed, 99 insertions, 85 deletions
diff --git a/net/batman-adv/translation-table.c b/net/batman-adv/translation-table.c index c7aafc7c5ed4..5f09a578d49d 100644 --- a/net/batman-adv/translation-table.c +++ b/net/batman-adv/translation-table.c | |||
| @@ -245,9 +245,11 @@ void tt_local_add(struct net_device *soft_iface, const uint8_t *addr, | |||
| 245 | if (tt_global_entry) { | 245 | if (tt_global_entry) { |
| 246 | /* This node is probably going to update its tt table */ | 246 | /* This node is probably going to update its tt table */ |
| 247 | tt_global_entry->orig_node->tt_poss_change = true; | 247 | tt_global_entry->orig_node->tt_poss_change = true; |
| 248 | /* The global entry has to be marked as PENDING and has to be | 248 | /* The global entry has to be marked as ROAMING and has to be |
| 249 | * kept for consistency purpose */ | 249 | * kept for consistency purpose */ |
| 250 | tt_global_entry->flags |= TT_CLIENT_PENDING; | 250 | tt_global_entry->flags |= TT_CLIENT_ROAM; |
| 251 | tt_global_entry->roam_at = jiffies; | ||
| 252 | |||
| 251 | send_roam_adv(bat_priv, tt_global_entry->addr, | 253 | send_roam_adv(bat_priv, tt_global_entry->addr, |
| 252 | tt_global_entry->orig_node); | 254 | tt_global_entry->orig_node); |
| 253 | } | 255 | } |
| @@ -694,6 +696,7 @@ void tt_global_del(struct bat_priv *bat_priv, | |||
| 694 | const char *message, bool roaming) | 696 | const char *message, bool roaming) |
| 695 | { | 697 | { |
| 696 | struct tt_global_entry *tt_global_entry = NULL; | 698 | struct tt_global_entry *tt_global_entry = NULL; |
| 699 | struct tt_local_entry *tt_local_entry = NULL; | ||
| 697 | 700 | ||
| 698 | tt_global_entry = tt_global_hash_find(bat_priv, addr); | 701 | tt_global_entry = tt_global_hash_find(bat_priv, addr); |
| 699 | if (!tt_global_entry) | 702 | if (!tt_global_entry) |
| @@ -701,15 +704,29 @@ void tt_global_del(struct bat_priv *bat_priv, | |||
| 701 | 704 | ||
| 702 | if (tt_global_entry->orig_node == orig_node) { | 705 | if (tt_global_entry->orig_node == orig_node) { |
| 703 | if (roaming) { | 706 | if (roaming) { |
| 704 | tt_global_entry->flags |= TT_CLIENT_ROAM; | 707 | /* if we are deleting a global entry due to a roam |
| 705 | tt_global_entry->roam_at = jiffies; | 708 | * event, there are two possibilities: |
| 706 | goto out; | 709 | * 1) the client roamed from node A to node B => we mark |
| 710 | * it with TT_CLIENT_ROAM, we start a timer and we | ||
| 711 | * wait for node B to claim it. In case of timeout | ||
| 712 | * the entry is purged. | ||
| 713 | * 2) the client roamed to us => we can directly delete | ||
| 714 | * the global entry, since it is useless now. */ | ||
| 715 | tt_local_entry = tt_local_hash_find(bat_priv, | ||
| 716 | tt_global_entry->addr); | ||
| 717 | if (!tt_local_entry) { | ||
| 718 | tt_global_entry->flags |= TT_CLIENT_ROAM; | ||
| 719 | tt_global_entry->roam_at = jiffies; | ||
| 720 | goto out; | ||
| 721 | } | ||
| 707 | } | 722 | } |
| 708 | _tt_global_del(bat_priv, tt_global_entry, message); | 723 | _tt_global_del(bat_priv, tt_global_entry, message); |
| 709 | } | 724 | } |
| 710 | out: | 725 | out: |
| 711 | if (tt_global_entry) | 726 | if (tt_global_entry) |
| 712 | tt_global_entry_free_ref(tt_global_entry); | 727 | tt_global_entry_free_ref(tt_global_entry); |
| 728 | if (tt_local_entry) | ||
| 729 | tt_local_entry_free_ref(tt_local_entry); | ||
| 713 | } | 730 | } |
| 714 | 731 | ||
| 715 | void tt_global_del_orig(struct bat_priv *bat_priv, | 732 | void tt_global_del_orig(struct bat_priv *bat_priv, |
diff --git a/net/bluetooth/bnep/core.c b/net/bluetooth/bnep/core.c index 91bcd3a961ec..1eea8208b2cc 100644 --- a/net/bluetooth/bnep/core.c +++ b/net/bluetooth/bnep/core.c | |||
| @@ -79,17 +79,12 @@ static struct bnep_session *__bnep_get_session(u8 *dst) | |||
| 79 | 79 | ||
| 80 | static void __bnep_link_session(struct bnep_session *s) | 80 | static void __bnep_link_session(struct bnep_session *s) |
| 81 | { | 81 | { |
| 82 | /* It's safe to call __module_get() here because sessions are added | ||
| 83 | by the socket layer which has to hold the reference to this module. | ||
| 84 | */ | ||
| 85 | __module_get(THIS_MODULE); | ||
| 86 | list_add(&s->list, &bnep_session_list); | 82 | list_add(&s->list, &bnep_session_list); |
| 87 | } | 83 | } |
| 88 | 84 | ||
| 89 | static void __bnep_unlink_session(struct bnep_session *s) | 85 | static void __bnep_unlink_session(struct bnep_session *s) |
| 90 | { | 86 | { |
| 91 | list_del(&s->list); | 87 | list_del(&s->list); |
| 92 | module_put(THIS_MODULE); | ||
| 93 | } | 88 | } |
| 94 | 89 | ||
| 95 | static int bnep_send(struct bnep_session *s, void *data, size_t len) | 90 | static int bnep_send(struct bnep_session *s, void *data, size_t len) |
| @@ -530,6 +525,7 @@ static int bnep_session(void *arg) | |||
| 530 | 525 | ||
| 531 | up_write(&bnep_session_sem); | 526 | up_write(&bnep_session_sem); |
| 532 | free_netdev(dev); | 527 | free_netdev(dev); |
| 528 | module_put_and_exit(0); | ||
| 533 | return 0; | 529 | return 0; |
| 534 | } | 530 | } |
| 535 | 531 | ||
| @@ -616,9 +612,11 @@ int bnep_add_connection(struct bnep_connadd_req *req, struct socket *sock) | |||
| 616 | 612 | ||
| 617 | __bnep_link_session(s); | 613 | __bnep_link_session(s); |
| 618 | 614 | ||
| 615 | __module_get(THIS_MODULE); | ||
| 619 | s->task = kthread_run(bnep_session, s, "kbnepd %s", dev->name); | 616 | s->task = kthread_run(bnep_session, s, "kbnepd %s", dev->name); |
| 620 | if (IS_ERR(s->task)) { | 617 | if (IS_ERR(s->task)) { |
| 621 | /* Session thread start failed, gotta cleanup. */ | 618 | /* Session thread start failed, gotta cleanup. */ |
| 619 | module_put(THIS_MODULE); | ||
| 622 | unregister_netdev(dev); | 620 | unregister_netdev(dev); |
| 623 | __bnep_unlink_session(s); | 621 | __bnep_unlink_session(s); |
| 624 | err = PTR_ERR(s->task); | 622 | err = PTR_ERR(s->task); |
diff --git a/net/bluetooth/cmtp/core.c b/net/bluetooth/cmtp/core.c index 7d00ddf9e9dc..5a6e634f7fca 100644 --- a/net/bluetooth/cmtp/core.c +++ b/net/bluetooth/cmtp/core.c | |||
| @@ -67,14 +67,12 @@ static struct cmtp_session *__cmtp_get_session(bdaddr_t *bdaddr) | |||
| 67 | 67 | ||
| 68 | static void __cmtp_link_session(struct cmtp_session *session) | 68 | static void __cmtp_link_session(struct cmtp_session *session) |
| 69 | { | 69 | { |
| 70 | __module_get(THIS_MODULE); | ||
| 71 | list_add(&session->list, &cmtp_session_list); | 70 | list_add(&session->list, &cmtp_session_list); |
| 72 | } | 71 | } |
| 73 | 72 | ||
| 74 | static void __cmtp_unlink_session(struct cmtp_session *session) | 73 | static void __cmtp_unlink_session(struct cmtp_session *session) |
| 75 | { | 74 | { |
| 76 | list_del(&session->list); | 75 | list_del(&session->list); |
| 77 | module_put(THIS_MODULE); | ||
| 78 | } | 76 | } |
| 79 | 77 | ||
| 80 | static void __cmtp_copy_session(struct cmtp_session *session, struct cmtp_conninfo *ci) | 78 | static void __cmtp_copy_session(struct cmtp_session *session, struct cmtp_conninfo *ci) |
| @@ -327,6 +325,7 @@ static int cmtp_session(void *arg) | |||
| 327 | up_write(&cmtp_session_sem); | 325 | up_write(&cmtp_session_sem); |
| 328 | 326 | ||
| 329 | kfree(session); | 327 | kfree(session); |
| 328 | module_put_and_exit(0); | ||
| 330 | return 0; | 329 | return 0; |
| 331 | } | 330 | } |
| 332 | 331 | ||
| @@ -376,9 +375,11 @@ int cmtp_add_connection(struct cmtp_connadd_req *req, struct socket *sock) | |||
| 376 | 375 | ||
| 377 | __cmtp_link_session(session); | 376 | __cmtp_link_session(session); |
| 378 | 377 | ||
| 378 | __module_get(THIS_MODULE); | ||
| 379 | session->task = kthread_run(cmtp_session, session, "kcmtpd_ctr_%d", | 379 | session->task = kthread_run(cmtp_session, session, "kcmtpd_ctr_%d", |
| 380 | session->num); | 380 | session->num); |
| 381 | if (IS_ERR(session->task)) { | 381 | if (IS_ERR(session->task)) { |
| 382 | module_put(THIS_MODULE); | ||
| 382 | err = PTR_ERR(session->task); | 383 | err = PTR_ERR(session->task); |
| 383 | goto unlink; | 384 | goto unlink; |
| 384 | } | 385 | } |
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index d7d96b6b1f0d..643a41b76e2e 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c | |||
| @@ -545,7 +545,7 @@ static void hci_setup(struct hci_dev *hdev) | |||
| 545 | { | 545 | { |
| 546 | hci_setup_event_mask(hdev); | 546 | hci_setup_event_mask(hdev); |
| 547 | 547 | ||
| 548 | if (hdev->lmp_ver > 1) | 548 | if (hdev->hci_ver > 1) |
| 549 | hci_send_cmd(hdev, HCI_OP_READ_LOCAL_COMMANDS, 0, NULL); | 549 | hci_send_cmd(hdev, HCI_OP_READ_LOCAL_COMMANDS, 0, NULL); |
| 550 | 550 | ||
| 551 | if (hdev->features[6] & LMP_SIMPLE_PAIR) { | 551 | if (hdev->features[6] & LMP_SIMPLE_PAIR) { |
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/ipv4/ipip.c b/net/ipv4/ipip.c index 065effd8349a..0b2e7329abda 100644 --- a/net/ipv4/ipip.c +++ b/net/ipv4/ipip.c | |||
| @@ -285,6 +285,8 @@ static struct ip_tunnel * ipip_tunnel_locate(struct net *net, | |||
| 285 | if (register_netdevice(dev) < 0) | 285 | if (register_netdevice(dev) < 0) |
| 286 | goto failed_free; | 286 | goto failed_free; |
| 287 | 287 | ||
| 288 | strcpy(nt->parms.name, dev->name); | ||
| 289 | |||
| 288 | dev_hold(dev); | 290 | dev_hold(dev); |
| 289 | ipip_tunnel_link(ipn, nt); | 291 | ipip_tunnel_link(ipn, nt); |
| 290 | return nt; | 292 | return nt; |
| @@ -759,7 +761,6 @@ static int ipip_tunnel_init(struct net_device *dev) | |||
| 759 | struct ip_tunnel *tunnel = netdev_priv(dev); | 761 | struct ip_tunnel *tunnel = netdev_priv(dev); |
| 760 | 762 | ||
| 761 | tunnel->dev = dev; | 763 | tunnel->dev = dev; |
| 762 | strcpy(tunnel->parms.name, dev->name); | ||
| 763 | 764 | ||
| 764 | memcpy(dev->dev_addr, &tunnel->parms.iph.saddr, 4); | 765 | memcpy(dev->dev_addr, &tunnel->parms.iph.saddr, 4); |
| 765 | memcpy(dev->broadcast, &tunnel->parms.iph.daddr, 4); | 766 | memcpy(dev->broadcast, &tunnel->parms.iph.daddr, 4); |
| @@ -825,6 +826,7 @@ static void ipip_destroy_tunnels(struct ipip_net *ipn, struct list_head *head) | |||
| 825 | static int __net_init ipip_init_net(struct net *net) | 826 | static int __net_init ipip_init_net(struct net *net) |
| 826 | { | 827 | { |
| 827 | struct ipip_net *ipn = net_generic(net, ipip_net_id); | 828 | struct ipip_net *ipn = net_generic(net, ipip_net_id); |
| 829 | struct ip_tunnel *t; | ||
| 828 | int err; | 830 | int err; |
| 829 | 831 | ||
| 830 | ipn->tunnels[0] = ipn->tunnels_wc; | 832 | ipn->tunnels[0] = ipn->tunnels_wc; |
| @@ -848,6 +850,9 @@ static int __net_init ipip_init_net(struct net *net) | |||
| 848 | if ((err = register_netdev(ipn->fb_tunnel_dev))) | 850 | if ((err = register_netdev(ipn->fb_tunnel_dev))) |
| 849 | goto err_reg_dev; | 851 | goto err_reg_dev; |
| 850 | 852 | ||
| 853 | t = netdev_priv(ipn->fb_tunnel_dev); | ||
| 854 | |||
| 855 | strcpy(t->parms.name, ipn->fb_tunnel_dev->name); | ||
| 851 | return 0; | 856 | return 0; |
| 852 | 857 | ||
| 853 | err_reg_dev: | 858 | err_reg_dev: |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index cf88df82e2c2..36806def8cfd 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
| @@ -1805,7 +1805,8 @@ static struct inet6_dev *addrconf_add_dev(struct net_device *dev) | |||
| 1805 | return ERR_PTR(-EACCES); | 1805 | return ERR_PTR(-EACCES); |
| 1806 | 1806 | ||
| 1807 | /* Add default multicast route */ | 1807 | /* Add default multicast route */ |
| 1808 | addrconf_add_mroute(dev); | 1808 | if (!(dev->flags & IFF_LOOPBACK)) |
| 1809 | addrconf_add_mroute(dev); | ||
| 1809 | 1810 | ||
| 1810 | /* Add link local route */ | 1811 | /* Add link local route */ |
| 1811 | addrconf_add_lroute(dev); | 1812 | addrconf_add_lroute(dev); |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 3399dd326287..b582a0a0f1c5 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
| @@ -728,7 +728,7 @@ static struct rt6_info *rt6_alloc_cow(const struct rt6_info *ort, | |||
| 728 | int attempts = !in_softirq(); | 728 | int attempts = !in_softirq(); |
| 729 | 729 | ||
| 730 | if (!(rt->rt6i_flags&RTF_GATEWAY)) { | 730 | if (!(rt->rt6i_flags&RTF_GATEWAY)) { |
| 731 | if (rt->rt6i_dst.plen != 128 && | 731 | if (ort->rt6i_dst.plen != 128 && |
| 732 | ipv6_addr_equal(&ort->rt6i_dst.addr, daddr)) | 732 | ipv6_addr_equal(&ort->rt6i_dst.addr, daddr)) |
| 733 | rt->rt6i_flags |= RTF_ANYCAST; | 733 | rt->rt6i_flags |= RTF_ANYCAST; |
| 734 | ipv6_addr_copy(&rt->rt6i_gateway, daddr); | 734 | ipv6_addr_copy(&rt->rt6i_gateway, daddr); |
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c index a7a18602a046..96f3623618e3 100644 --- a/net/ipv6/sit.c +++ b/net/ipv6/sit.c | |||
| @@ -263,6 +263,8 @@ static struct ip_tunnel *ipip6_tunnel_locate(struct net *net, | |||
| 263 | if (register_netdevice(dev) < 0) | 263 | if (register_netdevice(dev) < 0) |
| 264 | goto failed_free; | 264 | goto failed_free; |
| 265 | 265 | ||
| 266 | strcpy(nt->parms.name, dev->name); | ||
| 267 | |||
| 266 | dev_hold(dev); | 268 | dev_hold(dev); |
| 267 | 269 | ||
| 268 | ipip6_tunnel_link(sitn, nt); | 270 | ipip6_tunnel_link(sitn, nt); |
| @@ -1144,7 +1146,6 @@ static int ipip6_tunnel_init(struct net_device *dev) | |||
| 1144 | struct ip_tunnel *tunnel = netdev_priv(dev); | 1146 | struct ip_tunnel *tunnel = netdev_priv(dev); |
| 1145 | 1147 | ||
| 1146 | tunnel->dev = dev; | 1148 | tunnel->dev = dev; |
| 1147 | strcpy(tunnel->parms.name, dev->name); | ||
| 1148 | 1149 | ||
| 1149 | memcpy(dev->dev_addr, &tunnel->parms.iph.saddr, 4); | 1150 | memcpy(dev->dev_addr, &tunnel->parms.iph.saddr, 4); |
| 1150 | memcpy(dev->broadcast, &tunnel->parms.iph.daddr, 4); | 1151 | memcpy(dev->broadcast, &tunnel->parms.iph.daddr, 4); |
| @@ -1207,6 +1208,7 @@ static void __net_exit sit_destroy_tunnels(struct sit_net *sitn, struct list_hea | |||
| 1207 | static int __net_init sit_init_net(struct net *net) | 1208 | static int __net_init sit_init_net(struct net *net) |
| 1208 | { | 1209 | { |
| 1209 | struct sit_net *sitn = net_generic(net, sit_net_id); | 1210 | struct sit_net *sitn = net_generic(net, sit_net_id); |
| 1211 | struct ip_tunnel *t; | ||
| 1210 | int err; | 1212 | int err; |
| 1211 | 1213 | ||
| 1212 | sitn->tunnels[0] = sitn->tunnels_wc; | 1214 | sitn->tunnels[0] = sitn->tunnels_wc; |
| @@ -1231,6 +1233,9 @@ static int __net_init sit_init_net(struct net *net) | |||
| 1231 | if ((err = register_netdev(sitn->fb_tunnel_dev))) | 1233 | if ((err = register_netdev(sitn->fb_tunnel_dev))) |
| 1232 | goto err_reg_dev; | 1234 | goto err_reg_dev; |
| 1233 | 1235 | ||
| 1236 | t = netdev_priv(sitn->fb_tunnel_dev); | ||
| 1237 | |||
| 1238 | strcpy(t->parms.name, sitn->fb_tunnel_dev->name); | ||
| 1234 | return 0; | 1239 | return 0; |
| 1235 | 1240 | ||
| 1236 | err_reg_dev: | 1241 | err_reg_dev: |
diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c index b064e4df12c6..2e4b961648d4 100644 --- a/net/mac80211/agg-tx.c +++ b/net/mac80211/agg-tx.c | |||
| @@ -303,6 +303,38 @@ ieee80211_wake_queue_agg(struct ieee80211_local *local, int tid) | |||
| 303 | __release(agg_queue); | 303 | __release(agg_queue); |
| 304 | } | 304 | } |
| 305 | 305 | ||
| 306 | /* | ||
| 307 | * splice packets from the STA's pending to the local pending, | ||
| 308 | * requires a call to ieee80211_agg_splice_finish later | ||
| 309 | */ | ||
| 310 | static void __acquires(agg_queue) | ||
| 311 | ieee80211_agg_splice_packets(struct ieee80211_local *local, | ||
| 312 | struct tid_ampdu_tx *tid_tx, u16 tid) | ||
| 313 | { | ||
| 314 | int queue = ieee80211_ac_from_tid(tid); | ||
| 315 | unsigned long flags; | ||
| 316 | |||
| 317 | ieee80211_stop_queue_agg(local, tid); | ||
| 318 | |||
| 319 | if (WARN(!tid_tx, "TID %d gone but expected when splicing aggregates" | ||
| 320 | " from the pending queue\n", tid)) | ||
| 321 | return; | ||
| 322 | |||
| 323 | if (!skb_queue_empty(&tid_tx->pending)) { | ||
| 324 | spin_lock_irqsave(&local->queue_stop_reason_lock, flags); | ||
| 325 | /* copy over remaining packets */ | ||
| 326 | skb_queue_splice_tail_init(&tid_tx->pending, | ||
| 327 | &local->pending[queue]); | ||
| 328 | spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); | ||
| 329 | } | ||
| 330 | } | ||
| 331 | |||
| 332 | static void __releases(agg_queue) | ||
| 333 | ieee80211_agg_splice_finish(struct ieee80211_local *local, u16 tid) | ||
| 334 | { | ||
| 335 | ieee80211_wake_queue_agg(local, tid); | ||
| 336 | } | ||
| 337 | |||
| 306 | void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid) | 338 | void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid) |
| 307 | { | 339 | { |
| 308 | struct tid_ampdu_tx *tid_tx; | 340 | struct tid_ampdu_tx *tid_tx; |
| @@ -314,19 +346,17 @@ void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid) | |||
| 314 | tid_tx = rcu_dereference_protected_tid_tx(sta, tid); | 346 | tid_tx = rcu_dereference_protected_tid_tx(sta, tid); |
| 315 | 347 | ||
| 316 | /* | 348 | /* |
| 317 | * While we're asking the driver about the aggregation, | 349 | * Start queuing up packets for this aggregation session. |
| 318 | * stop the AC queue so that we don't have to worry | 350 | * We're going to release them once the driver is OK with |
| 319 | * about frames that came in while we were doing that, | 351 | * that. |
| 320 | * which would require us to put them to the AC pending | ||
| 321 | * afterwards which just makes the code more complex. | ||
| 322 | */ | 352 | */ |
| 323 | ieee80211_stop_queue_agg(local, tid); | ||
| 324 | |||
| 325 | clear_bit(HT_AGG_STATE_WANT_START, &tid_tx->state); | 353 | clear_bit(HT_AGG_STATE_WANT_START, &tid_tx->state); |
| 326 | 354 | ||
| 327 | /* | 355 | /* |
| 328 | * make sure no packets are being processed to get | 356 | * Make sure no packets are being processed. This ensures that |
| 329 | * valid starting sequence number | 357 | * we have a valid starting sequence number and that in-flight |
| 358 | * packets have been flushed out and no packets for this TID | ||
| 359 | * will go into the driver during the ampdu_action call. | ||
| 330 | */ | 360 | */ |
| 331 | synchronize_net(); | 361 | synchronize_net(); |
| 332 | 362 | ||
| @@ -340,17 +370,15 @@ void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid) | |||
| 340 | " tid %d\n", tid); | 370 | " tid %d\n", tid); |
| 341 | #endif | 371 | #endif |
| 342 | spin_lock_bh(&sta->lock); | 372 | spin_lock_bh(&sta->lock); |
| 373 | ieee80211_agg_splice_packets(local, tid_tx, tid); | ||
| 343 | ieee80211_assign_tid_tx(sta, tid, NULL); | 374 | ieee80211_assign_tid_tx(sta, tid, NULL); |
| 375 | ieee80211_agg_splice_finish(local, tid); | ||
| 344 | spin_unlock_bh(&sta->lock); | 376 | spin_unlock_bh(&sta->lock); |
| 345 | 377 | ||
| 346 | ieee80211_wake_queue_agg(local, tid); | ||
| 347 | kfree_rcu(tid_tx, rcu_head); | 378 | kfree_rcu(tid_tx, rcu_head); |
| 348 | return; | 379 | return; |
| 349 | } | 380 | } |
| 350 | 381 | ||
| 351 | /* we can take packets again now */ | ||
| 352 | ieee80211_wake_queue_agg(local, tid); | ||
| 353 | |||
| 354 | /* activate the timer for the recipient's addBA response */ | 382 | /* activate the timer for the recipient's addBA response */ |
| 355 | mod_timer(&tid_tx->addba_resp_timer, jiffies + ADDBA_RESP_INTERVAL); | 383 | mod_timer(&tid_tx->addba_resp_timer, jiffies + ADDBA_RESP_INTERVAL); |
| 356 | #ifdef CONFIG_MAC80211_HT_DEBUG | 384 | #ifdef CONFIG_MAC80211_HT_DEBUG |
| @@ -466,38 +494,6 @@ int ieee80211_start_tx_ba_session(struct ieee80211_sta *pubsta, u16 tid, | |||
| 466 | } | 494 | } |
| 467 | EXPORT_SYMBOL(ieee80211_start_tx_ba_session); | 495 | EXPORT_SYMBOL(ieee80211_start_tx_ba_session); |
| 468 | 496 | ||
| 469 | /* | ||
| 470 | * splice packets from the STA's pending to the local pending, | ||
| 471 | * requires a call to ieee80211_agg_splice_finish later | ||
| 472 | */ | ||
| 473 | static void __acquires(agg_queue) | ||
| 474 | ieee80211_agg_splice_packets(struct ieee80211_local *local, | ||
| 475 | struct tid_ampdu_tx *tid_tx, u16 tid) | ||
| 476 | { | ||
| 477 | int queue = ieee80211_ac_from_tid(tid); | ||
| 478 | unsigned long flags; | ||
| 479 | |||
| 480 | ieee80211_stop_queue_agg(local, tid); | ||
| 481 | |||
| 482 | if (WARN(!tid_tx, "TID %d gone but expected when splicing aggregates" | ||
| 483 | " from the pending queue\n", tid)) | ||
| 484 | return; | ||
| 485 | |||
| 486 | if (!skb_queue_empty(&tid_tx->pending)) { | ||
| 487 | spin_lock_irqsave(&local->queue_stop_reason_lock, flags); | ||
| 488 | /* copy over remaining packets */ | ||
| 489 | skb_queue_splice_tail_init(&tid_tx->pending, | ||
| 490 | &local->pending[queue]); | ||
| 491 | spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); | ||
| 492 | } | ||
| 493 | } | ||
| 494 | |||
| 495 | static void __releases(agg_queue) | ||
| 496 | ieee80211_agg_splice_finish(struct ieee80211_local *local, u16 tid) | ||
| 497 | { | ||
| 498 | ieee80211_wake_queue_agg(local, tid); | ||
| 499 | } | ||
| 500 | |||
| 501 | static void ieee80211_agg_tx_operational(struct ieee80211_local *local, | 497 | static void ieee80211_agg_tx_operational(struct ieee80211_local *local, |
| 502 | struct sta_info *sta, u16 tid) | 498 | struct sta_info *sta, u16 tid) |
| 503 | { | 499 | { |
diff --git a/net/sched/sch_gred.c b/net/sched/sch_gred.c index b9493a09a870..6cd8ddfb512d 100644 --- a/net/sched/sch_gred.c +++ b/net/sched/sch_gred.c | |||
| @@ -385,7 +385,7 @@ static inline int gred_change_vq(struct Qdisc *sch, int dp, | |||
| 385 | struct gred_sched_data *q; | 385 | struct gred_sched_data *q; |
| 386 | 386 | ||
| 387 | if (table->tab[dp] == NULL) { | 387 | if (table->tab[dp] == NULL) { |
| 388 | table->tab[dp] = kzalloc(sizeof(*q), GFP_KERNEL); | 388 | table->tab[dp] = kzalloc(sizeof(*q), GFP_ATOMIC); |
| 389 | if (table->tab[dp] == NULL) | 389 | if (table->tab[dp] == NULL) |
| 390 | return -ENOMEM; | 390 | return -ENOMEM; |
| 391 | } | 391 | } |
