[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: Jeff Dike <jdike@addtoit.com> Cc: Hugh Dickins <hugh@veritas.com> Cc: <stable@kernel.org> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
Родитель
676ff453e5
Коммит
b73781c866
|
@ -1,6 +1,7 @@
|
||||||
#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 @@
|
||||||
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 @@
|
||||||
#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 @@
|
||||||
|
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
#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)
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче