Root/
1 | List: linux-kernel |
2 | Subject: Re: active_mm |
3 | From: Linus Torvalds <torvalds () transmeta ! com> |
4 | Date: 1999-07-30 21:36:24 |
5 | |
6 | Cc'd to linux-kernel, because I don't write explanations all that often, |
7 | and when I do I feel better about more people reading them. |
8 | |
9 | On Fri, 30 Jul 1999, David Mosberger wrote: |
10 | > |
11 | > Is there a brief description someplace on how "mm" vs. "active_mm" in |
12 | > the task_struct are supposed to be used? (My apologies if this was |
13 | > discussed on the mailing lists---I just returned from vacation and |
14 | > wasn't able to follow linux-kernel for a while). |
15 | |
16 | Basically, the new setup is: |
17 | |
18 | - we have "real address spaces" and "anonymous address spaces". The |
19 | difference is that an anonymous address space doesn't care about the |
20 | user-level page tables at all, so when we do a context switch into an |
21 | anonymous address space we just leave the previous address space |
22 | active. |
23 | |
24 | The obvious use for a "anonymous address space" is any thread that |
25 | doesn't need any user mappings - all kernel threads basically fall into |
26 | this category, but even "real" threads can temporarily say that for |
27 | some amount of time they are not going to be interested in user space, |
28 | and that the scheduler might as well try to avoid wasting time on |
29 | switching the VM state around. Currently only the old-style bdflush |
30 | sync does that. |
31 | |
32 | - "tsk->mm" points to the "real address space". For an anonymous process, |
33 | tsk->mm will be NULL, for the logical reason that an anonymous process |
34 | really doesn't _have_ a real address space at all. |
35 | |
36 | - however, we obviously need to keep track of which address space we |
37 | "stole" for such an anonymous user. For that, we have "tsk->active_mm", |
38 | which shows what the currently active address space is. |
39 | |
40 | The rule is that for a process with a real address space (ie tsk->mm is |
41 | non-NULL) the active_mm obviously always has to be the same as the real |
42 | one. |
43 | |
44 | For a anonymous process, tsk->mm == NULL, and tsk->active_mm is the |
45 | "borrowed" mm while the anonymous process is running. When the |
46 | anonymous process gets scheduled away, the borrowed address space is |
47 | returned and cleared. |
48 | |
49 | To support all that, the "struct mm_struct" now has two counters: a |
50 | "mm_users" counter that is how many "real address space users" there are, |
51 | and a "mm_count" counter that is the number of "lazy" users (ie anonymous |
52 | users) plus one if there are any real users. |
53 | |
54 | Usually there is at least one real user, but it could be that the real |
55 | user exited on another CPU while a lazy user was still active, so you do |
56 | actually get cases where you have a address space that is _only_ used by |
57 | lazy users. That is often a short-lived state, because once that thread |
58 | gets scheduled away in favour of a real thread, the "zombie" mm gets |
59 | released because "mm_users" becomes zero. |
60 | |
61 | Also, a new rule is that _nobody_ ever has "init_mm" as a real MM any |
62 | more. "init_mm" should be considered just a "lazy context when no other |
63 | context is available", and in fact it is mainly used just at bootup when |
64 | no real VM has yet been created. So code that used to check |
65 | |
66 | if (current->mm == &init_mm) |
67 | |
68 | should generally just do |
69 | |
70 | if (!current->mm) |
71 | |
72 | instead (which makes more sense anyway - the test is basically one of "do |
73 | we have a user context", and is generally done by the page fault handler |
74 | and things like that). |
75 | |
76 | Anyway, I put a pre-patch-2.3.13-1 on ftp.kernel.org just a moment ago, |
77 | because it slightly changes the interfaces to accomodate the alpha (who |
78 | would have thought it, but the alpha actually ends up having one of the |
79 | ugliest context switch codes - unlike the other architectures where the MM |
80 | and register state is separate, the alpha PALcode joins the two, and you |
81 | need to switch both together). |
82 | |
83 | (From http://marc.info/?l=linux-kernel&m=93337278602211&w=2) |
84 |
Branches:
ben-wpan
ben-wpan-stefan
javiroman/ks7010
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9