UBUNTU: SAUCE: (no-up) swap: Add notify_swap_entry_free callback for compcache
authorTim Gardner <tim.gardner@canonical.com>
Sun, 15 Mar 2009 19:38:17 +0000 (13:38 -0600)
committerLeann Ogasawara <leann.ogasawara@canonical.com>
Mon, 28 Mar 2011 13:48:09 +0000 (06:48 -0700)
Code is required for ubuntu/compcache

Signed-off-by: Ben Collins <ben.collins@canonical.com>
Signed-off-by: Tim Gardner <tim.gardner@canonical.com>

include/linux/swap.h
mm/swapfile.c

index 4d55932..97a5514 100644 (file)
@@ -185,6 +185,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 {
@@ -344,6 +345,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;
index 6d6d28c..7c23299 100644 (file)
@@ -594,6 +594,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;
 }
 
@@ -2299,6 +2305,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);
+
+/*
  * swap_lock prevents swap_map being freed. Don't grab an extra
  * reference on the swaphandle, it doesn't matter if it becomes unused.
  */