mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/xiang/erofs.git
synced 2026-11-05 17:13:47 +01:00
mm: fix slab->page _count corruption when using slub
On arches that do not support this_cpu_cmpxchg_double() slab_lock is used to do atomic cmpxchg() on double word which contains page->_count. The page count can be changed from get_page() or put_page() without taking slab_lock. That corrupts page counter. Fix it by moving page->_count out of cmpxchg_double data. So that slub does no change it while updating slub meta-data in struct page. [[email protected]: use standard comment layout, tweak comment text] Reported-by: Amey Bhide <[email protected]> Signed-off-by: Pravin B Shelar <[email protected]> Acked-by: Christoph Lameter <[email protected]> Cc: Pekka Enberg <[email protected]> Cc: Andrea Arcangeli <[email protected]> Cc: <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
1 parent
485802a6c5
commit
abca7c4965
1 file changed
+10
@@ -57,8 +57,18 @@ struct page {
|
||||
};
|
||||
|
||||
union {
|
||||
#if defined(CONFIG_HAVE_CMPXCHG_DOUBLE) && \
|
||||
defined(CONFIG_HAVE_ALIGNED_STRUCT_PAGE)
|
||||
/* Used for cmpxchg_double in slub */
|
||||
unsigned long counters;
|
||||
#else
|
||||
/*
|
||||
* Keep _count separate from slub cmpxchg_double data.
|
||||
* As the rest of the double word is protected by
|
||||
* slab_lock but _count is not.
|
||||
*/
|
||||
unsigned counters;
|
||||
#endif
|
||||
|
||||
struct {
|
||||
|
||||
|
||||
Reference in new issue
Block a user