1List: linux-kernel 2Subject: Re: active_mm 3From: Linus Torvalds <torvalds () transmeta ! com> 4Date: 1999-07-30 21:36:24 5 6Cc'd to linux-kernel, because I don't write explanations all that often, 7and when I do I feel better about more people reading them. 8 9On 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 16Basically, 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 49To 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, 51and a "mm_count" counter that is the number of "lazy" users (ie anonymous 52users) plus one if there are any real users. 53 54Usually there is at least one real user, but it could be that the real 55user exited on another CPU while a lazy user was still active, so you do 56actually get cases where you have a address space that is _only_ used by 57lazy users. That is often a short-lived state, because once that thread 58gets scheduled away in favour of a real thread, the "zombie" mm gets 59released because "mm_users" becomes zero. 60 61Also, a new rule is that _nobody_ ever has "init_mm" as a real MM any 62more. "init_mm" should be considered just a "lazy context when no other 63context is available", and in fact it is mainly used just at bootup when 64no real VM has yet been created. So code that used to check 65 66 if (current->mm == &init_mm) 67 68should generally just do 69 70 if (!current->mm) 71 72instead (which makes more sense anyway - the test is basically one of "do 73we have a user context", and is generally done by the page fault handler 74and things like that). 75 76Anyway, I put a pre-patch-2.3.13-1 on ftp.kernel.org just a moment ago, 77because it slightly changes the interfaces to accommodate the alpha (who 78would have thought it, but the alpha actually ends up having one of the 79ugliest context switch codes - unlike the other architectures where the MM 80and register state is separate, the alpha PALcode joins the two, and you 81need to switch both together). 82 83(From http://marc.info/?l=linux-kernel&m=93337278602211&w=2) 84