Rev 1248 | Rev 1568 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1248 | Rev 1269 | ||
---|---|---|---|
Line 432... | Line 432... | ||
432 | /* Zone functions */ |
432 | /* Zone functions */ |
433 | 433 | ||
434 | /** Allocate frame in particular zone |
434 | /** Allocate frame in particular zone |
435 | * |
435 | * |
436 | * Assume zone is locked |
436 | * Assume zone is locked |
437 | * Panics, if allocation is impossible. |
437 | * Panics if allocation is impossible. |
- | 438 | * |
|
- | 439 | * @param zone Zone to allocate from. |
|
- | 440 | * @param order Allocate exactly 2^order frames. |
|
438 | * |
441 | * |
439 | * @return Frame index in zone |
442 | * @return Frame index in zone |
- | 443 | * |
|
440 | */ |
444 | */ |
441 | static pfn_t zone_frame_alloc(zone_t *zone,__u8 order) |
445 | static pfn_t zone_frame_alloc(zone_t *zone, __u8 order) |
442 | { |
446 | { |
443 | pfn_t v; |
447 | pfn_t v; |
444 | link_t *tmp; |
448 | link_t *tmp; |
445 | frame_t *frame; |
449 | frame_t *frame; |
446 | 450 | ||
Line 889... | Line 893... | ||
889 | return res; |
893 | return res; |
890 | } |
894 | } |
891 | 895 | ||
892 | /** Allocate power-of-two frames of physical memory. |
896 | /** Allocate power-of-two frames of physical memory. |
893 | * |
897 | * |
- | 898 | * @param order Allocate exactly 2^order frames. |
|
894 | * @param flags Flags for host zone selection and address processing. |
899 | * @param flags Flags for host zone selection and address processing. |
895 | * @param order Allocate exactly 2^order frames. |
900 | * @param status Allocation status (FRAME_OK on success), unused if NULL. |
896 | * @param pzone Preferred zone |
901 | * @param pzone Preferred zone |
897 | * |
902 | * |
898 | * @return Allocated frame. |
903 | * @return Allocated frame. |
- | 904 | * |
|
899 | */ |
905 | */ |
900 | pfn_t frame_alloc_generic(__u8 order, int flags, int * status, int *pzone) |
906 | pfn_t frame_alloc_generic(__u8 order, int flags, int *status, int *pzone) |
901 | { |
907 | { |
902 | ipl_t ipl; |
908 | ipl_t ipl; |
903 | int freed; |
909 | int freed; |
904 | pfn_t v; |
910 | pfn_t v; |
905 | zone_t *zone; |
911 | zone_t *zone; |
906 | 912 | ||
907 | loop: |
913 | loop: |
908 | ipl = interrupts_disable(); |
914 | ipl = interrupts_disable(); |
- | 915 | ||
909 | /* |
916 | /* |
910 | * First, find suitable frame zone. |
917 | * First, find suitable frame zone. |
911 | */ |
918 | */ |
912 | zone = find_free_zone_lock(order,pzone); |
919 | zone = find_free_zone_lock(order, pzone); |
- | 920 | ||
913 | /* If no memory, reclaim some slab memory, |
921 | /* If no memory, reclaim some slab memory, |
914 | if it does not help, reclaim all */ |
922 | if it does not help, reclaim all */ |
915 | if (!zone && !(flags & FRAME_NO_RECLAIM)) { |
923 | if (!zone && !(flags & FRAME_NO_RECLAIM)) { |
916 | freed = slab_reclaim(0); |
924 | freed = slab_reclaim(0); |
917 | if (freed) |
925 | if (freed) |
918 | zone = find_free_zone_lock(order,pzone); |
926 | zone = find_free_zone_lock(order, pzone); |
919 | if (!zone) { |
927 | if (!zone) { |
920 | freed = slab_reclaim(SLAB_RECLAIM_ALL); |
928 | freed = slab_reclaim(SLAB_RECLAIM_ALL); |
921 | if (freed) |
929 | if (freed) |
922 | zone = find_free_zone_lock(order,pzone); |
930 | zone = find_free_zone_lock(order, pzone); |
923 | } |
931 | } |
924 | } |
932 | } |
925 | if (!zone) { |
933 | if (!zone) { |
926 | if (flags & FRAME_PANIC) |
934 | if (flags & FRAME_PANIC) |
927 | panic("Can't allocate frame.\n"); |
935 | panic("Can't allocate frame.\n"); |
Line 939... | Line 947... | ||
939 | } |
947 | } |
940 | 948 | ||
941 | panic("Sleep not implemented.\n"); |
949 | panic("Sleep not implemented.\n"); |
942 | goto loop; |
950 | goto loop; |
943 | } |
951 | } |
- | 952 | ||
944 | v = zone_frame_alloc(zone,order); |
953 | v = zone_frame_alloc(zone, order); |
945 | v += zone->base; |
954 | v += zone->base; |
946 | 955 | ||
947 | spinlock_unlock(&zone->lock); |
956 | spinlock_unlock(&zone->lock); |
948 | interrupts_restore(ipl); |
957 | interrupts_restore(ipl); |
949 | 958 |