wil6210: add option to drop Tx packets when Tx ring is full
authorDedy Lansky <dlansky@codeaurora.org>
Fri, 22 Feb 2019 14:21:00 +0000 (16:21 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 28 Feb 2019 09:24:19 +0000 (11:24 +0200)
In AP mode with multiple clients, driver stops net queue
(netif_tx_stop_queue) upon first ring (serving specific client)
becoming full. This can have negative effect on transmission to
other clients which may still have room in their corresponding rings.

Implement new policy in which stop/wake net queue are not used. In
case there is no room in the ring for a transmitted packet, drop the
packet.

New policy can be helpful to debug performance issues, to guarantee
maximum utilization of net queues.
New policy is disabled by default and can be enabled by debugfs:
echo 1 > drop_if_ring_full

Signed-off-by: Dedy Lansky <dlansky@codeaurora.org>
Signed-off-by: Maya Erez <merez@codeaurora.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/ath/wil6210/debugfs.c
drivers/net/wireless/ath/wil6210/txrx.c
drivers/net/wireless/ath/wil6210/wil6210.h

index 835c902b84c1c2bfe91015c3f036a7598ea111b7..acbf2f0c440e211177476bc6cf91fbd3c259303d 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2012-2017 Qualcomm Atheros, Inc.
- * Copyright (c) 2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -2386,6 +2386,7 @@ static const struct dbg_off dbg_statics[] = {
        {"led_polarity", 0644, (ulong)&led_polarity, doff_u8},
        {"status_index", 0644, (ulong)&dbg_status_msg_index, doff_u32},
        {"sring_index", 0644, (ulong)&dbg_sring_index, doff_u32},
+       {"drop_if_ring_full", 0644, (ulong)&drop_if_ring_full, doff_u8},
        {},
 };
 
index 4d286fbaa7b7d93c4b1ef8bab0207d7985db163c..de259dc7404b6f294db92ec2f7e30961d6f61489 100644 (file)
@@ -38,6 +38,9 @@ bool rx_large_buf;
 module_param(rx_large_buf, bool, 0444);
 MODULE_PARM_DESC(rx_large_buf, " allocate 8KB RX buffers, default - no");
 
+/* Drop Tx packets in case Tx ring is full */
+bool drop_if_ring_full;
+
 static inline uint wil_rx_snaplen(void)
 {
        return rx_align_2 ? 6 : 0;
@@ -1974,6 +1977,10 @@ static inline void __wil_update_net_queues(struct wil6210_priv *wil,
                wil_dbg_txrx(wil, "check_stop=%d, mid=%d, stopped=%d",
                             check_stop, vif->mid, vif->net_queue_stopped);
 
+       if (ring && drop_if_ring_full)
+               /* no need to stop/wake net queues */
+               return;
+
        if (check_stop == vif->net_queue_stopped)
                /* net queues already in desired state */
                return;
@@ -2099,6 +2106,8 @@ netdev_tx_t wil_start_xmit(struct sk_buff *skb, struct net_device *ndev)
                dev_kfree_skb_any(skb);
                return NETDEV_TX_OK;
        case -ENOMEM:
+               if (drop_if_ring_full)
+                       goto drop;
                return NETDEV_TX_BUSY;
        default:
                break; /* goto drop; */
index 0f3be3ffc6a28551e9ca8b49ed3a6f02b5673a2f..ba833ac925c382f1d02d475b8af656ff263f4541 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 2012-2017 Qualcomm Atheros, Inc.
- * Copyright (c) 2018, The Linux Foundation. All rights reserved.
+ * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
  *
  * Permission to use, copy, modify, and/or distribute this software for any
  * purpose with or without fee is hereby granted, provided that the above
@@ -38,6 +38,7 @@ extern bool rx_large_buf;
 extern bool debug_fw;
 extern bool disable_ap_sme;
 extern bool ftm_mode;
+extern bool drop_if_ring_full;
 
 struct wil6210_priv;
 struct wil6210_vif;