Rev 4377 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 4377 | Rev 4692 | ||
|---|---|---|---|
| Line 415... | Line 415... | ||
| 415 | node = |
415 | node = |
| 416 | list_get_instance(area->used_space.leaf_head.prev, |
416 | list_get_instance(area->used_space.leaf_head.prev, |
| 417 | btree_node_t, leaf_link); |
417 | btree_node_t, leaf_link); |
| 418 | if ((cond = (bool) node->keys)) { |
418 | if ((cond = (bool) node->keys)) { |
| 419 | uintptr_t b = node->key[node->keys - 1]; |
419 | uintptr_t b = node->key[node->keys - 1]; |
| 420 | count_t c = |
420 | size_t c = |
| 421 | (count_t) node->value[node->keys - 1]; |
421 | (size_t) node->value[node->keys - 1]; |
| 422 | unsigned int i = 0; |
422 | unsigned int i = 0; |
| 423 | 423 | ||
| 424 | if (overlaps(b, c * PAGE_SIZE, area->base, |
424 | if (overlaps(b, c * PAGE_SIZE, area->base, |
| 425 | pages * PAGE_SIZE)) { |
425 | pages * PAGE_SIZE)) { |
| 426 | 426 | ||
| Line 552... | Line 552... | ||
| 552 | unsigned int i; |
552 | unsigned int i; |
| 553 | 553 | ||
| 554 | node = list_get_instance(cur, btree_node_t, leaf_link); |
554 | node = list_get_instance(cur, btree_node_t, leaf_link); |
| 555 | for (i = 0; i < node->keys; i++) { |
555 | for (i = 0; i < node->keys; i++) { |
| 556 | uintptr_t b = node->key[i]; |
556 | uintptr_t b = node->key[i]; |
| 557 | count_t j; |
557 | size_t j; |
| 558 | pte_t *pte; |
558 | pte_t *pte; |
| 559 | 559 | ||
| 560 | for (j = 0; j < (count_t) node->value[i]; j++) { |
560 | for (j = 0; j < (size_t) node->value[i]; j++) { |
| 561 | page_table_lock(as, false); |
561 | page_table_lock(as, false); |
| 562 | pte = page_mapping_find(as, b + j * PAGE_SIZE); |
562 | pte = page_mapping_find(as, b + j * PAGE_SIZE); |
| 563 | ASSERT(pte && PTE_VALID(pte) && |
563 | ASSERT(pte && PTE_VALID(pte) && |
| 564 | PTE_PRESENT(pte)); |
564 | PTE_PRESENT(pte)); |
| 565 | if (area->backend && |
565 | if (area->backend && |
| Line 785... | Line 785... | ||
| 785 | uintptr_t base; |
785 | uintptr_t base; |
| 786 | link_t *cur; |
786 | link_t *cur; |
| 787 | ipl_t ipl; |
787 | ipl_t ipl; |
| 788 | int page_flags; |
788 | int page_flags; |
| 789 | uintptr_t *old_frame; |
789 | uintptr_t *old_frame; |
| 790 | index_t frame_idx; |
790 | size_t frame_idx; |
| 791 | count_t used_pages; |
791 | size_t used_pages; |
| 792 | 792 | ||
| 793 | /* Flags for the new memory mapping */ |
793 | /* Flags for the new memory mapping */ |
| 794 | page_flags = area_flags_to_page_flags(flags); |
794 | page_flags = area_flags_to_page_flags(flags); |
| 795 | 795 | ||
| 796 | ipl = interrupts_disable(); |
796 | ipl = interrupts_disable(); |
| Line 824... | Line 824... | ||
| 824 | btree_node_t *node; |
824 | btree_node_t *node; |
| 825 | unsigned int i; |
825 | unsigned int i; |
| 826 | 826 | ||
| 827 | node = list_get_instance(cur, btree_node_t, leaf_link); |
827 | node = list_get_instance(cur, btree_node_t, leaf_link); |
| 828 | for (i = 0; i < node->keys; i++) { |
828 | for (i = 0; i < node->keys; i++) { |
| 829 | used_pages += (count_t) node->value[i]; |
829 | used_pages += (size_t) node->value[i]; |
| 830 | } |
830 | } |
| 831 | } |
831 | } |
| 832 | 832 | ||
| 833 | /* An array for storing frame numbers */ |
833 | /* An array for storing frame numbers */ |
| 834 | old_frame = malloc(used_pages * sizeof(uintptr_t), 0); |
834 | old_frame = malloc(used_pages * sizeof(uintptr_t), 0); |
| Line 850... | Line 850... | ||
| 850 | unsigned int i; |
850 | unsigned int i; |
| 851 | 851 | ||
| 852 | node = list_get_instance(cur, btree_node_t, leaf_link); |
852 | node = list_get_instance(cur, btree_node_t, leaf_link); |
| 853 | for (i = 0; i < node->keys; i++) { |
853 | for (i = 0; i < node->keys; i++) { |
| 854 | uintptr_t b = node->key[i]; |
854 | uintptr_t b = node->key[i]; |
| 855 | count_t j; |
855 | size_t j; |
| 856 | pte_t *pte; |
856 | pte_t *pte; |
| 857 | 857 | ||
| 858 | for (j = 0; j < (count_t) node->value[i]; j++) { |
858 | for (j = 0; j < (size_t) node->value[i]; j++) { |
| 859 | page_table_lock(as, false); |
859 | page_table_lock(as, false); |
| 860 | pte = page_mapping_find(as, b + j * PAGE_SIZE); |
860 | pte = page_mapping_find(as, b + j * PAGE_SIZE); |
| 861 | ASSERT(pte && PTE_VALID(pte) && |
861 | ASSERT(pte && PTE_VALID(pte) && |
| 862 | PTE_PRESENT(pte)); |
862 | PTE_PRESENT(pte)); |
| 863 | old_frame[frame_idx++] = PTE_GET_FRAME(pte); |
863 | old_frame[frame_idx++] = PTE_GET_FRAME(pte); |
| Line 900... | Line 900... | ||
| 900 | unsigned int i; |
900 | unsigned int i; |
| 901 | 901 | ||
| 902 | node = list_get_instance(cur, btree_node_t, leaf_link); |
902 | node = list_get_instance(cur, btree_node_t, leaf_link); |
| 903 | for (i = 0; i < node->keys; i++) { |
903 | for (i = 0; i < node->keys; i++) { |
| 904 | uintptr_t b = node->key[i]; |
904 | uintptr_t b = node->key[i]; |
| 905 | count_t j; |
905 | size_t j; |
| 906 | 906 | ||
| 907 | for (j = 0; j < (count_t) node->value[i]; j++) { |
907 | for (j = 0; j < (size_t) node->value[i]; j++) { |
| 908 | page_table_lock(as, false); |
908 | page_table_lock(as, false); |
| 909 | 909 | ||
| 910 | /* Insert the new mapping */ |
910 | /* Insert the new mapping */ |
| 911 | page_mapping_insert(as, b + j * PAGE_SIZE, |
911 | page_mapping_insert(as, b + j * PAGE_SIZE, |
| 912 | old_frame[frame_idx++], page_flags); |
912 | old_frame[frame_idx++], page_flags); |
| Line 1394... | Line 1394... | ||
| 1394 | * @param page First page to be marked. |
1394 | * @param page First page to be marked. |
| 1395 | * @param count Number of page to be marked. |
1395 | * @param count Number of page to be marked. |
| 1396 | * |
1396 | * |
| 1397 | * @return Zero on failure and non-zero on success. |
1397 | * @return Zero on failure and non-zero on success. |
| 1398 | */ |
1398 | */ |
| 1399 | int used_space_insert(as_area_t *a, uintptr_t page, count_t count) |
1399 | int used_space_insert(as_area_t *a, uintptr_t page, size_t count) |
| 1400 | { |
1400 | { |
| 1401 | btree_node_t *leaf, *node; |
1401 | btree_node_t *leaf, *node; |
| 1402 | count_t pages; |
1402 | size_t pages; |
| 1403 | unsigned int i; |
1403 | unsigned int i; |
| 1404 | 1404 | ||
| 1405 | ASSERT(page == ALIGN_DOWN(page, PAGE_SIZE)); |
1405 | ASSERT(page == ALIGN_DOWN(page, PAGE_SIZE)); |
| 1406 | ASSERT(count); |
1406 | ASSERT(count); |
| 1407 | 1407 | ||
| 1408 | pages = (count_t) btree_search(&a->used_space, page, &leaf); |
1408 | pages = (size_t) btree_search(&a->used_space, page, &leaf); |
| 1409 | if (pages) { |
1409 | if (pages) { |
| 1410 | /* |
1410 | /* |
| 1411 | * We hit the beginning of some used space. |
1411 | * We hit the beginning of some used space. |
| 1412 | */ |
1412 | */ |
| 1413 | return 0; |
1413 | return 0; |
| Line 1420... | Line 1420... | ||
| 1420 | 1420 | ||
| 1421 | node = btree_leaf_node_left_neighbour(&a->used_space, leaf); |
1421 | node = btree_leaf_node_left_neighbour(&a->used_space, leaf); |
| 1422 | if (node) { |
1422 | if (node) { |
| 1423 | uintptr_t left_pg = node->key[node->keys - 1]; |
1423 | uintptr_t left_pg = node->key[node->keys - 1]; |
| 1424 | uintptr_t right_pg = leaf->key[0]; |
1424 | uintptr_t right_pg = leaf->key[0]; |
| 1425 | count_t left_cnt = (count_t) node->value[node->keys - 1]; |
1425 | size_t left_cnt = (size_t) node->value[node->keys - 1]; |
| 1426 | count_t right_cnt = (count_t) leaf->value[0]; |
1426 | size_t right_cnt = (size_t) leaf->value[0]; |
| 1427 | 1427 | ||
| 1428 | /* |
1428 | /* |
| 1429 | * Examine the possibility that the interval fits |
1429 | * Examine the possibility that the interval fits |
| 1430 | * somewhere between the rightmost interval of |
1430 | * somewhere between the rightmost interval of |
| 1431 | * the left neigbour and the first interval of the leaf. |
1431 | * the left neigbour and the first interval of the leaf. |
| Line 1475... | Line 1475... | ||
| 1475 | leaf); |
1475 | leaf); |
| 1476 | return 1; |
1476 | return 1; |
| 1477 | } |
1477 | } |
| 1478 | } else if (page < leaf->key[0]) { |
1478 | } else if (page < leaf->key[0]) { |
| 1479 | uintptr_t right_pg = leaf->key[0]; |
1479 | uintptr_t right_pg = leaf->key[0]; |
| 1480 | count_t right_cnt = (count_t) leaf->value[0]; |
1480 | size_t right_cnt = (size_t) leaf->value[0]; |
| 1481 | 1481 | ||
| 1482 | /* |
1482 | /* |
| 1483 | * Investigate the border case in which the left neighbour does |
1483 | * Investigate the border case in which the left neighbour does |
| 1484 | * not exist but the interval fits from the left. |
1484 | * not exist but the interval fits from the left. |
| 1485 | */ |
1485 | */ |
| Line 1510... | Line 1510... | ||
| 1510 | 1510 | ||
| 1511 | node = btree_leaf_node_right_neighbour(&a->used_space, leaf); |
1511 | node = btree_leaf_node_right_neighbour(&a->used_space, leaf); |
| 1512 | if (node) { |
1512 | if (node) { |
| 1513 | uintptr_t left_pg = leaf->key[leaf->keys - 1]; |
1513 | uintptr_t left_pg = leaf->key[leaf->keys - 1]; |
| 1514 | uintptr_t right_pg = node->key[0]; |
1514 | uintptr_t right_pg = node->key[0]; |
| 1515 | count_t left_cnt = (count_t) leaf->value[leaf->keys - 1]; |
1515 | size_t left_cnt = (size_t) leaf->value[leaf->keys - 1]; |
| 1516 | count_t right_cnt = (count_t) node->value[0]; |
1516 | size_t right_cnt = (size_t) node->value[0]; |
| 1517 | 1517 | ||
| 1518 | /* |
1518 | /* |
| 1519 | * Examine the possibility that the interval fits |
1519 | * Examine the possibility that the interval fits |
| 1520 | * somewhere between the leftmost interval of |
1520 | * somewhere between the leftmost interval of |
| 1521 | * the right neigbour and the last interval of the leaf. |
1521 | * the right neigbour and the last interval of the leaf. |
| Line 1565... | Line 1565... | ||
| 1565 | leaf); |
1565 | leaf); |
| 1566 | return 1; |
1566 | return 1; |
| 1567 | } |
1567 | } |
| 1568 | } else if (page >= leaf->key[leaf->keys - 1]) { |
1568 | } else if (page >= leaf->key[leaf->keys - 1]) { |
| 1569 | uintptr_t left_pg = leaf->key[leaf->keys - 1]; |
1569 | uintptr_t left_pg = leaf->key[leaf->keys - 1]; |
| 1570 | count_t left_cnt = (count_t) leaf->value[leaf->keys - 1]; |
1570 | size_t left_cnt = (size_t) leaf->value[leaf->keys - 1]; |
| 1571 | 1571 | ||
| 1572 | /* |
1572 | /* |
| 1573 | * Investigate the border case in which the right neighbour |
1573 | * Investigate the border case in which the right neighbour |
| 1574 | * does not exist but the interval fits from the right. |
1574 | * does not exist but the interval fits from the right. |
| 1575 | */ |
1575 | */ |
| Line 1603... | Line 1603... | ||
| 1603 | */ |
1603 | */ |
| 1604 | for (i = 1; i < leaf->keys; i++) { |
1604 | for (i = 1; i < leaf->keys; i++) { |
| 1605 | if (page < leaf->key[i]) { |
1605 | if (page < leaf->key[i]) { |
| 1606 | uintptr_t left_pg = leaf->key[i - 1]; |
1606 | uintptr_t left_pg = leaf->key[i - 1]; |
| 1607 | uintptr_t right_pg = leaf->key[i]; |
1607 | uintptr_t right_pg = leaf->key[i]; |
| 1608 | count_t left_cnt = (count_t) leaf->value[i - 1]; |
1608 | size_t left_cnt = (size_t) leaf->value[i - 1]; |
| 1609 | count_t right_cnt = (count_t) leaf->value[i]; |
1609 | size_t right_cnt = (size_t) leaf->value[i]; |
| 1610 | 1610 | ||
| 1611 | /* |
1611 | /* |
| 1612 | * The interval fits between left_pg and right_pg. |
1612 | * The interval fits between left_pg and right_pg. |
| 1613 | */ |
1613 | */ |
| 1614 | 1614 | ||
| Line 1662... | Line 1662... | ||
| 1662 | return 1; |
1662 | return 1; |
| 1663 | } |
1663 | } |
| 1664 | } |
1664 | } |
| 1665 | } |
1665 | } |
| 1666 | 1666 | ||
| 1667 | panic("Inconsistency detected while adding %" PRIc " pages of used " |
1667 | panic("Inconsistency detected while adding %" PRIs " pages of used " |
| 1668 | "space at %p.", count, page); |
1668 | "space at %p.", count, page); |
| 1669 | } |
1669 | } |
| 1670 | 1670 | ||
| 1671 | /** Mark portion of address space area as unused. |
1671 | /** Mark portion of address space area as unused. |
| 1672 | * |
1672 | * |
| Line 1676... | Line 1676... | ||
| 1676 | * @param page First page to be marked. |
1676 | * @param page First page to be marked. |
| 1677 | * @param count Number of page to be marked. |
1677 | * @param count Number of page to be marked. |
| 1678 | * |
1678 | * |
| 1679 | * @return Zero on failure and non-zero on success. |
1679 | * @return Zero on failure and non-zero on success. |
| 1680 | */ |
1680 | */ |
| 1681 | int used_space_remove(as_area_t *a, uintptr_t page, count_t count) |
1681 | int used_space_remove(as_area_t *a, uintptr_t page, size_t count) |
| 1682 | { |
1682 | { |
| 1683 | btree_node_t *leaf, *node; |
1683 | btree_node_t *leaf, *node; |
| 1684 | count_t pages; |
1684 | size_t pages; |
| 1685 | unsigned int i; |
1685 | unsigned int i; |
| 1686 | 1686 | ||
| 1687 | ASSERT(page == ALIGN_DOWN(page, PAGE_SIZE)); |
1687 | ASSERT(page == ALIGN_DOWN(page, PAGE_SIZE)); |
| 1688 | ASSERT(count); |
1688 | ASSERT(count); |
| 1689 | 1689 | ||
| 1690 | pages = (count_t) btree_search(&a->used_space, page, &leaf); |
1690 | pages = (size_t) btree_search(&a->used_space, page, &leaf); |
| 1691 | if (pages) { |
1691 | if (pages) { |
| 1692 | /* |
1692 | /* |
| 1693 | * We are lucky, page is the beginning of some interval. |
1693 | * We are lucky, page is the beginning of some interval. |
| 1694 | */ |
1694 | */ |
| 1695 | if (count > pages) { |
1695 | if (count > pages) { |
| Line 1714... | Line 1714... | ||
| 1714 | } |
1714 | } |
| 1715 | 1715 | ||
| 1716 | node = btree_leaf_node_left_neighbour(&a->used_space, leaf); |
1716 | node = btree_leaf_node_left_neighbour(&a->used_space, leaf); |
| 1717 | if (node && page < leaf->key[0]) { |
1717 | if (node && page < leaf->key[0]) { |
| 1718 | uintptr_t left_pg = node->key[node->keys - 1]; |
1718 | uintptr_t left_pg = node->key[node->keys - 1]; |
| 1719 | count_t left_cnt = (count_t) node->value[node->keys - 1]; |
1719 | size_t left_cnt = (size_t) node->value[node->keys - 1]; |
| 1720 | 1720 | ||
| 1721 | if (overlaps(left_pg, left_cnt * PAGE_SIZE, page, |
1721 | if (overlaps(left_pg, left_cnt * PAGE_SIZE, page, |
| 1722 | count * PAGE_SIZE)) { |
1722 | count * PAGE_SIZE)) { |
| 1723 | if (page + count * PAGE_SIZE == |
1723 | if (page + count * PAGE_SIZE == |
| 1724 | left_pg + left_cnt * PAGE_SIZE) { |
1724 | left_pg + left_cnt * PAGE_SIZE) { |
| Line 1730... | Line 1730... | ||
| 1730 | */ |
1730 | */ |
| 1731 | node->value[node->keys - 1] -= count; |
1731 | node->value[node->keys - 1] -= count; |
| 1732 | return 1; |
1732 | return 1; |
| 1733 | } else if (page + count * PAGE_SIZE < |
1733 | } else if (page + count * PAGE_SIZE < |
| 1734 | left_pg + left_cnt*PAGE_SIZE) { |
1734 | left_pg + left_cnt*PAGE_SIZE) { |
| 1735 | count_t new_cnt; |
1735 | size_t new_cnt; |
| 1736 | 1736 | ||
| 1737 | /* |
1737 | /* |
| 1738 | * The interval is contained in the rightmost |
1738 | * The interval is contained in the rightmost |
| 1739 | * interval of the left neighbour but its |
1739 | * interval of the left neighbour but its |
| 1740 | * removal requires both updating the size of |
1740 | * removal requires both updating the size of |
| Line 1754... | Line 1754... | ||
| 1754 | return 0; |
1754 | return 0; |
| 1755 | } |
1755 | } |
| 1756 | 1756 | ||
| 1757 | if (page > leaf->key[leaf->keys - 1]) { |
1757 | if (page > leaf->key[leaf->keys - 1]) { |
| 1758 | uintptr_t left_pg = leaf->key[leaf->keys - 1]; |
1758 | uintptr_t left_pg = leaf->key[leaf->keys - 1]; |
| 1759 | count_t left_cnt = (count_t) leaf->value[leaf->keys - 1]; |
1759 | size_t left_cnt = (size_t) leaf->value[leaf->keys - 1]; |
| 1760 | 1760 | ||
| 1761 | if (overlaps(left_pg, left_cnt * PAGE_SIZE, page, |
1761 | if (overlaps(left_pg, left_cnt * PAGE_SIZE, page, |
| 1762 | count * PAGE_SIZE)) { |
1762 | count * PAGE_SIZE)) { |
| 1763 | if (page + count * PAGE_SIZE == |
1763 | if (page + count * PAGE_SIZE == |
| 1764 | left_pg + left_cnt * PAGE_SIZE) { |
1764 | left_pg + left_cnt * PAGE_SIZE) { |
| Line 1769... | Line 1769... | ||
| 1769 | */ |
1769 | */ |
| 1770 | leaf->value[leaf->keys - 1] -= count; |
1770 | leaf->value[leaf->keys - 1] -= count; |
| 1771 | return 1; |
1771 | return 1; |
| 1772 | } else if (page + count * PAGE_SIZE < left_pg + |
1772 | } else if (page + count * PAGE_SIZE < left_pg + |
| 1773 | left_cnt * PAGE_SIZE) { |
1773 | left_cnt * PAGE_SIZE) { |
| 1774 | count_t new_cnt; |
1774 | size_t new_cnt; |
| 1775 | 1775 | ||
| 1776 | /* |
1776 | /* |
| 1777 | * The interval is contained in the rightmost |
1777 | * The interval is contained in the rightmost |
| 1778 | * interval of the leaf but its removal |
1778 | * interval of the leaf but its removal |
| 1779 | * requires both updating the size of the |
1779 | * requires both updating the size of the |
| Line 1796... | Line 1796... | ||
| 1796 | * Now the interval can be only between intervals of the leaf. |
1796 | * Now the interval can be only between intervals of the leaf. |
| 1797 | */ |
1797 | */ |
| 1798 | for (i = 1; i < leaf->keys - 1; i++) { |
1798 | for (i = 1; i < leaf->keys - 1; i++) { |
| 1799 | if (page < leaf->key[i]) { |
1799 | if (page < leaf->key[i]) { |
| 1800 | uintptr_t left_pg = leaf->key[i - 1]; |
1800 | uintptr_t left_pg = leaf->key[i - 1]; |
| 1801 | count_t left_cnt = (count_t) leaf->value[i - 1]; |
1801 | size_t left_cnt = (size_t) leaf->value[i - 1]; |
| 1802 | 1802 | ||
| 1803 | /* |
1803 | /* |
| 1804 | * Now the interval is between intervals corresponding |
1804 | * Now the interval is between intervals corresponding |
| 1805 | * to (i - 1) and i. |
1805 | * to (i - 1) and i. |
| 1806 | */ |
1806 | */ |
| Line 1816... | Line 1816... | ||
| 1816 | */ |
1816 | */ |
| 1817 | leaf->value[i - 1] -= count; |
1817 | leaf->value[i - 1] -= count; |
| 1818 | return 1; |
1818 | return 1; |
| 1819 | } else if (page + count * PAGE_SIZE < |
1819 | } else if (page + count * PAGE_SIZE < |
| 1820 | left_pg + left_cnt * PAGE_SIZE) { |
1820 | left_pg + left_cnt * PAGE_SIZE) { |
| 1821 | count_t new_cnt; |
1821 | size_t new_cnt; |
| 1822 | 1822 | ||
| 1823 | /* |
1823 | /* |
| 1824 | * The interval is contained in the |
1824 | * The interval is contained in the |
| 1825 | * interval (i - 1) of the leaf but its |
1825 | * interval (i - 1) of the leaf but its |
| 1826 | * removal requires both updating the |
1826 | * removal requires both updating the |
| Line 1841... | Line 1841... | ||
| 1841 | return 0; |
1841 | return 0; |
| 1842 | } |
1842 | } |
| 1843 | } |
1843 | } |
| 1844 | 1844 | ||
| 1845 | error: |
1845 | error: |
| 1846 | panic("Inconsistency detected while removing %" PRIc " pages of used " |
1846 | panic("Inconsistency detected while removing %" PRIs " pages of used " |
| 1847 | "space from %p.", count, page); |
1847 | "space from %p.", count, page); |
| 1848 | } |
1848 | } |
| 1849 | 1849 | ||
| 1850 | /** Remove reference to address space area share info. |
1850 | /** Remove reference to address space area share info. |
| 1851 | * |
1851 | * |
| Line 1940... | Line 1940... | ||
| 1940 | unsigned int i; |
1940 | unsigned int i; |
| 1941 | for (i = 0; i < node->keys; i++) { |
1941 | for (i = 0; i < node->keys; i++) { |
| 1942 | as_area_t *area = node->value[i]; |
1942 | as_area_t *area = node->value[i]; |
| 1943 | 1943 | ||
| 1944 | mutex_lock(&area->lock); |
1944 | mutex_lock(&area->lock); |
| 1945 | printf("as_area: %p, base=%p, pages=%" PRIc |
1945 | printf("as_area: %p, base=%p, pages=%" PRIs |
| 1946 | " (%p - %p)\n", area, area->base, area->pages, |
1946 | " (%p - %p)\n", area, area->base, area->pages, |
| 1947 | area->base, area->base + FRAMES2SIZE(area->pages)); |
1947 | area->base, area->base + FRAMES2SIZE(area->pages)); |
| 1948 | mutex_unlock(&area->lock); |
1948 | mutex_unlock(&area->lock); |
| 1949 | } |
1949 | } |
| 1950 | } |
1950 | } |