On Thu, Nov 08, 2018 at 01:42:41PM +0000, David Laight wrote: > From: Matthew Wilcox > > On Thu, Nov 08, 2018 at 12:02:49PM +0000, David Laight wrote: > > > This can be mitigated by only allocating 'big' numbers on systems > > > that have a lot of pids. > > > You also really want an O(1) allocator. > > > > The allocator is O(log n) -- it's the IDR allocator, used in cyclic mode. > > n in this case is the highest ID which is still in use. The tree is > > log_64(n) levels high. It walks to the bottom of the tree and puts a > > pointer into the tree. If the cursor has wrapped to the beginning of > > the tree, it may encounter a PID which is still in use; if it does, > > it does a bitmap scan of that node, and will then walk up the tree, > > doing a bitmap scan forward at each level until it finds a free PID. > > Right, but you can choose the pid so that you get a perfect hash. > You can then put a FIFO free list through the unused entries of > the hash table (just an array). > Then pid allocate just picks the oldest free entry and ups the > high bits (that the hash masks out) to make the old value stale. > Almost no cache lines are involved in the whole operation. You'd be looking for something like dynamic perfect hashing then? I think that'd make a great project for someone to try out. I don't have the time to look into it myself, and I'm not convinced there's a real workload that would benefit. But it'd be a great project for a university student.