Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 19994
b: refs/heads/master
c: a0a7ec3
h: refs/heads/master
v: v3
  • Loading branch information
JANAK DESAI authored and Linus Torvalds committed Feb 8, 2006
1 parent 2ed8a55 commit a1581f1
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 32 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 741a295130606143edbf9fc740f633dbc1e6225f
refs/heads/master: a0a7ec308f1be5957b20a1a535d21f683dfd83f0
87 changes: 56 additions & 31 deletions trunk/kernel/fork.c
Original file line number Diff line number Diff line change
Expand Up @@ -446,6 +446,55 @@ void mm_release(struct task_struct *tsk, struct mm_struct *mm)
}
}

/*
* Allocate a new mm structure and copy contents from the
* mm structure of the passed in task structure.
*/
static struct mm_struct *dup_mm(struct task_struct *tsk)
{
struct mm_struct *mm, *oldmm = current->mm;
int err;

if (!oldmm)
return NULL;

mm = allocate_mm();
if (!mm)
goto fail_nomem;

memcpy(mm, oldmm, sizeof(*mm));

if (!mm_init(mm))
goto fail_nomem;

if (init_new_context(tsk, mm))
goto fail_nocontext;

err = dup_mmap(mm, oldmm);
if (err)
goto free_pt;

mm->hiwater_rss = get_mm_rss(mm);
mm->hiwater_vm = mm->total_vm;

return mm;

free_pt:
mmput(mm);

fail_nomem:
return NULL;

fail_nocontext:
/*
* If init_new_context() failed, we cannot use mmput() to free the mm
* because it calls destroy_context()
*/
mm_free_pgd(mm);
free_mm(mm);
return NULL;
}

static int copy_mm(unsigned long clone_flags, struct task_struct * tsk)
{
struct mm_struct * mm, *oldmm;
Expand Down Expand Up @@ -473,43 +522,17 @@ static int copy_mm(unsigned long clone_flags, struct task_struct * tsk)
}

retval = -ENOMEM;
mm = allocate_mm();
mm = dup_mm(tsk);
if (!mm)
goto fail_nomem;

/* Copy the current MM stuff.. */
memcpy(mm, oldmm, sizeof(*mm));
if (!mm_init(mm))
goto fail_nomem;

if (init_new_context(tsk,mm))
goto fail_nocontext;

retval = dup_mmap(mm, oldmm);
if (retval)
goto free_pt;

mm->hiwater_rss = get_mm_rss(mm);
mm->hiwater_vm = mm->total_vm;

good_mm:
tsk->mm = mm;
tsk->active_mm = mm;
return 0;

free_pt:
mmput(mm);
fail_nomem:
return retval;

fail_nocontext:
/*
* If init_new_context() failed, we cannot use mmput() to free the mm
* because it calls destroy_context()
*/
mm_free_pgd(mm);
free_mm(mm);
return retval;
}

static inline struct fs_struct *__copy_fs_struct(struct fs_struct *old)
Expand Down Expand Up @@ -1423,18 +1446,20 @@ static int unshare_sighand(unsigned long unshare_flags, struct sighand_struct **
}

/*
* Unsharing of vm for tasks created with CLONE_VM is not supported yet
* Unshare vm if it is being shared
*/
static int unshare_vm(unsigned long unshare_flags, struct mm_struct **new_mmp)
{
struct mm_struct *mm = current->mm;

if ((unshare_flags & CLONE_VM) &&
(mm && atomic_read(&mm->mm_users) > 1))
return -EINVAL;
(mm && atomic_read(&mm->mm_users) > 1)) {
*new_mmp = dup_mm(current);
if (!*new_mmp)
return -ENOMEM;
}

return 0;

}

/*
Expand Down

0 comments on commit a1581f1

Please sign in to comment.