lkml.org 
[lkml]   [2010]   [May]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 2/3] Add swap slot free callback to block_device_operations
    Hi.

    On 07/05/10 17:25, Nitin Gupta wrote:
    > 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: Nitin Gupta<ngupta@vflare.org>
    > ---
    > include/linux/blkdev.h | 2 ++
    > mm/swapfile.c | 4 ++++
    > 2 files changed, 6 insertions(+), 0 deletions(-)
    >
    > diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
    > index 6690e8b..413284a 100644
    > --- a/include/linux/blkdev.h
    > +++ b/include/linux/blkdev.h
    > @@ -1287,6 +1287,8 @@ struct block_device_operations {
    > unsigned long long);
    > int (*revalidate_disk) (struct gendisk *);
    > 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;
    > };
    >
    > diff --git a/mm/swapfile.c b/mm/swapfile.c
    > index ecb069e..f5ccc47 100644
    > --- a/mm/swapfile.c
    > +++ b/mm/swapfile.c
    > @@ -574,6 +574,7 @@ static unsigned char swap_entry_free(struct swap_info_struct *p,
    >
    > /* free if no reference */
    > if (!usage) {
    > + struct gendisk *disk = p->bdev->bd_disk;
    > if (offset< p->lowest_bit)
    > p->lowest_bit = offset;
    > if (offset> p->highest_bit)
    > @@ -583,6 +584,9 @@ static unsigned char swap_entry_free(struct swap_info_struct *p,
    > swap_list.next = p->type;
    > nr_swap_pages++;
    > p->inuse_pages--;
    > + if ((p->flags& SWP_BLKDEV)&&
    > + disk->fops->swap_slot_free_notify)
    > + disk->fops->swap_slot_free_notify(p->bdev, offset);

    Is this p->flags & SWP_BLKDEV logic reversed? (Don't you want the
    notifier called for devices that aren't backed by a block device?)

    I also wonder whether leaving the p->flags & SWP_BLKDEV part out might
    be a good idea. Other potential notifier users?

    Regards,

    Nigel


    \
     
     \ /
      Last update: 2010-05-07 11:35    [W:0.022 / U:31.792 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site