Changeset de0af3a in mainline for kernel/generic/src/mm/backend_elf.c


Ignore:
Timestamp:
2018-12-03T18:29:53Z (5 years ago)
Author:
jxsvoboda <5887334+jxsvoboda@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
0777a933, 7be8d4d
Parents:
a0765f6
git-author:
Jiri Svoboda <jiri@…> (2018-12-03 16:53:27)
git-committer:
jxsvoboda <5887334+jxsvoboda@…> (2018-12-03 18:29:53)
Message:

Use ordered dictionary for pagemap instead of B+tree

At the same time we add a little bit more abstraction around the pagemap.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/mm/backend_elf.c

    ra0765f6 rde0af3a  
    219219                                assert(PTE_PRESENT(&pte));
    220220
    221                                 btree_insert(&area->sh_info->pagemap,
     221                                as_pagemap_insert(&area->sh_info->pagemap,
    222222                                    (base + P2SZ(j)) - area->base,
    223                                     (void *) PTE_GET_FRAME(&pte), NULL);
     223                                    PTE_GET_FRAME(&pte));
    224224                                page_table_unlock(area->as, false);
    225225
     
    267267        elf_header_t *elf = area->backend_data.elf;
    268268        elf_segment_header_t *entry = area->backend_data.segment;
    269         btree_node_t *leaf;
    270269        uintptr_t base;
    271270        uintptr_t frame;
     
    301300        mutex_lock(&area->sh_info->lock);
    302301        if (area->sh_info->shared) {
    303                 bool found = false;
    304 
    305302                /*
    306303                 * The address space area is shared.
    307304                 */
    308305
    309                 frame = (uintptr_t) btree_search(&area->sh_info->pagemap,
    310                     upage - area->base, &leaf);
    311                 if (!frame) {
    312                         unsigned int i;
    313 
    314                         /*
    315                          * Workaround for valid NULL address.
    316                          */
    317 
    318                         for (i = 0; i < leaf->keys; i++) {
    319                                 if (leaf->key[i] == upage - area->base) {
    320                                         found = true;
    321                                         break;
    322                                 }
    323                         }
    324                 }
    325                 if (frame || found) {
     306                errno_t rc = as_pagemap_find(&area->sh_info->pagemap,
     307                    upage - area->base, &frame);
     308                if (rc == EOK) {
    326309                        frame_reference_add(ADDR2PFN(frame));
    327310                        page_mapping_insert(AS, upage, frame,
     
    415398        if (dirty && area->sh_info->shared) {
    416399                frame_reference_add(ADDR2PFN(frame));
    417                 btree_insert(&area->sh_info->pagemap, upage - area->base,
    418                     (void *) frame, leaf);
     400                as_pagemap_insert(&area->sh_info->pagemap, upage - area->base,
     401                    frame);
    419402        }
    420403
Note: See TracChangeset for help on using the changeset viewer.