From: Bruce Richardson Date: Thu, 26 Mar 2015 21:14:54 +0000 (+0000) Subject: mbuf: add explanation for confusing checks when freeing X-Git-Tag: spdx-start~9376 X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=29115712328d22ae63ef542b3c514f19bfe02613;p=dpdk.git 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 --- 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)) {