summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRajeev Kumar <rajekuma@qca.qualcomm.com>2014-05-12 12:55:21 -0700
committerPitani Venkata Rajesh Kumar <c_vpitan@qti.qualcomm.com>2014-05-14 12:47:24 +0530
commit61ebbe0381bf64a39626ab1037d4ae2c10dcedeb (patch)
tree99888928af085516454a00a7f0dc119078301b92
parent80b843112a1eda0c12c712cb3630fdf18fd63314 (diff)
qcacld: Changes to avoid dog bark by wlan_tasklet in SLUB build
Changes to avoid dog bark by wlan_tasklet when SLUB debug is enabled. This change does following: 1) Reduce RX frame processing threshold to 400 when SLUB is enabled. 2) Reschedule the tasklet from a kernel worker thread after detecting max RX processign threshold is reached Change-Id: I0589f2a2ddb3b98d1d4c8c7c4269986d69d1f8ef CRs-Fixed: 663074
-rw-r--r--CORE/SERVICES/HIF/PCIe/if_pci.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/CORE/SERVICES/HIF/PCIe/if_pci.c b/CORE/SERVICES/HIF/PCIe/if_pci.c
index b538909abf41..15ec3dfad2b0 100644
--- a/CORE/SERVICES/HIF/PCIe/if_pci.c
+++ b/CORE/SERVICES/HIF/PCIe/if_pci.c
@@ -70,7 +70,13 @@
#define AR6320_FW_2_0 (0x20)
#define AR6320_FW_3_0 (0x30)
+#ifdef CONFIG_SLUB_DEBUG_ON
+#define MAX_NUM_OF_RECEIVES 400 /* Maximum number of Rx buf to process before*
+ break out in SLUB debug builds */
+#else
#define MAX_NUM_OF_RECEIVES 1000 /* Maximum number of Rx buf to process before break out */
+#endif
+
#define PCIE_WAKE_TIMEOUT 1000 /* Maximum ms timeout for host to wake up target */
#define RAMDUMP_EVENT_TIMEOUT 2500
@@ -539,6 +545,36 @@ CE_per_engine_handler(int irq, void *arg)
return IRQ_HANDLED;
}
+#ifdef CONFIG_SLUB_DEBUG_ON
+
+/* worker thread to schedule wlan_tasklet in SLUB debug build */
+static void reschedule_tasklet_work_handler(struct work_struct *recovery)
+{
+ void *vos_context = vos_get_global_context(VOS_MODULE_ID_HIF, NULL);
+ struct ol_softc *scn = vos_get_context(VOS_MODULE_ID_HIF, vos_context);
+ struct hif_pci_softc *sc;
+
+ if (NULL == scn){
+ printk(KERN_ERR "%s: tasklet scn is null\n", __func__);
+ return;
+ }
+
+ sc = scn->hif_sc;
+
+ if (sc->hif_init_done == FALSE) {
+ printk(KERN_ERR "%s: wlan driver is unloaded\n", __func__);
+ return;
+ }
+
+ tasklet_schedule(&sc->intr_tq);
+ return;
+}
+
+static DECLARE_WORK(reschedule_tasklet_work, reschedule_tasklet_work_handler);
+
+#endif
+
+
static void
wlan_tasklet(unsigned long data)
{
@@ -568,7 +604,11 @@ wlan_tasklet(unsigned long data)
* any of the Copy Engine pipes.
*/
adf_os_atomic_set(&sc->ce_suspend, 1);
+#ifdef CONFIG_SLUB_DEBUG_ON
+ schedule_work(&reschedule_tasklet_work);
+#else
tasklet_schedule(&sc->intr_tq);
+#endif
return;
}
irq_handled: