On Mon, 23 Oct 2023, Vlastimil Babka wrote:
For much of the frozen handling we must be holding the node list lock
anyways in order to add/remove from the list. So we already have a lock
that could be used to protect flag operations.
I can see the following differences between the traditional frozen bit and
the new flag:
frozen bit advantage:
- __slab_free() on an already-frozen slab can ignore list operations and
list_lock completely
frozen bit disadvantage:
- acquire_slab() trying to do cmpxchg_double() under list_lock (see commit
9b1ea29bc0d7)
Ok so a slab is frozen if either of those conditions are met. That gets a
bit complicated to test for. Can we just get away with the
slab_node_partial flag?
The advantage with the frozen state is that it can be changed with a
cmpxchg together with some other values (list pointer, counter) that need
updating at free and allocation.
But frozen updates are rarer so maybe its worth to completely drop the
frozen bit. If both need to be updates then we would have two atomic ops.
One is the cmpxchg and the other the operation on the page flag.