summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCNSS_WLAN Service <cnssbldsw@qualcomm.com>2019-04-23 08:28:40 -0700
committerGerrit - the friendly Code Review server <code-review@localhost>2019-04-23 08:28:40 -0700
commit01f644635fea868e046c0ea0915c85f5452af684 (patch)
treee81a35b5ca052ef2d0e71226adcd0a232aa2e176
parent6228788154ba67cbcc7a5d69df46398faa70ea86 (diff)
parent55c1e3b18be8cb84973a881352415e2bfe2e7554 (diff)
Merge "qcacld-2.0: Define CONFIG_VOS_MEM_PRE_ALLOC" into wlan-cld2.driver.lnx.1.0
-rw-r--r--CORE/HDD/src/wlan_hdd_main.c7
-rw-r--r--CORE/SERVICES/COMMON/adf/adf_os_mem.h11
-rw-r--r--CORE/VOSS/inc/vos_memory.h9
-rw-r--r--CORE/VOSS/src/vos_memory.c12
-rw-r--r--CORE/VOSS/src/vos_memory_prealloc.c216
-rw-r--r--Kbuild12
6 files changed, 255 insertions, 12 deletions
diff --git a/CORE/HDD/src/wlan_hdd_main.c b/CORE/HDD/src/wlan_hdd_main.c
index ecdc3da77c61..eb11478034b2 100644
--- a/CORE/HDD/src/wlan_hdd_main.c
+++ b/CORE/HDD/src/wlan_hdd_main.c
@@ -18225,6 +18225,10 @@ static int hdd_driver_init( void)
pr_info("%s: loading driver v%s\n", WLAN_MODULE_NAME,
QWLAN_VERSIONSTR TIMER_MANAGER_STR MEMORY_DEBUG_STR);
+#ifdef CONFIG_VOS_MEM_PRE_ALLOC
+ wcnss_prealloc_reset();
+#endif /* CONFIG_VOS_MEM_PRE_ALLOC */
+
do {
#ifndef MODULE
@@ -18491,6 +18495,9 @@ static void hdd_driver_exit(void)
#ifdef TIMER_MANAGER
vos_timer_exit();
#endif
+#ifdef CONFIG_VOS_MEM_PRE_ALLOC
+ wcnss_prealloc_reset();
+#endif
#ifdef MEMORY_DEBUG
adf_net_buf_debug_exit();
adf_nbuf_map_check_for_leaks();
diff --git a/CORE/SERVICES/COMMON/adf/adf_os_mem.h b/CORE/SERVICES/COMMON/adf/adf_os_mem.h
index 6ba0e30b865b..cb6766b9ef63 100644
--- a/CORE/SERVICES/COMMON/adf/adf_os_mem.h
+++ b/CORE/SERVICES/COMMON/adf/adf_os_mem.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011,2013,2015-2016 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011,2013,2015-2016,2019 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -44,6 +44,9 @@
#endif
#include <i_vos_types.h>
+#ifdef CONFIG_VOS_MEM_PRE_ALLOC
+#include <vos_memory.h>
+#endif
/**
* struct adf_os_mem_dma_page_t - Allocated dmaable page
@@ -96,11 +99,9 @@ adf_os_mem_free_debug(void *buf);
static inline void *
adf_os_mem_alloc(adf_os_device_t osdev, adf_os_size_t size)
{
-#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
+#if defined(CONFIG_WCNSS_MEM_PRE_ALLOC) || defined(CONFIG_VOS_MEM_PRE_ALLOC)
void *p_mem;
-#endif
-#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
if (size > WCNSS_PRE_ALLOC_GET_THRESHOLD)
{
p_mem = wcnss_prealloc_get(size);
@@ -120,7 +121,7 @@ adf_os_mem_alloc(adf_os_device_t osdev, adf_os_size_t size)
static inline void
adf_os_mem_free(void *buf)
{
-#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
+#if defined(CONFIG_WCNSS_MEM_PRE_ALLOC) || defined(CONFIG_VOS_MEM_PRE_ALLOC)
if (wcnss_prealloc_put(buf))
{
return;
diff --git a/CORE/VOSS/inc/vos_memory.h b/CORE/VOSS/inc/vos_memory.h
index 2147f249a378..5d4ed7a3c4d6 100644
--- a/CORE/VOSS/inc/vos_memory.h
+++ b/CORE/VOSS/inc/vos_memory.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014-2015 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2014-2015, 2019 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -89,7 +89,14 @@ v_VOID_t *vos_mem_malloc_debug(v_SIZE_t size, const char *fileName,
v_VOID_t * vos_mem_malloc( v_SIZE_t size );
#endif
+#ifdef CONFIG_VOS_MEM_PRE_ALLOC
+#define WCNSS_PRE_ALLOC_GET_THRESHOLD (16*1024)
+v_VOID_t wcnss_prealloc_reset(v_VOID_t);
+v_SINT_t wcnss_prealloc_put(v_VOID_t *ptr);
+v_VOID_t *wcnss_prealloc_get(v_UINT_t size);
+
+#endif /* CONFIG_VOS_MEM_PRE_ALLOC */
/*----------------------------------------------------------------------------
\brief vos_mem_free() - vOSS Free Memory
diff --git a/CORE/VOSS/src/vos_memory.c b/CORE/VOSS/src/vos_memory.c
index e58ef1ef2c84..6cb876416db7 100644
--- a/CORE/VOSS/src/vos_memory.c
+++ b/CORE/VOSS/src/vos_memory.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2012-2019 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -412,7 +412,7 @@ v_VOID_t *vos_mem_malloc_debug(v_SIZE_t size, const char *fileName,
flags = GFP_ATOMIC;
}
-#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
+#if defined(CONFIG_WCNSS_MEM_PRE_ALLOC) || defined(CONFIG_VOS_MEM_PRE_ALLOC)
if (size > WCNSS_PRE_ALLOC_GET_THRESHOLD)
{
v_VOID_t *pmem;
@@ -474,7 +474,7 @@ v_VOID_t vos_mem_free( v_VOID_t *ptr )
VOS_STATUS vosStatus;
struct s_vos_mem_struct* memStruct = ((struct s_vos_mem_struct*)ptr) - 1;
-#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
+#if defined(CONFIG_WCNSS_MEM_PRE_ALLOC) || defined(CONFIG_VOS_MEM_PRE_ALLOC)
if (wcnss_prealloc_put(ptr))
return;
#endif
@@ -515,7 +515,7 @@ v_VOID_t vos_mem_free( v_VOID_t *ptr )
v_VOID_t * vos_mem_malloc( v_SIZE_t size )
{
int flags = GFP_KERNEL;
-#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
+#if defined(CONFIG_WCNSS_MEM_PRE_ALLOC) || defined(CONFIG_VOS_MEM_PRE_ALLOC)
v_VOID_t* pmem;
#endif
v_VOID_t* memPtr = NULL;
@@ -532,7 +532,7 @@ v_VOID_t * vos_mem_malloc( v_SIZE_t size )
{
flags = GFP_ATOMIC;
}
-#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
+#if defined(CONFIG_WCNSS_MEM_PRE_ALLOC) || defined(CONFIG_VOS_MEM_PRE_ALLOC)
if(size > WCNSS_PRE_ALLOC_GET_THRESHOLD)
{
pmem = wcnss_prealloc_get(size);
@@ -563,7 +563,7 @@ v_VOID_t vos_mem_free( v_VOID_t *ptr )
if (ptr == NULL)
return;
-#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
+#if defined(CONFIG_WCNSS_MEM_PRE_ALLOC) || defined(CONFIG_VOS_MEM_PRE_ALLOC)
if(wcnss_prealloc_put(ptr))
return;
#endif
diff --git a/CORE/VOSS/src/vos_memory_prealloc.c b/CORE/VOSS/src/vos_memory_prealloc.c
new file mode 100644
index 000000000000..2f5a0f57b601
--- /dev/null
+++ b/CORE/VOSS/src/vos_memory_prealloc.c
@@ -0,0 +1,216 @@
+/*
+ * Copyright (c) 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 copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+/*Gerbera - WiFi*/
+
+/*===========================================================================
+ @file vos_memory.c
+
+ @brief Virtual Operating System Services Memory API
+===========================================================================*/
+
+/*===========================================================================
+
+ EDIT HISTORY FOR FILE
+
+
+ This section contains comments describing changes made to the module.
+ Notice that changes are listed in reverse chronological order.
+
+
+ $Header:$ $DateTime: $ $Author: $
+
+
+ when who what, where, why
+ -------- --- --------------------------------------------------------
+
+===========================================================================*/
+
+/*---------------------------------------------------------------------------
+ * Include Files
+ * ------------------------------------------------------------------------*/
+#include <linux/err.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/stacktrace.h>
+#include <linux/skbuff.h>
+
+#include "vos_memory.h"
+#include "vos_trace.h"
+#include "vos_api.h"
+#include "vos_diag_core_event.h"
+
+#include "vos_cnss.h"
+
+static DEFINE_SPINLOCK(alloc_lock);
+
+typedef struct
+{
+ char *name;
+ char *value;
+}tCfgIniEntry;
+#define MAX_CFG_INI_ITEMS 1024
+#define DBG_STRING(id) [id] = #id
+
+#ifdef CONFIG_SLUB_DEBUG
+#define VOS_MAX_STACK_TRACE 64
+#endif
+
+/* pre-alloced at load time
+ * following three definition must fit
+ * to avoid memory corruption */
+
+struct wcnss_prealloc {
+ v_UINT_t occupied;
+ v_UINT_t size;
+ v_VOID_t *ptr;
+};
+
+static struct wcnss_prealloc wcnss_allocs[] = {
+ {0, 40 * 1024, NULL},
+ {0, 40 * 1024, NULL},
+ {0, 40 * 1024, NULL},
+ {0, 40 * 1024, NULL},
+ {0, 40 * 1024, NULL},
+ {0, 40 * 1024, NULL},
+ {0, 40 * 1024, NULL},
+ {0, 40 * 1024, NULL},
+ {0, 40 * 1024, NULL},
+ {0, 40 * 1024, NULL},
+ {0, 40 * 1024, NULL},
+ {0, 64 * 1024, NULL},
+ {0, 64 * 1024, NULL},
+ {0, 64 * 1024, NULL},
+ {0, 64 * 1024, NULL},
+ {0, 128 * 1024, NULL},
+ {0, 128 * 1024, NULL},
+ {0, 128 * 1024, NULL},
+ {0, 256 * 1024, NULL},
+ {0, 1024 * 1024, NULL},
+};
+
+/* pre-alloced at load time*/
+static v_UINT_t wcnss_prealloc_init(v_VOID_t)
+{
+ v_UINT_t i,j;
+
+ for (i = 0; i < ARRAY_SIZE(wcnss_allocs); i++) {
+ wcnss_allocs[i].occupied = 0;
+ wcnss_allocs[i].ptr = kmalloc(wcnss_allocs[i].size, GFP_KERNEL);
+ if (wcnss_allocs[i].ptr == NULL){
+ for (j = 0; j < i; j++) {
+ kfree(wcnss_allocs[j].ptr);
+ }
+ pr_err("wcnss_pre: %s: init failed.\n", __func__);
+ return -ENOMEM;
+ }
+ }
+
+ return 0;
+}
+
+static v_VOID_t wcnss_prealloc_deinit(v_VOID_t)
+{
+ v_UINT_t i;
+
+ for (i = 0; i < ARRAY_SIZE(wcnss_allocs); i++) {
+ wcnss_allocs[i].occupied = 0;
+ if (wcnss_allocs[i].ptr != NULL){
+ kfree(wcnss_allocs[i].ptr);
+ }
+ }
+}
+
+static v_VOID_t wcnss_trace_prealloc_occupied(v_VOID_t)
+{
+ int i;
+ printk("Memory allocs occupied:");
+
+ for (i = 0; i < ARRAY_SIZE(wcnss_allocs); i++) {
+ printk(" %d", wcnss_allocs[i].occupied);
+ }
+ printk("\n");
+}
+
+v_VOID_t *wcnss_prealloc_get(v_UINT_t size)
+{
+ v_UINT_t i = 0;
+ unsigned long flags;
+
+ spin_lock_irqsave(&alloc_lock, flags);
+ wcnss_trace_prealloc_occupied();
+ for (i = 0; i < ARRAY_SIZE(wcnss_allocs); i++) {
+ if (wcnss_allocs[i].occupied)
+ continue;
+ if (wcnss_allocs[i].size >= size) {
+ /* we found the slot */
+ wcnss_allocs[i].occupied = 1;
+ wcnss_trace_prealloc_occupied();
+ spin_unlock_irqrestore(&alloc_lock, flags);
+ return wcnss_allocs[i].ptr;
+ }
+ }
+ wcnss_trace_prealloc_occupied();
+ spin_unlock_irqrestore(&alloc_lock, flags);
+
+ pr_err("wcnss_pre: %s: prealloc not available at size %d\n", __func__, size);
+ return NULL;
+}
+EXPORT_SYMBOL(wcnss_prealloc_get);
+
+v_SINT_t wcnss_prealloc_put(v_VOID_t *ptr)
+{
+ v_UINT_t i = 0;
+ unsigned long flags;
+
+ spin_lock_irqsave(&alloc_lock, flags);
+ for (i = 0; i < ARRAY_SIZE(wcnss_allocs); i++) {
+ if (wcnss_allocs[i].ptr == ptr) {
+ wcnss_allocs[i].occupied = 0;
+ spin_unlock_irqrestore(&alloc_lock, flags);
+ return 1;
+ }
+ }
+ spin_unlock_irqrestore(&alloc_lock, flags);
+ return 0;
+}
+EXPORT_SYMBOL(wcnss_prealloc_put);
+
+v_VOID_t wcnss_prealloc_reset(v_VOID_t)
+{
+ v_UINT_t i;
+
+ for (i = 0; i < ARRAY_SIZE(wcnss_allocs); i++) {
+ wcnss_allocs[i].occupied = 0;
+ }
+}
+EXPORT_SYMBOL(wcnss_prealloc_reset);
+
+static int __init wlan_prealloc_init(void)
+{
+ return wcnss_prealloc_init();
+}
+
+static void __exit wlan_prealloc_exit(void)
+{
+ wcnss_prealloc_deinit();
+}
+
+module_init(wlan_prealloc_init)
+module_exit(wlan_prealloc_exit);
+
+MODULE_DESCRIPTION("WLAN PREALLOC DRIVER");
diff --git a/Kbuild b/Kbuild
index deb4d0d1b3e3..ec80a67c5e43 100644
--- a/Kbuild
+++ b/Kbuild
@@ -1790,6 +1790,18 @@ ifeq ($(CONFIG_WLAN_FEATURE_NAN_DATAPATH),y)
CDEFINES += -DWLAN_FEATURE_NAN_DATAPATH
endif
+ifeq ($(CONFIG_USB_RECOVERY),y)
+CDEFINES += -DWLAN_FEATURE_USB_RECOVERY
+endif
+
+ifeq ($(CONFIG_VOS_MEM_PRE_ALLOC),y)
+ifneq ($(CONFIG_WCNSS_MEM_PRE_ALLOC), y)
+CDEFINES += -DCONFIG_VOS_MEM_PRE_ALLOC
+obj-m += wlan_prealloc.o
+wlan_prealloc-y += $(VOSS_SRC_DIR)/vos_memory_prealloc.o
+endif
+endif
+
ifeq ($(CONFIG_DPTRACE_ENABLE), y)
CDEFINES += -DFEATURE_DPTRACE_ENABLE
endif