Messages in this thread | | | Date | Tue, 20 Feb 2007 17:06:58 +0800 | From | "yunfeng zhang" <> | Subject | Re: [PATCH 2.6.20-rc5 1/1] MM: enhance Linux swap subsystem |
| |
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 majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |