Following arithmetic is based on SwapSpace bitmap management which is discussed
in the postscript section of my patch. Two purposes are implemented, one is
allocating a group of fake continual swap entries, another is re-allocating
swap entries in stage 3 for such as series length is too short.


#include <stdlib.h>
#include <stdio.h>
#include <string.h>
// 2 hardware cache line. You can also concentrate it to a hareware cache line.
char bits_per_short[256] = {
        8, 7, 7, 6, 7, 6, 6, 5,
        7, 6, 6, 5, 6, 5, 5, 4,
        7, 6, 6, 5, 6, 5, 5, 4,
        6, 5, 5, 4, 5, 4, 4, 3,
        7, 6, 6, 5, 6, 5, 5, 4,
        6, 5, 5, 4, 5, 4, 4, 3,
        6, 5, 5, 4, 5, 4, 4, 3,
        5, 4, 4, 3, 4, 3, 3, 2,
        7, 6, 6, 5, 6, 5, 5, 4,
        6, 5, 5, 4, 5, 4, 4, 3,
        6, 5, 5, 4, 5, 4, 4, 3,
        5, 4, 4, 3, 4, 3, 3, 2,
        6, 5, 5, 4, 5, 4, 4, 3,
        5, 4, 4, 3, 4, 3, 3, 2,
        5, 4, 4, 3, 4, 3, 3, 2,
        4, 3, 3, 2, 3, 2, 2, 1,
        7, 6, 6, 5, 6, 5, 5, 4,
        6, 5, 5, 4, 5, 4, 4, 3,
        6, 5, 5, 4, 5, 4, 4, 3,
        5, 4, 4, 3, 4, 3, 3, 2,
        6, 5, 5, 4, 5, 4, 4, 3,
        5, 4, 4, 3, 4, 3, 3, 2,
        5, 4, 4, 3, 4, 3, 3, 2,
        4, 3, 3, 2, 3, 2, 2, 1,
        6, 5, 5, 4, 5, 4, 4, 3,
        5, 4, 4, 3, 4, 3, 3, 2,
        5, 4, 4, 3, 4, 3, 3, 2,
        4, 3, 3, 2, 3, 2, 2, 1,
        5, 4, 4, 3, 4, 3, 3, 2,
        4, 3, 3, 2, 3, 2, 2, 1,
        4, 3, 3, 2, 3, 2, 2, 1,
        3, 2, 2, 1, 2, 1, 1, 0
};
unsigned char swap_bitmap[32];
// Allocate a group of fake continual swap entries.
int alloc(int size)
{
        int i, found = 0, result_offset;
        unsigned char a = 0, b = 0;
        for (i = 0; i < 32; i++) {
                b = bits_per_short[swap_bitmap[i]];
                if (a + b >= size) {
                        found = 1;
                        break;
                }
                a = b;
        }
        result_offset = i == 0 ? 0 : i - 1;
        result_offset = found ? result_offset : -1;
        return result_offset;
}
// Re-allocate in stage 3 if necessary.
int re_alloc(int position)
{
        int offset = position / 8;
        int a = offset == 0 ? 0 : offset - 1;
        int b = offset == 31 ? 31 : offset + 1;
        int i, empty_bits = 0;
        for (i = a; i <= b; i++) {
                empty_bits += bits_per_short[swap_bitmap[i]];
        }
        return empty_bits;
}
int main(int argc, char **argv)
{
        int i;
        for (i = 0; i < 32; i++) {
                swap_bitmap[i] = (unsigned char) (rand() % 0xff);
        }
        i = 9;
        int temp = alloc(i);
        temp = re_alloc(i);
}
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to