On Sunday 22 September 2002 16:57, Martin J. Bligh wrote: > > There is an alternative idea (we discussed this at OLS with Andrea, maybe > > you remember): allocate memory from the current node and keep statistics > > on where it is allocated. Determine the homenode from this (from time to > > time) and schedule accordingly. This eliminates the initial load > > balancing and leaves it all to the scheduler, but has the drawback that > > memory can be somewhat scattered across the nodes. Any comments? > > Well, that's a lot simpler. Things should end up running on their home > node, and thus will allocate pages from their home node, so it should > be self-re-enforcing. The algorithm for the home node is then implicitly > worked out from the scheduler itself, and its actions, so it's one less > set of stuff to write. Would suggest we do this at first, to keep things > as simple as possible so you have something mergeable. OK, sounds encouraging. So here is my first attempt (attached). You'll have to apply it on top of the two NUMA scheduler patches and hack SAPICID_TO_PNODE again. The patch adds a node_mem[NR_NODES] array to each task. When allocating memory (in rmqueue) and freeing it (in free_pages_ok) the number of pages is added/subtracted from that array and the homenode is set to the node having the largest entry. Is there a better place where to put this in (other than rmqueue/free_pages_ok)? I have two problems with this approach: 1: Freeing memory is quite expensive, as it currently involves finding the maximum of the array node_mem[]. 2: I have no idea how tasks sharing the mm structure will behave. I'd like them to run on different nodes (that's why node_mem is not in mm), but they could (legally) free pages which they did not allocate and have wrong values in node_mem[]. Comments? Regards, Erich