From: Nitin Gupta <ngupta@vflare.org>
To: Greg KH <greg@kroah.com>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Pekka Enberg <penberg@cs.helsinki.fi>, Ed Tomlinson <edt@aei.ca>,
linux-kernel <linux-kernel@vger.kernel.org>,
linux-mm <linux-mm@kvack.org>,
linux-mm-cc <linux-mm-cc@laptop.org>
Subject: [PATCH 2/4] send callback when swap slot is freed
Date: Fri, 18 Sep 2009 04:13:30 +0530 [thread overview]
Message-ID: <1253227412-24342-3-git-send-email-ngupta@vflare.org> (raw)
In-Reply-To: <1253227412-24342-1-git-send-email-ngupta@vflare.org>
Currently, we have "swap discard" mechanism which sends a discard bio request
when we find a free cluster during scan_swap_map(). This callback can come a
long time after swap slots are actually freed.
This delay in callback is a great problem when (compressed) RAM [1] is used
as a swap device. So, this change adds a callback which is called as
soon as a swap slot becomes free. For above mentioned case of swapping
over compressed RAM device, this is very useful since we can immediately
free memory allocated for this swap page.
This callback does not replace swap discard support. It is called with
swap_lock held, so it is meant to trigger action that finishes quickly.
However, swap discard is an I/O request and can be used for taking longer
actions.
It is preferred to use this callback for ramzswap case even if discard
mechanism could be improved such that it can be called as often as required.
This is because, allocation of 'bio'(s) is undesirable since ramzswap always
operates under low memory conditions (its a swap device). Also, batching of
discard bio requests is not optimal since stale data can accumulate very
quickly in ramzswap devices, pushing system further into low memory state.
Links:
[1] http://compcache.googlecode.com/
Signed-off-by: Nitin Gupta <ngupta@vflare.org>
---
include/linux/swap.h | 5 +++++
mm/swapfile.c | 34 ++++++++++++++++++++++++++++++++++
2 files changed, 39 insertions(+), 0 deletions(-)
diff --git a/include/linux/swap.h b/include/linux/swap.h
index 7c15334..64796fc 100644
--- a/include/linux/swap.h
+++ b/include/linux/swap.h
@@ -8,6 +8,7 @@
#include <linux/memcontrol.h>
#include <linux/sched.h>
#include <linux/node.h>
+#include <linux/blkdev.h>
#include <asm/atomic.h>
#include <asm/page.h>
@@ -20,6 +21,8 @@ struct bio;
#define SWAP_FLAG_PRIO_MASK 0x7fff
#define SWAP_FLAG_PRIO_SHIFT 0
+typedef void (swap_free_notify_fn) (struct block_device *, unsigned long);
+
static inline int current_is_kswapd(void)
{
return current->flags & PF_KSWAPD;
@@ -155,6 +158,7 @@ struct swap_info_struct {
unsigned int max;
unsigned int inuse_pages;
unsigned int old_block_size;
+ swap_free_notify_fn *swap_free_notify_fn;
};
struct swap_list_t {
@@ -295,6 +299,7 @@ extern sector_t swapdev_block(int, pgoff_t);
extern struct swap_info_struct *get_swap_info_struct(unsigned);
extern int reuse_swap_page(struct page *);
extern int try_to_free_swap(struct page *);
+extern void set_swap_free_notify(struct block_device *, swap_free_notify_fn *);
struct backing_dev_info;
/* linux/mm/thrash.c */
diff --git a/mm/swapfile.c b/mm/swapfile.c
index 74f1102..b165db0 100644
--- a/mm/swapfile.c
+++ b/mm/swapfile.c
@@ -554,6 +554,38 @@ out:
return NULL;
}
+/*
+ * Sets callback for event when swap_map[offset] == 0
+ * i.e. page at this swap offset is no longer used.
+ */
+void set_swap_free_notify(struct block_device *bdev,
+ swap_free_notify_fn *notify_fn)
+{
+ unsigned int i;
+ struct swap_info_struct *sis;
+
+ spin_lock(&swap_lock);
+ for (i = 0; i <= nr_swapfiles; i++) {
+ sis = &swap_info[i];
+ if (!(sis->flags & SWP_USED))
+ continue;
+ if (sis->bdev == bdev)
+ break;
+ }
+
+ /* swap device not found */
+ if (i > nr_swapfiles) {
+ spin_unlock(&swap_lock);
+ return;
+ }
+
+ BUG_ON(!sis || sis->swap_free_notify_fn);
+ sis->swap_free_notify_fn = notify_fn;
+ spin_unlock(&swap_lock);
+ return;
+}
+EXPORT_SYMBOL_GPL(set_swap_free_notify);
+
static int swap_entry_free(struct swap_info_struct *p,
swp_entry_t ent, int cache)
{
@@ -585,6 +617,8 @@ static int swap_entry_free(struct swap_info_struct *p,
swap_list.next = p - swap_info;
nr_swap_pages++;
p->inuse_pages--;
+ if (p->swap_free_notify_fn)
+ p->swap_free_notify_fn(p->bdev, offset);
}
if (!swap_count(count))
mem_cgroup_uncharge_swap(ent);
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to majordomo@kvack.org. For more info on Linux MM,
see: http://www.linux-mm.org/ .
Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>
next prev parent reply other threads:[~2009-09-17 22:44 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-09-17 22:43 [PATCH 0/4] compcache: in-memory compressed swapping v3 Nitin Gupta
2009-09-17 22:43 ` [PATCH 1/4] xvmalloc memory allocator Nitin Gupta
2009-09-18 21:05 ` Marcin Slusarz
2009-09-22 3:50 ` Nitin Gupta
2009-09-17 22:43 ` Nitin Gupta [this message]
2009-09-18 6:53 ` [PATCH 2/4] send callback when swap slot is freed Pekka Enberg
2009-09-18 7:17 ` Hugh Dickins
2009-09-18 7:55 ` Pekka Enberg
2009-09-18 7:59 ` Hugh Dickins
2009-09-18 9:33 ` Pekka Enberg
2009-09-18 15:04 ` Nitin Gupta
2009-09-19 7:27 ` Pekka Enberg
2009-09-20 15:02 ` Nitin Gupta
2009-09-21 11:17 ` Hugh Dickins
2009-09-21 11:07 ` Hugh Dickins
2009-09-21 11:12 ` Pekka Enberg
2009-09-21 11:55 ` Hugh Dickins
2009-09-21 12:01 ` Pekka Enberg
2009-09-22 3:04 ` Nitin Gupta
2009-09-21 12:08 ` Pekka Enberg
2009-09-21 12:29 ` Nitin Gupta
2009-09-18 9:59 ` Nitin Gupta
2009-09-19 5:47 ` Nitin Gupta
2009-09-24 1:39 ` KAMEZAWA Hiroyuki
2009-09-17 22:43 ` [PATCH 3/4] virtual block device driver (ramzswap) Nitin Gupta
2009-09-18 20:48 ` Marcin Slusarz
2009-09-17 22:43 ` [PATCH 4/4] documentation Nitin Gupta
2009-09-18 16:43 ` [PATCH] ramzswap prefix for swap free callback Nitin Gupta
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1253227412-24342-3-git-send-email-ngupta@vflare.org \
--to=ngupta@vflare.org \
--cc=akpm@linux-foundation.org \
--cc=edt@aei.ca \
--cc=greg@kroah.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm-cc@laptop.org \
--cc=linux-mm@kvack.org \
--cc=penberg@cs.helsinki.fi \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).