On 18-May-2002 Kenneth D. Merry wrote:
> On Fri, May 17, 2002 at 23:02:55 -0700, Alfred Perlstein wrote:
>> * Kenneth D. Merry <[EMAIL PROTECTED]> [020517 22:40] wrote:
>> > 
>> > I have released a new set of zero copy sockets patches, against -current
>> > from today (May 17th, 2002).
>> > 
>> > The main change is to deal with the vfs_ioopt changes that Alan Cox made
>> > in
>> > kern_subr.c.  (They conflicted a bit with the zero copy receive code.)
>> > 
>> > The patches and the FAQ are available here:
>> > 
>> > http://people.freebsd.org/~ken/zero_copy/
>> > 
>> > Comments, questions and reviews are all welcome!
>> 
>> jumbo_vm_init() has a bunch of bugs
>> 
>> first it doesn't work right if called concurrently.
>> you need to protect the initialization of jumbo_vm_object otherwise
>> bad things can happen.  my suggestion is to store the results of
>> vm_object_allocate into a temporary, grab the mutex and then check
>> to see if jumbo_vm_object has been initialized again if it has then
>> free the object, otherwise store the allocated object into the
>> global and continue.
> 
> The problem here is that the mutex needs to be initialized before I can
> acquire it, and there's going to be a race between checking to see
> whether it has been initialized and actually initializing it.
> 
> e.g.:
> 
>       if (!mtx_initialized(&jumbo_mutex))
>               mtx_init(&jumbo_mutex, "jumbo mutex", NULL, MTX_DEF);
> 
>       mtx_lock(&jumbo_mutex);
> 
>       if (jumbo_vm_object != NULL) {
>               mtx_unlock(&jumbo_mutex);
>               return (1);
>       }
> 
>       /* allocate our object */
>       jumbo_vm_object = vm_object_allocate(OBJT_DEFAULT, JUMBO_MAX_PAGES);
> 
> The above would work, I think, if it weren't for the race in the mutex
> initialization, and assuming I can allocate a vm object while holding
> the jumbo mutex.
> 
> Suggestions?

Either use a sysinit or something gross like this:

        static int jumbo_init = 0;

        ...
        while (jumbo_init != 2) {
                if (atomic_cmpset_acq_int(&jumbo_init, 0, 1) {
                        mtx_init(&jumbo_mutex, "jumbo_mutex", NULL, MTX_DEF);
                        atomic_store_rel_int(&jumbo_init, 2);
                }
        }

        mtx_lock(&jumbo_mutex);

        ...

a sysinit is probably best though.

-- 

John Baldwin <[EMAIL PROTECTED]>  <><  http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve!"  -  http://www.FreeBSD.org/

To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-current" in the body of the message

Reply via email to