From mboxrd@z Thu Jan 1 00:00:00 1970 From: Bruce Richardson Subject: [PATCH] mbuf: add comment explaining confusing code Date: Thu, 26 Mar 2015 21:14:54 +0000 Message-ID: <1427404494-27256-1-git-send-email-bruce.richardson@intel.com> To: dev-VfR2kkLFssw@public.gmane.org Return-path: List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces-VfR2kkLFssw@public.gmane.org Sender: "dev" 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 --- 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 17ba791..0265172 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.1.0