Ignore:
File:
1 edited

Legend:

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

    r38dc82d r59fb782  
    7676        .page_fault = anon_page_fault,
    7777        .frame_free = anon_frame_free,
    78 
    79         .create_shared_data = NULL,
    80         .destroy_shared_data = NULL
    8178};
    8279
     
    121118         */
    122119        mutex_lock(&area->sh_info->lock);
    123         list_foreach(area->used_space.leaf_list, leaf_link, btree_node_t,
    124             node) {
     120        list_foreach(area->used_space.leaf_list, cur) {
     121                btree_node_t *node;
    125122                unsigned int i;
    126123               
     124                node = list_get_instance(cur, btree_node_t, leaf_link);
    127125                for (i = 0; i < node->keys; i++) {
    128126                        uintptr_t base = node->key[i];
     
    131129                       
    132130                        for (j = 0; j < count; j++) {
    133                                 pte_t pte;
    134                                 bool found;
     131                                pte_t *pte;
    135132                       
    136133                                page_table_lock(area->as, false);
    137                                 found = page_mapping_find(area->as,
    138                                     base + P2SZ(j), false, &pte);
    139 
    140                                 ASSERT(found);
    141                                 ASSERT(PTE_VALID(&pte));
    142                                 ASSERT(PTE_PRESENT(&pte));
    143 
     134                                pte = page_mapping_find(area->as,
     135                                    base + P2SZ(j), false);
     136                                ASSERT(pte && PTE_VALID(pte) &&
     137                                    PTE_PRESENT(pte));
    144138                                btree_insert(&area->sh_info->pagemap,
    145139                                    (base + P2SZ(j)) - area->base,
    146                                     (void *) PTE_GET_FRAME(&pte), NULL);
     140                                    (void *) PTE_GET_FRAME(pte), NULL);
    147141                                page_table_unlock(area->as, false);
    148142
    149                                 pfn_t pfn = ADDR2PFN(PTE_GET_FRAME(&pte));
     143                                pfn_t pfn = ADDR2PFN(PTE_GET_FRAME(pte));
    150144                                frame_reference_add(pfn);
    151145                        }
     
    197191                return AS_PF_FAULT;
    198192
    199         mutex_lock(&area->sh_info->lock);
    200         if (area->sh_info->shared) {
     193        if (area->sh_info) {
    201194                btree_node_t *leaf;
    202195               
     
    208201                 * mapping, a new frame is allocated and the mapping is created.
    209202                 */
     203                mutex_lock(&area->sh_info->lock);
    210204                frame = (uintptr_t) btree_search(&area->sh_info->pagemap,
    211205                    upage - area->base, &leaf);
     
    239233                }
    240234                frame_reference_add(ADDR2PFN(frame));
     235                mutex_unlock(&area->sh_info->lock);
    241236        } else {
    242237
     
    260255                         * Reserve the memory for this page now.
    261256                         */
    262                         if (!reserve_try_alloc(1)) {
    263                                 mutex_unlock(&area->sh_info->lock);
     257                        if (!reserve_try_alloc(1))
    264258                                return AS_PF_SILENT;
    265                         }
    266259                }
    267260
     
    270263                km_temporary_page_put(kpage);
    271264        }
    272         mutex_unlock(&area->sh_info->lock);
    273265       
    274266        /*
     
    303295                 * the normal unreserving frame_free().
    304296                 */
    305                 frame_free(frame, 1);
     297                frame_free(frame);
    306298        } else {
    307299                /*
     
    310302                 * manipulate the reserve or it would be given back twice.
    311303                 */
    312                 frame_free_noreserve(frame, 1);
     304                frame_free_noreserve(frame);
    313305        }
    314306}
Note: See TracChangeset for help on using the changeset viewer.