From: Hui Zhu <zhuhui@kylinos.cn>
Add a lockdep_assert_held(&si->global_cluster_lock) in
swap_cluster_alloc_table() for non-SWP_SOLIDSTATE devices.
The function already requires the caller to hold both ci->lock
and percpu_swap_cluster.lock.
And it also necessitates si->global_cluster_lock when the device is not
SWP_SOLIDSTATE.
Adding this assertion ensures locking consistency and helps catch
potential synchronization issues during development.
Change the order of lockdep_assert_held() to match the actual lock
acquisition order.
Signed-off-by: Hui Zhu <zhuhui@kylinos.cn>
---
mm/swapfile.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/mm/swapfile.c b/mm/swapfile.c
index 3fc2eb30c187..b31b86263b89 100644
--- a/mm/swapfile.c
+++ b/mm/swapfile.c
@@ -476,8 +476,10 @@ swap_cluster_alloc_table(struct swap_info_struct *si,
* Only cluster isolation from the allocator does table allocation.
* Swap allocator uses percpu clusters and holds the local lock.
*/
- lockdep_assert_held(&ci->lock);
lockdep_assert_held(&this_cpu_ptr(&percpu_swap_cluster)->lock);
+ if (!(si->flags & SWP_SOLIDSTATE))
+ lockdep_assert_held(&si->global_cluster_lock);
+ lockdep_assert_held(&ci->lock);
/* The cluster must be free and was just isolated from the free list. */
VM_WARN_ON_ONCE(ci->flags || !cluster_is_empty(ci));
--
2.43.0
On Mon, Mar 09, 2026 at 04:05:42PM +0800, Hui Zhu wrote: > From: Hui Zhu <zhuhui@kylinos.cn> > > Add a lockdep_assert_held(&si->global_cluster_lock) in > swap_cluster_alloc_table() for non-SWP_SOLIDSTATE devices. > > The function already requires the caller to hold both ci->lock > and percpu_swap_cluster.lock. > And it also necessitates si->global_cluster_lock when the device is not > SWP_SOLIDSTATE. > > Adding this assertion ensures locking consistency and helps catch > potential synchronization issues during development. > Change the order of lockdep_assert_held() to match the actual lock > acquisition order. > > Signed-off-by: Hui Zhu <zhuhui@kylinos.cn> > --- > mm/swapfile.c | 4 +++- > 1 file changed, 3 insertions(+), 1 deletion(-) > > diff --git a/mm/swapfile.c b/mm/swapfile.c > index 3fc2eb30c187..b31b86263b89 100644 > --- a/mm/swapfile.c > +++ b/mm/swapfile.c > @@ -476,8 +476,10 @@ swap_cluster_alloc_table(struct swap_info_struct *si, > * Only cluster isolation from the allocator does table allocation. > * Swap allocator uses percpu clusters and holds the local lock. > */ > - lockdep_assert_held(&ci->lock); > lockdep_assert_held(&this_cpu_ptr(&percpu_swap_cluster)->lock); > + if (!(si->flags & SWP_SOLIDSTATE)) > + lockdep_assert_held(&si->global_cluster_lock); > + lockdep_assert_held(&ci->lock); > > /* The cluster must be free and was just isolated from the free list. */ > VM_WARN_ON_ONCE(ci->flags || !cluster_is_empty(ci)); > -- > 2.43.0 The changes look good to me. Thanks! Reviewed-by: Youngjun Park <youngjun.park@lge.com>
© 2016 - 2026 Red Hat, Inc.