Changeset 5df1963 in mainline
- Timestamp:
- 2013-09-10T21:47:25Z (11 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0511549
- Parents:
- a501e22c
- Location:
- kernel
- Files:
-
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/src/mm/as_pt.c
ra501e22c r5df1963 113 113 void ptl0_destroy(pte_t *page_table) 114 114 { 115 frame_free((uintptr_t) page_table );115 frame_free((uintptr_t) page_table, PTL0_FRAMES); 116 116 } 117 117 -
kernel/genarch/src/mm/page_pt.c
ra501e22c r5df1963 219 219 memsetb(&ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0); 220 220 #endif 221 frame_free(KA2PA((uintptr_t) ptl3) );221 frame_free(KA2PA((uintptr_t) ptl3), PTL3_FRAMES); 222 222 } else { 223 223 /* … … 253 253 memsetb(&ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0); 254 254 #endif 255 frame_free(KA2PA((uintptr_t) ptl2) );255 frame_free(KA2PA((uintptr_t) ptl2), PTL2_FRAMES); 256 256 } else { 257 257 /* … … 284 284 285 285 memsetb(&ptl0[PTL0_INDEX(page)], sizeof(pte_t), 0); 286 frame_free(KA2PA((uintptr_t) ptl1) );286 frame_free(KA2PA((uintptr_t) ptl1), PTL1_FRAMES); 287 287 } 288 288 #endif /* PTL1_ENTRIES != 0 */ -
kernel/generic/include/mm/frame.h
ra501e22c r5df1963 134 134 extern uintptr_t frame_alloc(size_t, frame_flags_t, uintptr_t); 135 135 extern uintptr_t frame_alloc_noreserve(size_t, frame_flags_t, uintptr_t); 136 extern void frame_free_generic(uintptr_t, frame_flags_t);137 extern void frame_free(uintptr_t );138 extern void frame_free_noreserve(uintptr_t );136 extern void frame_free_generic(uintptr_t, size_t, frame_flags_t); 137 extern void frame_free(uintptr_t, size_t); 138 extern void frame_free_noreserve(uintptr_t, size_t); 139 139 extern void frame_reference_add(pfn_t); 140 140 extern size_t frame_total_free_get(void); -
kernel/generic/src/ddi/ddi.c
ra501e22c r5df1963 339 339 if (!as_area_create(TASK->as, map_flags, size, 340 340 AS_AREA_ATTR_NONE, &phys_backend, &backend_data, virt, bound)) { 341 frame_free_noreserve(*phys );341 frame_free_noreserve(*phys, frames); 342 342 return ENOMEM; 343 343 } -
kernel/generic/src/mm/as.c
ra501e22c r5df1963 907 907 908 908 for (i = 0; i < node->keys; i++) 909 frame_free((uintptr_t) node->value[i] );909 frame_free((uintptr_t) node->value[i], 1); 910 910 } 911 911 -
kernel/generic/src/mm/backend_anon.c
ra501e22c r5df1963 294 294 * the normal unreserving frame_free(). 295 295 */ 296 frame_free(frame );296 frame_free(frame, 1); 297 297 } else { 298 298 /* … … 301 301 * manipulate the reserve or it would be given back twice. 302 302 */ 303 frame_free_noreserve(frame );303 frame_free_noreserve(frame, 1); 304 304 } 305 305 } -
kernel/generic/src/mm/backend_elf.c
ra501e22c r5df1963 429 429 * data. 430 430 */ 431 frame_free_noreserve(frame );431 frame_free_noreserve(frame, 1); 432 432 } 433 433 } else { … … 437 437 * anonymous). In any case, a frame needs to be freed. 438 438 */ 439 frame_free_noreserve(frame );439 frame_free_noreserve(frame, 1); 440 440 } 441 441 } -
kernel/generic/src/mm/frame.c
ra501e22c r5df1963 348 348 349 349 frame_t *frame = zone_get_frame(zone, index); 350 size_t size = 0;351 350 352 351 ASSERT(frame->refcount > 0); … … 359 358 zone->busy_count--; 360 359 361 size = FRAME_SIZE;362 } 363 364 return size;360 return 1; 361 } 362 363 return 0; 365 364 } 366 365 … … 891 890 } 892 891 893 /** Free a frame. 894 * 895 * Find respective frame structure for supplied physical frame address. 896 * Decrement frame reference count. If it drops to zero, move the frame 897 * structure to free list. 898 * 899 * @param frame Physical Address of of the frame to be freed. 892 /** Free frames of physical memory. 893 * 894 * Find respective frame structures for supplied physical frames. 895 * Decrement each frame reference count. If it drops to zero, mark 896 * the frames as available. 897 * 898 * @param start Physical Address of the first frame to be freed. 899 * @param count Number of frames to free. 900 900 * @param flags Flags to control memory reservation. 901 901 * 902 902 */ 903 void frame_free_generic(uintptr_t frame, frame_flags_t flags) 904 { 903 void frame_free_generic(uintptr_t start, size_t count, frame_flags_t flags) 904 { 905 size_t freed = 0; 906 905 907 irq_spinlock_lock(&zones.lock, true); 906 908 907 /* 908 * First, find host frame zone for addr. 909 */ 910 pfn_t pfn = ADDR2PFN(frame); 911 size_t znum = find_zone(pfn, 1, 0); 912 913 ASSERT(znum != (size_t) -1); 914 915 size_t size = 916 zone_frame_free(&zones.info[znum], pfn - zones.info[znum].base); 909 for (size_t i = 0; i < count; i++) { 910 /* 911 * First, find host frame zone for addr. 912 */ 913 pfn_t pfn = ADDR2PFN(start) + i; 914 size_t znum = find_zone(pfn, 1, 0); 915 916 ASSERT(znum != (size_t) -1); 917 918 freed += zone_frame_free(&zones.info[znum], 919 pfn - zones.info[znum].base); 920 } 917 921 918 922 irq_spinlock_unlock(&zones.lock, true); … … 920 924 /* 921 925 * Signal that some memory has been freed. 922 */ 923 924 925 /* 926 * Since the mem_avail_mtx is an active mutex, we need to disable interrupts 927 * to prevent deadlock with TLB shootdown. 926 * Since the mem_avail_mtx is an active mutex, 927 * we need to disable interruptsto prevent deadlock 928 * with TLB shootdown. 928 929 */ 929 930 … … 932 933 933 934 if (mem_avail_req > 0) 934 mem_avail_req -= min(mem_avail_req, size);935 mem_avail_req -= min(mem_avail_req, freed); 935 936 936 937 if (mem_avail_req == 0) { … … 943 944 944 945 if (!(flags & FRAME_NO_RESERVE)) 945 reserve_free( size);946 } 947 948 void frame_free(uintptr_t frame )949 { 950 frame_free_generic(frame, 0);951 } 952 953 void frame_free_noreserve(uintptr_t frame )954 { 955 frame_free_generic(frame, FRAME_NO_RESERVE);946 reserve_free(freed); 947 } 948 949 void frame_free(uintptr_t frame, size_t count) 950 { 951 frame_free_generic(frame, count, 0); 952 } 953 954 void frame_free_noreserve(uintptr_t frame, size_t count) 955 { 956 frame_free_generic(frame, count, FRAME_NO_RESERVE); 956 957 } 957 958 -
kernel/generic/src/mm/slab.c
ra501e22c r5df1963 193 193 slab = slab_alloc(slab_extern_cache, flags); 194 194 if (!slab) { 195 frame_free(KA2PA(data) );195 frame_free(KA2PA(data), cache->frames); 196 196 return NULL; 197 197 } … … 225 225 NO_TRACE static size_t slab_space_free(slab_cache_t *cache, slab_t *slab) 226 226 { 227 frame_free(KA2PA(slab->start) );227 frame_free(KA2PA(slab->start), slab->cache->frames); 228 228 if (!(cache->flags & SLAB_CACHE_SLINSIDE)) 229 229 slab_free(slab_extern_cache, slab); -
kernel/generic/src/proc/thread.c
ra501e22c r5df1963 217 217 thr_destructor_arch(thread); 218 218 219 frame_free(KA2PA(thread->kstack) );219 frame_free(KA2PA(thread->kstack), STACK_FRAMES); 220 220 221 221 #ifdef CONFIG_FPU -
kernel/test/mm/falloc1.c
ra501e22c r5df1963 84 84 85 85 for (unsigned int i = 0; i < allocated; i++) 86 frame_free(KA2PA(frames[i]) );86 frame_free(KA2PA(frames[i]), count); 87 87 88 88 TPRINTF("done.\n"); -
kernel/test/mm/falloc2.c
ra501e22c r5df1963 100 100 } 101 101 } 102 frame_free(KA2PA(frames[i]) );102 frame_free(KA2PA(frames[i]), count); 103 103 } 104 104 -
kernel/test/mm/mapping1.c
ra501e22c r5df1963 65 65 km_unmap(page0, PAGE_SIZE); 66 66 km_unmap(page1, PAGE_SIZE); 67 frame_free(frame );67 frame_free(frame, 1); 68 68 return "Criss-cross read does not match the value written."; 69 69 } … … 80 80 km_unmap(page0, PAGE_SIZE); 81 81 km_unmap(page1, PAGE_SIZE); 82 frame_free(frame );82 frame_free(frame, 1); 83 83 return "Criss-cross read does not match the value written."; 84 84 } … … 87 87 km_unmap(page0, PAGE_SIZE); 88 88 km_unmap(page1, PAGE_SIZE); 89 frame_free(frame );89 frame_free(frame, 1); 90 90 91 91 return NULL;
Note:
See TracChangeset
for help on using the changeset viewer.