Question about slab allocator

Shuxin Yang shuxinyang.oss at gmail.com
Wed May 7 19:38:00 UTC 2014


Hi,

    I'm nginx newbie. I'm reading src/core/ngx_slab.c, and am confused 
as to
the purpose of NGX_SLAB_PAGE_START.

    As far as I can understand, when allocating a block, the most 
significant
bit (MSB) of first page's corresponding ngx_slab_page_s::slab is set "1".
as we can see from :

    cat -n ngx_slab.c at pristine-1.7-release
    644    page->slab = pages | NGX_SLAB_PAGE_START;

   However, the MSB of is cleared later on:
     362         } else if (shift == ngx_slab_exact_shift) {
     363
     364             page->slab = 1;

   So, what is the purpose of NGX_SLAB_PAGE_START (i.e the MSB of the 
field slab)?

   If we really meant to keep the MSB, I guess there is another bug over 
here:
  the condition at line 514 is always true, and hence we never get 
chance to
  free the empty page.

   512             page->slab &= ~m;
   513
   514             if (page->slab) {
   515                 goto done;
   516             }
   517
   518             ngx_slab_free_pages(pool, page, 1);

   Thanks
   Shuxin



More information about the nginx mailing list