From dd2196a8f59b513b5be227b201ba86d3274883df Mon Sep 17 00:00:00 2001 From: Himanshu Agarwal Date: Mon, 31 Jul 2017 11:38:14 +0530 Subject: [PATCH] qcacld-3.0: Do netif_rx_ni() for frames received before peer assoc While processing of frames received before peer is registered in process context, tcp_v4_rcv() is called which takes a spinlock and in between the processing before spinlock can be released, it is getting preempted by hif_napi_poll() as it gets executed in softirq context. It tries to take the same spinlock in tcp_v4_rcv() resulting in deadlock. Do netif_rx_ni() for frames received before peer is registered. Change-Id: I6228984f209bb9312ed9d8f3937d6036918ff750 CRs-Fixed: 2034244 --- core/dp/txrx/ol_txrx.c | 2 +- core/hdd/src/wlan_hdd_lro.c | 3 ++- core/hdd/src/wlan_hdd_tx_rx.c | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c index 663cccb1ac3d..5a89b74d69e5 100644 --- a/core/dp/txrx/ol_txrx.c +++ b/core/dp/txrx/ol_txrx.c @@ -4647,7 +4647,7 @@ static inline int ol_txrx_drop_nbuf_list(qdf_nbuf_t buf_list) buf = buf_list; while (buf) { - QDF_NBUF_CB_RX_LRO_INELIGIBLE(buf) = 1; + QDF_NBUF_CB_RX_PEER_CACHED_FRM(buf) = 1; next_buf = qdf_nbuf_queue_next(buf); if (pdev) TXRX_STATS_MSDU_INCR(pdev, diff --git a/core/hdd/src/wlan_hdd_lro.c b/core/hdd/src/wlan_hdd_lro.c index c043b2b04393..7d242c58ad57 100644 --- a/core/hdd/src/wlan_hdd_lro.c +++ b/core/hdd/src/wlan_hdd_lro.c @@ -142,7 +142,8 @@ enum hdd_lro_rx_status hdd_lro_rx(hdd_context_t *hdd_ctx, enum hdd_lro_rx_status status = HDD_LRO_NO_RX; if ((adapter->dev->features & NETIF_F_LRO) && - QDF_NBUF_CB_RX_TCP_PROTO(skb)) { + QDF_NBUF_CB_RX_TCP_PROTO(skb) && + !QDF_NBUF_CB_RX_PEER_CACHED_FRM(skb)) { struct qdf_lro_info info; struct net_lro_desc *lro_desc = NULL; struct hif_opaque_softc *hif_hdl = diff --git a/core/hdd/src/wlan_hdd_tx_rx.c b/core/hdd/src/wlan_hdd_tx_rx.c index a559f6dd47a4..42830a70ce2f 100644 --- a/core/hdd/src/wlan_hdd_tx_rx.c +++ b/core/hdd/src/wlan_hdd_tx_rx.c @@ -1258,7 +1258,8 @@ QDF_STATUS hdd_rx_packet_cbk(void *context, qdf_nbuf_t rxBuf) if (HDD_LRO_NO_RX == hdd_lro_rx(pHddCtx, pAdapter, skb)) { if (hdd_napi_enabled(HDD_NAPI_ANY) && - !pHddCtx->enableRxThread) + !pHddCtx->enableRxThread && + !QDF_NBUF_CB_RX_PEER_CACHED_FRM(skb)) rxstat = netif_receive_skb(skb); else rxstat = netif_rx_ni(skb);