From owner-freebsd-net Sat May 18 20:36: 8 2002 Delivered-To: freebsd-net@freebsd.org Received: from panzer.kdm.org (panzer.kdm.org [216.160.178.169]) by hub.freebsd.org (Postfix) with ESMTP id 6CC7C37B40F; Sat, 18 May 2002 20:35:56 -0700 (PDT) Received: (from ken@localhost) by panzer.kdm.org (8.11.6/8.9.1) id g4J3ZtU46246; Sat, 18 May 2002 21:35:55 -0600 (MDT) (envelope-from ken) Date: Sat, 18 May 2002 21:35:55 -0600 From: "Kenneth D. Merry" To: John Baldwin Cc: net@FreeBSD.org, current@FreeBSD.org, Alfred Perlstein Subject: Re: new zero copy sockets patches available Message-ID: <20020518213555.A46216@panzer.kdm.org> References: <20020518003046.A36510@panzer.kdm.org> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.2.5.1i In-Reply-To: ; from jhb@FreeBSD.org on Sat, May 18, 2002 at 09:03:38AM -0400 Sender: owner-freebsd-net@FreeBSD.ORG Precedence: bulk List-ID: List-Archive: (Web Archive) List-Help: (List Instructions) List-Subscribe: List-Unsubscribe: X-Loop: FreeBSD.org On Sat, May 18, 2002 at 09:03:38 -0400, John Baldwin wrote: > > On 18-May-2002 Kenneth D. Merry wrote: > > On Fri, May 17, 2002 at 23:02:55 -0700, Alfred Perlstein wrote: > >> * Kenneth D. Merry [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. Sounds like a sysinit is probably the way to go. I'll give it a try, thanks! Ken -- Kenneth Merry ken@kdm.org To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-net" in the body of the message