Nick Piggin <nickpiggin@yahoo.com.au> writes:I would think it should be pretty hard to have only one page out of each 2MB chunk allocated and non evictable (writeable, swappable or movable). Wouldn't that require some kernel driver to allocate all pages and then selectively free them in such a pattern as to keep one page per 2MB chunk? Assuming nothing tries to allocate a large chunk of ram while holding to many locks for the kernel to free it. It might be naive (stop me as soon as I go into dream world) but I would think there are two kinds of fragmentation: Hard fragments - physical pages the kernel can't move around Soft fragments - virtual pages/cache that happen to cause a fragment I would further assume most ram is used on soft fragments and that the kernel will free them up by flushing or swapping the data when there is sufficient need. With defragmentation support the kernel could prevent some flushings or swapping by moving the data from one physical page to another. But that would just reduce unneccessary work and not change the availability of larger pages. Further I would assume that there are two kinds of hard fragments: Fragments allocated once at start time and temporary fragments. At boot time (or when a module is loaded or something) you get a tiny amount of ram allocated that will remain busy for basically ever. You get some fragmentation right there that you can never get rid of. At runtime a lot of pages are allocated and quickly freed again. They get preferably positions in regions where there already is fragmentation. In regions where there are suitable sized holes already. They would only break a free 2MB chunk into smaller chunks if there is no small hole to be found. Now a trick I would use is to put kernel allocated pages at one end of the ram and virtual/cache pages at the other end. Small kernel allocs would find holes at the start of the ram while big allocs would have to move more to the middle or end of the ram to find a large enough hole. And virtual/cache pages could always be cleared out to free large continious chunks. Splitting the two types would prevent fragmentation of freeable and not freeable regions giving us always a large pool to pull compound pages from. One could also split the ram into regions of different page sizes, meaning that some large compound pages may not be split below a certain limit. E.g. some amount of ram would be reserved for chunk It depends on the lifetime of the allocations. If the lifetime is uniform enough then larger chunks of memory allocated for small objects will always be freed after a short time. If the lifetime varies widely then it can happen that one page of a larger chunk remains busy far longer than the rest causing fragmentation. I'm hopeing that we don't have such wide variance in lifetime that we run into a ENOMEM. I'm hoping allocation and freeing are not random events that would result in an expectancy of an infinite number of allocations to be alife as time tends towards infinity. I'm hoping there is enough dependence between the two to impose an upper limit on the fragmentation. I think the only acceptable solution is to have the code cope with large pages being unavailable and use multiple smaller chunks instead in a tight spot. By all means try to use a large continious chunk but never fail just because we are too fragmented. I'm sure modern system with 4+GB ram will not run into the wall but i'm equaly sure older systems with as little as 64MB quickly will. Handling the fragmented case is the only way to make sure we keep running. MfG Goswin -
| Tarkan Erimer | Re: Dual-Licensing Linux Kernel with GPL V2 and GPL V3 |
| Greg Kroah-Hartman | [PATCH 002/196] Chinese: rephrase English introduction in HOWTO |
| Christoph Lameter | [00/41] Large Blocksize Support V7 (adds memmap support) |
| Chuck Ebbert | Re: Linux 2.6.21 |
git: | |
| Gerrit Renker | [PATCH 03/37] dccp: List management for new feature negotiation |
| Jarek Poplawski | [PATCH] pkt_sched: Destroy gen estimators under rtnl_lock(). |
| Hugh Dickins | Re: [bug?] tg3: Failed to load firmware "tigon/tg3_tso.bin" |
| David Miller | [GIT]: Networking |
