Commit b3a27d05 authored by Nitin Gupta's avatar Nitin Gupta Committed by Greg Kroah-Hartman

swap: Add swap slot free callback to block_device_operations

This callback is required when RAM based devices are used as swap disks.
One such device is ramzswap which is used as compressed in-memory swap
disk.  For such devices, we need a callback as soon as a swap slot is no
longer used to allow freeing memory allocated for this slot.  Without this
callback, stale data can quickly accumulate in memory defeating the whole
purpose of such devices.
Signed-off-by: default avatarNitin Gupta <ngupta@vflare.org>
Acked-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
Acked-by: default avatarNigel Cunningham <nigel@tuxonice.net>
Acked-by: default avatarPekka Enberg <penberg@cs.helsinki.fi>
Reviewed-by: default avatarMinchan Kim <minchan.kim@gmail.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent b2725643
...@@ -1287,6 +1287,8 @@ struct block_device_operations { ...@@ -1287,6 +1287,8 @@ struct block_device_operations {
unsigned long long); unsigned long long);
int (*revalidate_disk) (struct gendisk *); int (*revalidate_disk) (struct gendisk *);
int (*getgeo)(struct block_device *, struct hd_geometry *); int (*getgeo)(struct block_device *, struct hd_geometry *);
/* this callback is with swap_lock and sometimes page table lock held */
void (*swap_slot_free_notify) (struct block_device *, unsigned long);
struct module *owner; struct module *owner;
}; };
......
...@@ -574,6 +574,7 @@ static unsigned char swap_entry_free(struct swap_info_struct *p, ...@@ -574,6 +574,7 @@ static unsigned char swap_entry_free(struct swap_info_struct *p,
/* free if no reference */ /* free if no reference */
if (!usage) { if (!usage) {
struct gendisk *disk = p->bdev->bd_disk;
if (offset < p->lowest_bit) if (offset < p->lowest_bit)
p->lowest_bit = offset; p->lowest_bit = offset;
if (offset > p->highest_bit) if (offset > p->highest_bit)
...@@ -583,6 +584,9 @@ static unsigned char swap_entry_free(struct swap_info_struct *p, ...@@ -583,6 +584,9 @@ static unsigned char swap_entry_free(struct swap_info_struct *p,
swap_list.next = p->type; swap_list.next = p->type;
nr_swap_pages++; nr_swap_pages++;
p->inuse_pages--; p->inuse_pages--;
if ((p->flags & SWP_BLKDEV) &&
disk->fops->swap_slot_free_notify)
disk->fops->swap_slot_free_notify(p->bdev, offset);
} }
return usage; return usage;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment