qcacmn: Add nbuf map/unmap tracking

When MEMORY_DEBUG is enabled, track calls to nbuf map/unmap to detect
the following usage problems:

	* double map
	* double unmap
	* unmap without map
	* never unmap

Change-Id: I7326bb628d4cf0be9004398fd396907b1a06bf22
CRs-Fixed: 2155599
此提交包含在:
Dustin Brown
2017-12-07 14:18:47 -08:00
提交者 snandini
父節點 71ab9ef0b7
當前提交 4082a0951f
共有 2 個檔案被更改,包括 326 行新增18 行删除

查看文件

@@ -522,6 +522,96 @@ qdf_nbuf_set_send_complete_flag(qdf_nbuf_t buf, bool flag)
__qdf_nbuf_set_send_complete_flag(buf, flag);
}
#ifdef MEMORY_DEBUG
/**
* qdf_nbuf_map_check_for_leaks() - check for nbut map leaks
*
* Check for net buffers that have been mapped, but never unmapped.
*
* Returns: None
*/
void qdf_nbuf_map_check_for_leaks(void);
QDF_STATUS qdf_nbuf_map_debug(qdf_device_t osdev,
qdf_nbuf_t buf,
qdf_dma_dir_t dir,
const char *file,
uint32_t line);
#define qdf_nbuf_map(osdev, buf, dir) \
qdf_nbuf_map_debug(osdev, buf, dir, __FILE__, __LINE__)
void qdf_nbuf_unmap_debug(qdf_device_t osdev,
qdf_nbuf_t buf,
qdf_dma_dir_t dir,
const char *file,
uint32_t line);
#define qdf_nbuf_unmap(osdev, buf, dir) \
qdf_nbuf_unmap_debug(osdev, buf, dir, __FILE__, __LINE__)
QDF_STATUS qdf_nbuf_map_single_debug(qdf_device_t osdev,
qdf_nbuf_t buf,
qdf_dma_dir_t dir,
const char *file,
uint32_t line);
#define qdf_nbuf_map_single(osdev, buf, dir) \
qdf_nbuf_map_single_debug(osdev, buf, dir, __FILE__, __LINE__)
void qdf_nbuf_unmap_single_debug(qdf_device_t osdev,
qdf_nbuf_t buf,
qdf_dma_dir_t dir,
const char *file,
uint32_t line);
#define qdf_nbuf_unmap_single(osdev, buf, dir) \
qdf_nbuf_unmap_single_debug(osdev, buf, dir, __FILE__, __LINE__)
QDF_STATUS qdf_nbuf_map_nbytes_debug(qdf_device_t osdev,
qdf_nbuf_t buf,
qdf_dma_dir_t dir,
int nbytes,
const char *file,
uint32_t line);
#define qdf_nbuf_map_nbytes(osdev, buf, dir, nbytes) \
qdf_nbuf_map_nbytes_debug(osdev, buf, dir, nbytes, __FILE__, __LINE__)
void qdf_nbuf_unmap_nbytes_debug(qdf_device_t osdev,
qdf_nbuf_t buf,
qdf_dma_dir_t dir,
int nbytes,
const char *file,
uint32_t line);
#define qdf_nbuf_unmap_nbytes(osdev, buf, dir, nbytes) \
qdf_nbuf_unmap_nbytes_debug(osdev, buf, dir, nbytes, __FILE__, __LINE__)
QDF_STATUS qdf_nbuf_map_nbytes_single_debug(qdf_device_t osdev,
qdf_nbuf_t buf,
qdf_dma_dir_t dir,
int nbytes,
const char *file,
uint32_t line);
#define qdf_nbuf_map_nbytes_single(osdev, buf, dir, nbytes) \
qdf_nbuf_map_nbytes_single_debug(osdev, buf, dir, nbytes, \
__FILE__, __LINE__)
void qdf_nbuf_unmap_nbytes_single_debug(qdf_device_t osdev,
qdf_nbuf_t buf,
qdf_dma_dir_t dir,
int nbytes,
const char *file,
uint32_t line);
#define qdf_nbuf_unmap_nbytes_single(osdev, buf, dir, nbytes) \
qdf_nbuf_unmap_nbytes_single_debug(osdev, buf, dir, nbytes, \
__FILE__, __LINE__)
#else /* MEMORY_DEBUG */
static inline QDF_STATUS
qdf_nbuf_map(qdf_device_t osdev, qdf_nbuf_t buf, qdf_dma_dir_t dir)
{
@@ -534,6 +624,18 @@ qdf_nbuf_unmap(qdf_device_t osdev, qdf_nbuf_t buf, qdf_dma_dir_t dir)
__qdf_nbuf_unmap(osdev, buf, dir);
}
static inline QDF_STATUS
qdf_nbuf_map_single(qdf_device_t osdev, qdf_nbuf_t buf, qdf_dma_dir_t dir)
{
return __qdf_nbuf_map_single(osdev, buf, dir);
}
static inline void
qdf_nbuf_unmap_single(qdf_device_t osdev, qdf_nbuf_t buf, qdf_dma_dir_t dir)
{
__qdf_nbuf_unmap_single(osdev, buf, dir);
}
static inline QDF_STATUS
qdf_nbuf_map_nbytes(qdf_device_t osdev, qdf_nbuf_t buf,
qdf_dma_dir_t dir, int nbytes)
@@ -548,18 +650,6 @@ qdf_nbuf_unmap_nbytes(qdf_device_t osdev,
__qdf_nbuf_unmap_nbytes(osdev, buf, dir, nbytes);
}
static inline void
qdf_nbuf_sync_for_cpu(qdf_device_t osdev, qdf_nbuf_t buf, qdf_dma_dir_t dir)
{
__qdf_nbuf_sync_for_cpu(osdev, buf, dir);
}
static inline QDF_STATUS
qdf_nbuf_map_single(qdf_device_t osdev, qdf_nbuf_t buf, qdf_dma_dir_t dir)
{
return __qdf_nbuf_map_single(osdev, buf, dir);
}
static inline QDF_STATUS
qdf_nbuf_map_nbytes_single(
qdf_device_t osdev, qdf_nbuf_t buf, qdf_dma_dir_t dir, int nbytes)
@@ -567,18 +657,19 @@ qdf_nbuf_map_nbytes_single(
return __qdf_nbuf_map_nbytes_single(osdev, buf, dir, nbytes);
}
static inline void
qdf_nbuf_unmap_single(qdf_device_t osdev, qdf_nbuf_t buf, qdf_dma_dir_t dir)
{
__qdf_nbuf_unmap_single(osdev, buf, dir);
}
static inline void
qdf_nbuf_unmap_nbytes_single(
qdf_device_t osdev, qdf_nbuf_t buf, qdf_dma_dir_t dir, int nbytes)
{
return __qdf_nbuf_unmap_nbytes_single(osdev, buf, dir, nbytes);
}
#endif /* MEMORY_DEBUG */
static inline void
qdf_nbuf_sync_for_cpu(qdf_device_t osdev, qdf_nbuf_t buf, qdf_dma_dir_t dir)
{
__qdf_nbuf_sync_for_cpu(osdev, buf, dir);
}
static inline int qdf_nbuf_get_num_frags(qdf_nbuf_t buf)
{