diff options
-rw-r--r-- | mm/shmem.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/mm/shmem.c b/mm/shmem.c index b0aa6075d164..6540e5982444 100644 --- a/mm/shmem.c +++ b/mm/shmem.c | |||
@@ -1022,7 +1022,11 @@ static int shmem_setattr(struct dentry *dentry, struct iattr *attr) | |||
1022 | */ | 1022 | */ |
1023 | if (IS_ENABLED(CONFIG_TRANSPARENT_HUGE_PAGECACHE)) { | 1023 | if (IS_ENABLED(CONFIG_TRANSPARENT_HUGE_PAGECACHE)) { |
1024 | spin_lock(&sbinfo->shrinklist_lock); | 1024 | spin_lock(&sbinfo->shrinklist_lock); |
1025 | if (list_empty(&info->shrinklist)) { | 1025 | /* |
1026 | * _careful to defend against unlocked access to | ||
1027 | * ->shrink_list in shmem_unused_huge_shrink() | ||
1028 | */ | ||
1029 | if (list_empty_careful(&info->shrinklist)) { | ||
1026 | list_add_tail(&info->shrinklist, | 1030 | list_add_tail(&info->shrinklist, |
1027 | &sbinfo->shrinklist); | 1031 | &sbinfo->shrinklist); |
1028 | sbinfo->shrinklist_len++; | 1032 | sbinfo->shrinklist_len++; |
@@ -1817,7 +1821,11 @@ alloc_nohuge: page = shmem_alloc_and_acct_page(gfp, info, sbinfo, | |||
1817 | * to shrink under memory pressure. | 1821 | * to shrink under memory pressure. |
1818 | */ | 1822 | */ |
1819 | spin_lock(&sbinfo->shrinklist_lock); | 1823 | spin_lock(&sbinfo->shrinklist_lock); |
1820 | if (list_empty(&info->shrinklist)) { | 1824 | /* |
1825 | * _careful to defend against unlocked access to | ||
1826 | * ->shrink_list in shmem_unused_huge_shrink() | ||
1827 | */ | ||
1828 | if (list_empty_careful(&info->shrinklist)) { | ||
1821 | list_add_tail(&info->shrinklist, | 1829 | list_add_tail(&info->shrinklist, |
1822 | &sbinfo->shrinklist); | 1830 | &sbinfo->shrinklist); |
1823 | sbinfo->shrinklist_len++; | 1831 | sbinfo->shrinklist_len++; |