Re: [MM] Make mm counters per cpu instead of atomic V2

KAMEZAWA Hiroyuki
2009-11-06T19:03:26Z

Christoph Lameter wrote:
> On Fri, 6 Nov 2009, KAMEZAWA Hiroyuki wrote:
>
>> BTW, can't we have single-thread-mode for this counter ?
>> Usual program's read-side will get much benefit.....
>
> Thanks for the measurements.
>
> A single thread mode would be good. Ideas on how to add that would be
> appreciated.
>

Maybe there are some ways....At brief thought....
==
struct usage_counter {
long rss;
long file;
}

struct mm_struct {
....
atomic_long_t rss; /* only updated when usage_counter is NULL */
atomic_long_t file; /* only updated when usage_counter is NULL */
struct usage_counter *usage; /* percpu counter used when
multi-threaded */
.....
}

And allocate mm->usage only when the first CLONE_THREAD is specified.

if (mm->usage)
access per cpu
else
atomic_long_xxx

and read operation will be

val = atomic_read(mm->rss);
if (mm->usage)
for_each_possible_cpu()....
==
Does "if" seems too costly ?

If this idea is bad, I think moving mm_counter to task_struct from
mm_struct and doing slow-sync is an idea instead of percpu.

for example

struct task_struct {
....
mm_counter_t temp_counter;
....
};

struct mm_struct {
.....
atomic_long_t rss;
atomic_long_t file;
};

And adds temp_counter's value to mm_struct at some good point....before
sleep ?
kswapd and reclaim routine can update mm_struct's counter, directly.
Readers just read mm_struct's counter.

Thanks,
-Kame