* [PATCH V3] mm:add VM_BUG_ON_PAGE() for page_mapcount()
@ 2014-12-08 9:59 ` Wang, Yalin
0 siblings, 0 replies; 20+ messages in thread
From: Wang, Yalin @ 2014-12-08 9:59 UTC (permalink / raw)
To: 'Hillf Danton', 'linux-kernel',
'linux-mm@kvack.org',
'linux-arm-kernel@lists.infradead.org',
'Andrew Morton'
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset="utf-8", Size: 954 bytes --]
This patch add VM_BUG_ON_PAGE() for slab page,
because _mapcount is an union with slab struct in struct page,
avoid access _mapcount if this page is a slab page.
Also remove the unneeded bracket.
Signed-off-by: Yalin Wang <yalin.wang@sonymobile.com>
---
include/linux/mm.h | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/include/linux/mm.h b/include/linux/mm.h
index b464611..a117527 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -449,7 +449,8 @@ static inline void page_mapcount_reset(struct page *page)
static inline int page_mapcount(struct page *page)
{
- return atomic_read(&(page)->_mapcount) + 1;
+ VM_BUG_ON_PAGE(PageSlab(page), page);
+ return atomic_read(&page->_mapcount) + 1;
}
static inline int page_count(struct page *page)
--
2.1.3
ÿôèº{.nÇ+·®+%Ëÿ±éݶ\x17¥wÿº{.nÇ+·¥{±þG«éÿ{ayº\x1dÊÚë,j\a¢f£¢·hïêÿêçz_è®\x03(éÝ¢j"ú\x1a¶^[m§ÿÿ¾\a«þG«éÿ¢¸?¨èÚ&£ø§~á¶iOæ¬z·vØ^\x14\x04\x1a¶^[m§ÿÿÃ\fÿ¶ìÿ¢¸?I¥
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH V3] mm:add VM_BUG_ON_PAGE() for page_mapcount()
@ 2014-12-08 9:59 ` Wang, Yalin
0 siblings, 0 replies; 20+ messages in thread
From: Wang, Yalin @ 2014-12-08 9:59 UTC (permalink / raw)
To: 'Hillf Danton', 'linux-kernel',
'linux-mm@kvack.org',
'linux-arm-kernel@lists.infradead.org',
'Andrew Morton'
This patch add VM_BUG_ON_PAGE() for slab page,
because _mapcount is an union with slab struct in struct page,
avoid access _mapcount if this page is a slab page.
Also remove the unneeded bracket.
Signed-off-by: Yalin Wang <yalin.wang@sonymobile.com>
---
include/linux/mm.h | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/include/linux/mm.h b/include/linux/mm.h
index b464611..a117527 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -449,7 +449,8 @@ static inline void page_mapcount_reset(struct page *page)
static inline int page_mapcount(struct page *page)
{
- return atomic_read(&(page)->_mapcount) + 1;
+ VM_BUG_ON_PAGE(PageSlab(page), page);
+ return atomic_read(&page->_mapcount) + 1;
}
static inline int page_count(struct page *page)
--
2.1.3
^ permalink raw reply related [flat|nested] 20+ messages in thread* [PATCH V3] mm:add VM_BUG_ON_PAGE() for page_mapcount()
2014-12-08 9:59 ` Wang, Yalin
(?)
@ 2014-12-08 11:54 ` Kirill A. Shutemov
-1 siblings, 0 replies; 20+ messages in thread
From: Kirill A. Shutemov @ 2014-12-08 11:54 UTC (permalink / raw)
To: linux-arm-kernel
On Mon, Dec 08, 2014 at 05:59:46PM +0800, Wang, Yalin wrote:
> This patch add VM_BUG_ON_PAGE() for slab page,
> because _mapcount is an union with slab struct in struct page,
> avoid access _mapcount if this page is a slab page.
> Also remove the unneeded bracket.
>
> Signed-off-by: Yalin Wang <yalin.wang@sonymobile.com>
Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
--
Kirill A. Shutemov
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH V3] mm:add VM_BUG_ON_PAGE() for page_mapcount()
@ 2014-12-08 11:54 ` Kirill A. Shutemov
0 siblings, 0 replies; 20+ messages in thread
From: Kirill A. Shutemov @ 2014-12-08 11:54 UTC (permalink / raw)
To: Wang, Yalin
Cc: 'Hillf Danton', 'linux-kernel',
'linux-mm@kvack.org',
'linux-arm-kernel@lists.infradead.org',
'Andrew Morton'
On Mon, Dec 08, 2014 at 05:59:46PM +0800, Wang, Yalin wrote:
> This patch add VM_BUG_ON_PAGE() for slab page,
> because _mapcount is an union with slab struct in struct page,
> avoid access _mapcount if this page is a slab page.
> Also remove the unneeded bracket.
>
> Signed-off-by: Yalin Wang <yalin.wang@sonymobile.com>
Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
--
Kirill A. Shutemov
^ permalink raw reply [flat|nested] 20+ messages in thread
* Re: [PATCH V3] mm:add VM_BUG_ON_PAGE() for page_mapcount()
@ 2014-12-08 11:54 ` Kirill A. Shutemov
0 siblings, 0 replies; 20+ messages in thread
From: Kirill A. Shutemov @ 2014-12-08 11:54 UTC (permalink / raw)
To: Wang, Yalin
Cc: 'Hillf Danton', 'linux-kernel',
'linux-mm@kvack.org',
'linux-arm-kernel@lists.infradead.org',
'Andrew Morton'
On Mon, Dec 08, 2014 at 05:59:46PM +0800, Wang, Yalin wrote:
> This patch add VM_BUG_ON_PAGE() for slab page,
> because _mapcount is an union with slab struct in struct page,
> avoid access _mapcount if this page is a slab page.
> Also remove the unneeded bracket.
>
> Signed-off-by: Yalin Wang <yalin.wang@sonymobile.com>
Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
--
Kirill A. Shutemov
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH V3] mm:add VM_BUG_ON_PAGE() for page_mapcount()
2014-12-08 9:59 ` Wang, Yalin
(?)
@ 2014-12-09 3:18 ` Hillf Danton
-1 siblings, 0 replies; 20+ messages in thread
From: Hillf Danton @ 2014-12-09 3:18 UTC (permalink / raw)
To: linux-arm-kernel
>
> This patch add VM_BUG_ON_PAGE() for slab page,
> because _mapcount is an union with slab struct in struct page,
> avoid access _mapcount if this page is a slab page.
> Also remove the unneeded bracket.
>
> Signed-off-by: Yalin Wang <yalin.wang@sonymobile.com>
> ---
Acked-by: Hillf Danton <hillf.zj@alibaba-inc.com>
> include/linux/mm.h | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/include/linux/mm.h b/include/linux/mm.h
> index b464611..a117527 100644
> --- a/include/linux/mm.h
> +++ b/include/linux/mm.h
> @@ -449,7 +449,8 @@ static inline void page_mapcount_reset(struct page *page)
>
> static inline int page_mapcount(struct page *page)
> {
> - return atomic_read(&(page)->_mapcount) + 1;
> + VM_BUG_ON_PAGE(PageSlab(page), page);
> + return atomic_read(&page->_mapcount) + 1;
> }
>
> static inline int page_count(struct page *page)
> --
> 2.1.3
^ permalink raw reply [flat|nested] 20+ messages in thread* Re: [PATCH V3] mm:add VM_BUG_ON_PAGE() for page_mapcount()
@ 2014-12-09 3:18 ` Hillf Danton
0 siblings, 0 replies; 20+ messages in thread
From: Hillf Danton @ 2014-12-09 3:18 UTC (permalink / raw)
To: 'Wang, Yalin', 'linux-kernel', linux-mm,
linux-arm-kernel, 'Andrew Morton'
>
> This patch add VM_BUG_ON_PAGE() for slab page,
> because _mapcount is an union with slab struct in struct page,
> avoid access _mapcount if this page is a slab page.
> Also remove the unneeded bracket.
>
> Signed-off-by: Yalin Wang <yalin.wang@sonymobile.com>
> ---
Acked-by: Hillf Danton <hillf.zj@alibaba-inc.com>
> include/linux/mm.h | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/include/linux/mm.h b/include/linux/mm.h
> index b464611..a117527 100644
> --- a/include/linux/mm.h
> +++ b/include/linux/mm.h
> @@ -449,7 +449,8 @@ static inline void page_mapcount_reset(struct page *page)
>
> static inline int page_mapcount(struct page *page)
> {
> - return atomic_read(&(page)->_mapcount) + 1;
> + VM_BUG_ON_PAGE(PageSlab(page), page);
> + return atomic_read(&page->_mapcount) + 1;
> }
>
> static inline int page_count(struct page *page)
> --
> 2.1.3
^ permalink raw reply [flat|nested] 20+ messages in thread* Re: [PATCH V3] mm:add VM_BUG_ON_PAGE() for page_mapcount()
@ 2014-12-09 3:18 ` Hillf Danton
0 siblings, 0 replies; 20+ messages in thread
From: Hillf Danton @ 2014-12-09 3:18 UTC (permalink / raw)
To: 'Wang, Yalin', 'linux-kernel', linux-mm,
linux-arm-kernel, 'Andrew Morton'
>
> This patch add VM_BUG_ON_PAGE() for slab page,
> because _mapcount is an union with slab struct in struct page,
> avoid access _mapcount if this page is a slab page.
> Also remove the unneeded bracket.
>
> Signed-off-by: Yalin Wang <yalin.wang@sonymobile.com>
> ---
Acked-by: Hillf Danton <hillf.zj@alibaba-inc.com>
> include/linux/mm.h | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/include/linux/mm.h b/include/linux/mm.h
> index b464611..a117527 100644
> --- a/include/linux/mm.h
> +++ b/include/linux/mm.h
> @@ -449,7 +449,8 @@ static inline void page_mapcount_reset(struct page *page)
>
> static inline int page_mapcount(struct page *page)
> {
> - return atomic_read(&(page)->_mapcount) + 1;
> + VM_BUG_ON_PAGE(PageSlab(page), page);
> + return atomic_read(&page->_mapcount) + 1;
> }
>
> static inline int page_count(struct page *page)
> --
> 2.1.3
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 20+ messages in thread
* [PATCH V3] mm:add VM_BUG_ON_PAGE() for page_mapcount()
2014-12-08 9:59 ` Wang, Yalin
(?)
@ 2015-06-09 16:14 ` Vlastimil Babka
-1 siblings, 0 replies; 20+ messages in thread
From: Vlastimil Babka @ 2015-06-09 16:14 UTC (permalink / raw)
To: linux-arm-kernel
On 12/08/2014 10:59 AM, Wang, Yalin wrote:
> This patch add VM_BUG_ON_PAGE() for slab page,
> because _mapcount is an union with slab struct in struct page,
> avoid access _mapcount if this page is a slab page.
> Also remove the unneeded bracket.
>
> Signed-off-by: Yalin Wang <yalin.wang@sonymobile.com>
> ---
> include/linux/mm.h | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/include/linux/mm.h b/include/linux/mm.h
> index b464611..a117527 100644
> --- a/include/linux/mm.h
> +++ b/include/linux/mm.h
> @@ -449,7 +449,8 @@ static inline void page_mapcount_reset(struct page *page)
>
> static inline int page_mapcount(struct page *page)
> {
> - return atomic_read(&(page)->_mapcount) + 1;
> + VM_BUG_ON_PAGE(PageSlab(page), page);
> + return atomic_read(&page->_mapcount) + 1;
> }
>
I think this might theoretically trigger on the following code in
compaction's isolate_migratepages_block():
/*
* Migration will fail if an anonymous page is pinned in memory,
* so avoid taking lru_lock and isolating it unnecessarily in an
* admittedly racy check.
*/
if (!page_mapping(page) &&
page_count(page) > page_mapcount(page))
continue;
This is done after PageLRU() was positive, but the lru_lock might be not
taken yet. So, there's some time window during which the page might have
been reclaimed from LRU and become a PageSlab(page). !page_mapping(page)
will be true in that case so it will proceed with page_mapcount(page)
test and trigger the VM_BUG_ON.
(That test was added by DavidR year ago in commit
119d6d59dcc0980dcd581fdadb6b2033b512a473)
Vlastimil
> static inline int page_count(struct page *page)
>
^ permalink raw reply [flat|nested] 20+ messages in thread* Re: [PATCH V3] mm:add VM_BUG_ON_PAGE() for page_mapcount()
@ 2015-06-09 16:14 ` Vlastimil Babka
0 siblings, 0 replies; 20+ messages in thread
From: Vlastimil Babka @ 2015-06-09 16:14 UTC (permalink / raw)
To: Wang, Yalin, 'Hillf Danton', 'linux-kernel',
'linux-mm@kvack.org',
'linux-arm-kernel@lists.infradead.org',
'Andrew Morton'
Cc: Kirill A. Shutemov, David Rientjes
On 12/08/2014 10:59 AM, Wang, Yalin wrote:
> This patch add VM_BUG_ON_PAGE() for slab page,
> because _mapcount is an union with slab struct in struct page,
> avoid access _mapcount if this page is a slab page.
> Also remove the unneeded bracket.
>
> Signed-off-by: Yalin Wang <yalin.wang@sonymobile.com>
> ---
> include/linux/mm.h | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/include/linux/mm.h b/include/linux/mm.h
> index b464611..a117527 100644
> --- a/include/linux/mm.h
> +++ b/include/linux/mm.h
> @@ -449,7 +449,8 @@ static inline void page_mapcount_reset(struct page *page)
>
> static inline int page_mapcount(struct page *page)
> {
> - return atomic_read(&(page)->_mapcount) + 1;
> + VM_BUG_ON_PAGE(PageSlab(page), page);
> + return atomic_read(&page->_mapcount) + 1;
> }
>
I think this might theoretically trigger on the following code in
compaction's isolate_migratepages_block():
/*
* Migration will fail if an anonymous page is pinned in memory,
* so avoid taking lru_lock and isolating it unnecessarily in an
* admittedly racy check.
*/
if (!page_mapping(page) &&
page_count(page) > page_mapcount(page))
continue;
This is done after PageLRU() was positive, but the lru_lock might be not
taken yet. So, there's some time window during which the page might have
been reclaimed from LRU and become a PageSlab(page). !page_mapping(page)
will be true in that case so it will proceed with page_mapcount(page)
test and trigger the VM_BUG_ON.
(That test was added by DavidR year ago in commit
119d6d59dcc0980dcd581fdadb6b2033b512a473)
Vlastimil
> static inline int page_count(struct page *page)
>
^ permalink raw reply [flat|nested] 20+ messages in thread* Re: [PATCH V3] mm:add VM_BUG_ON_PAGE() for page_mapcount()
@ 2015-06-09 16:14 ` Vlastimil Babka
0 siblings, 0 replies; 20+ messages in thread
From: Vlastimil Babka @ 2015-06-09 16:14 UTC (permalink / raw)
To: Wang, Yalin, 'Hillf Danton', 'linux-kernel',
'linux-mm@kvack.org',
'linux-arm-kernel@lists.infradead.org',
'Andrew Morton'
Cc: Kirill A. Shutemov, David Rientjes
On 12/08/2014 10:59 AM, Wang, Yalin wrote:
> This patch add VM_BUG_ON_PAGE() for slab page,
> because _mapcount is an union with slab struct in struct page,
> avoid access _mapcount if this page is a slab page.
> Also remove the unneeded bracket.
>
> Signed-off-by: Yalin Wang <yalin.wang@sonymobile.com>
> ---
> include/linux/mm.h | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/include/linux/mm.h b/include/linux/mm.h
> index b464611..a117527 100644
> --- a/include/linux/mm.h
> +++ b/include/linux/mm.h
> @@ -449,7 +449,8 @@ static inline void page_mapcount_reset(struct page *page)
>
> static inline int page_mapcount(struct page *page)
> {
> - return atomic_read(&(page)->_mapcount) + 1;
> + VM_BUG_ON_PAGE(PageSlab(page), page);
> + return atomic_read(&page->_mapcount) + 1;
> }
>
I think this might theoretically trigger on the following code in
compaction's isolate_migratepages_block():
/*
* Migration will fail if an anonymous page is pinned in memory,
* so avoid taking lru_lock and isolating it unnecessarily in an
* admittedly racy check.
*/
if (!page_mapping(page) &&
page_count(page) > page_mapcount(page))
continue;
This is done after PageLRU() was positive, but the lru_lock might be not
taken yet. So, there's some time window during which the page might have
been reclaimed from LRU and become a PageSlab(page). !page_mapping(page)
will be true in that case so it will proceed with page_mapcount(page)
test and trigger the VM_BUG_ON.
(That test was added by DavidR year ago in commit
119d6d59dcc0980dcd581fdadb6b2033b512a473)
Vlastimil
> static inline int page_count(struct page *page)
>
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
^ permalink raw reply [flat|nested] 20+ messages in thread