aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Gardner <tim.gardner@canonical.com>2009-03-15 13:38:17 -0600
committerJohn Rigby <john.rigby@linaro.org>2012-06-20 14:33:34 -0600
commitfec0d3bfd2b14f0a7997c51c407f7483c6ed8dba (patch)
tree68ea49ae513cd9456662cb12773b237b805ed488
parent7c0fad83c5132f367a7b8c64deee8a2b50d1c100 (diff)
UBUNTU: SAUCE: (no-up) swap: Add notify_swap_entry_free callback for compcache
Code is required for ubuntu/compcache Signed-off-by: Ben Collins <ben.collins@canonical.com> Signed-off-by: Tim Gardner <tim.gardner@canonical.com>
-rw-r--r--include/linux/swap.h2
-rw-r--r--mm/swapfile.c23
2 files changed, 25 insertions, 0 deletions
diff --git a/include/linux/swap.h b/include/linux/swap.h
index b1fd5c7925f..acf2ae80729 100644
--- a/include/linux/swap.h
+++ b/include/linux/swap.h
@@ -197,6 +197,7 @@ struct swap_info_struct {
struct block_device *bdev; /* swap device or bdev of swap file */
struct file *swap_file; /* seldom referenced */
unsigned int old_block_size; /* seldom referenced */
+ void (*notify_swap_entry_free_fn) (unsigned long);
};
struct swap_list_t {
@@ -354,6 +355,7 @@ extern sector_t swapdev_block(int, pgoff_t);
extern int reuse_swap_page(struct page *);
extern int try_to_free_swap(struct page *);
struct backing_dev_info;
+extern void set_notify_swap_entry_free(unsigned, void (*) (unsigned long));
/* linux/mm/thrash.c */
extern struct mm_struct *swap_token_mm;
diff --git a/mm/swapfile.c b/mm/swapfile.c
index fafc26d1b1d..c8ac1899892 100644
--- a/mm/swapfile.c
+++ b/mm/swapfile.c
@@ -561,6 +561,12 @@ static unsigned char swap_entry_free(struct swap_info_struct *p,
disk->fops->swap_slot_free_notify(p->bdev, offset);
}
+ if (!swap_count(count)) {
+ mem_cgroup_uncharge_swap(entry);
+ if (p->notify_swap_entry_free_fn)
+ p->notify_swap_entry_free_fn(offset);
+ }
+
return usage;
}
@@ -2293,6 +2299,23 @@ int swapcache_prepare(swp_entry_t entry)
}
/*
+ * Sets callback for event when swap_map[offset] == 0
+ * i.e. page at this swap offset is not longer used.
+ *
+ * type: identifies swap file
+ * fn: callback function
+ */
+void set_notify_swap_entry_free(unsigned type, void (*fn) (unsigned long))
+{
+ struct swap_info_struct *sis;
+ sis = swap_info[type];
+ BUG_ON(!sis);
+ sis->notify_swap_entry_free_fn = fn;
+ return;
+}
+EXPORT_SYMBOL(set_notify_swap_entry_free);
+
+/*
* add_swap_count_continuation - called when a swap count is duplicated
* beyond SWAP_MAP_MAX, it allocates a new page and links that to the entry's
* page of the original vmalloc'ed swap_map, to hold the continuation count