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