Patch "mm/ksm: fix ksm exec support for prctl" has been added to the 6.9-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    mm/ksm: fix ksm exec support for prctl

to the 6.9-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     mm-ksm-fix-ksm-exec-support-for-prctl.patch
and it can be found in the queue-6.9 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 89d85f0567ac29842eba96dc5e132d873d398523
Author: Jinjiang Tu <tujinjiang@xxxxxxxxxx>
Date:   Thu Mar 28 19:10:08 2024 +0800

    mm/ksm: fix ksm exec support for prctl
    
    [ Upstream commit 3a9e567ca45fb5280065283d10d9a11f0db61d2b ]
    
    Patch series "mm/ksm: fix ksm exec support for prctl", v4.
    
    commit 3c6f33b7273a ("mm/ksm: support fork/exec for prctl") inherits
    MMF_VM_MERGE_ANY flag when a task calls execve().  However, it doesn't
    create the mm_slot, so ksmd will not try to scan this task.  The first
    patch fixes the issue.
    
    The second patch refactors to prepare for the third patch.  The third
    patch extends the selftests of ksm to verfity the deduplication really
    happens after fork/exec inherits ths KSM setting.
    
    This patch (of 3):
    
    commit 3c6f33b7273a ("mm/ksm: support fork/exec for prctl") inherits
    MMF_VM_MERGE_ANY flag when a task calls execve().  Howerver, it doesn't
    create the mm_slot, so ksmd will not try to scan this task.
    
    To fix it, allocate and add the mm_slot to ksm_mm_head in __bprm_mm_init()
    when the mm has MMF_VM_MERGE_ANY flag.
    
    Link: https://lkml.kernel.org/r/20240328111010.1502191-1-tujinjiang@xxxxxxxxxx
    Link: https://lkml.kernel.org/r/20240328111010.1502191-2-tujinjiang@xxxxxxxxxx
    Fixes: 3c6f33b7273a ("mm/ksm: support fork/exec for prctl")
    Signed-off-by: Jinjiang Tu <tujinjiang@xxxxxxxxxx>
    Reviewed-by: David Hildenbrand <david@xxxxxxxxxx>
    Cc: Johannes Weiner <hannes@xxxxxxxxxxx>
    Cc: Kefeng Wang <wangkefeng.wang@xxxxxxxxxx>
    Cc: Nanyong Sun <sunnanyong@xxxxxxxxxx>
    Cc: Rik van Riel <riel@xxxxxxxxxxx>
    Cc: Stefan Roesch <shr@xxxxxxxxxxxx>
    Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/fs/exec.c b/fs/exec.c
index cf1df7f16e55c..0c5f06d08c355 100644
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -67,6 +67,7 @@
 #include <linux/time_namespace.h>
 #include <linux/user_events.h>
 #include <linux/rseq.h>
+#include <linux/ksm.h>
 
 #include <linux/uaccess.h>
 #include <asm/mmu_context.h>
@@ -267,6 +268,14 @@ static int __bprm_mm_init(struct linux_binprm *bprm)
 		goto err_free;
 	}
 
+	/*
+	 * Need to be called with mmap write lock
+	 * held, to avoid race with ksmd.
+	 */
+	err = ksm_execve(mm);
+	if (err)
+		goto err_ksm;
+
 	/*
 	 * Place the stack at the largest stack address the architecture
 	 * supports. Later, we'll move this to an appropriate place. We don't
@@ -288,6 +297,8 @@ static int __bprm_mm_init(struct linux_binprm *bprm)
 	bprm->p = vma->vm_end - sizeof(void *);
 	return 0;
 err:
+	ksm_exit(mm);
+err_ksm:
 	mmap_write_unlock(mm);
 err_free:
 	bprm->vma = NULL;
diff --git a/include/linux/ksm.h b/include/linux/ksm.h
index 401348e9f92b4..7e2b1de3996ac 100644
--- a/include/linux/ksm.h
+++ b/include/linux/ksm.h
@@ -59,6 +59,14 @@ static inline int ksm_fork(struct mm_struct *mm, struct mm_struct *oldmm)
 	return 0;
 }
 
+static inline int ksm_execve(struct mm_struct *mm)
+{
+	if (test_bit(MMF_VM_MERGE_ANY, &mm->flags))
+		return __ksm_enter(mm);
+
+	return 0;
+}
+
 static inline void ksm_exit(struct mm_struct *mm)
 {
 	if (test_bit(MMF_VM_MERGEABLE, &mm->flags))
@@ -107,6 +115,11 @@ static inline int ksm_fork(struct mm_struct *mm, struct mm_struct *oldmm)
 	return 0;
 }
 
+static inline int ksm_execve(struct mm_struct *mm)
+{
+	return 0;
+}
+
 static inline void ksm_exit(struct mm_struct *mm)
 {
 }




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux