Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 9 Jun 2004 19:18:51 +0000 (UTC)
From:      Bosko Milekic <bmilekic@FreeBSD.org>
To:        src-committers@FreeBSD.org, cvs-src@FreeBSD.org, cvs-all@FreeBSD.org
Subject:   cvs commit: src/sys/vm uma_core.c
Message-ID:  <200406091918.i59JIpUe014375@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
bmilekic    2004-06-09 19:18:51 UTC

  FreeBSD src repository

  Modified files:
    sys/vm               uma_core.c 
  Log:
  Make the slabrefzone, the zone from which we allocated slabs with
  internal reference counters, UMA_ZONE_NOFREE.  This way, those slabs
  (with their ref counts) will be effectively type-stable, then using
  a trick like this on the refcount is no longer dangerous:
  
          MEXT_REM_REF(m);
          if (atomic_cmpset_int(m->m_ext.ref_cnt, 0, 1)) {
                  if (m->m_ext.ext_type == EXT_PACKET) {
                          uma_zfree(zone_pack, m);
                          return;
                  } else if (m->m_ext.ext_type == EXT_CLUSTER) {
                          uma_zfree(zone_clust, m->m_ext.ext_buf);
                          m->m_ext.ext_buf = NULL;
                  } else {
                          (*(m->m_ext.ext_free))(m->m_ext.ext_buf,
                              m->m_ext.ext_args);
                          if (m->m_ext.ext_type != EXT_EXTREF)
                                  free(m->m_ext.ref_cnt, M_MBUF);
                  }
          }
          uma_zfree(zone_mbuf, m);
  
  Previously, a second thread hitting the above cmpset might
  actually read the refcnt AFTER it has already been freed.  A very
  rare occurance.  Now we'll know that it won't be freed, though.
  
  Spotted by: julian, pjd
  
  Revision  Changes    Path
  1.95      +2 -1      src/sys/vm/uma_core.c



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