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 {
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;
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;
}
}
/*
+ * 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.
*/