Пример #1
0
/**
 * cdf_mem_malloc() - allocation CDF memory
 * @size: Number of bytes of memory to allocate.
 *
 * This function will dynamicallly allocate the specified number of bytes of
 * memory.
 *
 *
 * Return:
 *	Upon successful allocate, returns a non-NULL pointer to the allocated
 *	memory.  If this function is unable to allocate the amount of memory
 *	specified (for any reason) it returns %NULL.
 *
 */
void *cdf_mem_malloc(size_t size)
{
	int flags = GFP_KERNEL;
#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
	void *pmem;
#endif
	if (size > (1024 * 1024) || size == 0) {
		CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
			  "%s: called with invalid arg; passed in %zu !!",
			  __func__, size);
		return NULL;
	}

#if defined(CONFIG_CNSS) && defined(CONFIG_WCNSS_MEM_PRE_ALLOC)
	if (size > WCNSS_PRE_ALLOC_GET_THRESHOLD) {
		pmem = wcnss_prealloc_get(size);
		if (NULL != pmem) {
			memset(pmem, 0, size);
			return pmem;
		}
	}
#endif

	if (in_interrupt() || irqs_disabled() || in_atomic())
		flags = GFP_ATOMIC;

	return kzalloc(size, flags);
}
v_VOID_t * vos_mem_malloc( v_SIZE_t size )
{
   int flags = GFP_KERNEL;
#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
    v_VOID_t* pmem;
#endif    
   if (size > (1024*1024))
   {
       VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, "%s: called with arg > 1024K; passed in %d !!!", __func__,size); 
       return NULL;
   }
   if (in_interrupt() || irqs_disabled() || in_atomic())
   {
      flags = GFP_ATOMIC;
   }
#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
   if(size > WCNSS_PRE_ALLOC_GET_THRESHOLD)
   {
       pmem = wcnss_prealloc_get(size);
       if(NULL != pmem) 
           return pmem;
   }
#endif
   return kmalloc(size, flags);
}   
Пример #3
0
/**
 * cdf_mem_malloc_debug() - debug version of CDF memory allocation API
 * @size: Number of bytes of memory to allocate.
 * @fileName: File name from which memory allocation is called
 * @lineNum: Line number from which memory allocation is called
 *
 * This function will dynamicallly allocate the specified number of bytes of
 * memory and ad it in cdf tracking list to check against memory leaks and
 * corruptions
 *
 *
 * Return:
 *      Upon successful allocate, returns a non-NULL pointer to the allocated
 *      memory.  If this function is unable to allocate the amount of memory
 *      specified (for any reason) it returns %NULL.
 *
 */
void *cdf_mem_malloc_debug(size_t size, char *fileName, uint32_t lineNum)
{
	struct s_cdf_mem_struct *memStruct;
	void *memPtr = NULL;
	uint32_t new_size;
	int flags = GFP_KERNEL;

	if (size > (1024 * 1024) || size == 0) {
		CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
			  "%s: called with invalid arg; passed in %zu !!!",
			  __func__, size);
		return NULL;
	}

#if defined(CONFIG_CNSS) && defined(CONFIG_WCNSS_MEM_PRE_ALLOC)
	if (size > WCNSS_PRE_ALLOC_GET_THRESHOLD) {
		void *pmem;
		pmem = wcnss_prealloc_get(size);
		if (NULL != pmem) {
			memset(pmem, 0, size);
			return pmem;
		}
	}
#endif

	if (in_interrupt() || irqs_disabled() || in_atomic())
		flags = GFP_ATOMIC;

	new_size = size + sizeof(struct s_cdf_mem_struct) + 8;

	memStruct = (struct s_cdf_mem_struct *)kzalloc(new_size, flags);

	if (memStruct != NULL) {
		CDF_STATUS cdf_status;

		memStruct->fileName = fileName;
		memStruct->lineNum = lineNum;
		memStruct->size = size;

		cdf_mem_copy(&memStruct->header[0],
			     &WLAN_MEM_HEADER[0], sizeof(WLAN_MEM_HEADER));

		cdf_mem_copy((uint8_t *) (memStruct + 1) + size,
			     &WLAN_MEM_TAIL[0], sizeof(WLAN_MEM_TAIL));

		cdf_spin_lock_irqsave(&cdf_mem_list_lock);
		cdf_status = cdf_list_insert_front(&cdf_mem_list,
						   &memStruct->pNode);
		cdf_spin_unlock_irqrestore(&cdf_mem_list_lock);
		if (CDF_STATUS_SUCCESS != cdf_status) {
			CDF_TRACE(CDF_MODULE_ID_CDF, CDF_TRACE_LEVEL_ERROR,
				  "%s: Unable to insert node into List cdf_status %d",
				  __func__, cdf_status);
		}

		memPtr = (void *)(memStruct + 1);
	}
	return memPtr;
}
Пример #4
0
v_VOID_t * vos_mem_malloc( v_SIZE_t size )
{
   int flags = GFP_KERNEL;
#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
    v_VOID_t* pmem;
#endif
   v_VOID_t* memPtr = NULL;
   unsigned long  time_before_kmalloc;

   if (size > (1024*1024) || size == 0)
   {
       VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
            "%s: called with invalid arg %u !!", __func__, size);
       vos_log_low_resource_failure(WIFI_EVENT_MEMORY_FAILURE);
       return NULL;
   }
   if (in_interrupt() || irqs_disabled() || in_atomic())
   {
      flags = GFP_ATOMIC;
   }
#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
   if(size > WCNSS_PRE_ALLOC_GET_THRESHOLD)
   {
       pmem = wcnss_prealloc_get(size);
       if(NULL != pmem) {
           memset(pmem, 0, size);
           return pmem;
       }
   }
#endif
   time_before_kmalloc = vos_timer_get_system_time();
   memPtr = kmalloc(size, flags);
   /* If time taken by kmalloc is greater than
    * VOS_GET_MEMORY_TIME_THRESHOLD msec
    */
   if (vos_timer_get_system_time() - time_before_kmalloc >=
                                    VOS_GET_MEMORY_TIME_THRESHOLD)
       VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
           "%s: kmalloc took %lu msec for size %d from %pS",
           __func__,
           vos_timer_get_system_time() - time_before_kmalloc,
           size, (void *)_RET_IP_);
   if (!memPtr)
       vos_log_low_resource_failure(WIFI_EVENT_MEMORY_FAILURE);

   return memPtr;
}
Пример #5
0
v_VOID_t * vos_mem_malloc( v_SIZE_t size )
{
   int flags = GFP_KERNEL;
   v_VOID_t* memPtr = NULL;
#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
    v_VOID_t* pmem;
#endif    
   unsigned long  time_before_kmalloc;

   if (size > (1024*1024) || size == 0)
   {
       VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
               "%s: called with invalid arg %u !!!", __func__, size);
       return NULL;
   }
   if (in_interrupt() || irqs_disabled() || in_atomic())
   {
      flags = GFP_ATOMIC;
   }
#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
   if(size > WCNSS_PRE_ALLOC_GET_THRESHOLD)
   {
       pmem = wcnss_prealloc_get(size);
       if(NULL != pmem) 
           return pmem;
   }
#endif
   time_before_kmalloc = vos_timer_get_system_time();
   memPtr = kmalloc(size, flags);
   /* If time taken by kmalloc is greater than VOS_GET_MEMORY_TIME_THRESHOLD
    * msec */
   if (vos_timer_get_system_time() - time_before_kmalloc >=
                              VOS_GET_MEMORY_TIME_THRESHOLD)
      VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
          "%s: kmalloc took %lu msec", __func__,
          vos_timer_get_system_time() - time_before_kmalloc);

   return memPtr;

}
Пример #6
0
v_VOID_t *vos_mem_malloc_debug(v_SIZE_t size, const char *fileName,
                                          v_U32_t lineNum)
{
   struct s_vos_mem_struct* memStruct;
   v_VOID_t* memPtr = NULL;
   v_SIZE_t new_size;
   int flags = GFP_KERNEL;
   unsigned long IrqFlags;
   unsigned long  time_before_kmalloc;


   if (size > (1024*1024)|| size == 0)
   {
       VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
               "%s: called with invalid arg %u !!!", __func__, size);
       return NULL;
   }

   if (in_interrupt() || in_atomic() || irqs_disabled())
   {
       flags = GFP_ATOMIC;
   }

#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
   if (size > WCNSS_PRE_ALLOC_GET_THRESHOLD)
   {
      v_VOID_t *pmem;
      pmem = wcnss_prealloc_get(size);
      if (NULL != pmem) {
         memset(pmem, 0, size);
         return pmem;
      }
   }
#endif

   new_size = size + sizeof(struct s_vos_mem_struct) + 8;
   time_before_kmalloc = vos_timer_get_system_time();
   memStruct = (struct s_vos_mem_struct*)kmalloc(new_size, flags);
   /* If time taken by kmalloc is greater than
    * VOS_GET_MEMORY_TIME_THRESHOLD msec
    */
   if (vos_timer_get_system_time() - time_before_kmalloc >=
                                    VOS_GET_MEMORY_TIME_THRESHOLD)
      VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
           "%s: kmalloc took %lu msec for size %d called from %pS at line %d",
           __func__,
           vos_timer_get_system_time() - time_before_kmalloc,
           size, (void *)_RET_IP_, lineNum);

   if(memStruct != NULL)
   {
      VOS_STATUS vosStatus;

      memStruct->fileName = fileName;
      memStruct->lineNum  = lineNum;
      memStruct->size     = size;

      vos_mem_save_stack_trace(memStruct);

      vos_mem_copy(&memStruct->header[0], &WLAN_MEM_HEADER[0], sizeof(WLAN_MEM_HEADER));
      vos_mem_copy( (v_U8_t*)(memStruct + 1) + size, &WLAN_MEM_TAIL[0], sizeof(WLAN_MEM_TAIL));

      spin_lock_irqsave(&vosMemList.lock, IrqFlags);
      vosStatus = hdd_list_insert_front(&vosMemList, &memStruct->pNode);
      alloc_trace_usage(fileName, lineNum, size);
      spin_unlock_irqrestore(&vosMemList.lock, IrqFlags);
      if(VOS_STATUS_SUCCESS != vosStatus)
      {
         VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
             "%s: Unable to insert node into List vosStatus %d", __func__, vosStatus);
      }

      memPtr = (v_VOID_t*)(memStruct + 1);
   }
   return memPtr;
}
v_VOID_t * vos_mem_malloc_debug( v_SIZE_t size, char* fileName, v_U32_t lineNum)
{
   struct s_vos_mem_struct* memStruct;
   v_VOID_t* memPtr = NULL;
   v_SIZE_t new_size;
   int flags = GFP_KERNEL;
   unsigned long IrqFlags;


   if (size > (1024*1024))
   {
       VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR,
               "%s: called with arg > 1024K; passed in %d !!!", __func__,size); 
       return NULL;
   }

   if (in_interrupt())
   {
      flags = GFP_ATOMIC;
   }

   if (!memory_dbug_flag)
   {
#ifdef CONFIG_WCNSS_MEM_PRE_ALLOC
      v_VOID_t* pmem;
      if (size > WCNSS_PRE_ALLOC_GET_THRESHOLD)
      {
           pmem = wcnss_prealloc_get(size);
           if (NULL != pmem)
               return pmem;
      }
#endif
      return kmalloc(size, flags);
   }

   new_size = size + sizeof(struct s_vos_mem_struct) + 8; 

   memStruct = (struct s_vos_mem_struct*)kmalloc(new_size, flags);

   if(memStruct != NULL)
   {
      VOS_STATUS vosStatus;

      memStruct->fileName = fileName;
      memStruct->lineNum  = lineNum;
      memStruct->size     = size;

      vos_mem_copy(&memStruct->header[0], &WLAN_MEM_HEADER[0], sizeof(WLAN_MEM_HEADER));
      vos_mem_copy( (v_U8_t*)(memStruct + 1) + size, &WLAN_MEM_TAIL[0], sizeof(WLAN_MEM_TAIL));

      spin_lock_irqsave(&vosMemList.lock, IrqFlags);
      vosStatus = hdd_list_insert_front(&vosMemList, &memStruct->pNode);
      spin_unlock_irqrestore(&vosMemList.lock, IrqFlags);
      if(VOS_STATUS_SUCCESS != vosStatus)
      {
         VOS_TRACE(VOS_MODULE_ID_VOSS, VOS_TRACE_LEVEL_ERROR, 
             "%s: Unable to insert node into List vosStatus %d", __func__, vosStatus);
      }

      memPtr = (v_VOID_t*)(memStruct + 1); 
   }
   return memPtr;
}