cvs commit: src/sys/vm uma_core.c

Bosko Milekic bmilekic at FreeBSD.org
Wed Jun 9 19:18:51 GMT 2004


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


More information about the cvs-src mailing list