[3.8.y.z extended stable] Patch "mm/swap: fix race on swap_info reuse between swapoff and swapon" has been added to staging queue
Kamal Mostafa
kamal at canonical.com
Thu Feb 20 21:38:00 UTC 2014
This is a note to let you know that I have just added a patch titled
mm/swap: fix race on swap_info reuse between swapoff and swapon
to the linux-3.8.y-queue branch of the 3.8.y.z extended stable tree
which can be found at:
http://kernel.ubuntu.com/git?p=ubuntu/linux.git;a=shortlog;h=refs/heads/linux-3.8.y-queue
This patch is scheduled to be released in version 3.8.13.19.
If you, or anyone else, feels it should not be added to this tree, please
reply to this email.
For more information about the 3.8.y.z tree, see
https://wiki.ubuntu.com/Kernel/Dev/ExtendedStable
Thanks.
-Kamal
------
>From fbdc052c46f4dd3ecdea252ccee5360f0a70548c Mon Sep 17 00:00:00 2001
From: Weijie Yang <weijie.yang at samsung.com>
Date: Thu, 6 Feb 2014 12:04:23 -0800
Subject: mm/swap: fix race on swap_info reuse between swapoff and swapon
commit f893ab41e4dae2fe8991faf5d86d029068d1ef3a upstream.
swapoff clear swap_info's SWP_USED flag prematurely and free its
resources after that. A concurrent swapon will reuse this swap_info
while its previous resources are not cleared completely.
These late freed resources are:
- p->percpu_cluster
- swap_cgroup_ctrl[type]
- block_device setting
- inode->i_flags &= ~S_SWAPFILE
This patch clears the SWP_USED flag after all its resources are freed,
so that swapon can reuse this swap_info by alloc_swap_info() safely.
[akpm at linux-foundation.org: tidy up code comment]
Signed-off-by: Weijie Yang <weijie.yang at samsung.com>
Acked-by: Hugh Dickins <hughd at google.com>
Cc: Krzysztof Kozlowski <k.kozlowski at samsung.com>
Signed-off-by: Andrew Morton <akpm at linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>
Signed-off-by: Kamal Mostafa <kamal at canonical.com>
---
mm/swapfile.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/mm/swapfile.c b/mm/swapfile.c
index e97a0e5..85c5777 100644
--- a/mm/swapfile.c
+++ b/mm/swapfile.c
@@ -1587,7 +1587,6 @@ SYSCALL_DEFINE1(swapoff, const char __user *, specialfile)
p->max = 0;
swap_map = p->swap_map;
p->swap_map = NULL;
- p->flags = 0;
frontswap_invalidate_area(type);
spin_unlock(&swap_lock);
mutex_unlock(&swapon_mutex);
@@ -1607,6 +1606,16 @@ SYSCALL_DEFINE1(swapoff, const char __user *, specialfile)
mutex_unlock(&inode->i_mutex);
}
filp_close(swap_file, NULL);
+
+ /*
+ * Clear the SWP_USED flag after all resources are freed so that swapon
+ * can reuse this swap_info in alloc_swap_info() safely. It is ok to
+ * not hold p->lock after we cleared its SWP_WRITEOK.
+ */
+ spin_lock(&swap_lock);
+ p->flags = 0;
+ spin_unlock(&swap_lock);
+
err = 0;
atomic_inc(&proc_poll_event);
wake_up_interruptible(&proc_poll_wait);
--
1.8.3.2
More information about the kernel-team
mailing list