Changeset 5df1963 in mainline for kernel/generic/src/mm
- Timestamp:
- 2013-09-10T21:47:25Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0511549
- Parents:
- a501e22c
- Location:
- kernel/generic/src/mm
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
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);
Note:
See TracChangeset
for help on using the changeset viewer.