]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - net/mac80211/wme.c
mm: rotate_reclaimable_page() cleanup
[linux-2.6-omap-h63xx.git] / net / mac80211 / wme.c
index 425aa8588ea0ca9bb6c805ed4ec6e4f315ef7745..64faa3dc488f70d2cfb09fae1bb1c3470424153e 100644 (file)
@@ -25,7 +25,7 @@ const int ieee802_1d_to_ac[8] = { 2, 3, 3, 2, 1, 1, 0, 0 };
 
 struct ieee80211_sched_data
 {
-       unsigned long qdisc_pool;
+       unsigned long qdisc_pool[BITS_TO_LONGS(TC_80211_MAX_QUEUES)];
        struct tcf_proto *filter_list;
        struct Qdisc *queues[TC_80211_MAX_QUEUES];
        struct sk_buff_head requeued[TC_80211_MAX_QUEUES];
@@ -153,19 +153,20 @@ static int wme_qdiscop_enqueue(struct sk_buff *skb, struct Qdisc* qd)
 
        if (pkt_data->flags & IEEE80211_TXPD_REQUEUE) {
                queue = pkt_data->queue;
+               rcu_read_lock();
                sta = sta_info_get(local, hdr->addr1);
                tid = skb->priority & QOS_CONTROL_TAG1D_MASK;
                if (sta) {
                        int ampdu_queue = sta->tid_to_tx_q[tid];
                        if ((ampdu_queue < local->hw.queues) &&
-                           test_bit(ampdu_queue, &q->qdisc_pool)) {
+                           test_bit(ampdu_queue, q->qdisc_pool)) {
                                queue = ampdu_queue;
                                pkt_data->flags |= IEEE80211_TXPD_AMPDU;
                        } else {
                                pkt_data->flags &= ~IEEE80211_TXPD_AMPDU;
                        }
-                       sta_info_put(sta);
                }
+               rcu_read_unlock();
                skb_queue_tail(&q->requeued[queue], skb);
                qd->q.qlen++;
                return 0;
@@ -187,18 +188,21 @@ static int wme_qdiscop_enqueue(struct sk_buff *skb, struct Qdisc* qd)
                p++;
                *p = 0;
 
+               rcu_read_lock();
+
                sta = sta_info_get(local, hdr->addr1);
                if (sta) {
                        int ampdu_queue = sta->tid_to_tx_q[tid];
                        if ((ampdu_queue < local->hw.queues) &&
-                               test_bit(ampdu_queue, &q->qdisc_pool)) {
+                               test_bit(ampdu_queue, q->qdisc_pool)) {
                                queue = ampdu_queue;
                                pkt_data->flags |= IEEE80211_TXPD_AMPDU;
                        } else {
                                pkt_data->flags &= ~IEEE80211_TXPD_AMPDU;
                        }
-                       sta_info_put(sta);
                }
+
+               rcu_read_unlock();
        }
 
        if (unlikely(queue >= local->hw.queues)) {
@@ -272,7 +276,7 @@ static struct sk_buff *wme_qdiscop_dequeue(struct Qdisc* qd)
                                &local->state[queue])) ||
                    (test_bit(IEEE80211_LINK_STATE_PENDING,
                                &local->state[queue])) ||
-                        (!test_bit(queue, &q->qdisc_pool)))
+                        (!test_bit(queue, q->qdisc_pool)))
                        continue;
 
                /* there is space - try and get a frame */
@@ -396,7 +400,7 @@ static int wme_qdiscop_init(struct Qdisc *qd, struct nlattr *opt)
 
        /* reserve all legacy QoS queues */
        for (i = 0; i < min(IEEE80211_TX_QUEUE_DATA4, queues); i++)
-               set_bit(i, &q->qdisc_pool);
+               set_bit(i, q->qdisc_pool);
 
        return err;
 }
@@ -657,7 +661,7 @@ int ieee80211_ht_agg_queue_add(struct ieee80211_local *local,
 
        /* try to get a Qdisc from the pool */
        for (i = IEEE80211_TX_QUEUE_BEACON; i < local->hw.queues; i++)
-               if (!test_and_set_bit(i, &q->qdisc_pool)) {
+               if (!test_and_set_bit(i, q->qdisc_pool)) {
                        ieee80211_stop_queue(local_to_hw(local), i);
                        sta->tid_to_tx_q[tid] = i;
 
@@ -668,9 +672,9 @@ int ieee80211_ht_agg_queue_add(struct ieee80211_local *local,
 #ifdef CONFIG_MAC80211_HT_DEBUG
                        if (net_ratelimit())
                                printk(KERN_DEBUG "allocated aggregation queue"
-                                       " %d tid %d addr %s pool=0x%lX\n",
+                                       " %d tid %d addr %s pool=0x%lX",
                                        i, tid, print_mac(mac, sta->addr),
-                                       q->qdisc_pool);
+                                       q->qdisc_pool[0]);
 #endif /* CONFIG_MAC80211_HT_DEBUG */
                        return 0;
                }
@@ -690,7 +694,7 @@ void ieee80211_ht_agg_queue_remove(struct ieee80211_local *local,
        int agg_queue = sta->tid_to_tx_q[tid];
 
        /* return the qdisc to the pool */
-       clear_bit(agg_queue, &q->qdisc_pool);
+       clear_bit(agg_queue, q->qdisc_pool);
        sta->tid_to_tx_q[tid] = local->hw.queues;
 
        if (requeue)
@@ -705,7 +709,7 @@ void ieee80211_requeue(struct ieee80211_local *local, int queue)
        struct ieee80211_sched_data *q = qdisc_priv(root_qd);
        struct Qdisc *qdisc = q->queues[queue];
        struct sk_buff *skb = NULL;
-       u32 len = qdisc->q.qlen;
+       u32 len;
 
        if (!qdisc || !qdisc->dequeue)
                return;