lkml.org 
[lkml]   [2009]   [May]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 7/19] TuxOnIce: Modify swsusp bitmaps to allow modification during scanning.
    Date
    The version of the bitmap code currently in vanilla uses one struct
    bm_position only. This prevents code from modifying a bitmap while
    iterating through it. Add an extra struct bm_position and use it in
    memory_bm_next_pfn so that this is no longer an issue.

    Signed-off-by: Nigel Cunningham <nigel@tuxonice.net>
    ---
    kernel/power/power.h | 3 +++
    kernel/power/snapshot.c | 13 ++++++++-----
    2 files changed, 11 insertions(+), 5 deletions(-)

    diff --git a/kernel/power/power.h b/kernel/power/power.h
    index ce81df1..4cc59d5 100644
    --- a/kernel/power/power.h
    +++ b/kernel/power/power.h
    @@ -287,6 +287,9 @@ struct memory_bitmap {
    * objects
    */
    struct bm_position cur; /* most recently used bit position */
    + struct bm_position iter; /* most recently used bit position
    + * when iterating over a bitmap.
    + */
    };

    extern int memory_bm_create(struct memory_bitmap *bm, gfp_t gfp_mask,
    diff --git a/kernel/power/snapshot.c b/kernel/power/snapshot.c
    index 8020644..786227c 100644
    --- a/kernel/power/snapshot.c
    +++ b/kernel/power/snapshot.c
    @@ -234,6 +234,9 @@ void memory_bm_position_reset(struct memory_bitmap *bm)
    {
    bm->cur.block = list_entry(bm->blocks.next, struct bm_block, hook);
    bm->cur.bit = 0;
    +
    + bm->iter.block = list_entry(bm->blocks.next, struct bm_block, hook);
    + bm->iter.bit = 0;
    }

    /**
    @@ -519,23 +522,23 @@ unsigned long memory_bm_next_pfn(struct memory_bitmap *bm)
    struct bm_block *bb;
    int bit;

    - bb = bm->cur.block;
    + bb = bm->iter.block;
    do {
    - bit = bm->cur.bit;
    + bit = bm->iter.bit;
    bit = find_next_bit(bb->data, bm_block_bits(bb), bit);
    if (bit < bm_block_bits(bb))
    goto Return_pfn;

    bb = list_entry(bb->hook.next, struct bm_block, hook);
    - bm->cur.block = bb;
    - bm->cur.bit = 0;
    + bm->iter.block = bb;
    + bm->iter.bit = 0;
    } while (&bb->hook != &bm->blocks);

    memory_bm_position_reset(bm);
    return BM_END_OF_MAP;

    Return_pfn:
    - bm->cur.bit = bit + 1;
    + bm->iter.bit = bit + 1;
    return bb->start_pfn + bit;
    }

    --
    1.5.6.3


    \
     
     \ /
      Last update: 2009-05-06 16:53    [W:0.038 / U:2.908 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site