lkml.org 
[lkml]   [2021]   [Sep]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH v2 07/13] mm: thp: make split queue lock safe when LRU pages reparented
Date
Similar to lruvec lock, we use the same approach to make the split
queue lock safe when LRU pages reparented.

Signed-off-by: Muchun Song <songmuchun@bytedance.com>
---
mm/huge_memory.c | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+)

diff --git a/mm/huge_memory.c b/mm/huge_memory.c
index 9d8dfa82991a..12950d4988e6 100644
--- a/mm/huge_memory.c
+++ b/mm/huge_memory.c
@@ -535,9 +535,22 @@ static struct deferred_split *split_queue_lock(struct page *head)
{
struct deferred_split *queue;

+ rcu_read_lock();
+retry:
queue = page_split_queue(head);
spin_lock(&queue->split_queue_lock);

+ if (unlikely(split_queue_memcg(queue) != page_memcg(head))) {
+ spin_unlock(&queue->split_queue_lock);
+ goto retry;
+ }
+
+ /*
+ * Preemption is disabled in the internal of spin_lock, which can serve
+ * as RCU read-side critical sections.
+ */
+ rcu_read_unlock();
+
return queue;
}

@@ -546,9 +559,19 @@ split_queue_lock_irqsave(struct page *head, unsigned long *flags)
{
struct deferred_split *queue;

+ rcu_read_lock();
+retry:
queue = page_split_queue(head);
spin_lock_irqsave(&queue->split_queue_lock, *flags);

+ if (unlikely(split_queue_memcg(queue) != page_memcg(head))) {
+ spin_unlock_irqrestore(&queue->split_queue_lock, *flags);
+ goto retry;
+ }
+
+ /* See the comments in split_queue_lock(). */
+ rcu_read_unlock();
+
return queue;
}

--
2.11.0
\
 
 \ /
  Last update: 2021-09-16 15:53    [W:0.170 / U:0.100 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site