Hi,
On Sep,Saturday 5 2009, at 3:33 PM, Pawel Jakub Dawidek wrote:

> On Sat, Sep 05, 2009 at 03:22:12PM +0200, Ricardo M. Correia wrote:
>> On Sat, 2009-09-05 at 15:08 +0200, Pawel Jakub Dawidek wrote:
>>>> Unfortunately your fix will not work correctly, because the DMU  
>>>> code
>>>> expects all of the dnode_t fields to be initialized to 0 after
>>>> allocation, which will not happen if you eliminate that call.
>>>
>>> And this is not what constructor is doing? Could you explain what
>>> doesn't work here exactly? From my understanding (at least that's  
>>> the
>>> case for FreeBSD's zone allocator) kmem_cache will call constructor
>>> after allocating the memory. If it isn't called after allocation  
>>> then
>>> when?
>>
>> Well, in Linux and Solaris, the constructor is called only when an
>> entire slab is allocated internally by the kmem code, not when the  
>> one
>> of the objects in the slab is allocated (by calling kmem_cache_alloc 
>> ()).
>>
>> In fact, the only thing kmem_cache_alloc() usually does is to just
>> retrieve a pointer from a per-CPU array of pointers and decrement a
>> counter (except if there are no more pointers available, in which  
>> case
>> the cache is refilled).
>>
>> But if in FreeBSD kmem_cache_alloc() calls the constructor, then I  
>> guess
>> you can live with your simple fix instead, no need for the  
>> complicated
>> fix.
>
> I see, thanks for explanation. Yes, FreeBSD always calls the  
> constructor,
> even if the memory is taken from cache.

Thanks for finding this, this is problem for NetBSD too then.

Regards

Adam.

Reply via email to