Ok, updated patch:

        
https://patch-diff.githubusercontent.com/raw/thorpej/netbsd-src/pull/5.diff 
<https://patch-diff.githubusercontent.com/raw/thorpej/netbsd-src/pull/5.diff>

I went an used a simple hash table with 32 buckets.  Seems good enough for now. 
 Since the “pshared” IDs are random anyway, I didn’t bother with any exotic 
hash function — just extract some of the random bits to use as the bucket index.

I also added some test cases to exercise the basic lifecycle of the ksem 
objects.

I plan to check this in later today.

> On Feb 2, 2019, at 11:44 AM, Jason Thorpe <thor...@me.com> wrote:
> 
> 
>> On Feb 2, 2019, at 10:33 AM, Mindaugas Rasiukevicius <rm...@netbsd.org> 
>> wrote:
>> 
>> Jason Thorpe <thor...@me.com> wrote:
>>> Patch is here:
>>> https://patch-diff.githubusercontent.com/raw/thorpej/netbsd-src/pull/5.diff
>> 
>> Thanks for working on this.
>> 
>> - Why not just add a new syscall, instead of the KSEM_PSHARED stuff?
> 
> Mainly because a new syscall is more intrusive, and harder to back-port.  
> It’s a shame the existing system call didn’t have a way to pass flags up.
> 
>> - If you add the 'fd' parameter to ksem_release(), then you can move
>> fd_putfile() there too (with fd != -1 case) and simplify a little bit.
> 
> I’ll take a look.  There are a few spots where I think the pattern still 
> needs to “leak” out of ksem_release().
> 
>> - ksem_alloc_pshared_id: can ~KSEM_MARKER_MASK range be exhausted as an
>> attach vector?
> 
> You’d have to allocate a ton of pshared semaphores … it’s a 23-bit range, and 
> that definitely exceeds the system max semaphores limit.  I assign it 
> randomly only to make it harder to guess that the in-use semaphore IDs are 
> (mainly as a way to avoid bad behavior caused by buggy programs).
> 
> (As an aside, the POSIX semaphore API is … annoyingly underspecified — 
> there’s a lot of room for implementation-defined behavior that the spec 
> doesn’t even bother to call out as “implementation-defined”).
> 
>> - Can you eliminate ksem_insert_pshared_locked(), 
>> ksem_remove_pshared_locked()
>> and ksem_remove_pshared() wrappers?  They serve no purpose.
> 
> I initially did that just to hide the “what kind of data structure contains 
> the objects” away from the main logic.    I’ll go ahead and simplify, though.
> 
>> - ksem_lookup_pshared_locked: it makes sense to use a hash table here.
>> Using hashinit() is clumsy nowadays.. personally, I would replace most
>> of the subr_hash.c use cases with something like rhashmap [1] and much
>> more convenient get/put/del semantics.  Anyway, that is off-topic, so
>> up to you if you want to bother.
> 
> It does make sense to use something else .. I thought about using an r-b 
> tree.  Given the default system limits, we’re talking about a small number of 
> objects, but yah, I’ll use something better there.
> 
> -- thorpej
> 

-- thorpej

Reply via email to