• Daniel Borkmann's avatar
    packet: check for ndo_select_queue during queue selection · 0fd5d57b
    Daniel Borkmann authored
    Mathias reported that on an AMD Geode LX embedded board (ALiX)
    with ath9k driver PACKET_QDISC_BYPASS, introduced in commit
    d346a3fa ("packet: introduce PACKET_QDISC_BYPASS socket
    option"), triggers a WARN_ON() coming from the driver itself
    via 066dae93
     ("ath9k: rework tx queue selection and fix
    queue stopping/waking").
    The reason why this happened is that ndo_select_queue() call
    is not invoked from direct xmit path i.e. for ieee80211 subsystem
    that sets queue and TID (similar to 802.1d tag) which is being
    put into the frame through 802.11e (WMM, QoS). If that is not
    set, pending frame counter for e.g. ath9k can get messed up.
    So the WARN_ON() in ath9k is absolutely legitimate. Generally,
    the hw queue selection in ieee80211 depends on the type of
    traffic, and priorities are set according to ieee80211_ac_numbers
    mapping; working in a similar way as DiffServ only on a lower
    layer, so that the AP can favour frames that have "real-time"
    requirements like voice or video data frames.
    Therefore, check for presence of ndo_select_queue() in netdev
    ops and, if available, invoke it with a fallback handler to
    __packet_pick_tx_queue(), so that driver such as bnx2x, ixgbe,
    or mlx4 can still select a hw queue for transmission in
    relation to the current CPU while e.g. ieee80211 subsystem
    can make their own choices.
    Reported-by: default avatarMathias Kretschmer <mathias.kretschmer@fokus.fraunhofer.de>
    Signed-off-by: default avatarDaniel Borkmann <dborkman@redhat.com>
    Cc: Jesper Dangaard Brouer <brouer@redhat.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
af_packet.c 95.4 KB