Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1472671 > unrolled thread
| Started by | "Huang, Ying" <ying.huang@intel.com> |
|---|---|
| First post | 2016-08-30 19:30 +0200 |
| Last post | 2016-09-01 11:20 +0200 |
| Articles | 10 — 7 participants |
Back to article view | Back to linux.kernel
[PATCH -v2] mm: Don't use radix tree writeback tags for pages in swap cache "Huang, Ying" <ying.huang@intel.com> - 2016-08-30 19:30 +0200
Re: [PATCH -v2] mm: Don't use radix tree writeback tags for pages in swap cache Rik van Riel <riel@redhat.com> - 2016-08-30 20:40 +0200
Re: [PATCH -v2] mm: Don't use radix tree writeback tags for pages in swap cache Mel Gorman <mgorman@techsingularity.net> - 2016-08-31 11:20 +0200
Re: [PATCH -v2] mm: Don't use radix tree writeback tags for pages in swap cache "Huang\, Ying" <ying.huang@intel.com> - 2016-08-31 17:20 +0200
Re: [PATCH -v2] mm: Don't use radix tree writeback tags for pages in swap cache Mel Gorman <mgorman@techsingularity.net> - 2016-08-31 17:40 +0200
Re: [PATCH -v2] mm: Don't use radix tree writeback tags for pages in swap cache "Huang\, Ying" <ying.huang@intel.com> - 2016-08-31 17:50 +0200
Re: [PATCH -v2] mm: Don't use radix tree writeback tags for pages in swap cache Andi Kleen <andi@firstfloor.org> - 2016-08-31 23:40 +0200
Re: [PATCH -v2] mm: Don't use radix tree writeback tags for pages in swap cache Andrew Morton <akpm@linux-foundation.org> - 2016-08-31 23:40 +0200
Re: [PATCH -v2] mm: Don't use radix tree writeback tags for pages in swap cache Mel Gorman <mgorman@techsingularity.net> - 2016-09-01 11:00 +0200
Re: [PATCH -v2] mm: Don't use radix tree writeback tags for pages in swap cache Michal Hocko <mhocko@kernel.org> - 2016-09-01 11:20 +0200
| From | "Huang, Ying" <ying.huang@intel.com> |
|---|---|
| Date | 2016-08-30 19:30 +0200 |
| Subject | [PATCH -v2] mm: Don't use radix tree writeback tags for pages in swap cache |
| Message-ID | <sbV1g-7PN-7@gated-at.bofh.it> |
From: Huang Ying <ying.huang@intel.com>
File pages use a set of radix tree tags (DIRTY, TOWRITE, WRITEBACK,
etc.) to accelerate finding the pages with a specific tag in the radix
tree during inode writeback. But for anonymous pages in the swap
cache, there is no inode writeback. So there is no need to find the
pages with some writeback tags in the radix tree. It is not necessary
to touch radix tree writeback tags for pages in the swap cache.
Per Rik van Riel's suggestion, a new flag AS_NO_WRITEBACK_TAGS is
introduced for address spaces which don't need to update the writeback
tags. The flag is set for swap caches. It may be used for DAX file
systems, etc.
With this patch, the swap out bandwidth improved 22.3% (from ~1.2GB/s to
~ 1.48GBps) in the vm-scalability swap-w-seq test case with 8 processes.
The test is done on a Xeon E5 v3 system. The swap device used is a RAM
simulated PMEM (persistent memory) device. The improvement comes from
the reduced contention on the swap cache radix tree lock. To test
sequential swapping out, the test case uses 8 processes, which
sequentially allocate and write to the anonymous pages until RAM and
part of the swap device is used up.
Details of comparison is as follow,
base base+patch
---------------- --------------------------
%stddev %change %stddev
\ | \
2506952 ± 2% +28.1% 3212076 ± 7% vm-scalability.throughput
1207402 ± 7% +22.3% 1476578 ± 6% vmstat.swap.so
10.86 ± 12% -23.4% 8.31 ± 16% perf-profile.cycles-pp._raw_spin_lock_irq.__add_to_swap_cache.add_to_swap_cache.add_to_swap.shrink_page_list
10.82 ± 13% -33.1% 7.24 ± 14% perf-profile.cycles-pp._raw_spin_lock_irqsave.__remove_mapping.shrink_page_list.shrink_inactive_list.shrink_zone_memcg
10.36 ± 11% -100.0% 0.00 ± -1% perf-profile.cycles-pp._raw_spin_lock_irqsave.__test_set_page_writeback.bdev_write_page.__swap_writepage.swap_writepage
10.52 ± 12% -100.0% 0.00 ± -1% perf-profile.cycles-pp._raw_spin_lock_irqsave.test_clear_page_writeback.end_page_writeback.page_endio.pmem_rw_page
Cc: Hugh Dickins <hughd@google.com>
Cc: Shaohua Li <shli@kernel.org>
Cc: Minchan Kim <minchan@kernel.org>
Cc: Rik van Riel <riel@redhat.com>
Cc: Mel Gorman <mgorman@techsingularity.net>
Cc: Tejun Heo <tj@kernel.org>
Cc: Wu Fengguang <fengguang.wu@intel.com>
Cc: Dave Hansen <dave.hansen@intel.com>
Signed-off-by: "Huang, Ying" <ying.huang@intel.com>
---
include/linux/pagemap.h | 12 ++++++++++++
mm/page-writeback.c | 4 ++--
mm/swap_state.c | 2 ++
3 files changed, 16 insertions(+), 2 deletions(-)
diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
index 66a1260..2f5a65dd 100644
--- a/include/linux/pagemap.h
+++ b/include/linux/pagemap.h
@@ -25,6 +25,8 @@ enum mapping_flags {
AS_MM_ALL_LOCKS = __GFP_BITS_SHIFT + 2, /* under mm_take_all_locks() */
AS_UNEVICTABLE = __GFP_BITS_SHIFT + 3, /* e.g., ramdisk, SHM_LOCK */
AS_EXITING = __GFP_BITS_SHIFT + 4, /* final truncate in progress */
+ /* writeback related tags are not used */
+ AS_NO_WRITEBACK_TAGS = __GFP_BITS_SHIFT + 5,
};
static inline void mapping_set_error(struct address_space *mapping, int error)
@@ -64,6 +66,16 @@ static inline int mapping_exiting(struct address_space *mapping)
return test_bit(AS_EXITING, &mapping->flags);
}
+static inline void mapping_set_no_writeback_tags(struct address_space *mapping)
+{
+ set_bit(AS_NO_WRITEBACK_TAGS, &mapping->flags);
+}
+
+static inline int mapping_use_writeback_tags(struct address_space *mapping)
+{
+ return !test_bit(AS_NO_WRITEBACK_TAGS, &mapping->flags);
+}
+
static inline gfp_t mapping_gfp_mask(struct address_space * mapping)
{
return (__force gfp_t)mapping->flags & __GFP_BITS_MASK;
diff --git a/mm/page-writeback.c b/mm/page-writeback.c
index 82e7252..67b7c8b 100644
--- a/mm/page-writeback.c
+++ b/mm/page-writeback.c
@@ -2728,7 +2728,7 @@ int test_clear_page_writeback(struct page *page)
int ret;
lock_page_memcg(page);
- if (mapping) {
+ if (mapping && mapping_use_writeback_tags(mapping)) {
struct inode *inode = mapping->host;
struct backing_dev_info *bdi = inode_to_bdi(inode);
unsigned long flags;
@@ -2771,7 +2771,7 @@ int __test_set_page_writeback(struct page *page, bool keep_write)
int ret;
lock_page_memcg(page);
- if (mapping) {
+ if (mapping && mapping_use_writeback_tags(mapping)) {
struct inode *inode = mapping->host;
struct backing_dev_info *bdi = inode_to_bdi(inode);
unsigned long flags;
diff --git a/mm/swap_state.c b/mm/swap_state.c
index c8310a3..268b819 100644
--- a/mm/swap_state.c
+++ b/mm/swap_state.c
@@ -37,6 +37,8 @@ struct address_space swapper_spaces[MAX_SWAPFILES] = {
.page_tree = RADIX_TREE_INIT(GFP_ATOMIC|__GFP_NOWARN),
.i_mmap_writable = ATOMIC_INIT(0),
.a_ops = &swap_aops,
+ /* swap cache doesn't use writeback related tags */
+ .flags = 1 << AS_NO_WRITEBACK_TAGS,
}
};
--
2.8.1
[toc] | [next] | [standalone]
| From | Rik van Riel <riel@redhat.com> |
|---|---|
| Date | 2016-08-30 20:40 +0200 |
| Subject | Re: [PATCH -v2] mm: Don't use radix tree writeback tags for pages in swap cache |
| Message-ID | <sbW6Z-8w9-13@gated-at.bofh.it> |
| In reply to | #1472671 |
[Multipart message — attachments visible in raw view] — view raw
On Tue, 2016-08-30 at 10:28 -0700, Huang, Ying wrote: > From: Huang Ying <ying.huang@intel.com> > > File pages use a set of radix tree tags (DIRTY, TOWRITE, WRITEBACK, > etc.) to accelerate finding the pages with a specific tag in the > radix > tree during inode writeback. But for anonymous pages in the swap > cache, there is no inode writeback. So there is no need to find the > pages with some writeback tags in the radix tree. It is not > necessary > to touch radix tree writeback tags for pages in the swap cache. > > Per Rik van Riel's suggestion, a new flag AS_NO_WRITEBACK_TAGS is > introduced for address spaces which don't need to update the > writeback > tags. The flag is set for swap caches. It may be used for DAX file > systems, etc. > > With this patch, the swap out bandwidth improved 22.3% (from ~1.2GB/s > to > ~ 1.48GBps) in the vm-scalability swap-w-seq test case with 8 > processes. > The test is done on a Xeon E5 v3 system. The swap device used is a > RAM > simulated PMEM (persistent memory) device. The improvement comes > from > the reduced contention on the swap cache radix tree lock. To test > sequential swapping out, the test case uses 8 processes, which > sequentially allocate and write to the anonymous pages until RAM and > part of the swap device is used up. > > Details of comparison is as follow, > > base base+patch > ---------------- -------------------------- > %stddev %change %stddev > \ | \ > 2506952 ± 2% +28.1% 3212076 ± 7% vm- > scalability.throughput > 1207402 ± 7% +22.3% 1476578 ± 6% vmstat.swap.so > 10.86 ± 12% -23.4% 8.31 ± 16% perf-profile.cycles- > pp._raw_spin_lock_irq.__add_to_swap_cache.add_to_swap_cache.add_to_sw > ap.shrink_page_list > 10.82 ± 13% -33.1% 7.24 ± 14% perf-profile.cycles- > pp._raw_spin_lock_irqsave.__remove_mapping.shrink_page_list.shrink_in > active_list.shrink_zone_memcg > 10.36 ± 11% -100.0% 0.00 ± -1% perf-profile.cycles- > pp._raw_spin_lock_irqsave.__test_set_page_writeback.bdev_write_page._ > _swap_writepage.swap_writepage > 10.52 ± 12% -100.0% 0.00 ± -1% perf-profile.cycles- > pp._raw_spin_lock_irqsave.test_clear_page_writeback.end_page_writebac > k.page_endio.pmem_rw_page > > Cc: Hugh Dickins <hughd@google.com> > Cc: Shaohua Li <shli@kernel.org> > Cc: Minchan Kim <minchan@kernel.org> > Cc: Rik van Riel <riel@redhat.com> > Cc: Mel Gorman <mgorman@techsingularity.net> > Cc: Tejun Heo <tj@kernel.org> > Cc: Wu Fengguang <fengguang.wu@intel.com> > Cc: Dave Hansen <dave.hansen@intel.com> > Signed-off-by: "Huang, Ying" <ying.huang@intel.com> > Acked-by: Rik van Riel <riel@redhat.com> -- All rights reversed
[toc] | [prev] | [next] | [standalone]
| From | Mel Gorman <mgorman@techsingularity.net> |
|---|---|
| Date | 2016-08-31 11:20 +0200 |
| Subject | Re: [PATCH -v2] mm: Don't use radix tree writeback tags for pages in swap cache |
| Message-ID | <sc9QB-xQ-11@gated-at.bofh.it> |
| In reply to | #1472671 |
On Tue, Aug 30, 2016 at 10:28:09AM -0700, Huang, Ying wrote:
> From: Huang Ying <ying.huang@intel.com>
>
> File pages use a set of radix tree tags (DIRTY, TOWRITE, WRITEBACK,
> etc.) to accelerate finding the pages with a specific tag in the radix
> tree during inode writeback. But for anonymous pages in the swap
> cache, there is no inode writeback. So there is no need to find the
> pages with some writeback tags in the radix tree. It is not necessary
> to touch radix tree writeback tags for pages in the swap cache.
>
> Per Rik van Riel's suggestion, a new flag AS_NO_WRITEBACK_TAGS is
> introduced for address spaces which don't need to update the writeback
> tags. The flag is set for swap caches. It may be used for DAX file
> systems, etc.
>
> With this patch, the swap out bandwidth improved 22.3% (from ~1.2GB/s to
> ~ 1.48GBps) in the vm-scalability swap-w-seq test case with 8 processes.
> The test is done on a Xeon E5 v3 system. The swap device used is a RAM
> simulated PMEM (persistent memory) device. The improvement comes from
> the reduced contention on the swap cache radix tree lock. To test
> sequential swapping out, the test case uses 8 processes, which
> sequentially allocate and write to the anonymous pages until RAM and
> part of the swap device is used up.
>
> Details of comparison is as follow,
>
> base base+patch
> ---------------- --------------------------
> %stddev %change %stddev
> \ | \
> 2506952 ± 2% +28.1% 3212076 ± 7% vm-scalability.throughput
> 1207402 ± 7% +22.3% 1476578 ± 6% vmstat.swap.so
> 10.86 ± 12% -23.4% 8.31 ± 16% perf-profile.cycles-pp._raw_spin_lock_irq.__add_to_swap_cache.add_to_swap_cache.add_to_swap.shrink_page_list
> 10.82 ± 13% -33.1% 7.24 ± 14% perf-profile.cycles-pp._raw_spin_lock_irqsave.__remove_mapping.shrink_page_list.shrink_inactive_list.shrink_zone_memcg
> 10.36 ± 11% -100.0% 0.00 ± -1% perf-profile.cycles-pp._raw_spin_lock_irqsave.__test_set_page_writeback.bdev_write_page.__swap_writepage.swap_writepage
> 10.52 ± 12% -100.0% 0.00 ± -1% perf-profile.cycles-pp._raw_spin_lock_irqsave.test_clear_page_writeback.end_page_writeback.page_endio.pmem_rw_page
>
I didn't see anything wrong with the patch but it's worth highlighting
that this hunk means we are now out of GFP bits.
> diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
> index 66a1260..2f5a65dd 100644
> --- a/include/linux/pagemap.h
> +++ b/include/linux/pagemap.h
> @@ -25,6 +25,8 @@ enum mapping_flags {
> AS_MM_ALL_LOCKS = __GFP_BITS_SHIFT + 2, /* under mm_take_all_locks() */
> AS_UNEVICTABLE = __GFP_BITS_SHIFT + 3, /* e.g., ramdisk, SHM_LOCK */
> AS_EXITING = __GFP_BITS_SHIFT + 4, /* final truncate in progress */
> + /* writeback related tags are not used */
> + AS_NO_WRITEBACK_TAGS = __GFP_BITS_SHIFT + 5,
> };
>
--
Mel Gorman
SUSE Labs
[toc] | [prev] | [next] | [standalone]
| From | "Huang\, Ying" <ying.huang@intel.com> |
|---|---|
| Date | 2016-08-31 17:20 +0200 |
| Message-ID | <scft0-44i-21@gated-at.bofh.it> |
| In reply to | #1473217 |
Mel Gorman <mgorman@techsingularity.net> writes:
> On Tue, Aug 30, 2016 at 10:28:09AM -0700, Huang, Ying wrote:
>> From: Huang Ying <ying.huang@intel.com>
>>
>> File pages use a set of radix tree tags (DIRTY, TOWRITE, WRITEBACK,
>> etc.) to accelerate finding the pages with a specific tag in the radix
>> tree during inode writeback. But for anonymous pages in the swap
>> cache, there is no inode writeback. So there is no need to find the
>> pages with some writeback tags in the radix tree. It is not necessary
>> to touch radix tree writeback tags for pages in the swap cache.
>>
>> Per Rik van Riel's suggestion, a new flag AS_NO_WRITEBACK_TAGS is
>> introduced for address spaces which don't need to update the writeback
>> tags. The flag is set for swap caches. It may be used for DAX file
>> systems, etc.
>>
>> With this patch, the swap out bandwidth improved 22.3% (from ~1.2GB/s to
>> ~ 1.48GBps) in the vm-scalability swap-w-seq test case with 8 processes.
>> The test is done on a Xeon E5 v3 system. The swap device used is a RAM
>> simulated PMEM (persistent memory) device. The improvement comes from
>> the reduced contention on the swap cache radix tree lock. To test
>> sequential swapping out, the test case uses 8 processes, which
>> sequentially allocate and write to the anonymous pages until RAM and
>> part of the swap device is used up.
>>
>> Details of comparison is as follow,
>>
>> base base+patch
>> ---------------- --------------------------
>> %stddev %change %stddev
>> \ | \
>> 2506952 ± 2% +28.1% 3212076 ± 7% vm-scalability.throughput
>> 1207402 ± 7% +22.3% 1476578 ± 6% vmstat.swap.so
>> 10.86 ± 12% -23.4% 8.31 ± 16% perf-profile.cycles-pp._raw_spin_lock_irq.__add_to_swap_cache.add_to_swap_cache.add_to_swap.shrink_page_list
>> 10.82 ± 13% -33.1% 7.24 ± 14% perf-profile.cycles-pp._raw_spin_lock_irqsave.__remove_mapping.shrink_page_list.shrink_inactive_list.shrink_zone_memcg
>> 10.36 ± 11% -100.0% 0.00 ± -1% perf-profile.cycles-pp._raw_spin_lock_irqsave.__test_set_page_writeback.bdev_write_page.__swap_writepage.swap_writepage
>> 10.52 ± 12% -100.0% 0.00 ± -1% perf-profile.cycles-pp._raw_spin_lock_irqsave.test_clear_page_writeback.end_page_writeback.page_endio.pmem_rw_page
>>
>
> I didn't see anything wrong with the patch but it's worth highlighting
> that this hunk means we are now out of GFP bits.
Sorry, I don't know whether I understand your words. It is something
about,
__GFP_BITS_SHIFT == 26
So remainning bits in mapping_flags is 6. And now the latest bit is
used for the flag introduced in the patch?
Best Regards,
Huang, Ying
>> diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
>> index 66a1260..2f5a65dd 100644
>> --- a/include/linux/pagemap.h
>> +++ b/include/linux/pagemap.h
>> @@ -25,6 +25,8 @@ enum mapping_flags {
>> AS_MM_ALL_LOCKS = __GFP_BITS_SHIFT + 2, /* under mm_take_all_locks() */
>> AS_UNEVICTABLE = __GFP_BITS_SHIFT + 3, /* e.g., ramdisk, SHM_LOCK */
>> AS_EXITING = __GFP_BITS_SHIFT + 4, /* final truncate in progress */
>> + /* writeback related tags are not used */
>> + AS_NO_WRITEBACK_TAGS = __GFP_BITS_SHIFT + 5,
>> };
>>
[toc] | [prev] | [next] | [standalone]
| From | Mel Gorman <mgorman@techsingularity.net> |
|---|---|
| Date | 2016-08-31 17:40 +0200 |
| Subject | Re: [PATCH -v2] mm: Don't use radix tree writeback tags for pages in swap cache |
| Message-ID | <scfMl-4aI-13@gated-at.bofh.it> |
| In reply to | #1473602 |
On Wed, Aug 31, 2016 at 08:17:24AM -0700, Huang, Ying wrote: > Mel Gorman <mgorman@techsingularity.net> writes: > > > On Tue, Aug 30, 2016 at 10:28:09AM -0700, Huang, Ying wrote: > >> From: Huang Ying <ying.huang@intel.com> > >> > >> File pages use a set of radix tree tags (DIRTY, TOWRITE, WRITEBACK, > >> etc.) to accelerate finding the pages with a specific tag in the radix > >> tree during inode writeback. But for anonymous pages in the swap > >> cache, there is no inode writeback. So there is no need to find the > >> pages with some writeback tags in the radix tree. It is not necessary > >> to touch radix tree writeback tags for pages in the swap cache. > >> > >> Per Rik van Riel's suggestion, a new flag AS_NO_WRITEBACK_TAGS is > >> introduced for address spaces which don't need to update the writeback > >> tags. The flag is set for swap caches. It may be used for DAX file > >> systems, etc. > >> > >> With this patch, the swap out bandwidth improved 22.3% (from ~1.2GB/s to > >> ~ 1.48GBps) in the vm-scalability swap-w-seq test case with 8 processes. > >> The test is done on a Xeon E5 v3 system. The swap device used is a RAM > >> simulated PMEM (persistent memory) device. The improvement comes from > >> the reduced contention on the swap cache radix tree lock. To test > >> sequential swapping out, the test case uses 8 processes, which > >> sequentially allocate and write to the anonymous pages until RAM and > >> part of the swap device is used up. > >> > >> Details of comparison is as follow, > >> > >> base base+patch > >> ---------------- -------------------------- > >> %stddev %change %stddev > >> \ | \ > >> 2506952 ± 2% +28.1% 3212076 ± 7% vm-scalability.throughput > >> 1207402 ± 7% +22.3% 1476578 ± 6% vmstat.swap.so > >> 10.86 ± 12% -23.4% 8.31 ± 16% perf-profile.cycles-pp._raw_spin_lock_irq.__add_to_swap_cache.add_to_swap_cache.add_to_swap.shrink_page_list > >> 10.82 ± 13% -33.1% 7.24 ± 14% perf-profile.cycles-pp._raw_spin_lock_irqsave.__remove_mapping.shrink_page_list.shrink_inactive_list.shrink_zone_memcg > >> 10.36 ± 11% -100.0% 0.00 ± -1% perf-profile.cycles-pp._raw_spin_lock_irqsave.__test_set_page_writeback.bdev_write_page.__swap_writepage.swap_writepage > >> 10.52 ± 12% -100.0% 0.00 ± -1% perf-profile.cycles-pp._raw_spin_lock_irqsave.test_clear_page_writeback.end_page_writeback.page_endio.pmem_rw_page > >> > > > > I didn't see anything wrong with the patch but it's worth highlighting > > that this hunk means we are now out of GFP bits. > > Sorry, I don't know whether I understand your words. It is something > about, > > __GFP_BITS_SHIFT == 26 > > So remainning bits in mapping_flags is 6. And now the latest bit is > used for the flag introduced in the patch? > __GFP_BITS_SHIFT + 5 (AS_NO_WRITEBACK_TAGS) = 31 mapping->flags is a combination of AS and GFP flags so increasing __GFP_BITS_SHIFT overflows mapping->flags on 32-bit as gfp_t is an unsigned int. -- Mel Gorman SUSE Labs
[toc] | [prev] | [next] | [standalone]
| From | "Huang\, Ying" <ying.huang@intel.com> |
|---|---|
| Date | 2016-08-31 17:50 +0200 |
| Message-ID | <scfW1-4eb-11@gated-at.bofh.it> |
| In reply to | #1473615 |
Mel Gorman <mgorman@techsingularity.net> writes: > On Wed, Aug 31, 2016 at 08:17:24AM -0700, Huang, Ying wrote: >> Mel Gorman <mgorman@techsingularity.net> writes: >> >> > On Tue, Aug 30, 2016 at 10:28:09AM -0700, Huang, Ying wrote: >> >> From: Huang Ying <ying.huang@intel.com> >> >> >> >> File pages use a set of radix tree tags (DIRTY, TOWRITE, WRITEBACK, >> >> etc.) to accelerate finding the pages with a specific tag in the radix >> >> tree during inode writeback. But for anonymous pages in the swap >> >> cache, there is no inode writeback. So there is no need to find the >> >> pages with some writeback tags in the radix tree. It is not necessary >> >> to touch radix tree writeback tags for pages in the swap cache. >> >> >> >> Per Rik van Riel's suggestion, a new flag AS_NO_WRITEBACK_TAGS is >> >> introduced for address spaces which don't need to update the writeback >> >> tags. The flag is set for swap caches. It may be used for DAX file >> >> systems, etc. >> >> >> >> With this patch, the swap out bandwidth improved 22.3% (from ~1.2GB/s to >> >> ~ 1.48GBps) in the vm-scalability swap-w-seq test case with 8 processes. >> >> The test is done on a Xeon E5 v3 system. The swap device used is a RAM >> >> simulated PMEM (persistent memory) device. The improvement comes from >> >> the reduced contention on the swap cache radix tree lock. To test >> >> sequential swapping out, the test case uses 8 processes, which >> >> sequentially allocate and write to the anonymous pages until RAM and >> >> part of the swap device is used up. >> >> >> >> Details of comparison is as follow, >> >> >> >> base base+patch >> >> ---------------- -------------------------- >> >> %stddev %change %stddev >> >> \ | \ >> >> 2506952 ± 2% +28.1% 3212076 ± 7% vm-scalability.throughput >> >> 1207402 ± 7% +22.3% 1476578 ± 6% vmstat.swap.so >> >> 10.86 ± 12% -23.4% 8.31 ± 16% perf-profile.cycles-pp._raw_spin_lock_irq.__add_to_swap_cache.add_to_swap_cache.add_to_swap.shrink_page_list >> >> 10.82 ± 13% -33.1% 7.24 ± 14% perf-profile.cycles-pp._raw_spin_lock_irqsave.__remove_mapping.shrink_page_list.shrink_inactive_list.shrink_zone_memcg >> >> 10.36 ± 11% -100.0% 0.00 ± -1% perf-profile.cycles-pp._raw_spin_lock_irqsave.__test_set_page_writeback.bdev_write_page.__swap_writepage.swap_writepage >> >> 10.52 ± 12% -100.0% 0.00 ± -1% perf-profile.cycles-pp._raw_spin_lock_irqsave.test_clear_page_writeback.end_page_writeback.page_endio.pmem_rw_page >> >> >> > >> > I didn't see anything wrong with the patch but it's worth highlighting >> > that this hunk means we are now out of GFP bits. >> >> Sorry, I don't know whether I understand your words. It is something >> about, >> >> __GFP_BITS_SHIFT == 26 >> >> So remainning bits in mapping_flags is 6. And now the latest bit is >> used for the flag introduced in the patch? >> > > __GFP_BITS_SHIFT + 5 (AS_NO_WRITEBACK_TAGS) = 31 > > mapping->flags is a combination of AS and GFP flags so increasing > __GFP_BITS_SHIFT overflows mapping->flags on 32-bit as gfp_t is an > unsigned int. Got it! Thanks a lot! Best Regards, Huang, Ying
[toc] | [prev] | [next] | [standalone]
| From | Andi Kleen <andi@firstfloor.org> |
|---|---|
| Date | 2016-08-31 23:40 +0200 |
| Message-ID | <scloK-7GT-25@gated-at.bofh.it> |
| In reply to | #1473615 |
Mel Gorman <mgorman@techsingularity.net> writes: > > __GFP_BITS_SHIFT + 5 (AS_NO_WRITEBACK_TAGS) = 31 > > mapping->flags is a combination of AS and GFP flags so increasing > __GFP_BITS_SHIFT overflows mapping->flags on 32-bit as gfp_t is an > unsigned int. Couldn't we just split mapping->flags into two fields? I'm sure more GFP bits will be needed eventually. -Andi
[toc] | [prev] | [next] | [standalone]
| From | Andrew Morton <akpm@linux-foundation.org> |
|---|---|
| Date | 2016-08-31 23:40 +0200 |
| Subject | Re: [PATCH -v2] mm: Don't use radix tree writeback tags for pages in swap cache |
| Message-ID | <scloK-7GT-17@gated-at.bofh.it> |
| In reply to | #1473217 |
On Wed, 31 Aug 2016 10:14:59 +0100 Mel Gorman <mgorman@techsingularity.net> wrote:
> > 2506952 __ 2% +28.1% 3212076 __ 7% vm-scalability.throughput
> > 1207402 __ 7% +22.3% 1476578 __ 6% vmstat.swap.so
> > 10.86 __ 12% -23.4% 8.31 __ 16% perf-profile.cycles-pp._raw_spin_lock_irq.__add_to_swap_cache.add_to_swap_cache.add_to_swap.shrink_page_list
> > 10.82 __ 13% -33.1% 7.24 __ 14% perf-profile.cycles-pp._raw_spin_lock_irqsave.__remove_mapping.shrink_page_list.shrink_inactive_list.shrink_zone_memcg
> > 10.36 __ 11% -100.0% 0.00 __ -1% perf-profile.cycles-pp._raw_spin_lock_irqsave.__test_set_page_writeback.bdev_write_page.__swap_writepage.swap_writepage
> > 10.52 __ 12% -100.0% 0.00 __ -1% perf-profile.cycles-pp._raw_spin_lock_irqsave.test_clear_page_writeback.end_page_writeback.page_endio.pmem_rw_page
> >
>
> I didn't see anything wrong with the patch but it's worth highlighting
> that this hunk means we are now out of GFP bits.
Well ugh. What are we to do about that?
Sigh. This?
From: Andrew Morton <akpm@linux-foundation.org>
Subject: mm: check that we haven't used more than 32 bits in address_space.flags
After "mm: don't use radix tree writeback tags for pages in swap cache",
all the flags are now used up on 32-bit builds.
Add a build-time assertion to prevent 64-bit developers from accidentally
breaking things.
Cc: Mel Gorman <mgorman@techsingularity.net>
Cc: "Huang, Ying" <ying.huang@intel.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
---
include/linux/pagemap.h | 2 ++
init/main.c | 4 ++++
2 files changed, 6 insertions(+)
diff -puN include/linux/pagemap.h~mm-check-that-we-havent-used-more-than-32-bits-in-address_spaceflags include/linux/pagemap.h
--- a/include/linux/pagemap.h~mm-check-that-we-havent-used-more-than-32-bits-in-address_spaceflags
+++ a/include/linux/pagemap.h
@@ -27,6 +27,8 @@ enum mapping_flags {
AS_EXITING = __GFP_BITS_SHIFT + 4, /* final truncate in progress */
/* writeback related tags are not used */
AS_NO_WRITEBACK_TAGS = __GFP_BITS_SHIFT + 5,
+
+ AS_LAST_FLAG,
};
static inline void mapping_set_error(struct address_space *mapping, int error)
diff -puN init/main.c~mm-check-that-we-havent-used-more-than-32-bits-in-address_spaceflags init/main.c
--- a/init/main.c~mm-check-that-we-havent-used-more-than-32-bits-in-address_spaceflags
+++ a/init/main.c
@@ -59,6 +59,7 @@
#include <linux/pid_namespace.h>
#include <linux/device.h>
#include <linux/kthread.h>
+#include <linux/pagemap.h>
#include <linux/sched.h>
#include <linux/signal.h>
#include <linux/idr.h>
@@ -463,6 +464,9 @@ void __init __weak thread_stack_cache_in
*/
static void __init mm_init(void)
{
+ /* Does address_space.flags still fit into a 32-bit ulong? */
+ BUILD_BUG_ON(AS_LAST_FLAG > 32);
+
/*
* page_ext requires contiguous pages,
* bigger than MAX_ORDER unless SPARSEMEM.
_
[toc] | [prev] | [next] | [standalone]
| From | Mel Gorman <mgorman@techsingularity.net> |
|---|---|
| Date | 2016-09-01 11:00 +0200 |
| Subject | Re: [PATCH -v2] mm: Don't use radix tree writeback tags for pages in swap cache |
| Message-ID | <scw0N-7nt-27@gated-at.bofh.it> |
| In reply to | #1473897 |
On Wed, Aug 31, 2016 at 02:30:31PM -0700, Andrew Morton wrote: > On Wed, 31 Aug 2016 10:14:59 +0100 Mel Gorman <mgorman@techsingularity.net> wrote: > > > > 2506952 __ 2% +28.1% 3212076 __ 7% vm-scalability.throughput > > > 1207402 __ 7% +22.3% 1476578 __ 6% vmstat.swap.so > > > 10.86 __ 12% -23.4% 8.31 __ 16% perf-profile.cycles-pp._raw_spin_lock_irq.__add_to_swap_cache.add_to_swap_cache.add_to_swap.shrink_page_list > > > 10.82 __ 13% -33.1% 7.24 __ 14% perf-profile.cycles-pp._raw_spin_lock_irqsave.__remove_mapping.shrink_page_list.shrink_inactive_list.shrink_zone_memcg > > > 10.36 __ 11% -100.0% 0.00 __ -1% perf-profile.cycles-pp._raw_spin_lock_irqsave.__test_set_page_writeback.bdev_write_page.__swap_writepage.swap_writepage > > > 10.52 __ 12% -100.0% 0.00 __ -1% perf-profile.cycles-pp._raw_spin_lock_irqsave.test_clear_page_writeback.end_page_writeback.page_endio.pmem_rw_page > > > > > > > I didn't see anything wrong with the patch but it's worth highlighting > > that this hunk means we are now out of GFP bits. > > Well ugh. What are we to do about that? > It'll stop silent breakage so Acked-by: Mel Gorman <mgorman@techsingularity.net> Whoever hits it will need to take similar steps we had to with page->flags by making some 64-bit only, removing flags or inferring the flag values from other sources. -- Mel Gorman SUSE Labs
[toc] | [prev] | [next] | [standalone]
| From | Michal Hocko <mhocko@kernel.org> |
|---|---|
| Date | 2016-09-01 11:20 +0200 |
| Subject | Re: [PATCH -v2] mm: Don't use radix tree writeback tags for pages in swap cache |
| Message-ID | <scwk9-7Sa-5@gated-at.bofh.it> |
| In reply to | #1473897 |
On Wed 31-08-16 14:30:31, Andrew Morton wrote: > On Wed, 31 Aug 2016 10:14:59 +0100 Mel Gorman <mgorman@techsingularity.net> wrote: > > > > 2506952 __ 2% +28.1% 3212076 __ 7% vm-scalability.throughput > > > 1207402 __ 7% +22.3% 1476578 __ 6% vmstat.swap.so > > > 10.86 __ 12% -23.4% 8.31 __ 16% perf-profile.cycles-pp._raw_spin_lock_irq.__add_to_swap_cache.add_to_swap_cache.add_to_swap.shrink_page_list > > > 10.82 __ 13% -33.1% 7.24 __ 14% perf-profile.cycles-pp._raw_spin_lock_irqsave.__remove_mapping.shrink_page_list.shrink_inactive_list.shrink_zone_memcg > > > 10.36 __ 11% -100.0% 0.00 __ -1% perf-profile.cycles-pp._raw_spin_lock_irqsave.__test_set_page_writeback.bdev_write_page.__swap_writepage.swap_writepage > > > 10.52 __ 12% -100.0% 0.00 __ -1% perf-profile.cycles-pp._raw_spin_lock_irqsave.test_clear_page_writeback.end_page_writeback.page_endio.pmem_rw_page > > > > > > > I didn't see anything wrong with the patch but it's worth highlighting > > that this hunk means we are now out of GFP bits. > > Well ugh. What are we to do about that? Can we simply give these AS_ flags their own word in mapping rather than squash them together with gfp flags and impose the restriction on the number of gfp flags. There was some demand for new gfp flags already and mapping flags were in the way. -- Michal Hocko SUSE Labs
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web