From owner-freebsd-net@FreeBSD.ORG Fri Aug 17 03:33:14 2012 Return-Path: Delivered-To: net@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 557C2106567D for ; Fri, 17 Aug 2012 03:33:14 +0000 (UTC) (envelope-from vijju.singh@gmail.com) Received: from mail-ee0-f54.google.com (mail-ee0-f54.google.com [74.125.83.54]) by mx1.freebsd.org (Postfix) with ESMTP id DFCEC8FC1B for ; Fri, 17 Aug 2012 03:33:13 +0000 (UTC) Received: by eeke52 with SMTP id e52so1077843eek.13 for ; Thu, 16 Aug 2012 20:33:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:content-type; bh=LfL17gZebdQaDyvtuefOCW/axJGoNBxMimfEJatv5hI=; b=S68eTYr0AmiUaTbB6ZfTjHjGA6PlEPZ89OonMdt5bx79d4hFXtg2DYN1wHyx6dZpuT cMRKGR/N/Bd7LNlRfbDAvEgHE4jlDg9JTVnzGBXX0aZ4Cp1D+q0MYC5V1voZwFl1KnDB l2jmRDPd3A860nhajhSwiYRWcjkWtjurOTLKLLwPwUQ1MlEBz4UeDWEpKKatybAm14jm l5kXUIndPm8ojvyQH0WbQO2Le+EoYrd7Cc+4kZ9EFkKPdrVywAZYld5dOObRwqMNqX5/ E5zoOVSrLDd8s+nL+L9V9hLSbVd7fzxCAaMDxNTP9+0y70me0hdGmHIQ4GmPF+XeDExq E8Qw== MIME-Version: 1.0 Received: by 10.14.211.3 with SMTP id v3mr4478240eeo.43.1345174392770; Thu, 16 Aug 2012 20:33:12 -0700 (PDT) Received: by 10.14.134.145 with HTTP; Thu, 16 Aug 2012 20:33:12 -0700 (PDT) Date: Thu, 16 Aug 2012 20:33:12 -0700 Message-ID: From: Vijay Singh To: net@freebsd.org Content-Type: text/plain; charset=ISO-8859-1 Cc: Subject: a query in mb_free_ext() X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 17 Aug 2012 03:33:14 -0000 Does anyone here understand this bit of code in mb_free_ext()? /* Free attached storage if this mbuf is the only reference to it. */ if (*(m->m_ext.ref_cnt) == 1 || atomic_fetchadd_int(m->m_ext.ref_cnt, -1) == 1) { switch (m->m_ext.ext_type) { case EXT_PACKET: /* The packet zone is special. */ if (*(m->m_ext.ref_cnt) == 0) *(m->m_ext.ref_cnt) = 1; uma_zfree(zone_pack, m); return; /* Job done. */ Why would *(m->m_ext.ref_cnt) == 0 be true when the if condition checks only for ref_cnt to be 1? Should the atomic_fetchadd_int() be checked for <= 1? Also, why is the packet zone special? Any history here? -vijay