From: Tim Gardner Date: Sun, 15 Mar 2009 19:38:17 +0000 (-0600) Subject: UBUNTU: SAUCE: (no-up) swap: Add notify_swap_entry_free callback for compcache X-Git-Url: http://git.alex.org.uk UBUNTU: SAUCE: (no-up) swap: Add notify_swap_entry_free callback for compcache Code is required for ubuntu/compcache Signed-off-by: Ben Collins Signed-off-by: Tim Gardner --- diff --git a/include/linux/swap.h b/include/linux/swap.h index 4d55932..97a5514 100644 --- a/include/linux/swap.h +++ b/include/linux/swap.h @@ -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; diff --git a/mm/swapfile.c b/mm/swapfile.c index 6d6d28c..7c23299 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -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. */