diff options
| author | Rajeev Kumar <rajekuma@qca.qualcomm.com> | 2014-05-12 12:55:21 -0700 |
|---|---|---|
| committer | Pitani Venkata Rajesh Kumar <c_vpitan@qti.qualcomm.com> | 2014-05-14 12:47:24 +0530 |
| commit | 61ebbe0381bf64a39626ab1037d4ae2c10dcedeb (patch) | |
| tree | 99888928af085516454a00a7f0dc119078301b92 | |
| parent | 80b843112a1eda0c12c712cb3630fdf18fd63314 (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.c | 40 |
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: |
