diff options
author | Hugh Dickins <hugh@veritas.com> | 2005-09-03 18:54:41 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@evo.osdl.org> | 2005-09-05 03:05:42 -0400 |
commit | 5d337b9194b1ce3b6fd5f3cb2799455ed2f9a3d1 (patch) | |
tree | 91ed9ef6f4cb5f6a1832f2baaaabd53fcd83513e /include | |
parent | 048c27fd72816b44e096997d1c6901c3abbfd45b (diff) |
[PATCH] swap: swap_lock replace list+device
The idea of a swap_device_lock per device, and a swap_list_lock over them all,
is appealing; but in practice almost every holder of swap_device_lock must
already hold swap_list_lock, which defeats the purpose of the split.
The only exceptions have been swap_duplicate, valid_swaphandles and an
untrodden path in try_to_unuse (plus a few places added in this series).
valid_swaphandles doesn't show up high in profiles, but swap_duplicate does
demand attention. However, with the hold time in get_swap_pages so much
reduced, I've not yet found a load and set of swap device priorities to show
even swap_duplicate benefitting from the split. Certainly the split is mere
overhead in the common case of a single swap device.
So, replace swap_list_lock and swap_device_lock by spinlock_t swap_lock
(generally we seem to prefer an _ in the name, and not hide in a macro).
If someone can show a regression in swap_duplicate, then probably we should
add a hashlock for the swap_map entries alone (shorts being anatomic), so as
to help the case of the single swap device too.
Signed-off-by: Hugh Dickins <hugh@veritas.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/swap.h | 11 |
1 files changed, 2 insertions, 9 deletions
diff --git a/include/linux/swap.h b/include/linux/swap.h index db3b5de7c92f..3c9ff0048153 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h | |||
@@ -121,7 +121,7 @@ enum { | |||
121 | */ | 121 | */ |
122 | struct swap_info_struct { | 122 | struct swap_info_struct { |
123 | unsigned int flags; | 123 | unsigned int flags; |
124 | spinlock_t sdev_lock; | 124 | int prio; /* swap priority */ |
125 | struct file *swap_file; | 125 | struct file *swap_file; |
126 | struct block_device *bdev; | 126 | struct block_device *bdev; |
127 | struct list_head extent_list; | 127 | struct list_head extent_list; |
@@ -135,7 +135,6 @@ struct swap_info_struct { | |||
135 | unsigned int pages; | 135 | unsigned int pages; |
136 | unsigned int max; | 136 | unsigned int max; |
137 | unsigned int inuse_pages; | 137 | unsigned int inuse_pages; |
138 | int prio; /* swap priority */ | ||
139 | int next; /* next entry on swap list */ | 138 | int next; /* next entry on swap list */ |
140 | }; | 139 | }; |
141 | 140 | ||
@@ -221,13 +220,7 @@ extern int can_share_swap_page(struct page *); | |||
221 | extern int remove_exclusive_swap_page(struct page *); | 220 | extern int remove_exclusive_swap_page(struct page *); |
222 | struct backing_dev_info; | 221 | struct backing_dev_info; |
223 | 222 | ||
224 | extern struct swap_list_t swap_list; | 223 | extern spinlock_t swap_lock; |
225 | extern spinlock_t swaplock; | ||
226 | |||
227 | #define swap_list_lock() spin_lock(&swaplock) | ||
228 | #define swap_list_unlock() spin_unlock(&swaplock) | ||
229 | #define swap_device_lock(p) spin_lock(&p->sdev_lock) | ||
230 | #define swap_device_unlock(p) spin_unlock(&p->sdev_lock) | ||
231 | 224 | ||
232 | /* linux/mm/thrash.c */ | 225 | /* linux/mm/thrash.c */ |
233 | extern struct mm_struct * swap_token_mm; | 226 | extern struct mm_struct * swap_token_mm; |