aboutsummaryrefslogtreecommitdiff
path: root/mm
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-23 23:13:41 -0600
commit6abb66725eda99546bcfd684c127c8c4f1f184c8 (patch)
tree68ea49ae513cd9456662cb12773b237b805ed488 /mm
parent7364b82ec31509bb7af8398c844b9011e4e4ae66 (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>
Diffstat (limited to 'mm')
-rw-r--r--mm/swapfile.c23
1 files changed, 23 insertions, 0 deletions
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