Since private memory is intended for explicit placement, allowing
KSM to operate on it by default would completely defeat the purpose.

Skip KSM merge and scan operations for private node folios using
the same filter location as zone_device folios.

Signed-off-by: Gregory Price <[email protected]>
---
 mm/ksm.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/mm/ksm.c b/mm/ksm.c
index 47006f494fcb1..dcc5c46a29eac 100644
--- a/mm/ksm.c
+++ b/mm/ksm.c
@@ -827,7 +827,7 @@ static struct page *get_mergeable_page(struct ksm_rmap_item 
*rmap_item)
 
        folio = folio_walk_start(&fw, vma, addr, 0);
        if (folio) {
-               if (!folio_is_zone_device(folio) &&
+               if (!folio_is_private_managed(folio) &&
                    folio_test_anon(folio)) {
                        folio_get(folio);
                        page = fw.page;
@@ -2558,7 +2558,8 @@ static int ksm_next_page_pmd_entry(pmd_t *pmdp, unsigned 
long addr, unsigned lon
                                goto not_found_unlock;
                        folio = page_folio(page);
 
-                       if (folio_is_zone_device(folio) || 
!folio_test_anon(folio))
+                       if (unlikely(folio_is_private_managed(folio)) ||
+                           !folio_test_anon(folio))
                                goto not_found_unlock;
 
                        page += ((addr & (PMD_SIZE - 1)) >> PAGE_SHIFT);
@@ -2582,7 +2583,8 @@ static int ksm_next_page_pmd_entry(pmd_t *pmdp, unsigned 
long addr, unsigned lon
                        continue;
                folio = page_folio(page);
 
-               if (folio_is_zone_device(folio) || !folio_test_anon(folio))
+               if (unlikely(folio_is_private_managed(folio)) ||
+                   !folio_test_anon(folio))
                        continue;
                goto found_unlock;
        }
-- 
2.53.0-Meta


Reply via email to