Rev 1851 | Rev 1890 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1851 | Rev 1889 | ||
---|---|---|---|
Line 357... | Line 357... | ||
357 | */ |
357 | */ |
358 | 358 | ||
359 | cond = false; /* we are almost done */ |
359 | cond = false; /* we are almost done */ |
360 | i = (start_free - b) >> PAGE_WIDTH; |
360 | i = (start_free - b) >> PAGE_WIDTH; |
361 | if (!used_space_remove(area, start_free, c - i)) |
361 | if (!used_space_remove(area, start_free, c - i)) |
362 | panic("Could not remove used space."); |
362 | panic("Could not remove used space.\n"); |
363 | } else { |
363 | } else { |
364 | /* |
364 | /* |
365 | * The interval of used space can be completely removed. |
365 | * The interval of used space can be completely removed. |
366 | */ |
366 | */ |
367 | if (!used_space_remove(area, b, c)) |
367 | if (!used_space_remove(area, b, c)) |
Line 387... | Line 387... | ||
387 | /* |
387 | /* |
388 | * Finish TLB shootdown sequence. |
388 | * Finish TLB shootdown sequence. |
389 | */ |
389 | */ |
390 | tlb_invalidate_pages(AS->asid, area->base + pages*PAGE_SIZE, area->pages - pages); |
390 | tlb_invalidate_pages(AS->asid, area->base + pages*PAGE_SIZE, area->pages - pages); |
391 | tlb_shootdown_finalize(); |
391 | tlb_shootdown_finalize(); |
- | 392 | ||
- | 393 | /* |
|
- | 394 | * Invalidate software translation caches (e.g. TSB on sparc64). |
|
- | 395 | */ |
|
- | 396 | as_invalidate_translation_cache(as, area->base + pages*PAGE_SIZE, area->pages - pages); |
|
392 | } else { |
397 | } else { |
393 | /* |
398 | /* |
394 | * Growing the area. |
399 | * Growing the area. |
395 | * Check for overlaps with other address space areas. |
400 | * Check for overlaps with other address space areas. |
396 | */ |
401 | */ |
Line 438... | Line 443... | ||
438 | base = area->base; |
443 | base = area->base; |
439 | 444 | ||
440 | /* |
445 | /* |
441 | * Start TLB shootdown sequence. |
446 | * Start TLB shootdown sequence. |
442 | */ |
447 | */ |
443 | tlb_shootdown_start(TLB_INVL_PAGES, AS->asid, area->base, area->pages); |
448 | tlb_shootdown_start(TLB_INVL_PAGES, as->asid, area->base, area->pages); |
444 | 449 | ||
445 | /* |
450 | /* |
446 | * Visit only the pages mapped by used_space B+tree. |
451 | * Visit only the pages mapped by used_space B+tree. |
447 | */ |
452 | */ |
448 | for (cur = area->used_space.leaf_head.next; cur != &area->used_space.leaf_head; cur = cur->next) { |
453 | for (cur = area->used_space.leaf_head.next; cur != &area->used_space.leaf_head; cur = cur->next) { |
Line 461... | Line 466... | ||
461 | ASSERT(pte && PTE_VALID(pte) && PTE_PRESENT(pte)); |
466 | ASSERT(pte && PTE_VALID(pte) && PTE_PRESENT(pte)); |
462 | if (area->backend && area->backend->frame_free) { |
467 | if (area->backend && area->backend->frame_free) { |
463 | area->backend->frame_free(area, |
468 | area->backend->frame_free(area, |
464 | b + j*PAGE_SIZE, PTE_GET_FRAME(pte)); |
469 | b + j*PAGE_SIZE, PTE_GET_FRAME(pte)); |
465 | } |
470 | } |
466 | page_mapping_remove(as, b + j*PAGE_SIZE); |
471 | page_mapping_remove(as, b + j*PAGE_SIZE); |
467 | page_table_unlock(as, false); |
472 | page_table_unlock(as, false); |
468 | } |
473 | } |
469 | } |
474 | } |
470 | } |
475 | } |
471 | 476 | ||
472 | /* |
477 | /* |
473 | * Finish TLB shootdown sequence. |
478 | * Finish TLB shootdown sequence. |
474 | */ |
479 | */ |
475 | tlb_invalidate_pages(AS->asid, area->base, area->pages); |
480 | tlb_invalidate_pages(as->asid, area->base, area->pages); |
476 | tlb_shootdown_finalize(); |
481 | tlb_shootdown_finalize(); |
477 | 482 | ||
- | 483 | /* |
|
- | 484 | * Invalidate potential software translation caches (e.g. TSB on sparc64). |
|
- | 485 | */ |
|
- | 486 | as_invalidate_translation_cache(as, area->base, area->pages); |
|
- | 487 | ||
478 | btree_destroy(&area->used_space); |
488 | btree_destroy(&area->used_space); |
479 | 489 | ||
480 | area->attributes |= AS_AREA_ATTR_PARTIAL; |
490 | area->attributes |= AS_AREA_ATTR_PARTIAL; |
481 | 491 | ||
482 | if (area->sh_info) |
492 | if (area->sh_info) |
Line 485... | Line 495... | ||
485 | mutex_unlock(&area->lock); |
495 | mutex_unlock(&area->lock); |
486 | 496 | ||
487 | /* |
497 | /* |
488 | * Remove the empty area from address space. |
498 | * Remove the empty area from address space. |
489 | */ |
499 | */ |
490 | btree_remove(&AS->as_area_btree, base, NULL); |
500 | btree_remove(&as->as_area_btree, base, NULL); |
491 | 501 | ||
492 | free(area); |
502 | free(area); |
493 | 503 | ||
494 | mutex_unlock(&AS->lock); |
504 | mutex_unlock(&as->lock); |
495 | interrupts_restore(ipl); |
505 | interrupts_restore(ipl); |
496 | return 0; |
506 | return 0; |
497 | } |
507 | } |
498 | 508 | ||
499 | /** Share address space area with another or the same address space. |
509 | /** Share address space area with another or the same address space. |