aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
authorAndrew Morton <akpm@osdl.org>2004-05-22 08:04:29 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2004-05-22 08:04:29 -0700
commitc78b023ffcddf5868ec0bedc07942ac62c11154d (patch)
tree47753685c4379d42d5b3dd0ebc7c9dbe4afb88ab /kernel
parent490b582a14d4611d2942a7d8a188c9eca8ecf44b (diff)
downloadhistory-c78b023ffcddf5868ec0bedc07942ac62c11154d.tar.gz
[PATCH] numa api: Add VMA hooks for policy
From: Andi Kleen <ak@suse.de> NUMA API adds a policy to each VMA. During VMA creattion, merging and splitting these policies must be handled properly. This patch adds the calls to this. It is a nop when CONFIG_NUMA is not defined.
Diffstat (limited to 'kernel')
-rw-r--r--kernel/exit.c1
-rw-r--r--kernel/fork.c18
2 files changed, 18 insertions, 1 deletions
diff --git a/kernel/exit.c b/kernel/exit.c
index d439e608f3435b..5ac2db963f0b2f 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -791,6 +791,7 @@ asmlinkage NORET_TYPE void do_exit(long code)
__exit_fs(tsk);
exit_namespace(tsk);
exit_thread();
+ mpol_free(tsk->mempolicy);
if (tsk->signal->leader)
disassociate_ctty(1);
diff --git a/kernel/fork.c b/kernel/fork.c
index 3cb3bc41b0c085..2297ac8d0a0fb9 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -271,6 +271,7 @@ static inline int dup_mmap(struct mm_struct * mm, struct mm_struct * oldmm)
struct rb_node **rb_link, *rb_parent;
int retval;
unsigned long charge = 0;
+ struct mempolicy *pol;
down_write(&oldmm->mmap_sem);
flush_cache_mm(current->mm);
@@ -312,6 +313,11 @@ static inline int dup_mmap(struct mm_struct * mm, struct mm_struct * oldmm)
if (!tmp)
goto fail_nomem;
*tmp = *mpnt;
+ pol = mpol_copy(vma_policy(mpnt));
+ retval = PTR_ERR(pol);
+ if (IS_ERR(pol))
+ goto fail_nomem_policy;
+ vma_set_policy(tmp, pol);
tmp->vm_flags &= ~VM_LOCKED;
tmp->vm_mm = mm;
tmp->vm_next = NULL;
@@ -358,6 +364,8 @@ out:
flush_tlb_mm(current->mm);
up_write(&oldmm->mmap_sem);
return retval;
+fail_nomem_policy:
+ kmem_cache_free(vm_area_cachep, tmp);
fail_nomem:
retval = -ENOMEM;
fail:
@@ -964,10 +972,16 @@ struct task_struct *copy_process(unsigned long clone_flags,
p->security = NULL;
p->io_context = NULL;
p->audit_context = NULL;
+ p->mempolicy = mpol_copy(p->mempolicy);
+ if (IS_ERR(p->mempolicy)) {
+ retval = PTR_ERR(p->mempolicy);
+ p->mempolicy = NULL;
+ goto bad_fork_cleanup;
+ }
retval = -ENOMEM;
if ((retval = security_task_alloc(p)))
- goto bad_fork_cleanup;
+ goto bad_fork_cleanup_policy;
if ((retval = audit_alloc(p)))
goto bad_fork_cleanup_security;
/* copy all the process information */
@@ -1113,6 +1127,8 @@ bad_fork_cleanup_audit:
audit_free(p);
bad_fork_cleanup_security:
security_task_free(p);
+bad_fork_cleanup_policy:
+ mpol_free(p->mempolicy);
bad_fork_cleanup:
if (p->pid > 0)
free_pidmap(p->pid);