Plus the allocator may be reusing parts of the freed object for a freelist
etc even if the object is not poisoned.
You can simplify defrag by not doing anything in the get() method. That
means some of the objects passed to the kick() method may be already have
been freed in the interim.
The kick method then must be able to determine if the object has already
been freed (or is undergoing freeing) by inspecting the object contents
(allocations are held off until kick() is complete). It then needs to free
only the objects that are still allocated.
That way you could get to a one stage system.... If the dentry code can
give us that then the approach would become much simpler.
--