00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00035 #ifndef __BUDDY_H__
00036 #define __BUDDY_H__
00037
00038 #include <arch/types.h>
00039 #include <typedefs.h>
00040
00041 #define BUDDY_SYSTEM_INNER_BLOCK 0xff
00042
00044 struct buddy_system_operations {
00045 link_t *(* find_buddy)(buddy_system_t *, link_t *);
00046 link_t *(* bisect)(buddy_system_t *, link_t *);
00047 link_t *(* coalesce)(buddy_system_t *, link_t *, link_t *);
00048 void (*set_order)(buddy_system_t *, link_t *, __u8);
00049 __u8 (*get_order)(buddy_system_t *, link_t *);
00050 void (*mark_busy)(buddy_system_t *, link_t *);
00051 void (*mark_available)(buddy_system_t *, link_t *);
00053 link_t *(* find_block)(buddy_system_t *, link_t *, __u8);
00054 void (* print_id)(buddy_system_t *, link_t *);
00055 };
00056
00057 struct buddy_system {
00058 __u8 max_order;
00059 link_t *order;
00060 buddy_system_operations_t *op;
00061 void *data;
00062 };
00063
00064 extern void buddy_system_create(buddy_system_t *b,
00065 __u8 max_order,
00066 buddy_system_operations_t *op, void *data);
00067 extern link_t *buddy_system_alloc(buddy_system_t *b, __u8 i);
00068 extern bool buddy_system_can_alloc(buddy_system_t *b, __u8 order);
00069 extern void buddy_system_free(buddy_system_t *b, link_t *block);
00070 extern void buddy_system_structure_print(buddy_system_t *b, size_t elem_size);
00071 extern size_t buddy_conf_size(int max_order);
00072 extern link_t *buddy_system_alloc_block(buddy_system_t *b, link_t *block);
00073
00074 #endif
00075