Rev 1224 | Rev 1269 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1224 | Rev 1236 | ||
---|---|---|---|
Line 56... | Line 56... | ||
56 | typedef struct { |
56 | typedef struct { |
57 | count_t refcount; /**< tracking of shared frames */ |
57 | count_t refcount; /**< tracking of shared frames */ |
58 | __u8 buddy_order; /**< buddy system block order */ |
58 | __u8 buddy_order; /**< buddy system block order */ |
59 | link_t buddy_link; /**< link to the next free block inside one order */ |
59 | link_t buddy_link; /**< link to the next free block inside one order */ |
60 | void *parent; /**< If allocated by slab, this points there */ |
60 | void *parent; /**< If allocated by slab, this points there */ |
61 | }frame_t; |
61 | } frame_t; |
62 | 62 | ||
63 | typedef struct { |
63 | typedef struct { |
64 | SPINLOCK_DECLARE(lock); /**< this lock protects everything below */ |
64 | SPINLOCK_DECLARE(lock); /**< this lock protects everything below */ |
65 | pfn_t base; /**< frame_no of the first frame in the frames array */ |
65 | pfn_t base; /**< frame_no of the first frame in the frames array */ |
66 | count_t count; /**< Size of zone */ |
66 | count_t count; /**< Size of zone */ |
67 | 67 | ||
68 | frame_t *frames; /**< array of frame_t structures in this zone */ |
68 | frame_t *frames; /**< array of frame_t structures in this zone */ |
69 | count_t free_count; /**< number of free frame_t structures */ |
69 | count_t free_count; /**< number of free frame_t structures */ |
70 | count_t busy_count; /**< number of busy frame_t structures */ |
70 | count_t busy_count; /**< number of busy frame_t structures */ |
71 | 71 | ||
72 | buddy_system_t * buddy_system; /**< buddy system for the zone */ |
72 | buddy_system_t * buddy_system; /**< buddy system for the zone */ |
73 | int flags; |
73 | int flags; |
74 | }zone_t; |
74 | } zone_t; |
75 | 75 | ||
76 | /* |
76 | /* |
77 | * The zoneinfo.lock must be locked when accessing zoneinfo structure. |
77 | * The zoneinfo.lock must be locked when accessing zoneinfo structure. |
78 | * Some of the attributes in zone_t structures are 'read-only' |
78 | * Some of the attributes in zone_t structures are 'read-only' |
79 | */ |
79 | */ |
80 | 80 | ||
81 | struct { |
81 | struct { |
82 | SPINLOCK_DECLARE(lock); |
82 | SPINLOCK_DECLARE(lock); |
83 | int count; |
83 | int count; |
84 | zone_t *info[ZONES_MAX]; |
84 | zone_t *info[ZONES_MAX]; |
85 | }zones; |
85 | } zones; |
86 | 86 | ||
87 | 87 | ||
88 | /*********************************/ |
88 | /*********************************/ |
89 | /* Helper functions */ |
89 | /* Helper functions */ |
90 | static inline index_t frame_index(zone_t *zone, frame_t *frame) |
90 | static inline index_t frame_index(zone_t *zone, frame_t *frame) |
Line 942... | Line 942... | ||
942 | return v; |
942 | return v; |
943 | } |
943 | } |
944 | 944 | ||
945 | /** Free a frame. |
945 | /** Free a frame. |
946 | * |
946 | * |
947 | * Find respective frame structure for supplied addr. |
947 | * Find respective frame structure for supplied PFN. |
948 | * Decrement frame reference count. |
948 | * Decrement frame reference count. |
949 | * If it drops to zero, move the frame structure to free list. |
949 | * If it drops to zero, move the frame structure to free list. |
950 | * |
950 | * |
951 | * @param frame Frame no to be freed. |
951 | * @param frame Frame number to be freed. |
952 | */ |
952 | */ |
953 | void frame_free(pfn_t pfn) |
953 | void frame_free(pfn_t pfn) |
954 | { |
954 | { |
955 | ipl_t ipl; |
955 | ipl_t ipl; |
956 | zone_t *zone; |
956 | zone_t *zone; |
Line 967... | Line 967... | ||
967 | 967 | ||
968 | spinlock_unlock(&zone->lock); |
968 | spinlock_unlock(&zone->lock); |
969 | interrupts_restore(ipl); |
969 | interrupts_restore(ipl); |
970 | } |
970 | } |
971 | 971 | ||
- | 972 | /** Add reference to frame. |
|
- | 973 | * |
|
- | 974 | * Find respective frame structure for supplied PFN and |
|
- | 975 | * increment frame reference count. |
|
- | 976 | * |
|
- | 977 | * @param frame Frame no to be freed. |
|
- | 978 | */ |
|
- | 979 | void frame_reference_add(pfn_t pfn) |
|
- | 980 | { |
|
- | 981 | ipl_t ipl; |
|
- | 982 | zone_t *zone; |
|
- | 983 | frame_t *frame; |
|
972 | 984 | ||
- | 985 | ipl = interrupts_disable(); |
|
- | 986 | ||
- | 987 | /* |
|
- | 988 | * First, find host frame zone for addr. |
|
- | 989 | */ |
|
- | 990 | zone = find_zone_and_lock(pfn,NULL); |
|
- | 991 | ASSERT(zone); |
|
- | 992 | ||
- | 993 | frame = &zone->frames[pfn-zone->base]; |
|
- | 994 | frame->refcount++; |
|
- | 995 | ||
- | 996 | spinlock_unlock(&zone->lock); |
|
- | 997 | interrupts_restore(ipl); |
|
- | 998 | } |
|
973 | 999 | ||
974 | /** Mark given range unavailable in frame zones */ |
1000 | /** Mark given range unavailable in frame zones */ |
975 | void frame_mark_unavailable(pfn_t start, count_t count) |
1001 | void frame_mark_unavailable(pfn_t start, count_t count) |
976 | { |
1002 | { |
977 | int i; |
1003 | int i; |