The race condition should be avoided. That can be done easily by first doing the shm_reserve(). If that succeeds, a pool can be allocated normally behind the lock.
shm = shm_reserve(); if (shm == invalid) return -1; LOCK(); // Search a free pool and reserve it (like today) UNLOCK(); if (pool == NULL) { shm_free(shm); return -1; } pool->ring_shm = shm; ... -Petri > -----Original Message----- > From: lng-odp [mailto:lng-odp-boun...@lists.linaro.org] On Behalf Of Maxim > Uvarov > Sent: Monday, January 09, 2017 6:57 PM > To: Bill Fischofer <bill.fischo...@linaro.org> > Cc: lng-odp-forward <lng-odp@lists.linaro.org> > Subject: Re: [lng-odp] [API-NEXT PATCHv3] linux-generic: pool: defer ring > allocation until pool creation > > Petri, do you have objections for this patch for locked area? If not, > than Bill can do v2 with more clean shm names. > > Maxim. > > On 12/16/16 17:08, Bill Fischofer wrote: > > On Fri, Dec 16, 2016 at 7:13 AM, Maxim Uvarov <maxim.uva...@linaro.org> > wrote: > >> On 12/16/16 11:06, Savolainen, Petri (Nokia - FI/Espoo) wrote: > >>>> > >>>> @@ -172,6 +172,7 @@ static pool_t *reserve_pool(void) > >>>> { > >>>> int i; > >>>> pool_t *pool; > >>>> + char ring_name[ODP_POOL_NAME_LEN]; > >>>> > >>>> for (i = 0; i < ODP_CONFIG_POOLS; i++) { > >>>> pool = pool_entry(i); > >>>> @@ -180,6 +181,17 @@ static pool_t *reserve_pool(void) > >>>> if (pool->reserved == 0) { > >>>> pool->reserved = 1; > >>>> UNLOCK(&pool->lock); > >>>> + sprintf(ring_name, "_odp_pool_ring_%d", i); > >> > >> > >> shm reserve will create /tmp/odp-pid-_odp_pool_ring_%d > >> > >> which looks like more odp works there. I think name pool_ring_%d is > >> better here. > > > > I can certainly change that and will do so in the next rev. I'd like > > to get Petri's feedback on the reserve question first, however, so > > that this doesn't have to be two revisions. > > > >> > >> Maxim. > >> > >> > >>>> + pool->ring_shm = > >>>> + odp_shm_reserve(ring_name, > >>>> + sizeof(pool_ring_t), > >>>> + ODP_CACHE_LINE_SIZE, 0); > >>>> + if (pool->ring_shm == ODP_SHM_INVALID) { > >>>> + ODP_ERR("Unable to alloc pool ring > %d\n", i); > >>>> + pool->reserved = 0; > >>> > >>> This must be modified inside the lock, otherwise there's a race > condition if a pool is reserved or not. > >>> > >>> Also, I'd like to have performance impact of the extra indirection > verified. > >>> > >>> -Petri > >>> > >>