diff options
Diffstat (limited to 'arch/um/os-Linux/process.c')
| -rw-r--r-- | arch/um/os-Linux/process.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/arch/um/os-Linux/process.c b/arch/um/os-Linux/process.c index d261888f39c4..8176b0b52047 100644 --- a/arch/um/os-Linux/process.c +++ b/arch/um/os-Linux/process.c | |||
| @@ -11,6 +11,7 @@ | |||
| 11 | #include <linux/unistd.h> | 11 | #include <linux/unistd.h> |
| 12 | #include <sys/mman.h> | 12 | #include <sys/mman.h> |
| 13 | #include <sys/wait.h> | 13 | #include <sys/wait.h> |
| 14 | #include <sys/mman.h> | ||
| 14 | #include "ptrace_user.h" | 15 | #include "ptrace_user.h" |
| 15 | #include "os.h" | 16 | #include "os.h" |
| 16 | #include "user.h" | 17 | #include "user.h" |
| @@ -20,6 +21,7 @@ | |||
| 20 | #include "kern_util.h" | 21 | #include "kern_util.h" |
| 21 | #include "longjmp.h" | 22 | #include "longjmp.h" |
| 22 | #include "skas_ptrace.h" | 23 | #include "skas_ptrace.h" |
| 24 | #include "kern_constants.h" | ||
| 23 | 25 | ||
| 24 | #define ARBITRARY_ADDR -1 | 26 | #define ARBITRARY_ADDR -1 |
| 25 | #define FAILURE_PID -1 | 27 | #define FAILURE_PID -1 |
| @@ -187,6 +189,48 @@ int os_unmap_memory(void *addr, int len) | |||
| 187 | return(0); | 189 | return(0); |
| 188 | } | 190 | } |
| 189 | 191 | ||
| 192 | #ifndef MADV_REMOVE | ||
| 193 | #define MADV_REMOVE 0x5 /* remove these pages & resources */ | ||
| 194 | #endif | ||
| 195 | |||
| 196 | int os_drop_memory(void *addr, int length) | ||
| 197 | { | ||
| 198 | int err; | ||
| 199 | |||
| 200 | err = madvise(addr, length, MADV_REMOVE); | ||
| 201 | if(err < 0) | ||
| 202 | err = -errno; | ||
| 203 | return err; | ||
| 204 | } | ||
| 205 | |||
| 206 | int can_drop_memory(void) | ||
| 207 | { | ||
| 208 | void *addr; | ||
| 209 | int fd; | ||
| 210 | |||
| 211 | printk("Checking host MADV_REMOVE support..."); | ||
| 212 | fd = create_mem_file(UM_KERN_PAGE_SIZE); | ||
| 213 | if(fd < 0){ | ||
| 214 | printk("Creating test memory file failed, err = %d\n", -fd); | ||
| 215 | return 0; | ||
| 216 | } | ||
| 217 | |||
| 218 | addr = mmap64(NULL, UM_KERN_PAGE_SIZE, PROT_READ | PROT_WRITE, | ||
| 219 | MAP_PRIVATE, fd, 0); | ||
| 220 | if(addr == MAP_FAILED){ | ||
| 221 | printk("Mapping test memory file failed, err = %d\n", -errno); | ||
| 222 | return 0; | ||
| 223 | } | ||
| 224 | |||
| 225 | if(madvise(addr, UM_KERN_PAGE_SIZE, MADV_REMOVE) != 0){ | ||
| 226 | printk("MADV_REMOVE failed, err = %d\n", -errno); | ||
| 227 | return 0; | ||
| 228 | } | ||
| 229 | |||
| 230 | printk("OK\n"); | ||
| 231 | return 1; | ||
| 232 | } | ||
| 233 | |||
| 190 | void init_new_thread_stack(void *sig_stack, void (*usr1_handler)(int)) | 234 | void init_new_thread_stack(void *sig_stack, void (*usr1_handler)(int)) |
| 191 | { | 235 | { |
| 192 | int flags = 0, pages; | 236 | int flags = 0, pages; |
