From 29115712328d22ae63ef542b3c514f19bfe02613 Mon Sep 17 00:00:00 2001 From: Bruce Richardson Date: Thu, 26 Mar 2015 21:14:54 +0000 Subject: [PATCH] mbuf: add explanation for confusing checks when freeing The logic used in the condition check before freeing an mbuf is sometimes confusing, so explain it in a proper comment. Signed-off-by: Bruce Richardson Acked-by: Olivier Matz Acked-by: Konstantin Ananyev Acked-by: Neil Horman --- lib/librte_mbuf/rte_mbuf.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/librte_mbuf/rte_mbuf.h b/lib/librte_mbuf/rte_mbuf.h index 17ba7915dc..02651729a6 100644 --- a/lib/librte_mbuf/rte_mbuf.h +++ b/lib/librte_mbuf/rte_mbuf.h @@ -764,6 +764,16 @@ __rte_pktmbuf_prefree_seg(struct rte_mbuf *m) { __rte_mbuf_sanity_check(m, 0); + /* + * Check to see if this is the last reference to the mbuf. + * Note: the double check here is deliberate. If the ref_cnt is "atomic" + * the call to "refcnt_update" is a very expensive operation, so we + * don't want to call it in the case where we know we are the holder + * of the last reference to this mbuf i.e. ref_cnt == 1. + * If however, ref_cnt != 1, it's still possible that we may still be + * the final decrementer of the count, so we need to check that + * result also, to make sure the mbuf is freed properly. + */ if (likely (rte_mbuf_refcnt_read(m) == 1) || likely (rte_mbuf_refcnt_update(m, -1) == 0)) { -- 2.20.1