summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/hdd/src/wlan_hdd_softap_tx_rx.c40
-rw-r--r--core/hdd/src/wlan_hdd_tx_rx.c38
2 files changed, 78 insertions, 0 deletions
diff --git a/core/hdd/src/wlan_hdd_softap_tx_rx.c b/core/hdd/src/wlan_hdd_softap_tx_rx.c
index 89c232111682..ea8c3c55ab55 100644
--- a/core/hdd/src/wlan_hdd_softap_tx_rx.c
+++ b/core/hdd/src/wlan_hdd_softap_tx_rx.c
@@ -198,6 +198,26 @@ void hdd_softap_tx_resume_cb(void *adapter_context, bool tx_resume)
return;
}
+
+static inline struct sk_buff *hdd_skb_orphan(hdd_adapter_t *pAdapter,
+ struct sk_buff *skb)
+{
+ if (pAdapter->tx_flow_low_watermark > 0)
+ skb_orphan(skb);
+ else {
+ skb = skb_unshare(skb, GFP_ATOMIC);
+ }
+
+ return skb;
+}
+
+#else
+
+static inline struct sk_buff *hdd_skb_orphan(hdd_adapter_t *pAdapter,
+ struct sk_buff *skb)
+{
+ return skb_unshare(skb, GFP_ATOMIC);
+}
#endif /* QCA_LL_LEGACY_TX_FLOW_CONTROL */
/**
@@ -317,10 +337,30 @@ static int __hdd_softap_hard_start_xmit(struct sk_buff *skb,
#if defined (IPA_OFFLOAD)
if (!qdf_nbuf_ipa_owned_get(skb)) {
#endif
+
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(3, 19, 0))
+ /*
+ * The TCP TX throttling logic is changed a little after
+ * 3.19-rc1 kernel, the TCP sending limit will be smaller,
+ * which will throttle the TCP packets to the host driver.
+ * The TCP UP LINK throughput will drop heavily. In order to
+ * fix this issue, need to orphan the socket buffer asap, which
+ * will call skb's destructor to notify the TCP stack that the
+ * SKB buffer is unowned. And then the TCP stack will pump more
+ * packets to host driver.
+ *
+ * The TX packets might be dropped for UDP case in the iperf
+ * testing. So need to be protected by follow control.
+ */
+ skb = hdd_skb_orphan(pAdapter, skb);
+#else
/* Check if the buffer has enough header room */
skb = skb_unshare(skb, GFP_ATOMIC);
+#endif
+
if (!skb)
goto drop_pkt_accounting;
+
#if defined (IPA_OFFLOAD)
}
#endif
diff --git a/core/hdd/src/wlan_hdd_tx_rx.c b/core/hdd/src/wlan_hdd_tx_rx.c
index 511f7407248c..87baf8dd453e 100644
--- a/core/hdd/src/wlan_hdd_tx_rx.c
+++ b/core/hdd/src/wlan_hdd_tx_rx.c
@@ -153,6 +153,18 @@ hdd_tx_resume_false(hdd_adapter_t *pAdapter, bool tx_resume)
}
#endif
+static inline struct sk_buff *hdd_skb_orphan(hdd_adapter_t *pAdapter,
+ struct sk_buff *skb)
+{
+ if (pAdapter->tx_flow_low_watermark > 0)
+ skb_orphan(skb);
+ else {
+ skb = skb_unshare(skb, GFP_ATOMIC);
+ }
+
+ return skb;
+}
+
/**
* hdd_tx_resume_cb() - Resume OS TX Q.
* @adapter_context: pointer to vdev apdapter
@@ -270,6 +282,14 @@ void hdd_get_tx_resource(hdd_adapter_t *adapter,
}
}
+#else
+
+static inline struct sk_buff *hdd_skb_orphan(hdd_adapter_t *pAdapter,
+ struct sk_buff *skb)
+{
+ return skb_unshare(skb, GFP_ATOMIC);
+}
+
#endif /* QCA_LL_LEGACY_TX_FLOW_CONTROL */
/**
@@ -447,8 +467,26 @@ static int __hdd_hard_start_xmit(struct sk_buff *skb, struct net_device *dev)
ac = hdd_qdisc_ac_to_tl_ac[skb->queue_mapping];
if (!qdf_nbuf_ipa_owned_get(skb)) {
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(3, 19, 0))
+ /*
+ * The TCP TX throttling logic is changed a little after
+ * 3.19-rc1 kernel, the TCP sending limit will be smaller,
+ * which will throttle the TCP packets to the host driver.
+ * The TCP UP LINK throughput will drop heavily. In order to
+ * fix this issue, need to orphan the socket buffer asap, which
+ * will call skb's destructor to notify the TCP stack that the
+ * SKB buffer is unowned. And then the TCP stack will pump more
+ * packets to host driver.
+ *
+ * The TX packets might be dropped for UDP case in the iperf
+ * testing. So need to be protected by follow control.
+ */
+ skb = hdd_skb_orphan(pAdapter, skb);
+#else
/* Check if the buffer has enough header room */
skb = skb_unshare(skb, GFP_ATOMIC);
+#endif
+
if (!skb)
goto drop_pkt_accounting;
}