On Fri, 16 Nov 2007, Jeremy Fitzhardinge wrote:Are you sure? Anyway, this is not worth making a distinction for. Just pre-allocate all of them. There really is just 4 PGD entries, and it really *is* different from having a full three-level page table, and of the four PGD entries: - one is used for the kernel mapping (assuming the regular 1:3 layout) - AT LEAST two are required by user space anyway so pre-allocating is never going to waste more than one page. And you may feel that pre-allocating is a special case, but it's an *easier* special case than the one that you are apparently thinking about (which is to special-case according to CPU version). So don't do it. Just preallocate for the magic 4-entry PGD. You can make the special case just be something like /* Preallocate for small PGD's */ #if PTRS_PER_PGD == 4 for (i = 0; i < USER_PTRS_PER_PGD; i++) { pmd_t *pmd = pmd_alloc(); set_pgd(pgd+i, __pgd(PAGE_PRESENT | __pa(pmd)); } #endif or similar. There is absolutely *zero* reason not to do this, and there is also zero reason to make this be a "32-bit vs 64-bit" issue. The code can be there in both, and the #if could even be all in C code (ie there may be reasons to prefer writing it as /* The old-style PAE PGD needs to be preallocated */ if (USER_PTRS_PER_PGD <= 4) { ... } and the compiler should even compile it away entirely for all practical cases even without using the preprocessor. x86 page table walking never sets A/D bits on non-present entries. That said, there's still a huge difference. For "real" page table walking, you can always just insert entries without flushing the cache if those entries weren't there before (because the TLB is supposed to not cache negative entries). Again, because of the way the mahic 4-entry PGD works, that isn't true for it. It caches the entries regardless, so if you change it from non-present to present, you have to flush the TLB (well, "reload %cr3", which is the same thing in practice, although it's for a different *reason*). BUT ONLY FOR THIS CASE! And if you preallocate it, you make *that* special case go away. So you're going to have special cases regardless. Do the simple and really straightforward one, please! Nothing subtle. Linus -
| H. Peter Anvin | Re: [rft] s2ram wakeup moves to .c, could fix few machines |
| Greg Kroah-Hartman | [PATCH 002/196] Chinese: rephrase English introduction in HOWTO |
| Ingo Molnar | [patch] PID namespace design bug, workaround |
| Tarkan Erimer | Re: Dual-Licensing Linux Kernel with GPL V2 and GPL V3 |
git: | |
| Eric Dumazet | Re: Multicast packet loss |
| Gerrit Renker | [PATCH 27/37] dccp: Integration of dynamic feature activation - part 2 (server side) |
| David Miller | [GIT]: Networking |
| Jarek Poplawski | Re: [PATCH] pkt_sched: Destroy gen estimators under rtnl_lock(). |
