Changes in kernel/generic/src/mm/frame.c [da1bafb:05411e8] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/mm/frame.c
rda1bafb r05411e8 66 66 * available. 67 67 */ 68 staticmutex_t mem_avail_mtx;69 staticcondvar_t mem_avail_cv;70 s tatic size_t mem_avail_req = 0; /**< Number of frames requested. */71 s tatic size_t mem_avail_gen = 0; /**< Generation counter. */68 mutex_t mem_avail_mtx; 69 condvar_t mem_avail_cv; 70 size_t mem_avail_req = 0; /**< Number of frames requested. */ 71 size_t mem_avail_gen = 0; /**< Generation counter. */ 72 72 73 73 /********************/ … … 171 171 return total; 172 172 } 173 #endif /* CONFIG_DEBUG */173 #endif 174 174 175 175 /** Find a zone with a given frames. … … 199 199 if (i >= zones.count) 200 200 i = 0; 201 202 201 } while (i != hint); 203 202 … … 243 242 if (i >= zones.count) 244 243 i = 0; 245 246 244 } while (i != hint); 247 245 … … 298 296 index = (frame_index(zone, frame)) + 299 297 (1 << frame->buddy_order); 300 } else { 298 } else { /* is_right */ 301 299 index = (frame_index(zone, frame)) - 302 300 (1 << frame->buddy_order); … … 675 673 bool zone_merge(size_t z1, size_t z2) 676 674 { 677 irq_spinlock_lock(&zones.lock, true); 675 ipl_t ipl = interrupts_disable(); 676 spinlock_lock(&zones.lock); 678 677 679 678 bool ret = true; … … 745 744 746 745 errout: 747 irq_spinlock_unlock(&zones.lock, true); 746 spinlock_unlock(&zones.lock); 747 interrupts_restore(ipl); 748 748 749 749 return ret; … … 777 777 * 778 778 */ 779 static void zone_construct(zone_t *zone, buddy_system_t *buddy, pfn_t start, 780 size_t count, zone_flags_t flags) 779 static void zone_construct(zone_t *zone, buddy_system_t *buddy, pfn_t start, size_t count, zone_flags_t flags) 781 780 { 782 781 zone->base = start; … … 842 841 * 843 842 */ 844 size_t zone_create(pfn_t start, size_t count, pfn_t confframe, 845 zone_flags_t flags) 846 { 847 irq_spinlock_lock(&zones.lock, true);843 size_t zone_create(pfn_t start, size_t count, pfn_t confframe, zone_flags_t flags) 844 { 845 ipl_t ipl = interrupts_disable(); 846 spinlock_lock(&zones.lock); 848 847 849 848 if (zone_flags_available(flags)) { /* Create available zone */ … … 890 889 size_t znum = zones_insert_zone(start, count); 891 890 if (znum == (size_t) -1) { 892 irq_spinlock_unlock(&zones.lock, true); 891 spinlock_unlock(&zones.lock); 892 interrupts_restore(ipl); 893 893 return (size_t) -1; 894 894 } … … 905 905 } 906 906 907 irq_spinlock_unlock(&zones.lock, true); 907 spinlock_unlock(&zones.lock); 908 interrupts_restore(ipl); 908 909 909 910 return znum; … … 913 914 size_t znum = zones_insert_zone(start, count); 914 915 if (znum == (size_t) -1) { 915 irq_spinlock_unlock(&zones.lock, true); 916 spinlock_unlock(&zones.lock); 917 interrupts_restore(ipl); 916 918 return (size_t) -1; 917 919 } 918 920 zone_construct(&zones.info[znum], NULL, start, count, flags); 919 921 920 irq_spinlock_unlock(&zones.lock, true); 922 spinlock_unlock(&zones.lock); 923 interrupts_restore(ipl); 921 924 922 925 return znum; … … 930 933 void frame_set_parent(pfn_t pfn, void *data, size_t hint) 931 934 { 932 irq_spinlock_lock(&zones.lock, true); 935 ipl_t ipl = interrupts_disable(); 936 spinlock_lock(&zones.lock); 933 937 934 938 size_t znum = find_zone(pfn, 1, hint); … … 939 943 pfn - zones.info[znum].base)->parent = data; 940 944 941 irq_spinlock_unlock(&zones.lock, true); 945 spinlock_unlock(&zones.lock); 946 interrupts_restore(ipl); 942 947 } 943 948 944 949 void *frame_get_parent(pfn_t pfn, size_t hint) 945 950 { 946 irq_spinlock_lock(&zones.lock, true); 951 ipl_t ipl = interrupts_disable(); 952 spinlock_lock(&zones.lock); 947 953 948 954 size_t znum = find_zone(pfn, 1, hint); … … 953 959 pfn - zones.info[znum].base)->parent; 954 960 955 irq_spinlock_unlock(&zones.lock, true); 961 spinlock_unlock(&zones.lock); 962 interrupts_restore(ipl); 956 963 957 964 return res; … … 970 977 { 971 978 size_t size = ((size_t) 1) << order; 979 ipl_t ipl; 972 980 size_t hint = pzone ? (*pzone) : 0; 973 981 974 982 loop: 975 irq_spinlock_lock(&zones.lock, true); 983 ipl = interrupts_disable(); 984 spinlock_lock(&zones.lock); 976 985 977 986 /* … … 984 993 if it does not help, reclaim all */ 985 994 if ((znum == (size_t) -1) && (!(flags & FRAME_NO_RECLAIM))) { 986 irq_spinlock_unlock(&zones.lock, true); 995 spinlock_unlock(&zones.lock); 996 interrupts_restore(ipl); 997 987 998 size_t freed = slab_reclaim(0); 988 irq_spinlock_lock(&zones.lock, true); 999 1000 ipl = interrupts_disable(); 1001 spinlock_lock(&zones.lock); 989 1002 990 1003 if (freed > 0) … … 993 1006 994 1007 if (znum == (size_t) -1) { 995 irq_spinlock_unlock(&zones.lock, true); 1008 spinlock_unlock(&zones.lock); 1009 interrupts_restore(ipl); 1010 996 1011 freed = slab_reclaim(SLAB_RECLAIM_ALL); 997 irq_spinlock_lock(&zones.lock, true); 1012 1013 ipl = interrupts_disable(); 1014 spinlock_lock(&zones.lock); 998 1015 999 1016 if (freed > 0) … … 1005 1022 if (znum == (size_t) -1) { 1006 1023 if (flags & FRAME_ATOMIC) { 1007 irq_spinlock_unlock(&zones.lock, true); 1024 spinlock_unlock(&zones.lock); 1025 interrupts_restore(ipl); 1008 1026 return NULL; 1009 1027 } … … 1013 1031 #endif 1014 1032 1015 irq_spinlock_unlock(&zones.lock, true); 1016 1033 spinlock_unlock(&zones.lock); 1034 interrupts_restore(ipl); 1035 1017 1036 if (!THREAD) 1018 1037 panic("Cannot wait for memory to become available."); … … 1050 1069 + zones.info[znum].base; 1051 1070 1052 irq_spinlock_unlock(&zones.lock, true); 1071 spinlock_unlock(&zones.lock); 1072 interrupts_restore(ipl); 1053 1073 1054 1074 if (pzone) … … 1072 1092 void frame_free(uintptr_t frame) 1073 1093 { 1074 irq_spinlock_lock(&zones.lock, true); 1094 ipl_t ipl = interrupts_disable(); 1095 spinlock_lock(&zones.lock); 1075 1096 1076 1097 /* … … 1084 1105 zone_frame_free(&zones.info[znum], pfn - zones.info[znum].base); 1085 1106 1086 irq_spinlock_unlock(&zones.lock, true); 1107 spinlock_unlock(&zones.lock); 1108 interrupts_restore(ipl); 1087 1109 1088 1110 /* … … 1110 1132 void frame_reference_add(pfn_t pfn) 1111 1133 { 1112 irq_spinlock_lock(&zones.lock, true); 1134 ipl_t ipl = interrupts_disable(); 1135 spinlock_lock(&zones.lock); 1113 1136 1114 1137 /* … … 1121 1144 zones.info[znum].frames[pfn - zones.info[znum].base].refcount++; 1122 1145 1123 irq_spinlock_unlock(&zones.lock, true); 1124 } 1125 1126 /** Mark given range unavailable in frame zones. 1127 * 1128 */ 1146 spinlock_unlock(&zones.lock); 1147 interrupts_restore(ipl); 1148 } 1149 1150 /** Mark given range unavailable in frame zones. */ 1129 1151 void frame_mark_unavailable(pfn_t start, size_t count) 1130 1152 { 1131 irq_spinlock_lock(&zones.lock, true); 1153 ipl_t ipl = interrupts_disable(); 1154 spinlock_lock(&zones.lock); 1132 1155 1133 1156 size_t i; … … 1141 1164 } 1142 1165 1143 irq_spinlock_unlock(&zones.lock, true); 1144 } 1145 1146 /** Initialize physical memory management. 1147 * 1148 */ 1166 spinlock_unlock(&zones.lock); 1167 interrupts_restore(ipl); 1168 } 1169 1170 /** Initialize physical memory management. */ 1149 1171 void frame_init(void) 1150 1172 { 1151 1173 if (config.cpu_active == 1) { 1152 1174 zones.count = 0; 1153 irq_spinlock_initialize(&zones.lock, "frame.zones.lock");1175 spinlock_initialize(&zones.lock, "zones.lock"); 1154 1176 mutex_initialize(&mem_avail_mtx, MUTEX_ACTIVE); 1155 1177 condvar_initialize(&mem_avail_cv); … … 1182 1204 } 1183 1205 1184 /** Return total size of all zones. 1185 * 1186 */ 1206 /** Return total size of all zones. */ 1187 1207 uint64_t zones_total_size(void) 1188 1208 { 1189 irq_spinlock_lock(&zones.lock, true); 1209 ipl_t ipl = interrupts_disable(); 1210 spinlock_lock(&zones.lock); 1190 1211 1191 1212 uint64_t total = 0; … … 1194 1215 total += (uint64_t) FRAMES2SIZE(zones.info[i].count); 1195 1216 1196 irq_spinlock_unlock(&zones.lock, true); 1217 spinlock_unlock(&zones.lock); 1218 interrupts_restore(ipl); 1197 1219 1198 1220 return total; … … 1207 1229 ASSERT(free != NULL); 1208 1230 1209 irq_spinlock_lock(&zones.lock, true); 1231 ipl_t ipl = interrupts_disable(); 1232 spinlock_lock(&zones.lock); 1210 1233 1211 1234 *total = 0; … … 1225 1248 } 1226 1249 1227 irq_spinlock_unlock(&zones.lock, true); 1228 } 1229 1230 /** Prints list of zones. 1231 * 1232 */ 1250 spinlock_unlock(&zones.lock); 1251 interrupts_restore(ipl); 1252 } 1253 1254 /** Prints list of zones. */ 1233 1255 void zones_print_list(void) 1234 1256 { … … 1256 1278 size_t i; 1257 1279 for (i = 0;; i++) { 1258 irq_spinlock_lock(&zones.lock, true); 1280 ipl_t ipl = interrupts_disable(); 1281 spinlock_lock(&zones.lock); 1259 1282 1260 1283 if (i >= zones.count) { 1261 irq_spinlock_unlock(&zones.lock, true); 1284 spinlock_unlock(&zones.lock); 1285 interrupts_restore(ipl); 1262 1286 break; 1263 1287 } … … 1269 1293 size_t busy_count = zones.info[i].busy_count; 1270 1294 1271 irq_spinlock_unlock(&zones.lock, true); 1295 spinlock_unlock(&zones.lock); 1296 interrupts_restore(ipl); 1272 1297 1273 1298 bool available = zone_flags_available(flags); … … 1303 1328 void zone_print_one(size_t num) 1304 1329 { 1305 irq_spinlock_lock(&zones.lock, true); 1330 ipl_t ipl = interrupts_disable(); 1331 spinlock_lock(&zones.lock); 1306 1332 size_t znum = (size_t) -1; 1307 1333 … … 1315 1341 1316 1342 if (znum == (size_t) -1) { 1317 irq_spinlock_unlock(&zones.lock, true); 1343 spinlock_unlock(&zones.lock); 1344 interrupts_restore(ipl); 1318 1345 printf("Zone not found.\n"); 1319 1346 return; … … 1326 1353 size_t busy_count = zones.info[i].busy_count; 1327 1354 1328 irq_spinlock_unlock(&zones.lock, true); 1355 spinlock_unlock(&zones.lock); 1356 interrupts_restore(ipl); 1329 1357 1330 1358 bool available = zone_flags_available(flags);
Note:
See TracChangeset
for help on using the changeset viewer.