Messages in this thread | | | Date | Tue, 23 Aug 2011 10:56:51 +0400 | From | Konstantin Khlebnikov <> | Subject | Re: [PATCH 2/2] vmscan: use atomic-long for shrinker batching |
| |
Konstantin Khlebnikov wrote: > delta = (4 * nr_pages_scanned) / shrinker->seeks; > @@ -329,12 +327,11 @@ unsigned long shrink_slab(struct shrink_control *shrink, > * manner that handles concurrent updates. If we exhausted the > * scan, there is no need to do an update. > */ > - do { > - nr = shrinker->nr; > - new_nr = total_scan + nr; > - if (total_scan<= 0) > - break; > - } while (cmpxchg(&shrinker->nr, nr, new_nr) != nr); > + if (total_scan> 0) > + new_nr = atomic_long_add_return(total_scan, > + &shrinker->nr_in_batch); > + else > + new_nr = atomic_long_read(&shrinker->nr_in_batch); > > trace_mm_shrink_slab_end(shrinker, shrink_ret, nr, new_nr);
BTW, new_nr required only for tracing, maybe this will be better/faster, because atomic accuracy there isn't required at all.
if (total_scan > 0) atomic_long_add(total_scan, &shrinker->nr_in_batch);
new_nr = atomic_long_read(&shrinker->nr_in_batch); trace_mm_shrink_slab_end(shrinker, shrink_ret, nr, new_nr);
| |