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