|
@@ -162,7 +162,34 @@ hdd_tx_resume_false(struct hdd_adapter *pAdapter, bool tx_resume)
|
|
|
static inline struct sk_buff *hdd_skb_orphan(struct hdd_adapter *pAdapter,
|
|
|
struct sk_buff *skb)
|
|
|
{
|
|
|
- if (pAdapter->tx_flow_low_watermark > 0)
|
|
|
+#if (LINUX_VERSION_CODE <= KERNEL_VERSION(3, 19, 0))
|
|
|
+ struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
|
|
|
+#endif
|
|
|
+ int need_orphan = 0;
|
|
|
+
|
|
|
+ if (pAdapter->tx_flow_low_watermark > 0) {
|
|
|
+#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.
|
|
|
+ */
|
|
|
+ need_orphan = 1;
|
|
|
+#else
|
|
|
+ if (hdd_ctx->config->tx_orphan_enable)
|
|
|
+ need_orphan = 1;
|
|
|
+#endif
|
|
|
+ }
|
|
|
+
|
|
|
+ if (need_orphan)
|
|
|
skb_orphan(skb);
|
|
|
else
|
|
|
skb = skb_unshare(skb, GFP_ATOMIC);
|
|
@@ -298,9 +325,12 @@ static inline struct sk_buff *hdd_skb_orphan(struct hdd_adapter *pAdapter,
|
|
|
struct sk_buff *skb) {
|
|
|
|
|
|
struct sk_buff *nskb;
|
|
|
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(3, 19, 0))
|
|
|
struct hdd_context *hdd_ctx = WLAN_HDD_GET_CTX(pAdapter);
|
|
|
+#endif
|
|
|
|
|
|
nskb = skb_unshare(skb, GFP_ATOMIC);
|
|
|
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(3, 19, 0))
|
|
|
if (unlikely(hdd_ctx->config->tx_orphan_enable) && (nskb == skb)) {
|
|
|
/*
|
|
|
* For UDP packets we want to orphan the packet to allow the app
|
|
@@ -310,6 +340,7 @@ static inline struct sk_buff *hdd_skb_orphan(struct hdd_adapter *pAdapter,
|
|
|
++pAdapter->hdd_stats.hddTxRxStats.txXmitOrphaned;
|
|
|
skb_orphan(skb);
|
|
|
}
|
|
|
+#endif
|
|
|
return nskb;
|
|
|
}
|
|
|
#endif /* QCA_LL_LEGACY_TX_FLOW_CONTROL */
|
|
@@ -571,26 +602,7 @@ 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;
|
|
|
}
|