The commit is pushed to "branch-rh9-5.14.0-427.44.1.vz9.80.x-ovz" and will 
appear at g...@bitbucket.org:openvz/vzkernel.git
after rh9-5.14.0-427.44.1.vz9.80.5
------>
commit 8d21192ba4fba88cf663c202721fd2c1db4e9d74
Author: Steve Sistare <steven.sist...@oracle.com>
Date:   Tue Oct 27 16:47:57 2020 -0700

    oracle/mm: introduce MADV_DOEXEC
    
    madvise MADV_DOEXEC preserves a memory range across exec.  Initially
    only supported for non-executable, non-stack, anonymous memory.
    MADV_DOEXEC is single-use and after exec madvise must done again to
    preserve memory for a subsequent exec.
    MADV_DONTEXEC reverts the effect of a previous MADV_DOXEXEC call and
    undoes the preservation of the range.
    
    Orabug: 32387875
    Signed-off-by: Steve Sistare <steven.sist...@oracle.com>
    Signed-off-by: Anthony Yznaga <anthony.yzn...@oracle.com>
    Reviewed-by: Liam R. Howlett <liam.howl...@oracle.com>
    
    https://virtuozzo.atlassian.net/browse/VSTOR-96305
    
    (cherry picked from Oracle commit 4693c5d9d799eb4803c5afc781cc60e2b645e398)
    Signed-off-by: Konstantin Khorenko <khore...@virtuozzo.com>
    
    +++
     commit 606472268c9ca1edb06b3f0e17477a6b8f229c29
     Author: Anthony Yznaga <anthony.yzn...@oracle.com>
     Date:   Thu Feb 22 15:11:46 2024 -0800
    
        mm: avoid conflict between MADV_DOEXEC and upstream advice values
    
        Change MADV_DOEXEC and MADV_DONTEXEC to values that does not conflict
        with new advice values added upstream which can hinder the ability of
        a cross-distro application from determining if a conflicting advice
        value is supported. As provided in the original patchset, a consumer
        of MADV_DOEXEC is expected to read /proc/sys/vm/madv_doexec_flag to
        determine the correct value to use.
        If an application is affected by the conflict, one possible workaround
        is to test for and read /proc/sys/vm/madv_doexec_flag.
    
        Orabug: 36334308
        Signed-off-by: Anthony Yznaga <anthony.yzn...@oracle.com>
        Reviewed-by: Jane Chu <jane....@oracle.com>
        Signed-off-by: Brian Maly <brian.m...@oracle.com>
    
    Feature: oracle/mm: MADV_DOEXEC madvise() flag
---
 include/uapi/asm-generic/mman-common.h |  3 +++
 mm/madvise.c                           | 25 +++++++++++++++++++++++++
 2 files changed, 28 insertions(+)

diff --git a/include/uapi/asm-generic/mman-common.h 
b/include/uapi/asm-generic/mman-common.h
index 6ce1f1ceb432..7a98ab73fe88 100644
--- a/include/uapi/asm-generic/mman-common.h
+++ b/include/uapi/asm-generic/mman-common.h
@@ -79,6 +79,9 @@
 
 #define MADV_COLLAPSE  25              /* Synchronous hugepage collapse */
 
+#define MADV_DOEXEC    201             /* do inherit across exec */
+#define MADV_DONTEXEC  202             /* don't inherit across exec */
+
 /* compatibility flags */
 #define MAP_FILE       0
 
diff --git a/mm/madvise.c b/mm/madvise.c
index 0583abc9ca19..8cab55109411 100644
--- a/mm/madvise.c
+++ b/mm/madvise.c
@@ -1083,6 +1083,26 @@ static int madvise_vma_behavior(struct vm_area_struct 
*vma,
        case MADV_KEEPONFORK:
                new_flags &= ~VM_WIPEONFORK;
                break;
+       case MADV_DOEXEC:
+               /*
+                * MADV_DOEXEC is only supported on private, non-executable,
+                * non-stack anonymous memory and if the VM_EXEC_KEEP flag
+                * is available.
+                */
+               if (!VM_EXEC_KEEP || !vma_is_anonymous(vma) || vma->vm_flags & 
(VM_EXEC|VM_SHARED|VM_STACK)) {
+                       error = -EINVAL;
+                       goto out;
+               }
+               new_flags |= (new_flags & ~VM_MAYEXEC) | VM_EXEC_KEEP;
+               break;
+       case MADV_DONTEXEC:
+               if (!VM_EXEC_KEEP) {
+                       error = -EINVAL;
+                       goto out;
+               }
+               if (new_flags & VM_EXEC_KEEP)
+                       new_flags |= (new_flags & ~VM_EXEC_KEEP) | VM_MAYEXEC;
+               break;
        case MADV_DONTDUMP:
                new_flags |= VM_DONTDUMP;
                break;
@@ -1208,6 +1228,8 @@ madvise_behavior_valid(int behavior)
        case MADV_SOFT_OFFLINE:
        case MADV_HWPOISON:
 #endif
+       case MADV_DOEXEC:
+       case MADV_DONTEXEC:
                return true;
 
        default:
@@ -1401,6 +1423,9 @@ int madvise_set_anon_name(struct mm_struct *mm, unsigned 
long start,
  *             triggering read faults if required
  *  MADV_POPULATE_WRITE - populate (prefault) page tables writable by
  *             triggering write faults if required
+ *  MADV_DOEXEC - On exec, preserve and duplicate this area in the new process
+ *             if the new process allows it.
+ *  MADV_DONTEXEC - Undo the effect of MADV_DOEXEC.
  *
  * return values:
  *  zero    - success
_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to