lkml.org 
[lkml]   [2015]   [Jun]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.16.y-ckt 092/110] mac80211: don't use napi_gro_receive() outside NAPI context
    Date
    3.16.7-ckt13 -stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Johannes Berg <johannes.berg@intel.com>

    commit 22d3a3c829fa9ecdb493d1f1f2838d543f8d86a3 upstream.

    No matter how the driver manages its NAPI context, there's no way
    sending frames to it from a timer can be correct, since it would
    corrupt the internal GRO lists.

    To avoid that, always use the non-NAPI path when releasing frames
    from the timer.

    Reported-by: Jean Trivelly <jean.trivelly@intel.com>
    Signed-off-by: Johannes Berg <johannes.berg@intel.com>
    Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
    ---
    net/mac80211/ieee80211_i.h | 3 +++
    net/mac80211/rx.c | 5 +++--
    2 files changed, 6 insertions(+), 2 deletions(-)

    diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h
    index 6b943c29937b..d7a4c0ff66ff 100644
    --- a/net/mac80211/ieee80211_i.h
    +++ b/net/mac80211/ieee80211_i.h
    @@ -203,6 +203,8 @@ enum ieee80211_packet_rx_flags {
    * @IEEE80211_RX_CMNTR: received on cooked monitor already
    * @IEEE80211_RX_BEACON_REPORTED: This frame was already reported
    * to cfg80211_report_obss_beacon().
    + * @IEEE80211_RX_REORDER_TIMER: this frame is released by the
    + * reorder buffer timeout timer, not the normal RX path
    *
    * These flags are used across handling multiple interfaces
    * for a single frame.
    @@ -210,6 +212,7 @@ enum ieee80211_packet_rx_flags {
    enum ieee80211_rx_flags {
    IEEE80211_RX_CMNTR = BIT(0),
    IEEE80211_RX_BEACON_REPORTED = BIT(1),
    + IEEE80211_RX_REORDER_TIMER = BIT(2),
    };

    struct ieee80211_rx_data {
    diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c
    index 07fb67803097..3ee2abd4007e 100644
    --- a/net/mac80211/rx.c
    +++ b/net/mac80211/rx.c
    @@ -1968,7 +1968,8 @@ ieee80211_deliver_skb(struct ieee80211_rx_data *rx)
    /* deliver to local stack */
    skb->protocol = eth_type_trans(skb, dev);
    memset(skb->cb, 0, sizeof(skb->cb));
    - if (rx->local->napi)
    + if (!(rx->flags & IEEE80211_RX_REORDER_TIMER) &&
    + rx->local->napi)
    napi_gro_receive(rx->local->napi, skb);
    else
    netif_receive_skb(skb);
    @@ -3038,7 +3039,7 @@ void ieee80211_release_reorder_timeout(struct sta_info *sta, int tid)
    /* This is OK -- must be QoS data frame */
    .security_idx = tid,
    .seqno_idx = tid,
    - .flags = 0,
    + .flags = IEEE80211_RX_REORDER_TIMER,
    };
    struct tid_ampdu_rx *tid_agg_rx;


    \
     
     \ /
      Last update: 2015-06-05 16:21    [W:3.152 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site