Print this page
6138 don't abuse atomic_cas_*
*** 886,908 ****
/* ARGSUSED */
uint_t
get_color_start(struct as *as)
{
- uint32_t old, new;
-
if (consistent_coloring == 2 || color_start_random) {
return ((uint_t)(((gettick()) << (vac_shift - MMU_PAGESHIFT)) &
(hw_page_array[0].hp_colors - 1)));
}
! do {
! old = color_start_current;
! new = old + (color_start_stride << (vac_shift - MMU_PAGESHIFT));
! } while (atomic_cas_32(&color_start_current, old, new) != old);
!
! return ((uint_t)(new));
}
/*
* Called once at startup from kphysm_init() -- before memialloc()
* is invoked to do the 1st page_free()/page_freelist_add().
--- 886,902 ----
/* ARGSUSED */
uint_t
get_color_start(struct as *as)
{
if (consistent_coloring == 2 || color_start_random) {
return ((uint_t)(((gettick()) << (vac_shift - MMU_PAGESHIFT)) &
(hw_page_array[0].hp_colors - 1)));
}
! return ((uint_t)atomic_add_32_nv(&color_start_current,
! color_start_stride << (vac_shift - MMU_PAGESHIFT)));
}
/*
* Called once at startup from kphysm_init() -- before memialloc()
* is invoked to do the 1st page_free()/page_freelist_add().