Commit b73781c8 authored by Jeff Dike's avatar Jeff Dike Committed by Linus Torvalds

[PATCH] uml: MADV_REMOVE fixes

MADV_REMOVE fixes - change the test mapping to be MAP_SHARED instead of
MAP_PRIVATE, as MADV_REMOVE on MAP_PRIVATE maps won't work.  Also, use
the kernel's definition of MADV_REMOVE instead of hardcoding it if there
isn't a libc definition.
Signed-off-by: default avatarJeff Dike <jdike@addtoit.com>
Cc: Hugh Dickins <hugh@veritas.com>
Cc: <stable@kernel.org>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent 676ff453
#include <linux/stddef.h> #include <linux/stddef.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/elf.h> #include <linux/elf.h>
#include <asm/mman.h>
#define DEFINE(sym, val) \ #define DEFINE(sym, val) \
asm volatile("\n->" #sym " %0 " #val : : "i" (val)) asm volatile("\n->" #sym " %0 " #val : : "i" (val))
...@@ -16,6 +17,7 @@ ...@@ -16,6 +17,7 @@
void foo(void) void foo(void)
{ {
OFFSET(HOST_TASK_DEBUGREGS, task_struct, thread.arch.debugregs); OFFSET(HOST_TASK_DEBUGREGS, task_struct, thread.arch.debugregs);
DEFINE(KERNEL_MADV_REMOVE, MADV_REMOVE);
#ifdef CONFIG_MODE_TT #ifdef CONFIG_MODE_TT
OFFSET(HOST_TASK_EXTERN_PID, task_struct, thread.mode.tt.extern_pid); OFFSET(HOST_TASK_EXTERN_PID, task_struct, thread.mode.tt.extern_pid);
#endif #endif
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include <linux/time.h> #include <linux/time.h>
#include <linux/elf.h> #include <linux/elf.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/mman.h>
#define DEFINE(sym, val) \ #define DEFINE(sym, val) \
asm volatile("\n->" #sym " %0 " #val : : "i" (val)) asm volatile("\n->" #sym " %0 " #val : : "i" (val))
...@@ -18,6 +19,7 @@ ...@@ -18,6 +19,7 @@
void foo(void) void foo(void)
{ {
DEFINE(KERNEL_MADV_REMOVE, MADV_REMOVE);
#ifdef CONFIG_MODE_TT #ifdef CONFIG_MODE_TT
OFFSET(HOST_TASK_EXTERN_PID, task_struct, thread.mode.tt.extern_pid); OFFSET(HOST_TASK_EXTERN_PID, task_struct, thread.mode.tt.extern_pid);
#endif #endif
......
...@@ -190,7 +190,7 @@ int os_unmap_memory(void *addr, int len) ...@@ -190,7 +190,7 @@ int os_unmap_memory(void *addr, int len)
} }
#ifndef MADV_REMOVE #ifndef MADV_REMOVE
#define MADV_REMOVE 0x5 /* remove these pages & resources */ #define MADV_REMOVE KERNEL_MADV_REMOVE
#endif #endif
int os_drop_memory(void *addr, int length) int os_drop_memory(void *addr, int length)
...@@ -216,7 +216,7 @@ int can_drop_memory(void) ...@@ -216,7 +216,7 @@ int can_drop_memory(void)
} }
addr = mmap64(NULL, UM_KERN_PAGE_SIZE, PROT_READ | PROT_WRITE, addr = mmap64(NULL, UM_KERN_PAGE_SIZE, PROT_READ | PROT_WRITE,
MAP_PRIVATE, fd, 0); MAP_SHARED, fd, 0);
if(addr == MAP_FAILED){ if(addr == MAP_FAILED){
printk("Mapping test memory file failed, err = %d\n", -errno); printk("Mapping test memory file failed, err = %d\n", -errno);
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment