Эх сурвалжийг харах

qcacmn: Maintain counter for nbuf tracker nodes memory allocation failures

During nbuf free if entry is not found in debug tracker list
it is treated as double free or unallocated buffer free
which is not correct because there is possibility of nbuf
entry not being present in debug tracker list due to memory
allocation failures for tracker nodes in system low memory state.

Maintaian counter for nbuf debug tracker node memory
allocation failures, during nbuf free if entry is not found
in debug tracker list and tracker memory allocation failures
are present then don't raise issue for nbuf free.

Change-Id: I770cfc23bad35af7e7dbec34852a31cc68300ca5
CRs-Fixed: 2844059
Karthik Kantamneni 4 жил өмнө
parent
commit
dcba7b8baf
1 өөрчлөгдсөн 11 нэмэгдсэн , 4 устгасан
  1. 11 4
      qdf/linux/src/qdf_nbuf.c

+ 11 - 4
qdf/linux/src/qdf_nbuf.c

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014-2020 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2014-2021 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
@@ -2262,6 +2262,7 @@ static uint32_t qdf_net_buf_track_used_list_count;
 static uint32_t qdf_net_buf_track_max_used;
 static uint32_t qdf_net_buf_track_max_free;
 static uint32_t qdf_net_buf_track_max_allocated;
+static uint32_t qdf_net_buf_track_fail_count;
 
 /**
  * update_max_used() - update qdf_net_buf_track_max_used tracking variable
@@ -2667,10 +2668,12 @@ void qdf_net_buf_debug_add_node(qdf_nbuf_t net_buf, size_t size,
 			qdf_mem_skb_inc(size);
 			p_node->p_next = gp_qdf_net_buf_track_tbl[i];
 			gp_qdf_net_buf_track_tbl[i] = p_node;
-		} else
+		} else {
+			qdf_net_buf_track_fail_count++;
 			qdf_print(
 				  "Mem alloc failed ! Could not track skb from %s %d of size %zu",
 				  func_name, line_num, size);
+		}
 	}
 
 	spin_unlock_irqrestore(&g_qdf_net_buf_track_lock[i], irq_flag);
@@ -2802,8 +2805,12 @@ done:
 		qdf_mem_skb_dec(p_node->size);
 		qdf_nbuf_track_free(p_node);
 	} else {
-		QDF_MEMDEBUG_PANIC("Unallocated buffer ! Double free of net_buf %pK ?",
-				   net_buf);
+		if (qdf_net_buf_track_fail_count) {
+			qdf_print("Untracked net_buf free: %pK with tracking failures count: %u",
+				  net_buf, qdf_net_buf_track_fail_count);
+		} else
+			QDF_MEMDEBUG_PANIC("Unallocated buffer ! Double free of net_buf %pK ?",
+					   net_buf);
 	}
 }
 qdf_export_symbol(qdf_net_buf_debug_delete_node);