Changeset bb68433 in mainline
- Timestamp:
- 2006-02-08T22:58:06Z (19 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 7e4e532
- Parents:
- 85dc2e7
- Files:
-
- 20 edited
Legend:
- Unmodified
- Added
- Removed
-
arch/amd64/src/pm.c
r85dc2e7 rbb68433 199 199 } 200 200 else { 201 tss_p = (struct tss *) malloc(sizeof(struct tss) );201 tss_p = (struct tss *) malloc(sizeof(struct tss),FRAME_ATOMIC); 202 202 if (!tss_p) 203 203 panic("could not allocate TSS\n"); -
arch/ia32/src/mm/frame.c
r85dc2e7 rbb68433 132 132 #endif 133 133 #endif 134 /* Merge all zones to 1 big zone */ 135 zone_merge_all(); 134 136 } 135 137 } -
arch/ia32/src/pm.c
r85dc2e7 rbb68433 191 191 } 192 192 else { 193 tss_p = (struct tss *) malloc(sizeof(struct tss) );193 tss_p = (struct tss *) malloc(sizeof(struct tss),FRAME_ATOMIC); 194 194 if (!tss_p) 195 195 panic("could not allocate TSS\n"); -
arch/ia32/src/smp/smp.c
r85dc2e7 rbb68433 139 139 * Prepare new GDT for CPU in question. 140 140 */ 141 if (!(gdt_new = (struct descriptor *) malloc(GDT_ITEMS*sizeof(struct descriptor) )))141 if (!(gdt_new = (struct descriptor *) malloc(GDT_ITEMS*sizeof(struct descriptor), FRAME_ATOMIC))) 142 142 panic("couldn't allocate memory for GDT\n"); 143 143 -
doc/mm
r85dc2e7 rbb68433 66 66 There is only one global page hash table in the system shared by all address 67 67 spaces. 68 69 2.1 General allocator 70 71 'malloc' function accepts flags as a second argument. The flags are directly 72 passed to the underlying frame_alloc function. 73 74 1) If the flags parameter contains FRAME_ATOMIC, the allocator will not sleep. 75 The allocator CAN return NULL, when memory is not directly available. 76 The caller MUST check if NULL was not returned 77 78 2) If the flags parameter does not contain FRAME_ATOMIC, the allocator 79 will never return NULL, but it CAN sleep indefinitely. The caller 80 does not have to check the return value. 81 82 3) The maximum size that can be allocated using malloc is 128K 83 84 Rules 1) and 2) apply to slab_alloc as well. Using SLAB allocator 85 to allocate too large values is not recommended. 86 -
genarch/src/acpi/matd.c
r85dc2e7 rbb68433 145 145 146 146 /* create madt apic entries index array */ 147 madt_entries_index = (struct madt_apic_header * *) malloc(madt_entries_index_cnt * sizeof(struct madt_apic_header * *)); 147 madt_entries_index = (struct madt_apic_header * *) malloc(madt_entries_index_cnt * sizeof(struct madt_apic_header * *), FRAME_ATOMIC); 148 if (!madt_entries_index) 149 panic("Memory allocation error."); 148 150 149 151 __u32 index = 0; -
generic/include/mm/buddy.h
r85dc2e7 rbb68433 46 46 /** Find parent of block that has given order */ 47 47 link_t *(* find_block)(buddy_system_t *, link_t *, __u8); 48 void (* print_id)(buddy_system_t *, link_t *); 48 49 }; 49 50 -
generic/include/mm/frame.h
r85dc2e7 rbb68433 54 54 55 55 /* Return true if the interlvals overlap */ 56 static inline int overlaps(__address s1,__address e1, __address s2, __address e2)56 static inline int overlaps(__address s1,__address sz1, __address s2, __address sz2) 57 57 { 58 __address e1 = s1+sz1; 59 __address e2 = s2+sz2; 58 60 if (s1 >= s2 && s1 < e2) 59 61 return 1; … … 96 98 extern void frame_free(__address addr); 97 99 98 extern void zone_create(pfn_t start, count_t count, pfn_t confframe, int flags); 99 100 extern int zone_create(pfn_t start, count_t count, pfn_t confframe, int flags); 100 101 void * frame_get_parent(pfn_t frame, int hint); 101 102 void frame_set_parent(pfn_t frame, void *data, int hint); 102 103 void frame_mark_unavailable(pfn_t start, count_t count); 103 __address zone_conf_size(pfn_t start, count_t count); 104 __address zone_conf_size(count_t count); 105 void zone_merge(int z1, int z2); 106 void zone_merge_all(void); 104 107 105 108 /* -
generic/include/mm/slab.h
r85dc2e7 rbb68433 126 126 127 127 /* Malloc support */ 128 extern void * kalloc(unsigned int size, int flags); 129 extern void kfree(void *obj); 130 #define malloc(x) kalloc(x, FRAME_ATOMIC) 131 #define free(x) kfree(x) 128 extern void * malloc(unsigned int size, int flags); 129 extern void free(void *obj); 132 130 #endif -
generic/src/adt/hash_table.c
r85dc2e7 rbb68433 52 52 ASSERT(max_keys > 0); 53 53 54 h->entry = malloc(m * sizeof(link_t *) );54 h->entry = malloc(m * sizeof(link_t *), 0); 55 55 if (!h->entry) { 56 56 panic("cannot allocate memory for hash table\n"); -
generic/src/cpu/cpu.c
r85dc2e7 rbb68433 54 54 if (config.cpu_active == 1) { 55 55 #endif /* CONFIG_SMP */ 56 cpus = (cpu_t *) malloc(sizeof(cpu_t) * config.cpu_count); 56 cpus = (cpu_t *) malloc(sizeof(cpu_t) * config.cpu_count, 57 FRAME_ATOMIC); 57 58 if (!cpus) 58 59 panic("malloc/cpus"); -
generic/src/lib/sort.c
r85dc2e7 rbb68433 42 42 * the pivot and temporary elements for generic quicksort algorithm. 43 43 * 44 * This function _can_ sleep 45 * 44 46 * @param data Pointer to data to be sorted. 45 47 * @param n Number of elements to be sorted. … … 56 58 57 59 if (e_size > EBUFSIZE) { 58 pivot = (void *) malloc(e_size); 59 tmp = (void *) malloc(e_size); 60 61 if (!tmp || !pivot) { 62 panic("Cannot allocate memory\n"); 63 } 60 pivot = (void *) malloc(e_size, 0); 61 tmp = (void *) malloc(e_size, 0); 64 62 } 65 63 … … 127 125 128 126 if (e_size > EBUFSIZE) { 129 slot = (void *) malloc(e_size); 130 131 if (!slot) { 132 panic("Cannot allocate memory\n"); 133 } 127 slot = (void *) malloc(e_size, 0); 134 128 } 135 129 -
generic/src/main/main.c
r85dc2e7 rbb68433 116 116 stackaddr = config.base + config.kernel_size; 117 117 /* Avoid placing kernel on top of init */ 118 if (overlaps(stackaddr, stackaddr+CONFIG_STACK_SIZE,119 config.init_addr, config.init_ addr+config.init_size)) {118 if (overlaps(stackaddr,CONFIG_STACK_SIZE, 119 config.init_addr, config.init_size)) { 120 120 121 121 stackaddr = ALIGN_UP(config.init_addr+config.init_size, -
generic/src/mm/as.c
r85dc2e7 rbb68433 79 79 as_t *as; 80 80 81 as = (as_t *) malloc(sizeof(as_t)); 82 if (as) { 83 list_initialize(&as->as_with_asid_link); 84 spinlock_initialize(&as->lock, "as_lock"); 85 list_initialize(&as->as_area_head); 86 87 if (flags & FLAG_AS_KERNEL) 88 as->asid = ASID_KERNEL; 89 else 90 as->asid = ASID_INVALID; 91 92 as->page_table = page_table_create(flags); 93 } 81 as = (as_t *) malloc(sizeof(as_t), 0); 82 83 list_initialize(&as->as_with_asid_link); 84 spinlock_initialize(&as->lock, "as_lock"); 85 list_initialize(&as->as_area_head); 86 87 if (flags & FLAG_AS_KERNEL) 88 as->asid = ASID_KERNEL; 89 else 90 as->asid = ASID_INVALID; 91 92 as->page_table = page_table_create(flags); 94 93 95 94 return as; … … 122 121 */ 123 122 124 a = (as_area_t *) malloc(sizeof(as_area_t)); 125 if (a) { 126 spinlock_initialize(&a->lock, "as_area_lock"); 127 128 link_initialize(&a->link); 129 a->type = type; 130 a->size = size; 131 a->base = base; 132 133 list_append(&a->link, &as->as_area_head); 134 } 123 a = (as_area_t *) malloc(sizeof(as_area_t), 0); 124 125 spinlock_initialize(&a->lock, "as_area_lock"); 126 127 link_initialize(&a->link); 128 a->type = type; 129 a->size = size; 130 a->base = base; 131 132 list_append(&a->link, &as->as_area_head); 135 133 136 134 spinlock_unlock(&as->lock); -
generic/src/mm/buddy.c
r85dc2e7 rbb68433 140 140 right = left; 141 141 left = tmp; 142 } 142 } 143 ASSERT(tmp == left); 143 144 b->op->mark_busy(b, left); 144 145 buddy_system_free(b, right); … … 291 292 } 292 293 293 printf("#%d\t%d\t%dK\t\t%dK\t\t%d\n", i, cnt, (cnt * (1 << i) * elem_size) >> 10, ((1 << i) * elem_size) >> 10, 1 << i); 294 294 printf("#%d\t%d\t%dK\t\t%dK\t\t%d\t", i, cnt, (cnt * (1 << i) * elem_size) >> 10, ((1 << i) * elem_size) >> 10, 1 << i); 295 if (!list_empty(&b->order[i])) { 296 for (cur = b->order[i].next; cur != &b->order[i]; cur = cur->next) { 297 b->op->print_id(b, cur); 298 printf(" "); 299 } 300 } 301 printf("\n"); 302 295 303 block_count += cnt; 296 304 elem_count += (1 << i) * cnt; -
generic/src/mm/frame.c
r85dc2e7 rbb68433 51 51 #include <align.h> 52 52 #include <mm/slab.h> 53 #include <bitops.h> 53 54 54 55 typedef struct { … … 122 123 /** 123 124 * Insert-sort zone into zones list 124 */ 125 static void zones_add_zone(zone_t *zone) 126 { 127 int i; 128 125 * 126 * @return zone number on success, -1 on error 127 */ 128 static int zones_add_zone(zone_t *newzone) 129 { 130 int i,j; 131 ipl_t ipl; 132 zone_t *z; 133 134 ipl = interrupts_disable(); 129 135 spinlock_lock(&zones.lock); 130 136 /* Try to merge */ 131 if (zone->flags & ZONE_JOIN) { 132 for (i=0; i < zones.count; i++) { 133 spinlock_lock(&zones.info[i]->lock); 134 135 /* Join forward, join backward */ 136 panic("Not implemented"); 137 138 spinlock_unlock(&zones.info[i]->lock); 137 if (zones.count+1 == ZONES_MAX) 138 panic("Maximum zone(%d) count exceeded.", ZONES_MAX); 139 140 for (i=0; i < zones.count; i++) { 141 /* Check for overflow */ 142 z = zones.info[zones.count]; 143 if (overlaps(newzone->base,newzone->count, 144 z->base, z->count)) { 145 printf("Zones overlap!\n"); 146 return -1; 139 147 } 140 spinlock_unlock(&zones.lock); 141 } else { 142 if (zones.count+1 == ZONES_MAX) 143 panic("Maximum zone(%d) count exceeded.", ZONES_MAX); 144 zones.info[zones.count++] = zone; 145 } 148 if (z->base < newzone->base) 149 break; 150 } 151 /* Move other zones up */ 152 for (j=i;j < zones.count;j++) 153 zones.info[j+1] = zones.info[j]; 154 155 zones.info[i] = newzone; 156 zones.count++; 157 146 158 spinlock_unlock(&zones.lock); 159 interrupts_restore(ipl); 160 161 return i; 147 162 } 148 163 … … 187 202 } 188 203 204 /** @return True if zone can allocate specified order */ 205 static int zone_can_alloc(zone_t *z, __u8 order) 206 { 207 return buddy_system_can_alloc(z->buddy_system, order); 208 } 209 189 210 /** 190 211 * Find AND LOCK zone that can allocate order frames … … 210 231 211 232 /* Check if the zone has 2^order frames area available */ 212 if ( buddy_system_can_alloc(z->buddy_system, order)) {233 if (zone_can_alloc(z, order)) { 213 234 spinlock_unlock(&zones.lock); 214 235 if (pzone) … … 253 274 } 254 275 255 276 static void zone_buddy_print_id(buddy_system_t *b, link_t *block) 277 { 278 frame_t * frame; 279 zone_t * zone; 280 index_t index; 281 282 frame = list_get_instance(block, frame_t, buddy_link); 283 zone = (zone_t *) b->data; 284 index = frame_index(zone, frame); 285 printf("%d", index); 286 } 256 287 257 288 /** Buddy system find_buddy implementation … … 319 350 */ 320 351 static link_t * zone_buddy_coalesce(buddy_system_t *b, link_t * block_1, 321 link_t * block_2) { 352 link_t * block_2) 353 { 322 354 frame_t *frame1, *frame2; 323 355 … … 361 393 static void zone_buddy_mark_busy(buddy_system_t *b, link_t * block) { 362 394 frame_t * frame; 395 363 396 frame = list_get_instance(block, frame_t, buddy_link); 364 397 frame->refcount = 1; … … 385 418 .mark_busy = zone_buddy_mark_busy, 386 419 .mark_available = zone_buddy_mark_available, 387 .find_block = zone_buddy_find_block 420 .find_block = zone_buddy_find_block, 421 .print_id = zone_buddy_print_id 388 422 }; 389 423 … … 394 428 * 395 429 * Assume zone is locked 430 * Panics, if allocation is impossible. 396 431 * 397 432 * @return Frame index in zone 398 433 */ 399 static pfn_t zone_frame_alloc(zone_t *zone,__u8 order , int flags, int *status)434 static pfn_t zone_frame_alloc(zone_t *zone,__u8 order) 400 435 { 401 436 pfn_t v; … … 459 494 460 495 frame = zone_get_frame(zone, frame_idx); 496 if (frame->refcount) 497 return; 461 498 link = buddy_system_alloc_block(zone->buddy_system, 462 499 &frame->buddy_link); … … 465 502 } 466 503 504 /** 505 * Join 2 zones 506 * 507 * Expect zone_t *z to point to space at least zone_conf_size large 508 * 509 * Assume z1 & z2 are locked 510 */ 511 512 static void _zone_merge(zone_t *z, zone_t *z1, zone_t *z2) 513 { 514 __u8 max_order; 515 int i, z2idx; 516 pfn_t frame_idx; 517 frame_t *frame; 518 519 ASSERT(!overlaps(z1->base,z1->count,z2->base,z2->count)); 520 ASSERT(z1->base < z2->base); 521 522 spinlock_initialize(&z->lock, "zone_lock"); 523 z->base = z1->base; 524 z->count = z2->base+z2->count - z1->base; 525 z->flags = z1->flags & z2->flags; 526 527 z->free_count = z1->free_count + z2->free_count; 528 z->busy_count = z1->busy_count + z2->busy_count; 529 530 max_order = fnzb(z->count); 531 532 z->buddy_system = (buddy_system_t *)&z[1]; 533 buddy_system_create(z->buddy_system, max_order, 534 &zone_buddy_system_operations, 535 (void *) z); 536 537 z->frames = (frame_t *)((void *)z->buddy_system+buddy_conf_size(max_order)); 538 for (i = 0; i < z->count; i++) { 539 /* This marks all frames busy */ 540 frame_initialize(&z->frames[i]); 541 } 542 /* Copy frames from both zones to preserve full frame orders, 543 * parents etc. Set all frames with refcount=0 to 1, because 544 * we add all free frames to buddy allocator later again, clear 545 * order to 0. 546 */ 547 for (i=0; i<z1->count; i++) 548 z->frames[i] = z1->frames[i]; 549 for (i=0; i < z2->count; i++) { 550 z2idx = i + (z2->base - z1->base); 551 z->frames[z2idx] = z2->frames[i]; 552 } 553 for (i=0; i < z->count; i++) { 554 if (!z->frames[i].refcount) { 555 z->frames[i].refcount = 1; 556 z->frames[i].buddy_order = 0; 557 } 558 } 559 /* Add free blocks from the 2 original zones */ 560 while (zone_can_alloc(z1, 0)) { 561 frame_idx = zone_frame_alloc(z1, 0); 562 frame = &z->frames[frame_idx]; 563 frame->refcount = 0; 564 buddy_system_free(z->buddy_system, &frame->buddy_link); 565 } 566 while (zone_can_alloc(z2, 0)) { 567 frame_idx = zone_frame_alloc(z2, 0); 568 frame = &z->frames[frame_idx + (z2->base-z1->base)]; 569 frame->refcount = 0; 570 buddy_system_free(z->buddy_system, &frame->buddy_link); 571 } 572 } 573 574 /** Return old configuration frames into the zone 575 * 576 * We have several cases 577 * - the conf. data is outside of zone -> exit, shall we call frame_free?? 578 * - the conf. data was created by zone_create -> free every frame 579 * - the conf. data was created by merge in frame_alloc -> free first frame 580 * (the difference is in order) 581 */ 582 static void return_config_frames(zone_t *newzone, zone_t *oldzone) 583 { 584 pfn_t pfn; 585 frame_t *frame; 586 count_t cframes; 587 int i; 588 589 pfn = ADDR2PFN((__address)KA2PA(oldzone)); 590 cframes = SIZE2FRAMES(zone_conf_size(oldzone->count)); 591 592 if (pfn < newzone->base || pfn >= newzone->base + newzone->count) 593 return; 594 595 frame = &newzone->frames[pfn - newzone->base]; 596 if (frame->buddy_order) { 597 /* Normally zone config data is hidden, show it again */ 598 newzone->busy_count += (1 << frame->buddy_order); 599 zone_frame_free(newzone, pfn - newzone->base); 600 return; 601 } 602 603 for (i=0; i < cframes; i++) { 604 newzone->busy_count++; 605 zone_frame_free(newzone, pfn+i-newzone->base); 606 } 607 } 608 609 /** Merge zones z1 and z2 610 * 611 * - the zones must be 2 zones with no zone existing in between, 612 * which means that z2 = z1+1 613 * 614 * - When you create a new zone, the frame allocator configuration does 615 * not to be 2^order size. Once the allocator is running it is no longer 616 * possible, merged configuration data occupies more space :-/ 617 */ 618 void zone_merge(int z1, int z2) 619 { 620 ipl_t ipl; 621 zone_t *zone1, *zone2, *newzone; 622 int cframes; 623 __u8 order; 624 int i; 625 pfn_t pfn; 626 627 ipl = interrupts_disable(); 628 spinlock_lock(&zones.lock); 629 630 if (z1 < 0 || z1 >= zones.count || z2 < 0 || z2 >= zones.count) 631 goto errout; 632 /* We can join only 2 zones with none existing inbetween */ 633 if (z2-z1 != 1) 634 goto errout; 635 636 zone1 = zones.info[z1]; 637 zone2 = zones.info[z2]; 638 spinlock_lock(&zone1->lock); 639 spinlock_lock(&zone2->lock); 640 641 cframes = SIZE2FRAMES(zone_conf_size(zone2->base+zone2->count-zone1->base)); 642 order = fnzb(cframes) + 1; 643 644 /* Allocate zonedata inside one of the zones */ 645 if (zone_can_alloc(zone1, order)) 646 pfn = zone1->base + zone_frame_alloc(zone1, order); 647 else if (zone_can_alloc(zone2, order)) 648 pfn = zone2->base + zone_frame_alloc(zone2, order); 649 else 650 goto errout2; 651 652 newzone = (zone_t *)PA2KA(PFN2ADDR(pfn)); 653 654 _zone_merge(newzone, zone1, zone2); 655 656 /* Subtract zone information from busy frames */ 657 newzone->busy_count -= (1 << order); 658 659 zones.info[z1] = newzone; 660 for (i=z2+1;i < zones.count;i++) 661 zones.info[i-1] = zones.info[i]; 662 zones.count--; 663 664 /* Free old zone information */ 665 return_config_frames(newzone, zone1); 666 return_config_frames(newzone, zone2); 667 errout2: 668 /* Nobody is allowed to enter to zone, so we are safe 669 * to touch the spinlocks last time */ 670 spinlock_unlock(&zone1->lock); 671 spinlock_unlock(&zone2->lock); 672 errout: 673 spinlock_unlock(&zones.lock); 674 interrupts_restore(ipl); 675 } 676 677 678 /** 679 * Merge all zones into one big zone 680 * 681 * It is reasonable to do this on systems whose bios reports parts in chunks, 682 * so that we could have 1 zone (it's faster). 683 */ 684 void zone_merge_all(void) 685 { 686 int count = zones.count; 687 688 while (zones.count > 1 && --count) { 689 zone_merge(0,1); 690 break; 691 } 692 } 693 467 694 /** Create frame zone 468 695 * … … 476 703 * @return Initialized zone. 477 704 */ 478 static zone_t * zone_construct(pfn_t start, count_t count, 479 zone_t *z, int flags) 705 static void zone_construct(pfn_t start, count_t count, zone_t *z, int flags) 480 706 { 481 707 int i; … … 492 718 * Compute order for buddy system, initialize 493 719 */ 494 for (max_order = 0; count >> max_order; max_order++) 495 ; 720 max_order = fnzb(count); 496 721 z->buddy_system = (buddy_system_t *)&z[1]; 497 722 … … 503 728 /* Check sizes */ 504 729 z->frames = (frame_t *)((void *)z->buddy_system+buddy_conf_size(max_order)); 505 506 730 for (i = 0; i<count; i++) { 507 731 frame_initialize(&z->frames[i]); 508 732 } 733 509 734 /* Stuffing frames */ 510 735 for (i = 0; i < count; i++) { … … 512 737 buddy_system_free(z->buddy_system, &z->frames[i].buddy_link); 513 738 } 514 return z;515 739 } 516 740 517 741 518 742 /** Compute configuration data size for zone */ 519 __address zone_conf_size( pfn_t start,count_t count)743 __address zone_conf_size(count_t count) 520 744 { 521 745 int size = sizeof(zone_t) + count*sizeof(frame_t); 522 746 int max_order; 523 747 524 for (max_order = 0; count >> max_order; max_order++) 525 ; 748 max_order = fnzb(count); 526 749 size += buddy_conf_size(max_order); 527 750 return size; 528 751 } 752 529 753 530 754 /** Create and add zone to system … … 535 759 * that the area is already marked BUSY and big enough 536 760 * to contain zone_conf_size() amount of data 537 */ 538 void zone_create(pfn_t start, count_t count, pfn_t confframe, int flags) 761 * 762 * @return Zone number or -1 on error 763 */ 764 int zone_create(pfn_t start, count_t count, pfn_t confframe, int flags) 539 765 { 540 766 zone_t *z; 541 __address addr ,endaddr;767 __address addr; 542 768 count_t confcount; 543 769 int i; 770 int znum; 544 771 545 772 /* Theoretically we could have here 0, practically make sure … … 551 778 * it does not span kernel & init 552 779 */ 553 confcount = SIZE2FRAMES(zone_conf_size( start,count));780 confcount = SIZE2FRAMES(zone_conf_size(count)); 554 781 if (confframe >= start && confframe < start+count) { 555 782 for (;confframe < start+count;confframe++) { 556 783 addr = PFN2ADDR(confframe); 557 endaddr = PFN2ADDR (confframe + confcount); 558 if (overlaps(addr, endaddr, KA2PA(config.base), 559 KA2PA(config.base+config.kernel_size))) 784 if (overlaps(addr, PFN2ADDR(confcount), 785 KA2PA(config.base),config.kernel_size)) 560 786 continue; 561 787 if (config.init_addr) 562 if (overlaps(addr, endaddr,788 if (overlaps(addr,PFN2ADDR(confcount), 563 789 KA2PA(config.init_addr), 564 KA2PA(config.init_addr+config.init_size)))790 config.init_size)) 565 791 continue; 566 792 break; … … 570 796 } 571 797 572 z = zone_construct(start, count, (zone_t *)PA2KA(PFN2ADDR(confframe)), flags); 573 zones_add_zone(z); 574 798 z = (zone_t *)PA2KA(PFN2ADDR(confframe)); 799 zone_construct(start, count, z, flags); 800 znum = zones_add_zone(z); 801 if (znum == -1) 802 return -1; 803 575 804 /* If confdata in zone, mark as unavailable */ 576 805 if (confframe >= start && confframe < start+count) … … 578 807 zone_mark_unavailable(z, i - z->base); 579 808 } 809 810 return znum; 580 811 } 581 812 … … 658 889 goto loop; 659 890 } 660 v = zone_frame_alloc(zone,order ,flags,status);891 v = zone_frame_alloc(zone,order); 661 892 v += zone->base; 662 893 … … 671 902 /** Free a frame. 672 903 * 673 * Find respective frame struct rue for supplied addr.904 * Find respective frame structure for supplied addr. 674 905 * Decrement frame reference count. 675 906 * If it drops to zero, move the frame structure to free list. … … 705 936 int prefzone = 0; 706 937 707 for (i=0; i <count; i++) {938 for (i=0; i < count; i++) { 708 939 zone = find_zone_and_lock(start+i,&prefzone); 709 940 if (!zone) /* PFN not found */ … … 748 979 ipl = interrupts_disable(); 749 980 spinlock_lock(&zones.lock); 750 printf(" Base address\tFree Frames\tBusy Frames\n");751 printf(" ------------\t-----------\t-----------\n");981 printf("# Base address\tFree Frames\tBusy Frames\n"); 982 printf(" ------------\t-----------\t-----------\n"); 752 983 for (i=0;i<zones.count;i++) { 753 984 zone = zones.info[i]; 754 985 spinlock_lock(&zone->lock); 755 printf("% L\t%d\t\t%d\n",PFN2ADDR(zone->base),986 printf("%d %L\t%d\t\t%d\n",i,PFN2ADDR(zone->base), 756 987 zone->free_count, zone->busy_count); 757 988 spinlock_unlock(&zone->lock); … … 763 994 /** Prints zone details 764 995 * 765 * @param base Zone base address 766 */ 767 void zone_print_one(int znum) {996 * @param base Zone base address OR zone number 997 */ 998 void zone_print_one(int num) { 768 999 zone_t *zone = NULL; 769 1000 ipl_t ipl; 1001 int i; 770 1002 771 1003 ipl = interrupts_disable(); 772 1004 spinlock_lock(&zones.lock); 773 774 if (znum >= zones.count || znum < 0) { 775 printf("Zone number out of bounds.\n"); 776 spinlock_unlock(&zones.lock); 777 interrupts_restore(ipl); 778 return; 779 } 780 781 zone = zones.info[znum]; 1005 1006 for (i=0;i < zones.count; i++) { 1007 if (i == num || zones.info[i]->base == ADDR2PFN(num)) { 1008 zone = zones.info[i]; 1009 break; 1010 } 1011 } 1012 if (!zone) { 1013 printf("Zone not found.\n"); 1014 goto out; 1015 } 782 1016 783 1017 spinlock_lock(&zone->lock); 784 printf("Memory zone information\n \n");1018 printf("Memory zone information\n"); 785 1019 printf("Zone base address: %P\n", PFN2ADDR(zone->base)); 786 1020 printf("Zone size: %d frames (%dK)\n", zone->count, ((zone->count) * FRAME_SIZE) >> 10); 787 1021 printf("Allocated space: %d frames (%dK)\n", zone->busy_count, (zone->busy_count * FRAME_SIZE) >> 10); 788 1022 printf("Available space: %d (%dK)\n", zone->free_count, (zone->free_count * FRAME_SIZE) >> 10); 789 790 printf("\nBuddy allocator structures:\n\n");791 1023 buddy_system_structure_print(zone->buddy_system, FRAME_SIZE); 792 1024 793 1025 spinlock_unlock(&zone->lock); 1026 out: 794 1027 spinlock_unlock(&zones.lock); 795 1028 interrupts_restore(ipl); -
generic/src/mm/slab.c
r85dc2e7 rbb68433 543 543 ASSERT(_slab_initialized >= 2); 544 544 545 cache->mag_cache = kalloc(sizeof(slab_mag_cache_t)*config.cpu_count,0);545 cache->mag_cache = malloc(sizeof(slab_mag_cache_t)*config.cpu_count,0); 546 546 for (i=0; i < config.cpu_count; i++) { 547 547 memsetb((__address)&cache->mag_cache[i], … … 706 706 707 707 if (!(cache->flags & SLAB_CACHE_NOMAGAZINE)) 708 kfree(cache->mag_cache);708 free(cache->mag_cache); 709 709 slab_free(&slab_cache_cache, cache); 710 710 } … … 872 872 /**************************************/ 873 873 /* kalloc/kfree functions */ 874 void * kalloc(unsigned int size, int flags)874 void * malloc(unsigned int size, int flags) 875 875 { 876 876 int idx; … … 888 888 889 889 890 void kfree(void *obj)890 void free(void *obj) 891 891 { 892 892 slab_t *slab; -
generic/src/proc/task.c
r85dc2e7 rbb68433 65 65 task_t *ta; 66 66 67 ta = (task_t *) malloc(sizeof(task_t) );68 if (ta) { 69 70 71 72 73 74 75 76 77 78 79 } 67 ta = (task_t *) malloc(sizeof(task_t), 0); 68 69 spinlock_initialize(&ta->lock, "task_ta_lock"); 70 list_initialize(&ta->th_head); 71 list_initialize(&ta->tasks_link); 72 ta->as = as; 73 74 ipl = interrupts_disable(); 75 spinlock_lock(&tasks_lock); 76 list_append(&ta->tasks_link, &tasks_head); 77 spinlock_unlock(&tasks_lock); 78 interrupts_restore(ipl); 79 80 80 return ta; 81 81 } -
generic/src/proc/thread.c
r85dc2e7 rbb68433 227 227 { 228 228 thread_t *t; 229 229 ipl_t ipl; 230 230 231 t = (thread_t *) slab_alloc(thread_slab, 0); 231 if (t) { 232 ipl_t ipl; 233 234 /* Not needed, but good for debugging */ 235 memsetb((__address)t->kstack, THREAD_STACK_SIZE, 0); 236 237 ipl = interrupts_disable(); 238 spinlock_lock(&tidlock); 239 t->tid = ++last_tid; 240 spinlock_unlock(&tidlock); 241 interrupts_restore(ipl); 232 233 /* Not needed, but good for debugging */ 234 memsetb((__address)t->kstack, THREAD_STACK_SIZE, 0); 235 236 ipl = interrupts_disable(); 237 spinlock_lock(&tidlock); 238 t->tid = ++last_tid; 239 spinlock_unlock(&tidlock); 240 interrupts_restore(ipl); 241 242 context_save(&t->saved_context); 243 context_set(&t->saved_context, FADDR(cushion), (__address) t->kstack, THREAD_STACK_SIZE); 244 245 the_initialize((the_t *) t->kstack); 246 247 ipl = interrupts_disable(); 248 t->saved_context.ipl = interrupts_read(); 249 interrupts_restore(ipl); 250 251 t->thread_code = func; 252 t->thread_arg = arg; 253 t->ticks = -1; 254 t->priority = -1; /* start in rq[0] */ 255 t->cpu = NULL; 256 t->flags = 0; 257 t->state = Entering; 258 t->call_me = NULL; 259 t->call_me_with = NULL; 260 261 timeout_initialize(&t->sleep_timeout); 262 t->sleep_queue = NULL; 263 t->timeout_pending = 0; 264 265 t->rwlock_holder_type = RWLOCK_NONE; 242 266 243 context_save(&t->saved_context); 244 context_set(&t->saved_context, FADDR(cushion), (__address) t->kstack, THREAD_STACK_SIZE); 245 246 the_initialize((the_t *) t->kstack); 247 248 ipl = interrupts_disable(); 249 t->saved_context.ipl = interrupts_read(); 250 interrupts_restore(ipl); 251 252 t->thread_code = func; 253 t->thread_arg = arg; 254 t->ticks = -1; 255 t->priority = -1; /* start in rq[0] */ 256 t->cpu = NULL; 257 t->flags = 0; 258 t->state = Entering; 259 t->call_me = NULL; 260 t->call_me_with = NULL; 261 262 timeout_initialize(&t->sleep_timeout); 263 t->sleep_queue = NULL; 264 t->timeout_pending = 0; 265 266 t->rwlock_holder_type = RWLOCK_NONE; 267 268 t->task = task; 269 270 t->fpu_context_exists=0; 271 t->fpu_context_engaged=0; 272 273 /* 274 * Register this thread in the system-wide list. 275 */ 276 ipl = interrupts_disable(); 277 spinlock_lock(&threads_lock); 278 list_append(&t->threads_link, &threads_head); 279 spinlock_unlock(&threads_lock); 280 281 /* 282 * Attach to the containing task. 283 */ 284 spinlock_lock(&task->lock); 285 list_append(&t->th_link, &task->th_head); 286 spinlock_unlock(&task->lock); 287 288 interrupts_restore(ipl); 289 } 267 t->task = task; 268 269 t->fpu_context_exists=0; 270 t->fpu_context_engaged=0; 271 272 /* 273 * Register this thread in the system-wide list. 274 */ 275 ipl = interrupts_disable(); 276 spinlock_lock(&threads_lock); 277 list_append(&t->threads_link, &threads_head); 278 spinlock_unlock(&threads_lock); 279 280 /* 281 * Attach to the containing task. 282 */ 283 spinlock_lock(&task->lock); 284 list_append(&t->th_link, &task->th_head); 285 spinlock_unlock(&task->lock); 286 287 interrupts_restore(ipl); 290 288 291 289 return t; -
test/mm/falloc2/test.c
r85dc2e7 rbb68433 56 56 index_t k; 57 57 58 __address * frames = (__address *) malloc(MAX_FRAMES * sizeof(__address) );58 __address * frames = (__address *) malloc(MAX_FRAMES * sizeof(__address), FRAME_ATOMIC); 59 59 ASSERT(frames != NULL); 60 60
Note:
See TracChangeset
for help on using the changeset viewer.