• B
    wcn36xx: introduce per-channel ring buffer locks · 8e8e54c4
    Bob Copeland 提交于
    wcn36xx implements a ring buffer for transmitted frames for each
    (high and low priority) DMA channel.  The ring buffers are lockless:
    new frames are inserted at the head of the queue, while finished
    packets are reaped from the tail.
    
    Unfortunately, the list manipulations are missing any kind of barriers
    so are susceptible to various races: for example, a TX completion
    handler might read an updated desc->ctrl before the head has actually
    advanced, and then null out the ctl->skb pointer while it is still
    being used in the TX path.
    
    Simplify things here by adding a spin lock when traversing the ring.
    This change increased stability for me without adding any noticeable
    overhead on my platform (xperia z).
    Signed-off-by: NBob Copeland <me@bobcopeland.com>
    Signed-off-by: NKalle Valo <kvalo@codeaurora.org>
    8e8e54c4
dxe.c 21.5 KB