hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/mm/rmap.c
....@@ -91,7 +91,8 @@
9191 anon_vma = kmem_cache_alloc(anon_vma_cachep, GFP_KERNEL);
9292 if (anon_vma) {
9393 atomic_set(&anon_vma->refcount, 1);
94
- anon_vma->degree = 1; /* Reference for first vma */
94
+ anon_vma->num_children = 0;
95
+ anon_vma->num_active_vmas = 0;
9596 anon_vma->parent = anon_vma;
9697 /*
9798 * Initialise the anon_vma root to point to itself. If called
....@@ -199,6 +200,7 @@
199200 anon_vma = anon_vma_alloc();
200201 if (unlikely(!anon_vma))
201202 goto out_enomem_free_avc;
203
+ anon_vma->num_children++; /* self-parent link for new root */
202204 allocated = anon_vma;
203205 }
204206
....@@ -208,8 +210,7 @@
208210 if (likely(!vma->anon_vma)) {
209211 vma->anon_vma = anon_vma;
210212 anon_vma_chain_link(vma, avc, anon_vma);
211
- /* vma reference or self-parent link for new root */
212
- anon_vma->degree++;
213
+ anon_vma->num_active_vmas++;
213214 allocated = NULL;
214215 avc = NULL;
215216 }
....@@ -294,19 +295,19 @@
294295 anon_vma_chain_link(dst, avc, anon_vma);
295296
296297 /*
297
- * Reuse existing anon_vma if its degree lower than two,
298
- * that means it has no vma and only one anon_vma child.
298
+ * Reuse existing anon_vma if it has no vma and only one
299
+ * anon_vma child.
299300 *
300
- * Do not chose parent anon_vma, otherwise first child
301
- * will always reuse it. Root anon_vma is never reused:
301
+ * Root anon_vma is never reused:
302302 * it has self-parent reference and at least one child.
303303 */
304304 if (!dst->anon_vma && src->anon_vma &&
305
- anon_vma != src->anon_vma && anon_vma->degree < 2)
305
+ anon_vma->num_children < 2 &&
306
+ anon_vma->num_active_vmas == 0)
306307 dst->anon_vma = anon_vma;
307308 }
308309 if (dst->anon_vma)
309
- dst->anon_vma->degree++;
310
+ dst->anon_vma->num_active_vmas++;
310311 unlock_anon_vma_root(root);
311312 return 0;
312313
....@@ -356,6 +357,7 @@
356357 anon_vma = anon_vma_alloc();
357358 if (!anon_vma)
358359 goto out_error;
360
+ anon_vma->num_active_vmas++;
359361 avc = anon_vma_chain_alloc(GFP_KERNEL);
360362 if (!avc)
361363 goto out_error_free_anon_vma;
....@@ -376,7 +378,7 @@
376378 vma->anon_vma = anon_vma;
377379 anon_vma_lock_write(anon_vma);
378380 anon_vma_chain_link(vma, avc, anon_vma);
379
- anon_vma->parent->degree++;
381
+ anon_vma->parent->num_children++;
380382 anon_vma_unlock_write(anon_vma);
381383
382384 return 0;
....@@ -408,7 +410,7 @@
408410 * to free them outside the lock.
409411 */
410412 if (RB_EMPTY_ROOT(&anon_vma->rb_root.rb_root)) {
411
- anon_vma->parent->degree--;
413
+ anon_vma->parent->num_children--;
412414 continue;
413415 }
414416
....@@ -416,7 +418,8 @@
416418 anon_vma_chain_free(avc);
417419 }
418420 if (vma->anon_vma)
419
- vma->anon_vma->degree--;
421
+ vma->anon_vma->num_active_vmas--;
422
+
420423 unlock_anon_vma_root(root);
421424
422425 /*
....@@ -427,7 +430,8 @@
427430 list_for_each_entry_safe(avc, next, &vma->anon_vma_chain, same_vma) {
428431 struct anon_vma *anon_vma = avc->anon_vma;
429432
430
- VM_WARN_ON(anon_vma->degree);
433
+ VM_WARN_ON(anon_vma->num_children);
434
+ VM_WARN_ON(anon_vma->num_active_vmas);
431435 put_anon_vma(anon_vma);
432436
433437 list_del(&avc->same_vma);
....@@ -911,6 +915,7 @@
911915
912916 return rwc.contended ? -1 : pra.referenced;
913917 }
918
+EXPORT_SYMBOL_GPL(page_referenced);
914919
915920 static bool page_mkclean_one(struct page *page, struct vm_area_struct *vma,
916921 unsigned long address, void *arg)