Convert simple loops freeing mbufs one at a time into a
single rte_pktmbuf_free_bulk() call.

Signed-off-by: Stephen Hemminger <[email protected]>
---
 devtools/cocci/free_bulk.cocci | 57 ++++++++++++++++++++++++++++++++++
 1 file changed, 57 insertions(+)
 create mode 100644 devtools/cocci/free_bulk.cocci

diff --git a/devtools/cocci/free_bulk.cocci b/devtools/cocci/free_bulk.cocci
new file mode 100644
index 0000000000..51ce58400a
--- /dev/null
+++ b/devtools/cocci/free_bulk.cocci
@@ -0,0 +1,57 @@
+//
+// Replace simple loops freeing mbufs one-by-one with rte_pktmbuf_free_bulk().
+//
+// rte_pktmbuf_free_bulk() handles NULL entries internally, so per-element
+// NULL guards are folded in as well.  Loops whose body does more than the
+// free (clearing the slot, bookkeeping, etc.) are not matched.
+//
+@@
+expression A, N;
+identifier i;
+@@
+
+(
+- for (i = 0; i < N; i++)
+-     rte_pktmbuf_free(A[i]);
++ rte_pktmbuf_free_bulk(A, N);
+|
+- for (i = 0; i < N; ++i)
+-     rte_pktmbuf_free(A[i]);
++ rte_pktmbuf_free_bulk(A, N);
+|
+- for (i = 0; i < N; i++)
+-     if (A[i] != NULL)
+-         rte_pktmbuf_free(A[i]);
++ rte_pktmbuf_free_bulk(A, N);
+|
+- for (i = 0; i < N; i++)
+-     if (A[i])
+-         rte_pktmbuf_free(A[i]);
++ rte_pktmbuf_free_bulk(A, N);
+)
+
+@@
+expression A, N;
+identifier i;
+type T;
+@@
+
+(
+- for (T i = 0; i < N; i++)
+-     rte_pktmbuf_free(A[i]);
++ rte_pktmbuf_free_bulk(A, N);
+|
+- for (T i = 0; i < N; ++i)
+-     rte_pktmbuf_free(A[i]);
++ rte_pktmbuf_free_bulk(A, N);
+|
+- for (T i = 0; i < N; i++)
+-     if (A[i] != NULL)
+-         rte_pktmbuf_free(A[i]);
++ rte_pktmbuf_free_bulk(A, N);
+|
+- for (T i = 0; i < N; i++)
+-     if (A[i])
+-         rte_pktmbuf_free(A[i]);
++ rte_pktmbuf_free_bulk(A, N);
+)
-- 
2.53.0

Reply via email to