2008-04-17 20:05:37 +02:00
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-07-18 14:27:13 +02:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-06-12 21:30:11 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
2008-02-15 14:55:54 -06:00
|
|
|
|
2013-02-04 15:35:26 -08:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-03-16 14:20:41 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
2010-05-20 21:04:21 -05:00
|
|
|
|
2017-02-08 18:51:31 +01:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mm: per-thread vma caching
This patch is a continuation of efforts trying to optimize find_vma(),
avoiding potentially expensive rbtree walks to locate a vma upon faults.
The original approach (https://lkml.org/lkml/2013/11/1/410), where the
largest vma was also cached, ended up being too specific and random,
thus further comparison with other approaches were needed. There are
two things to consider when dealing with this, the cache hit rate and
the latency of find_vma(). Improving the hit-rate does not necessarily
translate in finding the vma any faster, as the overhead of any fancy
caching schemes can be too high to consider.
We currently cache the last used vma for the whole address space, which
provides a nice optimization, reducing the total cycles in find_vma() by
up to 250%, for workloads with good locality. On the other hand, this
simple scheme is pretty much useless for workloads with poor locality.
Analyzing ebizzy runs shows that, no matter how many threads are
running, the mmap_cache hit rate is less than 2%, and in many situations
below 1%.
The proposed approach is to replace this scheme with a small per-thread
cache, maximizing hit rates at a very low maintenance cost.
Invalidations are performed by simply bumping up a 32-bit sequence
number. The only expensive operation is in the rare case of a seq
number overflow, where all caches that share the same address space are
flushed. Upon a miss, the proposed replacement policy is based on the
page number that contains the virtual address in question. Concretely,
the following results are seen on an 80 core, 8 socket x86-64 box:
1) System bootup: Most programs are single threaded, so the per-thread
scheme does improve ~50% hit rate by just adding a few more slots to
the cache.
+----------------+----------+------------------+
| caching scheme | hit-rate | cycles (billion) |
+----------------+----------+------------------+
| baseline | 50.61% | 19.90 |
| patched | 73.45% | 13.58 |
+----------------+----------+------------------+
2) Kernel build: This one is already pretty good with the current
approach as we're dealing with good locality.
+----------------+----------+------------------+
| caching scheme | hit-rate | cycles (billion) |
+----------------+----------+------------------+
| baseline | 75.28% | 11.03 |
| patched | 88.09% | 9.31 |
+----------------+----------+------------------+
3) Oracle 11g Data Mining (4k pages): Similar to the kernel build workload.
+----------------+----------+------------------+
| caching scheme | hit-rate | cycles (billion) |
+----------------+----------+------------------+
| baseline | 70.66% | 17.14 |
| patched | 91.15% | 12.57 |
+----------------+----------+------------------+
4) Ebizzy: There's a fair amount of variation from run to run, but this
approach always shows nearly perfect hit rates, while baseline is just
about non-existent. The amounts of cycles can fluctuate between
anywhere from ~60 to ~116 for the baseline scheme, but this approach
reduces it considerably. For instance, with 80 threads:
+----------------+----------+------------------+
| caching scheme | hit-rate | cycles (billion) |
+----------------+----------+------------------+
| baseline | 1.06% | 91.54 |
| patched | 99.97% | 14.18 |
+----------------+----------+------------------+
[akpm@linux-foundation.org: fix nommu build, per Davidlohr]
[akpm@linux-foundation.org: document vmacache_valid() logic]
[akpm@linux-foundation.org: attempt to untangle header files]
[akpm@linux-foundation.org: add vmacache_find() BUG_ON]
[hughd@google.com: add vmacache_valid_mm() (from Oleg)]
[akpm@linux-foundation.org: coding-style fixes]
[akpm@linux-foundation.org: adjust and enhance comments]
Signed-off-by: Davidlohr Bueso <davidlohr@hp.com>
Reviewed-by: Rik van Riel <riel@redhat.com>
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Reviewed-by: Michel Lespinasse <walken@google.com>
Cc: Oleg Nesterov <oleg@redhat.com>
Tested-by: Hugh Dickins <hughd@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2014-04-07 15:37:25 -07:00
|
|
|
|
2010-08-13 12:44:04 -05:00
|
|
|
|
2018-12-04 19:38:26 -08:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2011-07-26 16:09:06 -07:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
2010-04-02 11:47:02 -05:00
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-05-20 21:04:25 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
2012-03-19 19:35:55 -05:00
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-05-20 21:04:29 -05:00
|
|
|
|
|
|
|
|
|
2010-05-20 21:04:21 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-05-20 21:04:24 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-03-19 19:35:55 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-05-20 21:04:21 -05:00
|
|
|
|
2010-05-21 08:46:00 -05:00
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-05-21 08:46:00 -05:00
|
|
|
|
|
|
|
|
|
2009-06-03 14:06:57 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2008-04-24 16:57:23 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-03-21 10:17:03 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-03-21 10:17:03 -05:00
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
2012-03-21 10:17:03 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
2012-03-21 10:17:03 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
2012-03-21 10:17:03 -05:00
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
2008-08-01 08:39:34 -05:00
|
|
|
|
|
|
|
|
|
2012-03-21 10:17:03 -05:00
|
|
|
|
2008-08-01 08:39:34 -05:00
|
|
|
|
2012-03-21 10:17:03 -05:00
|
|
|
|
2008-08-01 08:39:34 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-03-21 10:17:03 -05:00
|
|
|
|
|
|
|
|
|
2008-08-01 08:39:34 -05:00
|
|
|
|
|
|
|
|
|
2012-03-21 10:17:03 -05:00
|
|
|
|
2008-08-01 08:39:34 -05:00
|
|
|
|
2014-06-12 21:30:11 +02:00
|
|
|
|
|
|
|
|
|
2008-08-01 08:39:34 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2008-02-20 13:33:38 -06:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2018-12-04 19:38:26 -08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2018-12-04 19:38:27 -08:00
|
|
|
|
2018-12-04 19:38:26 -08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2018-12-04 19:38:27 -08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2018-12-04 19:38:26 -08:00
|
|
|
|
2018-12-04 19:38:27 -08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2018-12-04 19:38:26 -08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mm: per-thread vma caching
This patch is a continuation of efforts trying to optimize find_vma(),
avoiding potentially expensive rbtree walks to locate a vma upon faults.
The original approach (https://lkml.org/lkml/2013/11/1/410), where the
largest vma was also cached, ended up being too specific and random,
thus further comparison with other approaches were needed. There are
two things to consider when dealing with this, the cache hit rate and
the latency of find_vma(). Improving the hit-rate does not necessarily
translate in finding the vma any faster, as the overhead of any fancy
caching schemes can be too high to consider.
We currently cache the last used vma for the whole address space, which
provides a nice optimization, reducing the total cycles in find_vma() by
up to 250%, for workloads with good locality. On the other hand, this
simple scheme is pretty much useless for workloads with poor locality.
Analyzing ebizzy runs shows that, no matter how many threads are
running, the mmap_cache hit rate is less than 2%, and in many situations
below 1%.
The proposed approach is to replace this scheme with a small per-thread
cache, maximizing hit rates at a very low maintenance cost.
Invalidations are performed by simply bumping up a 32-bit sequence
number. The only expensive operation is in the rare case of a seq
number overflow, where all caches that share the same address space are
flushed. Upon a miss, the proposed replacement policy is based on the
page number that contains the virtual address in question. Concretely,
the following results are seen on an 80 core, 8 socket x86-64 box:
1) System bootup: Most programs are single threaded, so the per-thread
scheme does improve ~50% hit rate by just adding a few more slots to
the cache.
+----------------+----------+------------------+
| caching scheme | hit-rate | cycles (billion) |
+----------------+----------+------------------+
| baseline | 50.61% | 19.90 |
| patched | 73.45% | 13.58 |
+----------------+----------+------------------+
2) Kernel build: This one is already pretty good with the current
approach as we're dealing with good locality.
+----------------+----------+------------------+
| caching scheme | hit-rate | cycles (billion) |
+----------------+----------+------------------+
| baseline | 75.28% | 11.03 |
| patched | 88.09% | 9.31 |
+----------------+----------+------------------+
3) Oracle 11g Data Mining (4k pages): Similar to the kernel build workload.
+----------------+----------+------------------+
| caching scheme | hit-rate | cycles (billion) |
+----------------+----------+------------------+
| baseline | 70.66% | 17.14 |
| patched | 91.15% | 12.57 |
+----------------+----------+------------------+
4) Ebizzy: There's a fair amount of variation from run to run, but this
approach always shows nearly perfect hit rates, while baseline is just
about non-existent. The amounts of cycles can fluctuate between
anywhere from ~60 to ~116 for the baseline scheme, but this approach
reduces it considerably. For instance, with 80 threads:
+----------------+----------+------------------+
| caching scheme | hit-rate | cycles (billion) |
+----------------+----------+------------------+
| baseline | 1.06% | 91.54 |
| patched | 99.97% | 14.18 |
+----------------+----------+------------------+
[akpm@linux-foundation.org: fix nommu build, per Davidlohr]
[akpm@linux-foundation.org: document vmacache_valid() logic]
[akpm@linux-foundation.org: attempt to untangle header files]
[akpm@linux-foundation.org: add vmacache_find() BUG_ON]
[hughd@google.com: add vmacache_valid_mm() (from Oleg)]
[akpm@linux-foundation.org: coding-style fixes]
[akpm@linux-foundation.org: adjust and enhance comments]
Signed-off-by: Davidlohr Bueso <davidlohr@hp.com>
Reviewed-by: Rik van Riel <riel@redhat.com>
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Reviewed-by: Michel Lespinasse <walken@google.com>
Cc: Oleg Nesterov <oleg@redhat.com>
Tested-by: Hugh Dickins <hughd@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2014-04-07 15:37:25 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2017-02-03 11:03:31 +01:00
|
|
|
|
mm: per-thread vma caching
This patch is a continuation of efforts trying to optimize find_vma(),
avoiding potentially expensive rbtree walks to locate a vma upon faults.
The original approach (https://lkml.org/lkml/2013/11/1/410), where the
largest vma was also cached, ended up being too specific and random,
thus further comparison with other approaches were needed. There are
two things to consider when dealing with this, the cache hit rate and
the latency of find_vma(). Improving the hit-rate does not necessarily
translate in finding the vma any faster, as the overhead of any fancy
caching schemes can be too high to consider.
We currently cache the last used vma for the whole address space, which
provides a nice optimization, reducing the total cycles in find_vma() by
up to 250%, for workloads with good locality. On the other hand, this
simple scheme is pretty much useless for workloads with poor locality.
Analyzing ebizzy runs shows that, no matter how many threads are
running, the mmap_cache hit rate is less than 2%, and in many situations
below 1%.
The proposed approach is to replace this scheme with a small per-thread
cache, maximizing hit rates at a very low maintenance cost.
Invalidations are performed by simply bumping up a 32-bit sequence
number. The only expensive operation is in the rare case of a seq
number overflow, where all caches that share the same address space are
flushed. Upon a miss, the proposed replacement policy is based on the
page number that contains the virtual address in question. Concretely,
the following results are seen on an 80 core, 8 socket x86-64 box:
1) System bootup: Most programs are single threaded, so the per-thread
scheme does improve ~50% hit rate by just adding a few more slots to
the cache.
+----------------+----------+------------------+
| caching scheme | hit-rate | cycles (billion) |
+----------------+----------+------------------+
| baseline | 50.61% | 19.90 |
| patched | 73.45% | 13.58 |
+----------------+----------+------------------+
2) Kernel build: This one is already pretty good with the current
approach as we're dealing with good locality.
+----------------+----------+------------------+
| caching scheme | hit-rate | cycles (billion) |
+----------------+----------+------------------+
| baseline | 75.28% | 11.03 |
| patched | 88.09% | 9.31 |
+----------------+----------+------------------+
3) Oracle 11g Data Mining (4k pages): Similar to the kernel build workload.
+----------------+----------+------------------+
| caching scheme | hit-rate | cycles (billion) |
+----------------+----------+------------------+
| baseline | 70.66% | 17.14 |
| patched | 91.15% | 12.57 |
+----------------+----------+------------------+
4) Ebizzy: There's a fair amount of variation from run to run, but this
approach always shows nearly perfect hit rates, while baseline is just
about non-existent. The amounts of cycles can fluctuate between
anywhere from ~60 to ~116 for the baseline scheme, but this approach
reduces it considerably. For instance, with 80 threads:
+----------------+----------+------------------+
| caching scheme | hit-rate | cycles (billion) |
+----------------+----------+------------------+
| baseline | 1.06% | 91.54 |
| patched | 99.97% | 14.18 |
+----------------+----------+------------------+
[akpm@linux-foundation.org: fix nommu build, per Davidlohr]
[akpm@linux-foundation.org: document vmacache_valid() logic]
[akpm@linux-foundation.org: attempt to untangle header files]
[akpm@linux-foundation.org: add vmacache_find() BUG_ON]
[hughd@google.com: add vmacache_valid_mm() (from Oleg)]
[akpm@linux-foundation.org: coding-style fixes]
[akpm@linux-foundation.org: adjust and enhance comments]
Signed-off-by: Davidlohr Bueso <davidlohr@hp.com>
Reviewed-by: Rik van Riel <riel@redhat.com>
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Reviewed-by: Michel Lespinasse <walken@google.com>
Cc: Oleg Nesterov <oleg@redhat.com>
Tested-by: Hugh Dickins <hughd@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2014-04-07 15:37:25 -07:00
|
|
|
|
2017-02-03 11:03:31 +01:00
|
|
|
|
mm: per-thread vma caching
This patch is a continuation of efforts trying to optimize find_vma(),
avoiding potentially expensive rbtree walks to locate a vma upon faults.
The original approach (https://lkml.org/lkml/2013/11/1/410), where the
largest vma was also cached, ended up being too specific and random,
thus further comparison with other approaches were needed. There are
two things to consider when dealing with this, the cache hit rate and
the latency of find_vma(). Improving the hit-rate does not necessarily
translate in finding the vma any faster, as the overhead of any fancy
caching schemes can be too high to consider.
We currently cache the last used vma for the whole address space, which
provides a nice optimization, reducing the total cycles in find_vma() by
up to 250%, for workloads with good locality. On the other hand, this
simple scheme is pretty much useless for workloads with poor locality.
Analyzing ebizzy runs shows that, no matter how many threads are
running, the mmap_cache hit rate is less than 2%, and in many situations
below 1%.
The proposed approach is to replace this scheme with a small per-thread
cache, maximizing hit rates at a very low maintenance cost.
Invalidations are performed by simply bumping up a 32-bit sequence
number. The only expensive operation is in the rare case of a seq
number overflow, where all caches that share the same address space are
flushed. Upon a miss, the proposed replacement policy is based on the
page number that contains the virtual address in question. Concretely,
the following results are seen on an 80 core, 8 socket x86-64 box:
1) System bootup: Most programs are single threaded, so the per-thread
scheme does improve ~50% hit rate by just adding a few more slots to
the cache.
+----------------+----------+------------------+
| caching scheme | hit-rate | cycles (billion) |
+----------------+----------+------------------+
| baseline | 50.61% | 19.90 |
| patched | 73.45% | 13.58 |
+----------------+----------+------------------+
2) Kernel build: This one is already pretty good with the current
approach as we're dealing with good locality.
+----------------+----------+------------------+
| caching scheme | hit-rate | cycles (billion) |
+----------------+----------+------------------+
| baseline | 75.28% | 11.03 |
| patched | 88.09% | 9.31 |
+----------------+----------+------------------+
3) Oracle 11g Data Mining (4k pages): Similar to the kernel build workload.
+----------------+----------+------------------+
| caching scheme | hit-rate | cycles (billion) |
+----------------+----------+------------------+
| baseline | 70.66% | 17.14 |
| patched | 91.15% | 12.57 |
+----------------+----------+------------------+
4) Ebizzy: There's a fair amount of variation from run to run, but this
approach always shows nearly perfect hit rates, while baseline is just
about non-existent. The amounts of cycles can fluctuate between
anywhere from ~60 to ~116 for the baseline scheme, but this approach
reduces it considerably. For instance, with 80 threads:
+----------------+----------+------------------+
| caching scheme | hit-rate | cycles (billion) |
+----------------+----------+------------------+
| baseline | 1.06% | 91.54 |
| patched | 99.97% | 14.18 |
+----------------+----------+------------------+
[akpm@linux-foundation.org: fix nommu build, per Davidlohr]
[akpm@linux-foundation.org: document vmacache_valid() logic]
[akpm@linux-foundation.org: attempt to untangle header files]
[akpm@linux-foundation.org: add vmacache_find() BUG_ON]
[hughd@google.com: add vmacache_valid_mm() (from Oleg)]
[akpm@linux-foundation.org: coding-style fixes]
[akpm@linux-foundation.org: adjust and enhance comments]
Signed-off-by: Davidlohr Bueso <davidlohr@hp.com>
Reviewed-by: Rik van Riel <riel@redhat.com>
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Reviewed-by: Michel Lespinasse <walken@google.com>
Cc: Oleg Nesterov <oleg@redhat.com>
Tested-by: Hugh Dickins <hughd@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2014-04-07 15:37:25 -07:00
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
mm: per-thread vma caching
This patch is a continuation of efforts trying to optimize find_vma(),
avoiding potentially expensive rbtree walks to locate a vma upon faults.
The original approach (https://lkml.org/lkml/2013/11/1/410), where the
largest vma was also cached, ended up being too specific and random,
thus further comparison with other approaches were needed. There are
two things to consider when dealing with this, the cache hit rate and
the latency of find_vma(). Improving the hit-rate does not necessarily
translate in finding the vma any faster, as the overhead of any fancy
caching schemes can be too high to consider.
We currently cache the last used vma for the whole address space, which
provides a nice optimization, reducing the total cycles in find_vma() by
up to 250%, for workloads with good locality. On the other hand, this
simple scheme is pretty much useless for workloads with poor locality.
Analyzing ebizzy runs shows that, no matter how many threads are
running, the mmap_cache hit rate is less than 2%, and in many situations
below 1%.
The proposed approach is to replace this scheme with a small per-thread
cache, maximizing hit rates at a very low maintenance cost.
Invalidations are performed by simply bumping up a 32-bit sequence
number. The only expensive operation is in the rare case of a seq
number overflow, where all caches that share the same address space are
flushed. Upon a miss, the proposed replacement policy is based on the
page number that contains the virtual address in question. Concretely,
the following results are seen on an 80 core, 8 socket x86-64 box:
1) System bootup: Most programs are single threaded, so the per-thread
scheme does improve ~50% hit rate by just adding a few more slots to
the cache.
+----------------+----------+------------------+
| caching scheme | hit-rate | cycles (billion) |
+----------------+----------+------------------+
| baseline | 50.61% | 19.90 |
| patched | 73.45% | 13.58 |
+----------------+----------+------------------+
2) Kernel build: This one is already pretty good with the current
approach as we're dealing with good locality.
+----------------+----------+------------------+
| caching scheme | hit-rate | cycles (billion) |
+----------------+----------+------------------+
| baseline | 75.28% | 11.03 |
| patched | 88.09% | 9.31 |
+----------------+----------+------------------+
3) Oracle 11g Data Mining (4k pages): Similar to the kernel build workload.
+----------------+----------+------------------+
| caching scheme | hit-rate | cycles (billion) |
+----------------+----------+------------------+
| baseline | 70.66% | 17.14 |
| patched | 91.15% | 12.57 |
+----------------+----------+------------------+
4) Ebizzy: There's a fair amount of variation from run to run, but this
approach always shows nearly perfect hit rates, while baseline is just
about non-existent. The amounts of cycles can fluctuate between
anywhere from ~60 to ~116 for the baseline scheme, but this approach
reduces it considerably. For instance, with 80 threads:
+----------------+----------+------------------+
| caching scheme | hit-rate | cycles (billion) |
+----------------+----------+------------------+
| baseline | 1.06% | 91.54 |
| patched | 99.97% | 14.18 |
+----------------+----------+------------------+
[akpm@linux-foundation.org: fix nommu build, per Davidlohr]
[akpm@linux-foundation.org: document vmacache_valid() logic]
[akpm@linux-foundation.org: attempt to untangle header files]
[akpm@linux-foundation.org: add vmacache_find() BUG_ON]
[hughd@google.com: add vmacache_valid_mm() (from Oleg)]
[akpm@linux-foundation.org: coding-style fixes]
[akpm@linux-foundation.org: adjust and enhance comments]
Signed-off-by: Davidlohr Bueso <davidlohr@hp.com>
Reviewed-by: Rik van Riel <riel@redhat.com>
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Reviewed-by: Michel Lespinasse <walken@google.com>
Cc: Oleg Nesterov <oleg@redhat.com>
Tested-by: Hugh Dickins <hughd@google.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2014-04-07 15:37:25 -07:00
|
|
|
|
2008-04-01 16:55:28 -05:00
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
2009-12-11 08:43:20 -06:00
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-03-21 10:17:03 -05:00
|
|
|
|
2009-12-11 08:43:20 -06:00
|
|
|
|
|
|
|
|
|
2014-06-12 21:30:11 +02:00
|
|
|
|
|
|
|
|
|
2009-12-11 08:43:20 -06:00
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
2012-03-21 10:17:03 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
2009-12-11 08:43:20 -06:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-05-20 21:04:21 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
2009-12-11 08:43:20 -06:00
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-03-21 10:17:03 -05:00
|
|
|
|
2009-12-11 08:43:20 -06:00
|
|
|
|
2014-06-12 21:30:11 +02:00
|
|
|
|
|
|
|
|
|
2009-12-11 08:43:20 -06:00
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
2012-03-21 10:17:03 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
2009-12-11 08:43:20 -06:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2008-03-07 16:34:16 -06:00
|
|
|
|
|
|
|
|
|
2012-03-21 10:17:03 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
2014-06-12 21:30:11 +02:00
|
|
|
|
2012-03-21 10:17:03 -05:00
|
|
|
|
2008-03-07 16:34:16 -06:00
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-05-20 21:04:21 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-06-12 21:30:11 +02:00
|
|
|
|
2010-05-20 21:04:21 -05:00
|
|
|
|
2014-06-12 21:30:11 +02:00
|
|
|
|
2010-05-20 21:04:21 -05:00
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-05-20 21:04:21 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
2014-06-12 21:30:11 +02:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-06-12 21:30:11 +02:00
|
|
|
|
2010-05-20 21:04:27 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-08-06 11:47:14 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-08-13 12:44:04 -05:00
|
|
|
|
2010-08-06 11:47:14 -05:00
|
|
|
|
|
|
|
|
|
2010-05-21 08:46:00 -05:00
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
2009-12-11 08:43:17 -06:00
|
|
|
|
2010-05-20 21:04:21 -05:00
|
|
|
|
2010-05-21 08:46:00 -05:00
|
|
|
|
2010-04-02 11:57:18 -05:00
|
|
|
|
2010-05-21 08:46:00 -05:00
|
|
|
|
2014-11-11 09:31:53 -06:00
|
|
|
|
2010-09-13 06:58:00 -05:00
|
|
|
|
2010-05-21 08:46:00 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-08-18 06:02:00 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-09-13 06:58:00 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-04-02 11:47:02 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-05-20 21:04:21 -05:00
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
2010-05-21 08:46:00 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-05-20 21:04:27 -05:00
|
|
|
|
2010-05-21 08:46:00 -05:00
|
|
|
|
2010-05-20 21:04:27 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
2010-04-02 11:47:02 -05:00
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
2010-04-02 11:47:02 -05:00
|
|
|
|
2010-05-20 21:04:21 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-05-21 08:46:00 -05:00
|
|
|
|
|
|
|
|
|
2010-04-02 11:47:02 -05:00
|
|
|
|
2010-05-21 08:46:00 -05:00
|
|
|
|
2010-04-02 11:47:02 -05:00
|
|
|
|
2010-05-21 08:46:00 -05:00
|
|
|
|
2010-04-02 11:47:02 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-04-02 11:57:18 -05:00
|
|
|
|
|
|
|
|
|
2018-12-04 19:38:28 -08:00
|
|
|
|
|
|
|
|
|
2010-05-21 08:46:00 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-03-17 18:06:10 +01:00
|
|
|
|
2010-05-21 08:46:00 -05:00
|
|
|
|
2010-08-06 11:47:14 -05:00
|
|
|
|
2010-04-02 11:47:02 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
2010-04-02 11:47:02 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
2009-12-11 08:43:17 -06:00
|
|
|
|
2011-03-30 22:57:33 -03:00
|
|
|
|
2009-12-11 08:43:17 -06:00
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
2009-12-11 08:43:17 -06:00
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
2010-05-21 08:46:00 -05:00
|
|
|
|
2010-08-06 11:47:14 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-05-20 21:04:21 -05:00
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-05-21 08:46:00 -05:00
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
2008-04-01 16:55:27 -05:00
|
|
|
|
2013-10-02 10:14:18 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2008-04-01 16:55:27 -05:00
|
|
|
|
2013-10-02 10:14:18 -05:00
|
|
|
|
2018-12-04 19:38:25 -08:00
|
|
|
|
2008-04-01 16:55:27 -05:00
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-12-14 15:05:49 -08:00
|
|
|
|
2014-11-11 09:31:53 -06:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2016-12-14 15:05:49 -08:00
|
|
|
|
2014-11-11 09:31:53 -06:00
|
|
|
|
2015-01-08 15:46:55 -06:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-05-20 21:04:21 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
kgdb, x86, arm, mips, powerpc: ignore user space single stepping
On the x86 arch, user space single step exceptions should be ignored
if they occur in the kernel space, such as ptrace stepping through a
system call.
First check if it is kgdb that is executing a single step, then ensure
it is not an accidental traversal into the user space, while in kgdb,
any other time the TIF_SINGLESTEP is set, kgdb should ignore the
exception.
On x86, arm, mips and powerpc, the kgdb_contthread usage was
inconsistent with the way single stepping is implemented in the kgdb
core. The arch specific stub should always set the
kgdb_cpu_doing_single_step correctly if it is single stepping. This
allows kgdb to correctly process an instruction steps if ptrace
happens to be requesting an instruction step over a system call.
Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
2008-09-26 10:36:41 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
2010-04-02 11:57:18 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
2010-05-20 21:04:21 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-08-05 09:22:25 -05:00
|
|
|
|
|
|
|
|
|
2010-07-21 19:27:07 -05:00
|
|
|
|
2010-05-20 21:04:21 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-05-21 08:46:00 -05:00
|
|
|
|
|
|
|
|
|
2010-05-20 21:04:21 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
kgdb, x86, arm, mips, powerpc: ignore user space single stepping
On the x86 arch, user space single step exceptions should be ignored
if they occur in the kernel space, such as ptrace stepping through a
system call.
First check if it is kgdb that is executing a single step, then ensure
it is not an accidental traversal into the user space, while in kgdb,
any other time the TIF_SINGLESTEP is set, kgdb should ignore the
exception.
On x86, arm, mips and powerpc, the kgdb_contthread usage was
inconsistent with the way single stepping is implemented in the kgdb
core. The arch specific stub should always set the
kgdb_cpu_doing_single_step correctly if it is single stepping. This
allows kgdb to correctly process an instruction steps if ptrace
happens to be requesting an instruction step over a system call.
Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
2008-09-26 10:36:41 -05:00
|
|
|
|
2010-05-21 08:46:00 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2009-12-11 08:43:17 -06:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-09-13 06:58:00 -05:00
|
|
|
|
|
|
|
|
|
2010-04-02 11:57:18 -05:00
|
|
|
|
|
|
|
|
|
2010-05-21 08:46:00 -05:00
|
|
|
|
2018-12-04 19:38:28 -08:00
|
|
|
|
|
|
|
|
|
2010-05-21 08:46:00 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-03-17 18:06:10 +01:00
|
|
|
|
2010-05-21 08:46:00 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
2010-05-21 08:46:00 -05:00
|
|
|
|
2010-08-06 11:47:14 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
2010-05-20 21:04:21 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
2010-04-02 11:47:02 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-09-24 14:27:50 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-01-28 17:02:14 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-04-02 11:47:02 -05:00
|
|
|
|
2013-10-02 10:14:18 -05:00
|
|
|
|
2010-04-02 11:47:02 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-09-24 14:27:50 -07:00
|
|
|
|
2010-05-21 08:46:00 -05:00
|
|
|
|
2012-09-24 14:27:50 -07:00
|
|
|
|
2010-05-21 08:46:00 -05:00
|
|
|
|
2012-09-24 14:27:50 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-04-02 11:47:02 -05:00
|
|
|
|
|
|
|
|
|
2012-10-12 06:37:33 -05:00
|
|
|
|
2018-10-21 21:45:48 -07:00
|
|
|
|
2012-10-12 06:37:33 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-04-02 11:47:02 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2018-12-04 19:38:27 -08:00
|
|
|
|
|
|
|
|
|
2010-04-02 11:47:02 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-05-21 08:46:00 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-01-14 10:25:52 -06:00
|
|
|
|
|
|
|
|
|
2013-10-02 10:14:18 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-01-14 10:25:52 -06:00
|
|
|
|
2013-10-02 10:14:18 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2008-06-24 10:52:55 -05:00
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-05-20 21:04:21 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-08-17 21:15:46 -07:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
2014-06-12 21:30:11 +02:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
2010-05-20 21:04:21 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-06-12 21:30:11 +02:00
|
|
|
|
2010-05-20 21:04:21 -05:00
|
|
|
|
2014-06-12 21:30:11 +02:00
|
|
|
|
2010-05-20 21:04:21 -05:00
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
|
|
|
|
|
2013-04-30 15:28:51 -07:00
|
|
|
|
2009-05-13 21:56:59 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2019-09-25 16:47:45 -07:00
|
|
|
|
2010-05-20 21:04:28 -05:00
|
|
|
|
2019-09-25 16:47:45 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2015-01-28 17:02:14 +05:30
|
|
|
|
2019-09-25 16:47:45 -07:00
|
|
|
|
|
|
|
|
|
2015-01-28 17:02:14 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2019-09-25 16:47:45 -07:00
|
|
|
|
2015-01-28 17:02:14 +05:30
|
|
|
|
2010-05-20 21:04:28 -05:00
|
|
|
|
2019-09-25 16:47:45 -07:00
|
|
|
|
|
|
|
|
|
2010-05-20 21:04:28 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-05-20 21:04:29 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-03-16 14:20:41 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-03-19 19:35:55 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-03-16 14:20:41 -05:00
|
|
|
|
|
|
|
|
|
2012-03-19 19:35:55 -05:00
|
|
|
|
2012-03-16 14:20:41 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-05-20 21:04:29 -05:00
|
|
|
|
|
|
|
|
|
2012-10-12 06:37:33 -05:00
|
|
|
|
2012-03-16 14:20:41 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2019-09-25 16:47:45 -07:00
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-03-16 14:20:41 -05:00
|
|
|
|
2012-10-12 06:37:33 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2009-06-03 14:06:57 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-06-12 21:30:11 +02:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2008-03-07 16:34:16 -06:00
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
2014-06-12 21:30:11 +02:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-06-12 21:30:11 +02:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-06-12 21:30:11 +02:00
|
|
|
|
2010-04-02 11:48:03 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-05-20 21:04:21 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-05-20 21:04:22 -05:00
|
|
|
|
|
|
|
|
|
2010-05-20 21:04:21 -05:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2014-01-28 16:50:20 +05:30
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
2010-04-02 14:58:18 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-04-02 14:58:18 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2010-05-20 21:04:21 -05:00
|
|
|
|
2008-04-17 20:05:37 +02:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|