tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: Heads up: moving some uvmexp stat to being per-cpu



On Dec 15, 2010, at 1:53 AM, Jean-Yves Migeon wrote:

>>> On Wed, Dec 15, 2010 at 1:49 PM, Matt Thomas 
>>> <matt%3am-software.com@localhost> wrote:
>>>> The diffs are at http://www.netbsd.org/uvmexp-diff.txt
> 
> Purely cosmetic comments:
> - why are most of the cpu_nsoft count commented out?

Because we were counting ASTs as soft interrupts but they aren't.
kern_softint.c already counts soft interrupts.

> - in uvmexp_print(), just use PRIu64 instead of %llu (as you did in other 
> places)

Good idea.

On Dec 15, 2010, at 5:51 AM, Andrew Doran wrote:

>> 
>> The diffs are at http://www.netbsd.org/uvmexp-diff.txt 
>> 
>> Have fun reading them!
> 
> I did!
> 
> I have three concerns around atomicity and concurrency.
> 
> - curcpu()->ci_data.cpu_.... we can be preempted in the middle of this type
>  of dereference.  So sometimes we could end up with the counter going
>  backwards.  Admittedly there are many places where we are counting,
>  where interrupts are off.

but that was true for the previous counters.  Though 64 bit makes it
a bit worse.

> - 64 bit increment isn't atomic on a 32-bit or RISCy platform.  So the
>  same sort of problem as above.

Except 32 bit counters could/will eventually overflow.  

> - In uvm where we tally the counters, we can read them mid-update so
>  maybe we'll only see half the updated value.  The reason I had the 
>  periodic update in the clock interrupt was to avoid this problem.
> 
> So all that said, maybe we don't care about the above problems but I wanted
> to point them out.  As long as there is not a "really bad" case then
> perhaps it's OK.

It's not really any worse that happens today.

On Dec 15, 2010, at 5:35 AM, Matthew Mondor wrote:

> On Tue, 14 Dec 2010 20:49:14 -0800
> Matt Thomas <matt%3am-software.com@localhost> wrote:
> 
>> I have a fairly large but mostly simple patch which changes the stats 
>> collected in
>> uvmexp for faults, intrs, softs, syscalls, and traps from 32 bit to 64 bits 
>> and
>> puts them in cpu_data (in cpu_info).  This makes more accurate and a little 
>> cheaper
>> to update on 64bit systems.
> 
> I like the cleanliness of the changes;
> 
> A potential issue I see is how heavy this becomes on some 32-bit CPUs
> i.e. m68k, where I see for instance 1 instruction being replaced by 9
> instructions (including registers save/restore) to increment a
> counter.  I'm not sure if in practice this will really affect
> performance, or if it's worth benchmarking for those architectures,
> however.

Actually, that's only true for a spurious interrupts and since those
shouldn't happen, who cares?  Otherwise the increment happens inside
already existing register save/restore.  I could get rid of the lea
but that would lead a longer instruction stream.  I got rid of moveq
and use addq.l #1, 4(%a1).  So it's down to 5 instructions.  Granted
that's more one but that as cheap as I can't make 

> If it turned out to be a problem, I could see two possible solutions:
> an option to disable some stat counters on slow systems (values could
> simply remain 0 in that case), or a new counter type say,
> cpustatcount_t and macros defined by the MD code to use 32-bit
> cpu-specific counters where necessary, getting compiled/exported to
> userland using 64-bit at statistics request time to avoid
> compat/userland complications...
> 
> Thanks,
> -- 
> Matt


On Dec 15, 2010, at 5:49 AM, Antti Kantee wrote:

> On Tue Dec 14 2010 at 20:49:14 -0800, Matt Thomas wrote:
>> I have a fairly large but mostly simple patch which changes the stats 
>> collected in
>> uvmexp for faults, intrs, softs, syscalls, and traps from 32 bit to 64 bits 
>> and
>> puts them in cpu_data (in cpu_info).  This makes more accurate and a little 
>> cheaper
>> to update on 64bit systems.
> 
> And probably a lot cheaper on MP systems?

Less contention for uvmexp and the cacheline with those stats is likely
to stay live.

> I was curious about the cache effects of uvmstats recently.  Did you by
> any chance do a before/after build.sh test on an SMP machine?


I did not.

On Dec 15, 2010, at 6:30 AM, Martin Husemann wrote:

> I have one stupid question: why can't we leave the size of the counters
> at 32bit on a per arch basis?

Why don't we have the same issue with ev_count being 64bit?  I dislike
counters that overflow and then lose any meaning.  We could have 32-bit
per-cpu counters and then add back the merge to uvmexp (except this time
doing a 64bit atomic_add) but then we lose per-cpu ness.

> At a quick glance the sparc code looked v9 only, so will need some work.

sparc--netbsdelf-gcc -mcpu=v7 generates the following for a 64bit increment:

        ldd     [%o0], %g2
        addcc   %g3, 1, %g3
        addx    %g2, 0, %g2
        std    %g2, [%o0]

For both SPARC and SPARC64, I've added INCR64 and INCR64X macros.
The former uses %o0/%o1/%o2 (%o2 on 32-bit SPARC only) and INCR64X
allows you specify the registers to be used.

I updated the patch at http://www.netbsd.org/~matt/uvmexp-diff.txt

Thanks for the comments.  On to round 2!


Home | Main Index | Thread Index | Old Index