lkml.org 
[lkml]   [2000]   [Oct]   [31]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: kmalloc() allocation.
On Tue, Oct 31, 2000 at 11:35:46AM -0200, Rik van Riel wrote:
> > Rik: What do you think about this (physical cont. area cache) for 2.5?
^^^^^^^^^^^^^^^^^^^^^^^^^ == PCAC
>
> http://www.surriel.com/zone-alloc.html

Read it when you published it first, but didn't notice you still
worked on it ;-)

My approach is still different. We get the HINT for free. And
your zone only shift this problem from page to mem_zone level.

I thought about sth. like this:

/* Adds an physical continuous area of pages to the PCAC.
* To be implemented later, once we decide on a data structure
* for this, which can do fast unique insert and at least O(N)
* retrieve. (Hashes?)
*/
void add_phys_cont_chunk(struct phys_page *start, size_t area_size);

/* Add page(s) to pool, where we prefer to kmalloc() small things
* and vmalloc() things. This gets us close to a best fit
* strategy instead of sth. like the first fit we have now.
*/
void add_small_phys_area(struct phys_page *start, size_t area_size);

/* Gets a chunk of at least area_size pages and removes it from
* the PCAC or NULL of none found.
*
* To be implemented later along with the above routine.
*/
struct phys_page *get_phys_cont_chunk(size_t area_size);

#define suitable(p) (moveable(p) || freeable(p)) /* refine this */
#define MIN_PHYS_CHUNK 2 /* tune this */

/* in physical page scan to transfer REFERENCED bit */

size_t area_size = 0;
struct phys_page *p, *chunk_start;

p = prev = first_phys_page;

while (p != last_phys_page) {
if (area_size) {
if (suitable(p)) {

/* expand recent chunk */
area_size++;

} else {

/* insert last chunk */
if (area_size >= MIN_PHYS_CHUNK)
add_phys_cont_chunk(chunk_start, area_size);
else add_small_phys_area(chunk_start, area_size);
area_size = 0;
}
} else {
if (suitable(p)) {

/* start new chunk */
area_size = 1;
chunk_start = p;
}
}
p = p->next;
}

And later, when we need a physically continuous area >= MIN_PHYS_CHUNK:

/* lookup PCAC for a hint */
struct phys_page *s = get_phys_cont_chunk(area_size);

if (s) {
size_t a = area_size;
struct phys_page *p = s;

/* lock down page tables */
while (a--) {
if ( ! free_or_move_page(p) )
break;
p = p->next;
}
/* unlock page tables*/
if (!a)
return s; /* hey, it worked! */

} else {
/* no hints, try it the old way or fail */
}


Hope it sound not too stupid ;-)

Regards

Ingo Oeser
--
Feel the power of the penguin - run linux@your.pc
<esc>:x
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-03-22 12:45    [W:0.850 / U:0.152 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site