summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRajeev Kumar <rajekuma@codeaurora.org>2017-06-13 16:42:30 -0700
committersnandini <snandini@codeaurora.org>2017-06-19 03:52:46 -0700
commit1a76aa975fc5fbc2246b73d0aff84feae9b57d7c (patch)
treedc18bb942bf49a5c0b0c29614585ea4f522bbd2a
parentca8f798f771e5e883b4b3083dd5fb680f3be7142 (diff)
qcacmn: Trigger panic on SKB memory leak in debug builds
To catch SKB memory leaks trigger panic on SKB leak in SLUB debug builds if CONFIG_HALT_KMEMLEAK is enabled. Change-Id: I817af56b4de19beae835f6d7791be51d4984ed22 CRs-Fixed: 2060796
-rw-r--r--qdf/linux/src/qdf_nbuf.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/qdf/linux/src/qdf_nbuf.c b/qdf/linux/src/qdf_nbuf.c
index b412d78a4a67..eceee0be12bd 100644
--- a/qdf/linux/src/qdf_nbuf.c
+++ b/qdf/linux/src/qdf_nbuf.c
@@ -1427,6 +1427,18 @@ void qdf_net_buf_debug_init(void)
}
qdf_export_symbol(qdf_net_buf_debug_init);
+#ifdef CONFIG_HALT_KMEMLEAK
+static void qdf_net_buf_handle_skb_leak(uint32_t leaked_skb_count)
+{
+ if (leaked_skb_count) {
+ qdf_print("%d SKB leaked", leaked_skb_count);
+ QDF_BUG(0);
+ }
+}
+#else
+static void qdf_net_buf_handle_skb_leak(uint32_t leaked_skb_count) { }
+#endif
+
/**
* qdf_net_buf_debug_init() - exit network buffer debug functionality
*
@@ -1439,6 +1451,7 @@ qdf_export_symbol(qdf_net_buf_debug_init);
void qdf_net_buf_debug_exit(void)
{
uint32_t i;
+ uint32_t count = 0;
unsigned long irq_flag;
QDF_NBUF_TRACK *p_node;
QDF_NBUF_TRACK *p_prev;
@@ -1449,6 +1462,7 @@ void qdf_net_buf_debug_exit(void)
while (p_node) {
p_prev = p_node;
p_node = p_node->p_next;
+ count++;
qdf_print("SKB buf memory Leak@ File %s, @Line %d, size %zu\n",
p_prev->file_name, p_prev->line_num,
p_prev->size);
@@ -1458,6 +1472,8 @@ void qdf_net_buf_debug_exit(void)
}
qdf_nbuf_track_memory_manager_destroy();
+
+ qdf_net_buf_handle_skb_leak(count);
}
qdf_export_symbol(qdf_net_buf_debug_exit);