lkml.org 
[lkml]   [2013]   [May]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[RFC 1/4] mm: Don't hide spin_lock in swap_info_get
Date
Now, swap_info_get hides lock holding by doing it internally
but releasing the lock is caller's duty. It's not serious bad
pattern but not good for readability, either.
More concern that if we uses swap_info_get in irq context,
the lock should be held with irq disabled.
So it would be better for caller to hold it because he can
judge the function will be used in irqcontext or not.

This patch will be used next patchset in this series.

Signed-off-by: Minchan Kim <minchan@kernel.org>
---
mm/swapfile.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/mm/swapfile.c b/mm/swapfile.c
index 6c340d9..2966978 100644
--- a/mm/swapfile.c
+++ b/mm/swapfile.c
@@ -523,7 +523,6 @@ static struct swap_info_struct *swap_info_get(swp_entry_t entry)
goto bad_offset;
if (!p->swap_map[offset])
goto bad_free;
- spin_lock(&p->lock);
return p;

bad_free:
@@ -629,6 +628,7 @@ void swap_free(swp_entry_t entry)

p = swap_info_get(entry);
if (p) {
+ spin_lock(&p->lock);
swap_entry_free(p, entry, 1);
spin_unlock(&p->lock);
}
@@ -644,6 +644,7 @@ void swapcache_free(swp_entry_t entry, struct page *page)

p = swap_info_get(entry);
if (p) {
+ spin_lock(&p->lock);
count = swap_entry_free(p, entry, SWAP_HAS_CACHE);
if (page)
mem_cgroup_uncharge_swapcache(page, entry, count != 0);
@@ -665,6 +666,7 @@ int page_swapcount(struct page *page)
entry.val = page_private(page);
p = swap_info_get(entry);
if (p) {
+ spin_lock(&p->lock);
count = swap_count(p->swap_map[swp_offset(entry)]);
spin_unlock(&p->lock);
}
@@ -747,6 +749,7 @@ int free_swap_and_cache(swp_entry_t entry)

p = swap_info_get(entry);
if (p) {
+ spin_lock(&p->lock);
if (swap_entry_free(p, entry, 1) == SWAP_HAS_CACHE) {
page = find_get_page(swap_address_space(entry),
entry.val);
@@ -2373,6 +2376,7 @@ int add_swap_count_continuation(swp_entry_t entry, gfp_t gfp_mask)
goto outer;
}

+ spin_lock(&si->lock);
offset = swp_offset(entry);
count = si->swap_map[offset] & ~SWAP_HAS_CACHE;

--
1.8.2.1


\
 
 \ /
  Last update: 2013-05-13 05:01    [W:0.077 / U:1.704 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site