diff options
| author | Yun Park <yunp@qca.qualcomm.com> | 2016-05-05 15:59:10 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2016-05-10 05:27:37 -0700 |
| commit | a06be174279673e4836ab8ee1d0f5e12209a3d48 (patch) | |
| tree | 3f9a5d72d9a4910789f4032155a702308c9fd566 | |
| parent | 67101f981beaff904bc42a1ce270af07eb226bfe (diff) | |
qcacld-2.0: Skip Rx packet aggregation logic for ICMP packets
Rx packet aggregation logic causes ping RTT regression.
Fix this by filtering ICMP packets to exclude them for Rx packet
aggregation.
Change-Id: I61367d8843fb4f913df11e210c68feea93baec8b
CRs-Fixed: 978742
| -rw-r--r-- | CORE/HDD/src/wlan_hdd_ipa.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/CORE/HDD/src/wlan_hdd_ipa.c b/CORE/HDD/src/wlan_hdd_ipa.c index bace00000884..e85dbe551c1c 100644 --- a/CORE/HDD/src/wlan_hdd_ipa.c +++ b/CORE/HDD/src/wlan_hdd_ipa.c @@ -2754,8 +2754,8 @@ static void hdd_ipa_destory_rm_resource(struct hdd_ipa_priv *hdd_ipa) static void hdd_ipa_send_skb_to_network(adf_nbuf_t skb, hdd_adapter_t *adapter) { int result; - #ifndef QCA_CONFIG_SMP + struct iphdr* ip_h; static atomic_t softirq_mitigation_cntr = ATOMIC_INIT(IPA_WLAN_RX_SOFTIRQ_THRESH); #endif @@ -2787,15 +2787,21 @@ static void hdd_ipa_send_skb_to_network(adf_nbuf_t skb, hdd_adapter_t *adapter) #ifdef QCA_CONFIG_SMP result = netif_rx_ni(skb); #else - /* Call netif_rx_ni for every IPA_WLAN_RX_SOFTIRQ_THRESH packets to - * avoid excessive softirq's. - */ - if (atomic_dec_and_test(&softirq_mitigation_cntr)) { + ip_h = (struct iphdr*)((uint8_t*)skb->data); + if ((skb->protocol == htons(ETH_P_IP)) && + (ip_h->protocol == IPPROTO_ICMP)) { result = netif_rx_ni(skb); - atomic_set(&softirq_mitigation_cntr, - IPA_WLAN_RX_SOFTIRQ_THRESH); } else { - result = netif_rx(skb); + /* Call netif_rx_ni for every IPA_WLAN_RX_SOFTIRQ_THRESH packets + * to avoid excessive softirq's. + */ + if (atomic_dec_and_test(&softirq_mitigation_cntr)){ + result = netif_rx_ni(skb); + atomic_set(&softirq_mitigation_cntr, + IPA_WLAN_RX_SOFTIRQ_THRESH); + } else { + result = netif_rx(skb); + } } #endif if (result == NET_RX_SUCCESS) |
