Jonathan Adams wrote:
> [ snipped...]
>
> Looking at the ::kmem_cache output:
>
> 32-bit:
>  >::kmem_cache ! grep streams_dblk_1984
> cac2e2b0 streams_dblk_1984 020f 000000 2048 9
>
> 64-bit
>  > ::kmem_cache ! grep streams_dblk_1936
> ffffffffec0033c08 streams_dblk_1936 0269 000000 2048 602
>
> The third field is the "flags" field;  this contains the full reason 
> for all the differences you noticed.
>
> 32-bit:  KMF_HASH | KMF_CONTENTS | KMF_AUDIT | KMF_DEADBEEF | KMF_REDZONE
> 64-bit:  KMF_HASH | KMF_CONTENTS | KMF_AUDIT | KMF_FIREWALL | 
> KMF_NOMAGAZINE
>
> The flags they both have are KMF_HASH (buffers require a hash table to 
> track control structures), KMF_CONTENTS (record contents of buffer 
> upon free), KMF_AUDIT (record information about each allocation and 
> free).
>
> The 64-bit cache is a firewall cache;  this means the buffer size is 
> rounded up to a multiple of PAGESIZE, and all buffers are allocated so
> that the end of the buffer is at the end of a page.  The allocation is 
> then done in such a way that there is an unmapped VA hole *after* that 
> page, and so that allocation addresses are not re-used recently.  The 
> magazine (that is, caching) layer of the cache is disabled, which 
> means that the objects are freed and unmapped immediately upon 
> kmem_cache_free().
>
> The 32-bit cache is a standard debugging cache;  the slabs are five 
> pages long, which is 9 buffers / slab (0x5000 / 0x540); the extra 40 
> bytes is a "REDZONE", used to detect buffer overruns, etc.  The 
> magazine layer is *enabled*, which means that freed buffers are 
> cached, until the system notices that we're running low on space.
>
> The difference only exists on DEBUG kernels, and is because 
> firewalling is not done on 32-bit platforms, since the allocation 
> patterns used waste and fragment VA space.
>
> On a non-debug system, the setup will be pretty much the same between 
> 32-bit and 64-bit systems.
>
Hi Jonathan,

I have a question about your comments above:

Raymond have told me he already set the kmem_flags = 0xf in the system,
why the kmem cache debug flags are still different between 32bit and 
64bit kernel?

The kmem_flags setting should be effecting for all of cache, right?

Anyway, thanks for your reply, I do learn something from it. :-)

-- 
Cheers,

----------------------------------------------------------
Oliver Yang | Work from home | http://blog.csdn.net/yayong


Reply via email to