diff options
| author | CNSS_WLAN Service <cnssbldsw@qualcomm.com> | 2019-04-23 08:28:40 -0700 |
|---|---|---|
| committer | Gerrit - the friendly Code Review server <code-review@localhost> | 2019-04-23 08:28:40 -0700 |
| commit | 01f644635fea868e046c0ea0915c85f5452af684 (patch) | |
| tree | e81a35b5ca052ef2d0e71226adcd0a232aa2e176 | |
| parent | 6228788154ba67cbcc7a5d69df46398faa70ea86 (diff) | |
| parent | 55c1e3b18be8cb84973a881352415e2bfe2e7554 (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.c | 7 | ||||
| -rw-r--r-- | CORE/SERVICES/COMMON/adf/adf_os_mem.h | 11 | ||||
| -rw-r--r-- | CORE/VOSS/inc/vos_memory.h | 9 | ||||
| -rw-r--r-- | CORE/VOSS/src/vos_memory.c | 12 | ||||
| -rw-r--r-- | CORE/VOSS/src/vos_memory_prealloc.c | 216 | ||||
| -rw-r--r-- | Kbuild | 12 |
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"); @@ -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 |
