The swap code synchronizes its access to the (four) pagevec struct (which is allocated per-CPU) by disabling preemption. This works and the one struct needs to be accessed from interrupt context is protected by disabling interrupts. This was manually audited and there is no lockdep coverage for this. There is one case where the per-CPU of a remote CPU needs to be accessed and this is solved by started a worker on the remote CPU and waiting for it to finish. In v1 [0] it was attempted to add per-CPU spinlocks for the access to struct. This would add lockdep coverage and access from a remote CPU so the worker wouldn't be required. It was argued about the cost of the uncontended spin_lock() and that the benefit of avoiding the per-CPU worker to be rare because it is hardly used. A static key has been suggested which enables the per-CPU locking under certain circumstances like in the NOHZ_FULL case and is implemented as part of this series. Sebastian