Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 9 Jan 2001 15:58:57 -0800 (PST)
From:      Bosko Milekic <bmilekic@FreeBSD.org>
To:        cvs-committers@FreeBSD.org, cvs-all@FreeBSD.org
Subject:   cvs commit: src/sys/kern uipc_mbuf.c
Message-ID:  <200101092358.f09NwvD53053@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
bmilekic    2001/01/09 15:58:57 PST

  Modified files:
    sys/kern             uipc_mbuf.c 
  Log:
  In m_mballoc_wait(), drop the mmbfree mutex lock prior to calling
  m_reclaim() and re-acquire it when m_reclaim() returns. This means that
  we now call the drain routines without holding the mutex lock and
  recursing into it. This was done for mainly two reasons:
  
  (i) Avoid the long recursion; long recursions are typically bad and this
      is the case here because we block all other code from freeing mbufs
      if they need to. Doing that is kind of counter-productive, since we're
      really hoping that someone will free.
  
  (ii) More importantly, avoid a potential lock order reversal. Right now,
       not all the locks have been added to our networking code; but
       without this change, we're introducing the possibility for deadlock.
       Consider for example ip_drain(). We will likely eventually introduce
       a lock for ipq there, and so ip_freef() will be called with ipq lock
       held. But, ip_freef() calls m_freem() which in turn acquires the
       mmbfree lock. Since we were previously calling ip_drain() with mmbfree
       held, our lock order would be: mmbfree->ipq->mmbfree. Some other code
       may very well lock ipq first and then call ip_freef(). This would
       result in the regular lock order, ipq->mmbfree. Clearly, we have
       deadlock if one thread acquires the ipq lock and sits waiting for
       mmbfree while another thread calling m_reclaim() acquires mmbfree
       and sits waiting for the ipq lock.
  
  Also, make sure to add a comment above m_reclaim()'s definition briefly
  explaining this. Also document this above the call to m_reclaim() in
  m_mballoc_wait().
  
  Suggested and reviewed by: alfred
  
  Revision  Changes    Path
  1.61      +16 -13    src/sys/kern/uipc_mbuf.c



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe cvs-all" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200101092358.f09NwvD53053>